PR

【Arduino】ボタンを押してLEDを点灯させよう

こんにちは、メカ旦那です!

先日1秒ごとにLEDを点灯させる回路について解説しました。その続きとして今回はボタンを押してLEDを点灯させてみましょう!
基礎編として「ボタンを押している間だけ点灯する回路」、応用編として「ボタンから指を離しても点灯し続ける回路」について解説します。

基礎編 「ボタンを押している間だけ点灯する回路」

使用部品

Arduino Uno、ブレッドボード、USBケーブル、ジャンプワイヤー×7、抵抗(220Ω) × 2、LED、ボタンをご準備下さい。

また、ワイヤーは3本と4本で色を分けてください。スイッチからの入力回路LEDへの出力回路をわかりやすく分けるためです。

ちなみに、私は下記の初心者キットを使用しています。

回路

回路図はfritzingを用いて作成しています

回路はスイッチ用(赤)LED用(青)の2種類あります。3ピンをスイッチ回路に、7ピンをLED回路に繋ぎましょう。

メカ坊や
メカ坊や

旦那~、スイッチ用回路の抵抗ってなんでこんな繋ぎ方するんですか?

メカ旦那
メカ旦那

これはプルダウンを考慮した繋ぎ方です。
プルダウンとはスイッチを押していない時に入力ピンをLOWにするための方法です。
こちらで解説しています!

ソースコード

/* ボタンを押している状態だけLED点灯、離したら消灯 */

void setup() {
    pinMode(3, INPUT);              //3ピンを入力ピンにする
    pinMode(7, OUTPUT);             //7ピンを出力ピンにする
}

void loop() {
    if(digitalRead(3)== HIGH){      //もし3ピンがHIGHなら
      digitalWrite(7,1);            //7ピンをHIGHにする
    }
    else {                          //もし3ピンがLOWなら
      digitalWrite(7,0);            //7ピンをLOWにする
    }
}

各関数の意味はこちらです。

  • if(条件){成立する場合の処理}else{成立しない場合の処理}
    ()内の条件が成立する時、しない時の処理を{}内に記入します。
  • digitalRead (ピン番号)
    指定のピン状態を読み取ります。HIGHなら電位が5V、LOWなら0Vの状態を指しています。
  • digitalWrite(ピン番号, 状態)
    指定のピンを、指定の状態(1はHIGH、0はLOW)にします。

転送!

コードをArduinoに転送してみましょう!

まず、void setupのpinMode関数で3ピン入力ピン7ピン出力ピンに設定します。この場合、入力ピンはスイッチの状態に関する信号を受け取り、出力ピンはLEDへの命令信号を送信します

void setup() {
    pinMode(3, INPUT); 
    pinMode(7, OUTPUT);
}
入力ピンはキャッチャー、出力ピンはピッチャーみたいなものですかね

次にvoid loopを実行します。
ボタンを押した時と指を離した時とで分けて解説します。

ボタンを押した時

ボタンを押すことで、①3ピンと5Vピンで回路ができて3ピンがHIGHになります。すると、if文により、②7ピンもHIGHになり、LEDが光ります。

if(digitalRead(3)== HIGH){      
  digitalWrite(7,1);           
}

ボタンから指を離した時

ボタンから指を離すと、①3ピンとGNDに回路ができて3ピンがLOWになります。するとif文により、②7ピンもLOWになり、LEDが消灯します。

else {                         
 digitalWrite(7,0);            
}

応用編 「ボタンから指を離しても点灯し続ける回路」

次は応用編として、ボタンから指を離してもLEDが点灯し続けるコードについて解説します!

使用部品、回路は基礎編と同じです。

ソースコード


int button = 0;         //スイッチを押したら1(HIGH)、指を離したら0(LOW)に切り替わる。
int button_keep = 0;    //buttonの値を保存する。
int led = 0;            //LEDを点灯させるときは1、消灯させるときは0を格納する。

void setup() {
    pinMode(3, INPUT);      //ボタン回路に接続する3ピンを入力に設定。
    pinMode(7, OUTPUT);     //LED回路に接続する7ピンを出力に設定。
}

void loop() {
  
  button = digitalRead(3);    //3ピンの状態を監視
  
  //スイッチを押した時
  
  if(button == HIGH && button_keep == LOW){
    led =1-led;             //LEDの点灯、消灯の指示
    delay(10);              //チャタリング防止
  }
  
  //スイッチを離した時
  
  if(button == LOW && button_keep == HIGH){
    delay(10);
  }
  
  button_keep = button;            //buttonの状態をbutton_keepに反映させる
  
  //LEDへの点灯指示
  
  if(led==1){
    digitalWrite(7,HIGH);   //LED点灯
  }
  else {
    digitalWrite(7,LOW);    //LED消灯
  }
}

新しい関数はこちらです。

  • A && B
    A かつ B を満たす時という意味です。
    例として、if ( A == HIGH && B == LOW){digitalWrite(7,HIGH)}なら、「A がHIGHでかつBがLOWの時、7ピンをHIGHにする」という意味です。

転送!

それでは転送させてみましょう。

まず、変数3種類、buttonbutton_keepledを宣言します。そして基礎編と同様にpinMode関数で3ピンを入力ピンに、7ピンを出力ピンにします。

int button = 0; 
int button_keep = 0;    
int led = 0;

void setup() {
    pinMode(3, INPUT);      
    pinMode(7, OUTPUT);     
}   
  • button
    ボタンを押している間は1が、指を離している間は0が格納されます。
  • button_keep
    button の値を一旦保存します。
  • led
    LEDを点灯させるときは1、消灯させる時は0を格納します。

そしてvoid loopの実行です!
まず、button == digitalRead(3) で3ピンの状態(LOW もしくは HIGH)をbuttonに反映します。

 button = digitalRead(3);   

ここでボタンを押した時と、指を離した時の場合分けをしてみます。

ボタンを押した時(1回目)

ボタンを押すと3ピンがHIGHになるので、先ほどの式でbutton に1が格納されます。

この時、button が1、button_keepが0なので下記のif文を実行します。また{}内で1 – led の値をledに代入します。初回ではledに0を代入しているので、1-0=1が新たに代入されます。

if(
button == HIGH &&
button_keep == LOW
){
led =1-led;             
delay(10);              
}

ちなみにdelay(10)はチャタリング防止のために記載します。

チャタリングとはボタンを押した時に生じる振動により、ほんの少しの間ON、OFF(HIGH、LOW)を繰り返す現象です。

ボタンを押した時に入力ピン(3ピン)がHIGHになりますが、チャタリングで一瞬LOWになります。その際誤って異なるif文を実行してしまいます。それを防止するために、先ほどのif文を実行したらチャタリングが収まるまでdelay(10)で時間稼ぎをして、 異なるif文実行を阻止します。

その後、button_keepbuttonの値を代入します。つまり1が代入されます。

button_keep = button; 

最後に下記のif文を実行します。ledに1が代入されているためdigitalWrite関数で7ピンをHIGHにします。つまりLEDが点灯します。

if(led==1){
digitalWrite(7,HIGH);   
}

ボタンから指を離した時(1回目)

ボタンから指を離してみましょう。

3ピンがLOWになり、buttonに0が格納されます。この時button_keepが1なので、下記のif文を実行します。今回はledの値を変えずにdelay(10)だけ実行します。

if(button == LOW && button_keep == HIGH){
 delay(10);
}

その後、button_keepbuttonの値を代入します。つまり0が代入されます。

button_keep = button; 

最後に下記のif文を実行します。ledに1が代入されているためdigitalWrite関数で7ピンをHIGHにします。つまりLEDが引き続き点灯します。

if(led==1){
digitalWrite(7,HIGH);   
}

ボタンを押した時(2回目)

再度ボタンを押してみましょう。

3ピンがHIGHになるので、button に1が格納されます。この時、button が1、button_keepが0なので下記のif文を実行します。更に1 – led の値をledに代入します。つまり、1-1=0が代入されます。

if(
button == HIGH &&
button_keep == LOW
){
led =1-led;             
delay(10);              
}

またbutton_keepbuttonの値0を代入します。

button_keep = button; 

そして最後に下記のif文を実行します。ledに0が代入されているためdigitalWrite関数で7ピンをLOWにします。つまりLEDが消灯します。

else { digitalWrite(7,LOW);  }

ボタンから指を離した時(2回目)

ボタンから指を離してみましょう。

3ピンがLOWになり、buttonに0が格納されます。この時button_keepが1なので、下記のif文を実行します。更にif文を実行後、button_keepに0が代入されます。

if(button == LOW && button_keep == HIGH){
    delay(10);
}
  
button_keep = button;         

最後に下記のif文を実行します。ledは0なのでdigitalWrite関数で7ピンをLOWにします。つまりLEDが引き続き消灯します。

else { digitalWrite(7,LOW);  }

この時点でbuttonが0、button_keepが0、ledが0なので、コード転送直後の初期状態に戻ります。そのため、上記の流れを繰り返します。

応用編まとめ

長々と解説したのでここで一旦まとめます。

3回目以降も同様に点灯、消灯を繰り返します。

まとめ

いかがでしたか。自分の思い通りにLEDを点灯させるのは面白いですよね。また家にある電気とスイッチの仕組みがわかったのではないでしょうか。

次回は「LEDの明るさを変化させる」回路について解説します。


メカ旦那

旧帝大工学部を卒業後、FA業界で会社員をしています。
電子工作の面白さを伝えるべく、ザックリ解説します!

メカ旦那をフォローする
Arduino
ザックリ解説Web

コメント

  1. 徳田 彰 より:

    有難う御座います。解決しました。ユーチューブでは中途半端にしか説明がなく行き詰っていました。berdで問い合わせても解決しませんでした。ここまで丁寧に解説していただき感謝です。76歳の気持ちの若いおじいさんです。孫に見せてやろうと頑張っています。昔はpascalの言語もやりましたが、理系ですが、電気系でないしパソコンもフロッピーディスクの時代からやっていましたが、使い道がなく。LOTUS123でマクロも組んだりしましたが、それっきりです。娘が雑誌の編集からゲームクリエイターになり手伝いを言われたのでパソコンをハイエンドとはいきませんが、グラボも積んで自作をしました。しかし、ゲームは久々の挫折を味わいました。そこで電子工作でもと考えいろんなものを集めて初めてスイッチで点灯し足りはできましたが、スイッチでオンオフを切り替えるのができなく途方に暮れ、プログラムを少し勉強して考えるかと考えていたところ貴殿のページに行き着き解決をしました。本当に感謝です。具体的なものからプログラムを習得しないとできませんので頑張ります。

スポンサーリンク