ボタンを回路に組み込むことで、ON、OFFで異なる動作をさせることができる。ここでは基本のLEDの点灯を制御する
Contents
この記事は以前に購入したOSOYOO製のArduino学習キットのレッスン内容について解説した記事です。
OSOYOOの学習キットは複数のグレードがあり、僕が購入したのは「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を始めたいという人の参考になればと思う