YouTube動画
今回のゴール
ブレッドボード回路
今回はスイッチを追加します。ブレッドボード上に次のように配線します。
スケッチ
スイッチが押されたらLEDを1秒ごとにピカッ、ピカッと制御するスケッチです。
/*
スイッチが押されたら
1秒ごとにLEDを点滅
*/
#define SW_PIN A5 // スイッチ接続端子
#define SW_OFF 1 // スイッチOFFのdigitalReadの値
#define LED_PIN 12 // LED接続端子
#define LED_ON_INTERVAL 50 // LEDを点灯する時間
#define LED_OFF_INTERVAL 950 // LEDを消灯する時間
void setup() {
// LED接続端子を出力制御にする
pinMode(LED_PIN, OUTPUT);
// スイッチ接続端子をプルアップ機能有効にする
pinMode(SW_PIN, INPUT_PULLUP);
// スイッチが押されるまで待つ
// (スイッチがONの間、何もしない)
while( digitalRead(SW_PIN) == SW_OFF ) {
}
}
void loop() {
// LEDをONにする
digitalWrite(LED_PIN, HIGH);
delay(LED_ON_INTERVAL);
// LEDをOFFにする
digitalWrite(LED_PIN, LOW);
delay(LED_OFF_INTERVAL);
}
要点まとめ
スイッチ状態を知るには?
スイッチをArduinoボードの端子に接続するだけでは、スイッチがOFFの場合、端子の電圧が不安定になります。
そのため、次のように抵抗を使って端子をプルアップ、プルダウンします。
Arduinoボードにはプルアップ機能が内蔵されていて、この機能を有効にするスイッチが内蔵されています。
プルアップ機能の選択
Arduinoボード内部のプルアップ機能を選択するには、pinModeを使用します。
pinModeの第2引数で、「INPUT_PULLUP」を指定するとプルアップ機能が有効、「INPUT」を指定するとプルアップ機能が無効になります。
使用例
次のコードは、A5端子の内部プルアップ機能を有効にします。
pinMode(A5, INPUT_PULLUP);
while文
While文は、条件が成立しているとき、命令を繰り返す、という制御ができます。
次のように書いた場合、「条件」が成立している間、ずっと波括弧内の命令を繰り返す、という動作をします。while文の条件を確認したときに成立しない場合は、while文の次の命令に進みます。
while( 条件 ) {
命令1;
命令2;
}
等価演算子
while文などで条件を書く場合、何かと何かが等しいかどうか調べたいことがあります。
そのときは次の等価演算子と呼ばれる記号を使用します。
使用例
次のよう書くと、A5端子のデジタル電圧計が1の間、何もしない、という制御ができます。
while( digitalRead(A5)==1 ) {
}
サンプルスケッチ
A0端子のデジタル電圧計をシリアルモニタに表示するスケッチ
A0端子に何も接続しない状態で次のスケッチを実行すると、多くの場合1(電圧あり)が表示されます。
端子に何も接続していない状態では、電圧が安定しないためです。
void setup() {
// シリアルモニタ初期化
Serial.begin(9600);
}
void loop() {
// A0端子のデジタル電圧計の値を送信する
Serial.println( digitalRead(A0) );
delay(200);
}
A0端子のアナロク電圧計をシリアルモニタに表示するスケッチ
A0端子に何も接続しないで次のスケッチを実行すると、0ではない数値が表示されます。
void setup() {
// シリアルモニタ初期化
Serial.begin(9600);
}
void loop() {
// A0端子のアナロク電圧計の値を送信する
Serial.println( analogRead(A0) );
delay(200);
}
チャレンジ課題解答例
チャレンジ課題1
スイッチが押されたら、1秒間隔で2回LEDを点灯しますので、「LEDを1秒間隔で2回点灯」という処理の前に、スイッチが押されるまで待つ、というスケッチにすればOKです。
/*
チャレンジ課題1 解答例
*/
#define SWITCH_PIN A5 // スイッチ接続端子
#define SWITCH_OFF 1 // スイッチOFFのdigitalReadの値
#define LED_PIN 12 // LED接続端子
#define INTERVAL 1000 // LEDを点滅する時間間隔
void setup() {
// LED接続端子を出力制御にする
pinMode(LED_PIN, OUTPUT);
// スイッチ接続端子をプルアップ機能有効にする
pinMode(SWITCH_PIN, INPUT_PULLUP);
}
void loop() {
// スイッチが押されるまで待つ
while( digitalRead(SWITCH_PIN) == SWITCH_OFF ) {
}
// スイッチが押されたら、LEDの点滅を2回繰り返して元に戻る
digitalWrite(LED_PIN, HIGH);
delay(INTERVAL);
digitalWrite(LED_PIN, LOW);
delay(INTERVAL);
digitalWrite(LED_PIN, HIGH);
delay(INTERVAL);
digitalWrite(LED_PIN, LOW);
delay(INTERVAL);
}
チャレンジ課題2
次は、スイッチが押されたら「LEDを1秒間隔で2回点灯」、さらにスイッチが押されたら「LEDを0.5秒間隔で2回点灯」という動作を丸ごとずっと繰り返しすることになります。
loopの部分にこの動作を書くと実現できます。
/*
チャレンジ課題2 解答例
*/
#define SWITCH_PIN A5 // スイッチ接続端子
#define SWITCH_OFF 1 // スイッチOFFのdigitalReadの値
#define LED_PIN 12 // LED接続端子
#define LONG_INTERVAL 1000 // LEDを点滅する時間間隔(長い間隔)
#define SHORT_INTERVAL 500 // LEDを点滅する時間間隔(短い間隔)
void setup() {
// LED接続端子を出力制御にする
pinMode(LED_PIN, OUTPUT);
// スイッチ接続端子をプルアップ機能有効にする
pinMode(SWITCH_PIN, INPUT_PULLUP);
}
void loop() {
// スイッチが押されるまで待つ
while( digitalRead(SWITCH_PIN) == SWITCH_OFF ) {
}
// 長い点滅を2回繰り返す
digitalWrite(LED_PIN, HIGH);
delay(LONG_INTERVAL);
digitalWrite(LED_PIN, LOW);
delay(LONG_INTERVAL);
digitalWrite(LED_PIN, HIGH);
delay(LONG_INTERVAL);
digitalWrite(LED_PIN, LOW);
delay(LONG_INTERVAL);
// スイッチが押されるまで待つ
while( digitalRead(SWITCH_PIN) == SWITCH_OFF ) {
}
// 短い点滅を2回繰り返す
digitalWrite(LED_PIN, HIGH);
delay(SHORT_INTERVAL);
digitalWrite(LED_PIN, LOW);
delay(SHORT_INTERVAL);
digitalWrite(LED_PIN, HIGH);
delay(SHORT_INTERVAL);
digitalWrite(LED_PIN, LOW);
delay(SHORT_INTERVAL);
}