ラベル Arduino の投稿を表示しています。 すべての投稿を表示
ラベル Arduino の投稿を表示しています。 すべての投稿を表示
2022/04/06

Digisparkでマクロパッドを作った: オンライン会議向けのマイクミュートやカメラのON/OFF操作デバイス

概要

Digispark互換ボードを使用してマクロパッドを作成しました. このマクロパッドはPCにはUSBキーボードとして認識され,各タクトスイッチを押下すると,プログラムで予め設定したキーボード操作がPCに対して実行されます.タクトスイッチは2つしかありませんが,短押しと長押しの使い分けも可能です. 例えばZoomやMicrosoft Teamsなどのオンライン会議アプリケーションのショートカットキーを設定しておけば,ワンタッチでマイクのミュートをON/OFFすることができます.

Digisparkで作成したマクロパッド (電源ON時)

PCにUSBケーブルで接続するとDigispark上の電源確認用の赤色LEDとP1に接続された赤色LEDおよび,P1に外付けした青色LEDが点灯します. P1に接続されたLEDは,ゆっくりと輝度を変化させながら点滅します.

Digisparkで作成したマクロパッド (電源OFF時)

開発環境

DigisparkはAttiny85を搭載した小型マイコンボードです. USBによるプログラム転送および通信が可能です. Arduino IDEを使用して開発できます. 今回は数年前にAitendoで処分価格で販売されていたDigispark互換ボードを使用しました.

Digispark ATTiny85マイコンモジュール [M8520SU-MCUM]
Arduino IDE Arduino 1.8.19
Arduino Boards Manager Digistump AVR Boards: Digispark (Default - 16.5mhz)
Arduino Library: FastLED Version 3.5.0
Arduino Library: OneButton Version 2.0.4

Digisparkのセットアップは下記を参照してください.

UbuntuでDigisparkを認識しない場合は,下記を参照してください.

回路

回路図

部品点数は非常に少ないです. Digisparkのピン配置については,公式Webページを参照してください.

回路図

回路部品

参考単価をクリックすると,秋月電子通商のページもしくはメーカーページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.

番号 部品名 型番 数量 参考単価
SW1, SW2 タクトスイッチ 各社 2 30円 (互換品)
LED1 LED 各社 青色 1 18円 (互換品)
R1 炭素皮膜抵抗 各社 1/4W 1kΩ 1 1円 (互換品)
その他 ユニバーサル基板, スズメッキ線など 適量

作成例

マクロパッドの基板

エンクロージャ

エンクロージャ(ケース)は,作成した基板に合わせて3Dプリンタで出力しました. モデリング環境は下表のとおりです.ソフトウェアは全てフリーウェアです. FreeCADでモデリングしたものをSTLでエクスポートし,Ultimaker CuraでスライスしてGコードを生成しています.

OS Ubuntu 20.04.4 LTS
FreeCAD 0.18.4
Ultimaker Cura 4.11.0
FreeCADによるマクロパッドのエンクロージャのモデリング

ソースコード

オリジナルソースコード

GitHub Gistにて公開されている下記のソースコードを改変して使用しました.Zoomのミュートボタンとして使用するためのキーボード操作が設定されています.

なお,Zoomのショートカットキー一覧は下記で確認できます.

タクトスイッチに割り当てるキーボード操作のカスタマイズ

私はMicrosoft Teamsで使用したかったため,下記を参照してキーボード操作の設定を変更しました.

ほとんどのキーはDigiKeyboardライブラリに定義されていますが,定義されていないキーもあります.定義がない場合は,下記資料のTable 12: Keyboard/Keypad Pageを参照して定義する必要があります.

Microsoft Teams向けに改変したソースコードは下記です.1つのタクトスイッチはマイクミュートのON/OFF操作,もう1つのタクトスイッチはカメラのON/OFF操作に割り当てました.

オンライン会議アプリケーションのほかにも,さまざまなアプリケーションのショートカットキーに割り当てることが可能です.例えば,下記のプラグインと組み合わせることでGoogle Chromeのタブのミュート操作もできました.

2022/01/31

Arduino: スイッチ押下4回目でLEDを点灯させて,押下5回目でLEDを消灯させる

概要

Arduinoに接続されたタクトスイッチ(ボタンスイッチ)が4回押下されたときにLEDを点灯させて,さらにもう1回,合計5回押下されたときにLEDを消灯させて初期状態に戻るという処理を繰り返すプログラムを紹介します. ボタンスイッチの押下判定方法などの参考になれば幸いです.

デモ

先に実行例をどうぞ.

開発環境

Arduino Arduino UNO R3互換ボード
Arduino IDE Arduino 1.8.13

回路

回路図

デジタルピン2番にボタンスイッチを接続してください.なお,ボタンスイッチはActive Lowとしています.つまり押しているときはLOW,離しているときはHIGHです. デジタルピン12番にLEDを接続してください.なお,LEDはHIGH出力で消灯,LOW出力で点灯するように配線しているので注意してください. LEDをHIGH出力で点灯,LOW出力で消灯にしたい場合は,ソースコードの19行目と20行目の定義を入れ替えます. Arduinoのピン配置については,公式Webページを参照してください.

回路図

回路部品

参考単価をクリックすると,秋月電子通商のページもしくはメーカーページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.

番号 部品名 型番 数量 参考単価
R1 炭素皮膜抵抗 各社 1/4W 10kΩ 1 1円 (互換品)
SW1 ボタンスイッチ 各社 1 10円 (互換品)
R2 炭素皮膜抵抗 各社 1/4W 330Ω 1 1円 (互換品)
LED1 LED 各社 赤色 1 10円 (互換品)
その他 リード線など 適量

ソースコード

GitHub Gistにて公開します.

簡単にソースコードを説明します.

タクトスイッチについては20ミリ秒周期(INTERVAL_TIME)で状態(sw_val[SW_VAL_CURR])を取得し,前回の状態(sw_val[SW_VAL_PREV])も使用して状態が変化したことを検出します.

タクトスイッチの押下回数(sw_count)が4回になったとき,LEDを点灯します.

タクトスイッチの押下回数(sw_count)が5回以上になったとき,LEDを消灯します.

ArduinoによるLED制御に関する記事

ArduinoによるLED制御を取り上げた,他の記事を紹介します.

製品紹介

2022/01/27

Arduino: タクトスイッチ押下を外部割込みで検出し,LEDの点滅方向を切り替える

概要

Arduinoに4個のLEDを接続し,このうち1個のみを順番に点灯させます. LEDの点灯順序は左方向または右方向で,タクトスイッチを押下することで方向が切り替わります. タクトスイッチの押下は,立ち下がりエッジで外部割込みを発生させて検出します.

初期点灯順序 右方向
点滅周期 [ミリ秒] 1000

デモ

先に実行例をどうぞ. LEDは左から順に,ソースコード上のLED4,LED3,LED2,LED1です. 黒色のタクトスイッチがSW_PINに接続されています.

開発環境

Arduino Arduino UNO R3互換ボード
Arduino IDE Arduino 1.8.13

回路

回路図

デジタルピン9番, 10番, 11番および12番にLEDを接続してください.なお,LEDはHIGH出力で消灯,LOW出力で点灯するように配線しているので注意してください. 逆にしたい場合は,ソースコードの82行目の定義の0と1を入れ替えます. Arduinoのピン配置については,公式Webページを参照してください.

回路図

回路部品

参考単価をクリックすると,秋月電子通商のページもしくはメーカーページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.

番号 部品名 型番 数量 参考単価
R1 炭素皮膜抵抗 各社 1/4W 10kΩ 1 1円 (互換品)
SW1 タクトスイッチ 各社 1 10円 (互換品)
R2, R3, R4, R5 炭素皮膜抵抗 各社 1/4W 330Ω 4 1円 (互換品)
LED1, LED2, LED3, LED4 LED 各社 赤色 4 10円 (互換品)
その他 リード線など 適量

ソースコード

GitHub Gistにて公開します.

簡単にソースコードを説明します.

  • 38行目の関数はタクトスイッチ押下による外部割込み発生時に実行され,LEDの点滅方向を切り替えます.チャタリング対策として外部割込み処理の前回実行時刻を変数sw_prev_timeに格納しておき,その時刻から変数sw_ineffective_time以上の時間が経過していた場合のみにLEDの点滅方向が切り替わります
  • 61行目はLEDの点滅状態を更新する関数です.変数ledsの下位4bitがLEDが接続されたデジタルピンの状態を示しており,この状態をdigitalWrite()関数で各デジタルピンに反映しています
  • 74行目が外部割込み処理の設定です.詳細は,公式Webページを参照してください.第1引数はINT.0,デジタルピン2番を示します.第2引数では割込み発生時に実行する関数を指定します.第3引数は割込み発生のトリガーを指定するもので,今回は立ち下がりエッジです

ArduinoによるLED制御に関する記事

ArduinoによるLED制御を取り上げた,他の記事を紹介します.

製品紹介

2021/12/02

Arduino: 複数のLEDを別々の周期やON/OFF比で点滅させる

概要

Arduinoに複数のLEDを接続したとき,LED毎に異なる周期で点滅させる方法です. また,この方法では点灯時間と消灯時間も個別に設定することが可能です.

実行例で使用しているソースコードでは,3つのLEDを下記のような設定で点滅させています.

番号 発光色 周期 [ミリ秒] 点灯時間 [ミリ秒] 消灯時間 [ミリ秒]
LED1 赤 2000 1000 1000
LED2 橙 1000 800 200
LED3 緑 2000 500 1500

デモ

先に実行例をどうぞ.

開発環境

Arduino Arduino UNO R3互換ボード
Arduino IDE Arduino 1.8.13

回路

回路図

デジタルピン10番, 11番および12番にLEDを接続してください.なお,LEDはHIGH出力で消灯,LOW出力で点灯するように配線しているので注意してください. 逆にしたい場合は,ソースコードの14行目と15行目の定義を入れ替えます. Arduinoのピン配置については,公式Webページを参照してください.

回路部品

参考単価をクリックすると,秋月電子通商のページもしくはメーカーページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.

番号 部品名 型番 数量 参考単価
R1, R2, R3 炭素皮膜抵抗 各社 1/4W 330Ω 3 1円 (互換品)
LED1 LED 各社 赤色 1 10円 (互換品)
LED2 LED 各社 橙色 1 20円 (互換品)
LED3 LED 各社 緑色 1 10円 (互換品)
その他 リード線など 適量

ソースコード

GitHub Gistにて公開します.

簡単にソースコードを説明します.

  • 17行目からLED点滅クラスを定義しています.このクラスで,各LEDの接続ピン,点灯時間,消灯時間,点灯状態および前回に点灯状態が変化した時刻を管理します
  • 58行目からはLED点滅クラスのコンストラクタです.各メンバ変数を設定し,LEDを消灯状態に初期化します.このときの時刻をmillis()で取得してm_prev_timeに保存します
  • 72行目からはLED点滅クラスの点灯状態を更新するメソッドです.millis()で取得した現在の時刻と前回に点灯状態が変化した時刻m_prev_timeの差分が点灯時間m_on_timeもしくは消灯時間m_off_timeを超過しているとき,点灯状態を更新します.
  • 108行目からのセットアップ関数で行う処理はありません
  • 115行目からのループ関数では,120行目付近で各LEDのインスタンスを作成しています.これらはstatic変数なのでプログラムの終了まで保持されます.126行目付近でupdate()メソッドを実行しており,毎ループでLEDの点灯状態を更新しています

ArduinoによるLED制御に関する記事

ArduinoによるLED制御を取り上げた,他の記事を紹介します.

製品紹介

2021/12/01

Arduino: タクトスイッチが押されたらLEDを5回点滅させる

概要

Arduinoに接続されたタクトスイッチ(ボタンスイッチ)が押下されたとき,LEDを5回点滅させてその後は再びボタンスイッチが押下されるまで消灯状態を維持するプログラムを紹介します. ボタンスイッチの押下判定方法や一定回数同じ処理を繰り返す方法の参考になれば幸いです.

デモ

先に実行例をどうぞ.

開発環境

Arduino Arduino UNO R3互換ボード
Arduino IDE Arduino 1.8.13

回路

回路図

デジタルピン2番にボタンスイッチを接続してください.なお,ボタンスイッチはActive Lowとしています.つまり押しているときはLOW,離しているときはHIGHです. デジタルピン12番にLEDを接続してください.なお,LEDはHIGH出力で消灯,LOW出力で点灯するように配線しているので注意してください. LEDをHIGH出力で点灯,LOW出力で消灯にしたい場合は,ソースコードの14行目と15行目の定義を入れ替えます. Arduinoのピン配置については,公式Webページを参照してください.

回路部品

参考単価をクリックすると,秋月電子通商のページもしくはメーカーページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.

番号 部品名 型番 数量 参考単価
R1 炭素皮膜抵抗 各社 1/4W 10kΩ 1 1円 (互換品)
SW1 ボタンスイッチ 各社 1 10円 (互換品)
R2 炭素皮膜抵抗 各社 1/4W 330Ω 1 1円 (互換品)
LED1 LED 各社 緑色 1 10円 (互換品)
その他 リード線など 適量

ソースコード

GitHub Gistにて公開します.

実行例で使用しているソースコードでは,LEDを下記のような設定で点滅させています.

番号 発光色 周期 [ミリ秒] 点灯時間 [ミリ秒] 消灯時間 [ミリ秒] 点滅回数 [回]
LED1 緑 1000 500 500 5

簡単にソースコードを説明します.

ボタンスイッチについては20ミリ秒周期(INTERVAL_TIME)で状態(btn_val)を確認し,2回連続(BTN_COUNT_THRESH)で同じ状態(btn->last_val)だった場合はその状態をボタンスイッチの状態(btn->state)としています. これはボタンスイッチのチャタリングによる誤動作を低減するための処理です.

LEDの点滅状態を列挙型で表現しています(LED_BLINK_STATE_E).現在のLEDの点滅状態(led_blinking_state)によって処理を切り替えています. 初期のLEDの点滅状態はLED_STOP_OFFです. LEDが点滅停止中の場合,つまりled_blinking_stateがLED_STOP_OFFの場合は,led_blinking_startがtrueになるまで状態遷移しません. LEDが点滅中の場合,つまりled_blinking_stateがLED_BLINK_ONもしくはLED_BLINK_OFFの場合は,led_blinking_periodがインクリメントされます.これは何周期同じ点滅状態に留まっているかを示しています.1周期は20ミリ秒周期(INTERVAL_TIME)です. led_blinking_periodが25(LED_BRINK_PERIOD)を超過したとき,つまり20ミリ秒 x 25 = 500ミリ秒を超過したときに状態遷移が発生します. LED_BLINK_ONの場合はLED_BLINK_OFFに遷移します. LED_BLINK_OFFの場合は,LEDの点滅回数(led_blinking_count)がインクリメントされます. led_blinking_countが5(LED_BRINK_COUNT)を超過したとき,LEDの点滅は終了してLED_STOP_OFFに遷移します.それ以外の場合はED_BLINK_ONに遷移します.

セットアップ関数ではボタンスイッチとLEDの初期化を行い,周期実行用の変数に初期値を代入します.

ループ関数では,233行目で現在の時刻を取得しています.現在の時刻と前回に周期実行を行ったときの時刻との差分がinterval_timeを超過した場合は,周期実行を行います.ボタンスイッチの状態を確認し,ボタンスイッチが押下されている場合はLEDの点滅を開始します.

ArduinoによるLED制御に関する記事

ArduinoによるLED制御を取り上げた,他の記事を紹介します.

製品紹介

2021/10/14

Processing & Arduino: マウスのクリックでLEDの点滅を切り替える

概要

ProcessingとArduinoの組み合わせ例として,マウスのクリックでLEDを点灯したり消灯したりする方法を紹介します.

デモ

先に実行例をどうぞ. 動画内でArduino UNO R3互換ボードの一部を黒いビニルテープで隠していますが,この下にはシリアル通信時に点滅するLEDが搭載されています. プログラムで点滅させているLEDと紛らわしいためです.

開発環境

PC (Processing)側のOSはUbuntuなのですが,Windowsでも動作すると思います.未確認です.

OS Ubuntu 20.04 LTS
Processing Processing 3.5.4 Linux 64-bit
Arduino Arduino UNO R3互換ボード
Arduino IDE Arduino 1.8.13

回路

今回はArduino UNOのBuilt-in LEDを使用しましたので,追加の回路は必要ありません. Arduino UNOの仕様については下記を参照してください.

ソースコード

GitHub Gistにて公開します.

製品紹介

2021/09/30

Arduino: ボタンスイッチでサーボモータの角度を切り替える

概要

Arduinoによるサーボモータの制御例を紹介します. ボタンスイッチを押下すると,サーボモータの角度が0度または180度に交互に切り替わります.

デモ

先に実行例をどうぞ. 動画内ではArduino IDEのシリアルモニタの代わりにTera Termを使用していますが,もちろんシリアルモニタでも大丈夫です.

開発環境

Arduino Arduino UNO R3互換ボード
Arduino IDE Arduino 1.8.13

回路

回路図

デジタルピン2番にボタンスイッチを接続し,デジタルピン11番にサーボモータの制御信号を接続してください. Arduinoのピン配置については,公式Webページを参照してください.

回路部品

参考単価をクリックすると,秋月電子通商のページもしくはメーカーページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.

番号 部品名 型番 数量 参考単価
R1 炭素皮膜抵抗 各社 1/4W 10kΩ 1 1円 (互換品)
SW1 ボタンスイッチ 各社 1 10円 (互換品)
M1 サーボモータ SANWA SRM-102Z 1 5500円
その他 リード線など 適量

ソースコード

GitHub Gistにて公開します.

製品紹介

サーボモータは安価に入手できるものもありますので,用途に応じて選択してください.

2021/09/28

Arduinoに接続したLEDをWindows PCのC#アプリからシリアル通信で制御する

概要

Windows PC上のGUIアプリのボタン操作により,Arduinoに接続されたLEDの点灯を制御する例を紹介します. GUIアプリはVisual Studioを使用してC#で,ArduinoのプログラムはArduino IDEを使用して作成しました.

デモ

先に実行例をどうぞ.

開発環境

OS Windows 10 Pro 20H2
Visual Studio Microsoft Visual Studio Community 2017
Arduino Arduino UNO R3互換ボード
Arduino IDE Arduino 1.8.13

回路

回路図

デジタルピン3本にそれぞれにLEDを接続するだけです. LEDはアノード側を電流制限抵抗を挟んで+5Vに,カソード側をデジタルピンに接続してください. したがって,LEDはHIGHを出力すると消灯,LOWを出力すると点灯します. これを逆にしたい場合は,Arduino側のソースコードを変更する必要があります. Arduinoのピン配置については,公式Webページを参照してください.

回路部品

参考単価をクリックすると,秋月電子通商のページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.

番号 部品名 型番 数量 参考単価
R0, R1, R2 炭素皮膜抵抗 各社 1/4W 330Ω 3 1円 (互換品)
LED0 LED 各社 緑色 1 10円 (互換品)
LED1, LED2 LED 各社 赤色 2 5円 (互換品)
その他 リード線など 適量

ソースコード

GitHubにて公開します.ページ右上付近の「Code」ボタンからダウンロードしてください.Arduinoのスケッチはarduinoフォルダ配下に,Visual Studioプロジェクトはwindowsフォルダ配下にあります.

製品紹介

2015/02/22

Arduino - 押しボタンスイッチと7セグメントLEDを使用したカウンタ回路

概要

モーメンタリ動作の押しボタンスイッチ(タクトスイッチ)と7セグメントLEDを使用したカウンタ回路の製作例を紹介します. 開発環境は下記のとおりです.

Arduino IDE Arduino 1.0.5-r2
回路
回路図

私はArduinoを持っていませんので,Arduino Duemilanove互換回路をブレッドボード上に作成しました. 私がSW1として使用したタクトスイッチはLED内蔵ですが,このLEDは使用していません. SW1は負論理(押下されている時にLOW,押下されていない時にHIGH)になっています.


回路図
回路部品

下表は,回路図中のSW1と「7セグメントLED表示回路」部分の使用部品表です. 参考単価をクリックすると,秋月電子通商のページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.

番号 部品名 型番 数量 参考単価
SW1 LED付き
押しボタンスイッチ
Switronic ST-12-303FC-G
(緑,正方形)
1 150円
LED1 7セグメントLED PARA LIGHT C-421E
(カソードコモン)
1
R1 - R7 炭素皮膜抵抗 各社 1/4W 200Ω 7 1円
(互換品)
その他 リード線など 適量
スケッチ
SW1のチャタリングによる誤動作防止対策

タクトスイッチSW1を押下される度に,7セグメントLEDの表示数値をインクリメントするスケッチを作成しました. この動作を実現するためには,SW1のチャタリング対策が必要です.

下記のスケッチ例では,スイッチの状態を10ミリ秒の間隔を置いて2回確認するようにしています. スイッチが押下された状態の場合は,変数sw1_state_prevの値から前回のスイッチの状態を確認します. これはスイッチが押下された状態でインクリメントを複数回繰り返さないための判定処理です. sw1_state_prevがHIGHであればスイッチは押下直後ということになります.

スケッチ例

GitHubにて公開します.

完成

Webカメラで撮影したためピントが合っていません.ご了承ください.


7セグメントLEDカウンタ
製品紹介
2014/11/24

Arduino - ロータリスイッチの状態をA/D変換で取得する

前置きが長いので,すぐに回路図とスケッチを確認したい場合は,最初の2項目を読み飛ばしてください.

しろくま氏のPWMパワーパックの改良

しろくま氏がジオタウンドットコムで公開している,PWMパワーパックを製作してみることにしました. プログラムをPICに移植して製作しようと思っていたのですが,Arduinoの使用経験がなかったこともあり,私の技術不足で一筋縄では行きそうにありません. そこで,Arduinoの開発環境を用意して,ひとまずArduinoで製作してみることにしました.

しろくま氏が記事を投稿してから3年以上経過しているため,既に多くの方が,しろくま氏のPWMパワーパックを製作したようです. ジオタウンドットコムのコメント欄を見ると,誤動作するという方も散見されます. どうやら,マスコンとして使用している,ロータリスイッチ周辺回路やプログラムに問題が1つあるようです. 今回は,このロータリスイッチ周辺回路とプログラムの改良について考えてみました.

誤動作の原因は回路にあると推測

誤動作の原因や対応策についてコメント欄でさまざまな議論がされていますが,私は回路に原因があると考えました. 記事の添付写真から推測すると,しろくま氏が使用しているロータリスイッチは,秋月電子通商で発売されているノンショーティングタイプの1回路12接点のものです. ノンショーティングタイプのロータリスイッチは,スイッチを回転させて選択接点を切り換える際,一時的に共通接点がどの選択接点にも接触していない状態になります.

ここで,しろくま氏の回路図を確認します. ロータリスイッチ RSW_12の共通接点aは,アナログ入力ピンに接続されています. つまり,ロータリスイッチを回転させた際に,一時的にアナログ入力ピンがどこにも接続されていない状態(ハイインピーダンス)になります. このとき,Arduinoがロータリスイッチの状態を取得できなくなりますので,誤動作が発生します. ただし,これは回路図から読み取った推測です. 実際には,見当違いであったり,複合的な原因である可能性もありますのでご注意ください. ご指摘があれば,コメントをいただければ幸いです.

次項から,改良した回路について紹介します.

回路
回路図

PDFファイルにて公開します. 回路図中の「ユーザ回路」部分を製作し,Arduinoのアナログ入力ピンに接続してください.

ロータリスイッチ SW1の共通接点Aは,グランドに接続されています. 一方,Arduinoのアナログ入力ピンは,常にSW1の選択接点1に接続されています. スイッチを回転させると,合成抵抗の分圧比が変化し,アナログ入力ピンに印加される電圧が変化します. この変化を読み取ることで,SW1の状態を取得できます.

仮に共通接点Aがいずれの選択端子にも接続されていない状態になっても,アナログ入力ピンは抵抗 R1でプルアップされている状態となり,ハイインピーダンスにはなりません.

回路部品

下表は,回路図中の「ユーザ回路」部分の使用部品表です. 参考単価をクリックすると,秋月電子通商のページに飛びます. 「互換品」と記載されているリンクについては,互換性があると考えられる部品のページに飛びます. ただし,私が互換性および動作を確認したわけではありませんので,ご注意ください.

番号 部品名 型番 数量 参考単価
SW1 ロータリスイッチ 1回路12接点
ノンショーティングタイプ
1 150円
(互換品)
R1, R10 炭素皮膜抵抗 各社 1/4W 4.7kΩ 2 1円
(互換品)
R2 炭素皮膜抵抗 各社 1/4W 470Ω 1 1円
(互換品)
R3 炭素皮膜抵抗 各社 1/4W 680Ω 1 1円
(互換品)
R4 炭素皮膜抵抗 各社 1/4W 820Ω 1 1円
(互換品)
R5 炭素皮膜抵抗 各社 1/4W 1kΩ 1 1円
(互換品)
R6 炭素皮膜抵抗 各社 1/4W 1.2kΩ 1 1円
(互換品)
R7 炭素皮膜抵抗 各社 1/4W 1.5kΩ 1 1円
(互換品)
R8 炭素皮膜抵抗 各社 1/4W 2.2kΩ 1 1円
(互換品)
R9 炭素皮膜抵抗 各社 1/4W 3kΩ 1 1円
(互換品)
R11 炭素皮膜抵抗 各社 1/4W 8.2kΩ 1 1円
(互換品)
R12 炭素皮膜抵抗 各社 1/4W 15kΩ 1 1円
(互換品)
その他 リード線など 適量
回路製作例

私が製作した回路の写真です. 炭素皮膜抵抗R2~R12は1/4Wの小型品を使用し,ロータリスイッチの接点間に直接ハンダ付けしました.


回路製作例
スケッチ
A/D変換値からロータリスイッチの状態を取得する方法

まず,ロータリスイッチの各状態における,アナログ入力ピンへの印加電圧を計算してみましょう. 計算結果を下表に示します. 下表から,例えば選択接点2の場合は,アナログ入力ピンへの印加電圧が0.455Vになることがわかります. ArduinoのA/D変換の分解能は10bit(0~1023)ですから,A/D変換値は93になると考えられます. ただし,電源電圧や抵抗値の公差により,各値は多少変動します.

これらの計算結果を基に,A/D変換値と閾値を比較することで,ロータリスイッチの状態を割り出します. 例えば,選択接点が3以下か4以上かを調べるためには,各状態におけるA/D変換値(201と302)の中間値(252)を閾値にします. このような比較処理を繰り返すことで.選択接点が特定できます.

ロータリスイッチの選択接点とアナログ入力ピンへの印加電圧の関係
選択接点 印加電圧 [V] A/D変換値(10bit)
1 0.000 0
2 0.455 93
3 0.983 201
4 1.477 302
5 1.936 396
6 2.351 481
7 2.734 560
8 3.130 641
9 3.491 715
10 3.841 787
11 4.175 855
12 4.459 910
スケッチ例

下記は,スケッチ例 rotary_sw.inoです. A/D変換値からロータリスイッチの状態を取得する,getRotarySwStatus()関数を作成しました. 復帰値1~12でロータリスイッチの状態を,復帰値0で取得エラーを示します.

getRotarySwStatus()関数内の条件分岐処理がif文の入れ子構造になっているのは,ロータリスイッチの状態によって関数内の処理時間が変動しないようにしたかったためです. この関数では,ロータリスイッチがいずれの状態であっても条件分岐処理が3回以内になっています. よりスマートなやり方があるのだとは思いますが….

製品紹介
2014/11/18

Arduino - ソースコードを複数ファイルに分割して記述する(2)

.inoファイルは外部エディタで編集しづらい

前回の投稿で,スケッチを複数のファイル(タブ)に分割して記述する方法を紹介しました. 前回紹介した方法でも,コンパイルに問題はありません. しかし,できれば.inoファイルは作成せず,.cppと.hファイルのみでコーディングしたいと考えました. Arduino IDEのエディタは使いづらいのでサクラエディタを使用しているのですが,デフォルト設定のサクラエディタでは,.inoファイルは.cppファイルのように色分け表示や自動インデントが行われないからです. そこで,.cppと.hファイルのみでスケッチを構成する方法について調べてみました.

スケッチには最低1つの.inoファイルが必要

Intel Galileo Arduino IDEのユーザですが,調査された方を発見しました.

上記Webページによると,各スケッチには,スケッチフォルダ名と同名の.inoファイルが必要であるとのことです. ただし,.inoファイルには何も記述されていなくても良いようです(ブランクのダミーファイル.) 上記Webページを例に,適当なスケッチをダミーの.inoファイル,.cppファイルおよび.hファイルの組み合わせに変更してみました.

.cppと.hファイルのみで記述する方法
概要

.inoファイルのみで記述されたサンプルスケッチを,ダミーの.inoファイル,.cppファイルおよび.hファイルの組み合わせによる記述に変更します. ソースコードは.cppファイルと.hファイルに記述するため,外部エディタを使用しても色分け表示や自動インデントの機能が使用できます. また,別の開発環境やマイコンへの移植性の改善も期待できます.

サンプルスケッチ

LED点滅回路用のサンプルスケッチ,led_test2.inoです.

サンプルスケッチの記述変更例

6つのファイルに分割して記述しました. まずはダミーファイル,led_test3.inoです.

ヘッダファイル,stdafx.hです.

setup()関数およびloop()関数を記述した,led_test3.cppです.

ヘッダファイル,led_test3.hです.

led_toggle()関数を記述した,led_toggle.cppです.

ヘッダファイル,led_toggle.hです.

製品紹介
2014/11/17

Arduino - Arduino IDEのエディタのタブ幅を変更する

Arduino IDEの設定ファイル

Arduino IDEの環境設定は,「ファイル」-「環境設定」をクリックして表示されるウィンドウで変更できます. しかし,このウィンドウ上で変更できる項目は限られているため,より詳細な環境設定を行うためには,設定ファイルを直接編集しなければいけません. 設定ファイルのファイル名はpreferences.txtで,この設定ファイルのパスは環境設定のウィンドウで確認できます. パスをクリックすると,エクスプローラで設定ファイルが格納されているフォルダが表示されます.


Arduino
エディタのタブ幅を変更する

設定項目については,下記Webサイトにまとめが掲載されています.

デフォルトのタブ幅は2ですが,下記のようにタブ幅を4に変更しました.

Arduino IDEのエディタは貧弱…

行番号表示もできませんし,インデントにタブ文字が使用できないようです. 私は,外部エディタとしてサクラエディタを使用し,Arduino IDEはコンパイルにのみ使用しています. 今後のバージョンアップで機能増強が図られるのでしょうか….

製品紹介

Arduino - typedef宣言を使用する際の注意

C/C++のようで違う,Arduino

前回の記事でも書きましたが,関数のプロトタイプ宣言をユーザが記述する必要がないなど,Arduino IDEで使用するプログラミング言語はC/C++とは若干異なります.

実際には,スケッチ内のタブのうち.inoファイルと拡張子のないファイルは,コンパイル前に1つの.cppファイルに統合されるようです. 一方,.cファイルと.cppファイルは個別にコンパイルされ,最後にリンクが実行されます.

これらの処理は,ユーザのコーディングを簡略化することを目的としているのだと思います. しかしながら,ここに罠が隠れており,私はその罠にかかってしまいました.

typedef宣言が無視されてしまう
コンパイルエラーとなるプログラム

一見すると問題のないソースコードのようですが,コンパイルエラーが発生します. メッセージは「led_test2:12: error: 'STATUS_LED' does not name a type」でした.

問題の原因

この問題の原因は,Arduino IDEがプロトタイプ宣言を自動挿入する位置がプリプロセッサ(#includeや#defineのこと)の直後であることです. つまり,プロトタイプ宣言はプリプロセッサとtypedef宣言の間,8行目に自動挿入されることになります. したがって,typedef宣言でデータ型を定義する前にそのデータ型を使用したプロトタイプ宣言があることになり,コンパイルエラーとなってしまうのです.

問題の回避方法
方法(1) typedef宣言をヘッダファイルに移行する

Arduino Build Processでも紹介されている問題回避方法です. 自動挿入されるプロトタイプ宣言はプリプロセッサの直後なので,プリプロセッサでインクルードされるヘッダファイルでtypedef宣言を行えば良い,というものです.

方法(1)を適用したプログラムを示します. 下記は既存タブのled_test2.inoです. 新規作成するヘッダファイル,led_test2.hをインクルードしています.

下記は新規タブのled_test2.hです. typedef宣言を記述しています.

方法(2) プロトタイプ宣言を自分で記述する

プロトタイプ宣言が既に存在する場合は,自動挿入が実行されません. したがって,typedef宣言の後方に自分でプロトタイプ宣言を書いておくことでも,この問題を回避できます.

製品紹介
2014/11/16

Arduino - ソースコードを複数ファイルに分割して記述する

Arduino,はじめました

かなり今更ですが,最近になってArduinoを触り始めました. Arduinoと言っても,基板は買わずにATmega328Pを買ってきて,ブートローダと開発環境だけを使用しています. 参考書なども買っていないため,インターネットで調べつつ試行錯誤しています.

最初に躓いたのは,ソースコードを複数ファイルに分割して記述する方法についてです. Arduino Build Processでも説明されていますが,備忘録として記述しておこうと思います.

ソースコードを複数ファイルに分割して記述する
サンプルプログラム

説明に使用するサンプルプログラム,led_test.inoです. PIN_LEDで指定したデジタル入出力ピンのLEDを点滅させるプログラムです. LEDを接続する際は,電流制限用抵抗を忘れずに挿入してください.

今回は,loop()関数内の32~35行目の処理を関数化し,別ファイルに記述します.

新規タブを作成する

Arduinoでは,1つのスケッチで複数ファイルを扱うとき,各々を「タブ」と呼ぶようです. 新規タブは,ウィンドウ右側のアイコンをクリックすると表示されるメニューから作成できます. 私は最初これを知りませんでした….


Arduino

ウィンドウ下部に表示されるテキストボックスで,新規タブ名を指定します. Arduino Build Processによれば,タブとして扱うことができるファイルは,拡張子なし,.c,.cppまたは.hのいずれかのようです. しかし,私の使用しているArduino 1.0.5-r2では,このテキストボックスで拡張子を指定しなかった場合,拡張子は.inoになります. 1つのスケッチで,複数の.inoファイルが扱えるようです.

関数を記述するのであれば,C++言語ライクではなくC言語ライクに書くのであっても,個人的には拡張子は.cppを指定すれば良いと思います. 今回は拡張子を指定しませんでしたので,led_func.inoというファイルがスケッチフォルダに新規作成されました.


Arduino
ソースコードを編集する

上記のサンプルプログラムを分割して記述した例を示します. loop()関数内の32~35行目の処理を,led_func()関数として関数化しています. このように関数化やファイル分割を行うことで,ソースコードの再利用性が向上します.

下記は既存タブのled_test.inoです.

下記は新規タブのled_func.inoです.

なお,関数のプロトタイプ宣言は,Arduinoにおいてはコンパイル時に自動挿入されるため,必要ありません. また,作成したタブが拡張子.hのヘッダファイルでない限り,#includeの記述も必要ありません. しかし,これらにも例外があります. 詳細については,別記事「Arduino - typedef宣言を使用する際の注意」をご覧ください.

追加情報

よりC/C++言語ライクに記述したい場合は,Arduino - ソースコードを複数ファイルに分割して記述する(2)をご覧ください.

製品紹介