ボタンを回路に組み込むことで、ON、OFFで異なる動作をさせることができる。ここでは基本のLEDの点灯を制御する

MEMO

この記事は以前に購入したOSOYOO製のArduino学習キットのレッスン内容について解説した記事です。
OSOYOOの学習キットは複数のグレードがあり、僕が購入したのは「LACC2006AD」という型番のもので低価格帯のグレードのものになります。

公式マニュアル LACC2006AD

OSOYOOはキットの内容を時々変更しているようで、僕が購入したものは品切れになっています。上記のリンクは僕が購入したキットに構成が近い製品です(やや豪華版)

他のレッスンの内容を知りたい場合は、下記のリンク先にまとめていますので、そちらを参照してください。

Arduino互換のスターターキットを買ってみた

Arduinoを触ってみたいけど、何を買ったらいいのか、なにから始めればいいのかわかならない!調べて見れると便利でお得な学習…

ボタンの内部回路

ボタンの内部回路図

ボタンは4個の端子が付いているけど内部では図のように横方向は常につながっており、ボタンを押したときだけ縦がつながるようになっている。そのため取付時は向きに注意しないとボタンとして役目を果たしてくれない。

端子が4個ある意味なくない?

ツン子

4個あることで取り付けが安定するし、左右のどちらからでもつなげるから設計しやすい。あと3個つなげることは良くあると思うよ。

ちたまん

回路図

回路図

待って。意味が分かんない。

ツン子

だよね。多分下図のような回路を最初に考えると思う

ちたまん
プルダウン無しの回路

うん。これで良いと思うんだけど?

ツン子

解放ピンのインプットは誤作動する

今回問題になるのはボタンがオフの時。ボタンがオフの状態だと5Vと12番ピンは繋がっていない。つまり12番ピンには何もつないでいない解放状態となっている。

仮に12番ピンのジャンパ線を外した状態で「12番がHighならLEDを点灯」というプログラムを組んだらどうなると思う?

ちたまん

繋いでないならずっとLowでしょ?点灯するわけないじゃん。

ツン子

そう思うのが普通なんだけど、マイコンの場合は残念ながら点灯してしまうことがあるんだ。

ちたまん

マイコンの解放ピンには意図せずに1V以上の中途半端な電圧がかかることが起きる。そうなるとHighとして判定されてしまう。その原因はノイズや初期化時の一時的なものなどさまざま。

良くわからんけど、確かに各ピンはインプットとアウトプットと兼任してるわけだし単純な構造じゃないから色々あるってことは察した

ツン子

うん。僕もその程度しかわかってない。そこで解放ピンをGNDに接続するんだ。

ちたまん

自身の理解不足もあるので細かいことは省くけどGNDに接続することで解放ピンは0Vに安定する。ただしこのままではボタンをONにしたときにショートを起こしてしまう。そこで抵抗を挿入する。このようにボタンのGND側に入れた抵抗をプルダウン抵抗という。

反対に電源側に入れた場合はプルアップ抵抗という。どちらも回路の動作を安定化するためのもので、ボタンやスイッチを使うときには抵抗をつなげてGNDに落とすことが基本。

プルアップ抵抗、プルダウン抵抗に関しては別記事にくわしく書くべき内容だけど、残念ながら僕自身そこまできちんと理解していない。

とりあえず現状は

  • スイッチやボタンは必ずGNDに落とすべし
  • GNDに落とすならショートを防ぐために抵抗が必要
  • 抵抗値は1kΩ~10kΩ

このように考えておけばよいみたい。

結線例

と、言うわけで回路図のとおりにブレッドボードを使い結線するとこのようになるはず。

スケッチを書く

const int keyPin = 12; //the number of the key pin
const int ledPin = 13;//the number of the led pin

void setup(){
  pinMode(keyPin,INPUT);
  pinMode(ledPin,OUTPUT);
}

void loop(){

  if(digitalRead(keyPin) ==HIGH ){
    digitalWrite(ledPin,HIGH);
  }else{
    digitalWrite(ledPin,LOW);
  }
}

digitalRead()

ここで初めてpinModeにINPUTを指定している。INPUTを指定することでピンは入力用になる。この状態でdigitalRead()関数を呼び出すと入力があるときはHIGH、入力が無ければLOWが返ってくるのでIF文を使うことで判定できる。

ボタンを押すことで12番ピンの状態がLOWからHIGHに変わる。そのため13番ピンがHIGHなら(ボタンを押下したなら)13番ピンをHIGHにするというプログラムだ。

その他に難しいことは無いが、オンボードのLEDと13番ピンの関係について不明であれば以前の記事で説明しているのでそちらを参照してほしい。

もっと簡単なコードでも同じ動作はできる

ちなみに12番ピンではなく13番ピンに繋ぎインプットさせれば下記のコードでも同じ動作をする

const int ledPin = 13;

void setup(){
  pinMode(ledPin,INPUT);
}

void loop(){

}

これだとスケッチが味気なさすぎるからあえて12番に入力して判定するコードにしたのだと思う。

Arduinoを始めるなら学習キットがおすすめ

学習キットならArduino互換ボード本体に加えてLEDやモーターが付いてくるのですぐに実験&学習がスタートできる。

僕が買ったのはOSOYOO製のセットで比較的シンプルなセット。※セット内容は常に変動するため購入当時と同じものは見つからなかった。リンク先は僕が購入したものになるべく近いものを選んでみた。

OSOYOO学習キットのまとめ記事

Arduino互換のスターターキットを買ってみた

Arduinoを触ってみたいけど、何を買ったらいいのか、なにから始めればいいのかわかならない!調べて見れると便利でお得な学習…

まとめ記事ではこの学習キットを選んだ理由や各レッスンの概要とレッスン毎の詳細記事へのリンクをまとめているので、Arduinoを始めたいという人の参考になればと思う