はじめに
このページは「マイコンLチカ道場 Arduino編」の「1-1:ボタンを押している間Lチカ」に対応するページです。スイッチによる外部入力を使用して動作させてみます。
回路図とブレッドボード接続図
今回は1個の青色LEDと、1個のタクトスイッチを使用します。タクトスイッチはピン2に接続しました。また、抵抗10kΩを介して5Vに接続し「プルアップ」させています。
タクトスイッチの向きにご注意ください。90°間違えて接続すると常時ショートした状態になります。(勘で繋いだら間違えました。)
プログラムを書いてみる
早速プログラム(スケッチ)を書いてみました。Arduino IDEのスケッチ例「02.digital」⇒「button」を参考にしています。
const int LED1 = 12; //LEDを接続するピン
const int SW1 = 2; //スイッチを接続するピン
int a = 0; //スイッチの状態保存用の変数
void setup() {
pinMode(LED1, OUTPUT);
pinMode(SW1, INPUT); //SW1を入力に設定
}
void loop() {
a = digitalRead(SW1); //SW1の状態を読み込み、aに代入
if (a == LOW){ //aがLOWであれば、下記を実行
digitalWrite(LED1, HIGH); //LEDを点灯
} else { //aがLOWでなければ、下記を実行
digitalWrite(LED1, LOW); //LEDを消灯
}
}
上記のプログラムで、スイッチを押した時にLチカさせることができました。
簡単な動作説明としては、変数「a」に現在のスイッチの状態を代入し、if文を使用して、aがLOWであれば、LEDを点灯、そうでなければ(HIGHであれば)LEDを消灯させています。
タクトスイッチを10kΩの抵抗でプルアップさせているため、スイッチを押していないときは2番ピンの入力電圧は5V(HIGH)に張り付きます。スイッチを押すとGNDにショートして0V(LOW)に張り付きます。このとき10kΩを介して5VとGNDが接続するため、5V/10kΩ=0.5mAの電流が抵抗に流れます。もったいないし危険なので、LEDの電流制限抵抗と間違えたり小さい抵抗値のものを使用しないようにしましょう。
実際のスイッチ入力(ピン2)の電圧と、LEDの電圧をオシロスコープで見てみました。ボタンを押したとほぼ同時に、LEDが点灯していることがわかります。
チャタリングが盛大に発生しているかと思ったけど、特に発生していませんでした。
内蔵プルアップ抵抗を試す
Aruduinoでは、内蔵プルアップ機能があるようです。これを有効にすることで、先ほど付けていたプルアップ抵抗が無くせないか試してみました。
その前に、試しに上記のプログラムのままプルアップ抵抗を外してみましたが、スイッチを押していないのにLEDがうっすら常時点灯するようになりました。これは、入力がオープンになることで、0か1か非常に不安定な状態になっているためでしょう。危険なのですぐに止めました。
const int LED1 = 12;
const int SW1 = 2;
int a = 0;
void setup() {
pinMode(LED1, OUTPUT);
pinMode(SW1, INPUT_PULLUP); //SW1を入力に設定、内蔵プルアップ有効
}
void loop() {
a = digitalRead(SW1); //SW1の状態を読み込み、aに代入
if (a == LOW){
digitalWrite(LED1, HIGH);
} else {
digitalWrite(LED1, LOW);
}
}
上記のスケッチのように「INPUT」⇒「INPUT_PULLUP」に変更することで、簡単に内蔵プルアップが有効になるようです。試してみたら、本当に外付けプルアップ抵抗を外した状態で同じ動作ができました。部品や回路を省略できそうで便利ですね。
ちなみに、「INPUT_PULLDOWN」もあるかと思ったらそれは出来ないようです。
まとめ
スイッチ入力を使用して、ボタンを押している間Lチカさせることができました。また、if文を使ったプログラムの動作と、内蔵プルアップ機能を確認することができました。引き続きもっと難しいLチカに挑戦していきましょう。