Arduino入門 第5回 スイッチを追加

目次

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);
}
通知の設定
通知タイミング
guest
0 コメント
本文中にフィードバック
全てのコメントを見る
目次