むささびPのblog

理系大学生が役に立つ情報を発信します!

​ArduinoでLEDをボタン操作で制御する方法 – ステップバイステップガイド~LEDをボタンで制御しよう~

https://cdn-ak.f.st-hatena.com/images/fotolife/P/Physiaki/20221126/20221126203706.png

このブログでは定期的にArduinoでの様々な電子工作について紹介やオススメをしています。Arduinoが初めての方にも丁寧で分かりやすいブログになるように頑張っています!

 

 

今回は新たに「Arduinoで楽しく開発」と題して、初心者コース④~LEDをボタンで制御しよう~と言うことで、LEDとボタンを使った制御について紹介しますArduinoの始め方どう、と言った人はぜひ過去の記事と合わせて読んでみてください!

 

 

Arduinoで楽しく開発ー初心者コース④~LEDをボタンで制御しよう~

 

 

 

Arduinoをお持ちでない方は、こちらの入出力モジュールがセットのものがオススメです。基本的にこのセットがあれば様々なプログラムを実際に動かして楽しめます。これらはArduinoUno互換品となっています。

 

 

私が使用している純正品のArduinoUnoはこちらです。

 
ArduinoC言語C++と呼ばれるプログラミング言語を使用してプログラムを書いていきます。ArduinoC言語の基礎的な学習Arduino特有の関数などをより勉強したい方はこちらの本が常に役立つのでオススメです。私も、日ごろこちらの本で大変勉強になっていす。

 

 

 

 

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(グラウンド)に落とします。

 

 

 (Ⅳ)実際にボタンで光らせる

プログラムと回路が完成したらさっそく動かしていきましょう。動画の様に制御できていれば完成です!


www.youtube.com

 

 

 

 

 

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を切り替えてみましょう。動画の様に制御できていれば完成です!


www.youtube.com

 

 

 

今回は以上です。次回はサーボモーターかジョイスティックとかをいじろうと思います。ではまた!