このブログでは定期的にArduinoでの様々な電子工作について紹介やオススメをしています。Arduinoが初めての方にも丁寧で分かりやすいブログになるように頑張っています!
今回は新たに「Arduinoで楽しく開発」と題して、初心者コース④~LEDをボタンで制御しよう~と言うことで、LEDとボタンを使った制御について紹介します!Arduinoの始め方やどうやってやるの、と言った人はぜひ過去の記事と合わせて読んでみてください!
Arduinoで楽しく開発ー初心者コース④~LEDをボタンで制御しよう~
Arduinoをお持ちでない方は、こちらの入出力モジュールがセットのものがオススメです。基本的にこのセットがあれば様々なプログラムを実際に動かして楽しめます。これらはArduinoUno互換品となっています。
私が使用している純正品のArduinoUnoはこちらです。
1. ボタンを押している間はLEDを点灯する
(Ⅰ)プッシュボタン
今回は下の画像のようなプッシュボタンと呼ばれるArduinoへのインプット、言わばセンサーを使います。
このボタンの状態をアナログで読み取りArduinoに認識させます。セットのArduinoを購入している場合付属されてます。お持ちでない方はリンクを参考に購入してください。
(Ⅱ)プログラム例
今回はまずボタンが押されている間、LEDが点灯するものを作っていきます。プログラム例は以下の様になります。
const int LED = 13; //LEDを接続するピン const int BUTTON = 8; //①プッシュボタンを接続するピン int val = 0; //②入力(ボタン)ピンの状態を記憶する変数(val) void setup() { pinMode(LED, OUTPUT); //LEDは出力であると定義 pinMode(BUTTON, INPUT);//③同様にBUTTONは入力であると定義 } void loop() { val = digitalRead(BUTTON); //④入力ピンの読み取った値をvalに格納 if (val == HIGH) //⑤ { digitalWrite(LED, HIGH); //LEDをON } else //⑥ { digitalWrite(LED, LOW); //LEDをOFF } }
コメントアウト(//)でプログラムの目的を記載しています。以前の記事で学んだ部分は説明を省きます。
①今回使用するボタンはプッシュボタンと呼ばれるものです。後ほど回路の時に詳しく説明します。このボタンをD8ピンと接続することを設定します。
②ボタンの値を格納する変数を定義します。読み取れる値は整数型なのでintで定義されています。
③ボタンを接続しているピンがArduinoに対し入力であることを設定します。(LEDには指令するため出力)
④ボタンピンから入力されるデジタル値をdigitalReadを用いて①で定義した変数valに格納します。今回はHIGH(ボタンが押されている)かLOW(ボタンが押されていない)としてvalに格納されます。
⑤if文(条件文)を使いボタンからの値によって{}の中の文を実行します。ここではボタンがHIGH(押されている)の時にLEDをHIGHにする信号を送るようにプログラムされています。
⑥⑤でのif(条件)文に当てはまらなかったelseの場合、下に続く{}の中の文を実行します。ここでは、LEDが消灯されるようにプログラムされています。⑤の条件に当てはまっている場合はこのelseの部分はスキップされることになります。
(Ⅲ)回路構成
前述のプログラムに沿って以下の図の様に回路を組み立てていきましょう。
LEDはアノード(足の長いほう)が13番ピンである事に注意してください。プッシュボタンには5Vから電圧を印加し、ボタンのアナログ値を読み込むD8ピンと抵抗(10kΩ)を介してGND(グラウンド)に落とします。
(Ⅳ)実際にボタンで光らせる
プログラムと回路が完成したらさっそく動かしていきましょう。動画の様に制御できていれば完成です!
2.ボタンでLEDのon・off切り替えスイッチ
(Ⅰ)プログラム
次に作成していくのは1回ボタンを押すと点灯しもう一度押すと消灯する、一般的な照明のボタンによるLEDの制御です。
const int LED = 13; //LEDを接続するピン const int BUTTON = 8; //プッシュボタンを接続するピン int val = 0; //入力(ボタン)ピンの状態を記憶する変数(val) int old_val = 0; //①更新前のvalの値を格納する変数 int s = 0; //②現在のon・offの状態を判断する変数 void setup() { pinMode(LED, OUTPUT); //LEDは出力であると定義 pinMode(BUTTON, INPUT);//同様にBUTTONは入力であると定義 } void loop() { val = digitalRead(BUTTON); //入力ピンの読み取った値をvalに格納 if (val == HIGH && old_val == LOW) //③ { s = 1 - s; //④ delay(10); } old_val=val; //⑤ if(s == 1) //⑥ { digitalWrite(LED, HIGH); //LEDをON } else // { digitalWrite(LED, LOW); //LEDをOFF } }
1のプログラムに追加をしてこのように作成します。ポイントになる部分を説明していきます。
①loopの中でプログラムが1周し繰り返す際に、前のloopで定まったvalの値を記録しておくold_valを整数型(int)で定義しています。これが必要になる理由について以下で詳しく説明します。
- プッシュボタンは金属板を触れ合わせて感知する単純な仕組みであることから、押し込み具合によってチャタリングと呼ばれる瞬間的な金属板の導通・非導通がおこる。
- この現象により瞬間的なon・offが繰り返されLEDが正常にコントロールできない場合がある。
②現在のLEDへの指令を0,1で判断するための変数sを定義
③ボタンがHIGH(押されている)かつ、前のloopでのval(old_val)がLOW(押されていない)場合の条件式で条件文を作っています。これにより①で説明したチャタリングによる意図しないスイッチの切り替えを防ぎます。
④この式で②で定義したLEDの指令を判断するための変数を、1から自分自身(s)を引いた数にします。③で示したif文内でこれを実行することで、ボタンが押されるとs=1,もう一度押すとs=0,もう一度押すとs=1を繰り返すことができます。
また、delayを10ms挿入することで条件文が瞬間的に繰り返されるHIGH,LOW(チャタリング)により誤作動しないようにします。
⑤次のloopでvalが変更される前にここで今回のloopで確定しているvalの値を①で定義したold_valに格納します。これにより次のloopの条件文でold_valを正しく認識することになります。
⑥ここで③④で決定されるsの値が1の場合にLEDを点灯させる指示となる条件文を書きます。続くelseでs=1ではない場合、つまり=0の時にLEDがoffになるように指令します。
(Ⅱ)回路構成
回路構成は1つ前の回路をそのまま使います。
(Ⅲ)実際にボタンで光らせる
それでは実際にボタンを押してon,offを切り替えてみましょう。動画の様に制御できていれば完成です!