押しボタンスイッチやリミットスイッチなどの外部入力回路をArduinoに接続すれば「利用者がボタンを押していているあいだLEDを点灯させる」「利用者がボタンを押したらLEDの点灯/消灯を切り替える」といった動作をさせることができます。
今回はArduinoにおけるスイッチ回路の構成方法とプログラムの書き方について学びます。
前回はこちら
回路の構成方法
押しボタンスイッチを利用した外部入力回路は、アクティブHとアクティブLの2通りで設計することができます。
アクティブHとはSWが押されるとHレベルが入力される設計です。
アクティブLとはSWが押されるとLレベルが入力される設計です。
実は、単に電源からスイッチを引いてArduinoのポートに入力するだけでは、正常に動作しません。
下記の図のように抵抗器が必要となります。
この回路で使用している抵抗を、その用途からプルダウン抵抗およびプルアップ抵抗といいます。
これらは、ボタンが押下されていないときの入力レベルを固定する(引き下げる/引き上げる)とともに、ボタンが押下されたときに電源とGNDがショートすることを防ぐ役目があります。1k~10kΩ程度の炭素皮膜抵抗を使用することが多いです。
例えば、7番ポートにアクティブLの押しボタンスイッチを接続した場合を考えます。
- 状態① SWが押されていない:Hレベル が7番ポートに入力
- 7番ポート入力電圧V = ∞Ω / 10kΩ+∞Ω ×5V = 5V(Hレベル)
- 状態② SWが押されている:Lレベル が7番ポートに入力
- 7番ポート入力電圧V= 0Ω / 10kΩ+0Ω ×5V = 0V(Lレベル)
状態① SW-OFF 状態② SW-ON
プログラムの記述方法
デジタル入出力ポートを「入力」に設定すれば、押しボタンスイッチなどを使った外部入力回路の状態を取得することができます。
デジタル入力値の取得にはdigitalRead命令を使用します。
スイッチの押し具合によって処理を変える場合は以下のように記述します。
#define SW 7
void setup(){
pinMode(SW,INPUT);
}
void loop(){
boolean x;
x=digitalRead(SW);
if(x==HIGH){
// SWにHレベル入力がある場合の処理
}else{
// SWにLレベル入力がある場合の処理
}
}
7行目:
x=digitalRead(7);
第1引数には、デジタルIOのピン番号 → 0から13 までの数値を指定します。
第1引数で指定したポートにHレベルが入力されていれば戻値は1(変数xに1が格納される)、Lレベルが入力されていれば戻値は0となります(変数xに0が格納される)。
慣れてきたら以下のように直接if文の中に条件を書くこともできます。
#define SW 7
void setup(){
pinMode(SW,INPUT);
}
void loop(){
if(digitalRead(SW)==HIGH){
// SWにHレベル入力がある場合の処理
}else{
// SWにLレベル入力がある場合の処理
}
}
プルアップ抵抗を使用しない方法
Arduino UNOにはプルアップ限定ですが、プログラム中のpinMode定義を変更すると、プルアップ抵抗なしでもスイッチを使用することが出来ます。
以下の通り記述します。
5行目、pinMode(SW,INPUT_PULLUP);と記述すると内部のプルアップ抵抗が機能し、回路側で抵抗が必要なくなります。
ただし、スイッチはアクティブHになります。
#define SW 7
#define LED 13
void setup() {
pinMode(SW, INPUT_PULLUP);
pinMode(LED, OUTPUT);
}
void loop() {
if (digitalRead(SW) == LOW) {
// SWが押されている場合の処理
digitalWrite(LED, HIGH);
} else {
// SWが押されていない場合の処理
digitalWrite(LED, LOW);
}
}
Arduino 実験⑦・⑧
⑦デジタル7番ポートにアクティブLの押しボタンSW、デジタル13番ポートにアクティブHのLEDが接続されている。
電源投入するとLEDが点灯し、その後、押しボタンSWが押されるとLEDが消灯するようなプログラム(ボタンが離されても消灯のまま)を作成せよ。
⑧ 押しボタンSWが押下された時間に関わらずLEDが3秒間点灯するようなプログラムを作成せよ
(ただし、SWが押下される時間は最大でも3秒未満であると仮定する)。
回路接続等は⑦と同じものとする。
次回はこちら