Arduinoちゃんペロペロ日記 第三話「スイッチON」

 参考書ではブレッドボードを用いた例として、プッシュボタンによるLED制御が一通り説明されています。
 電気回路が超苦手で、高校物理の内容さえ忘れてしまっていますが*1、そんな自分でもわかるような丁寧な解説が印象的。


 で、言われるがまま解説のまま図のままに、「Arduinoはじめようキット」の付属品で回路を組み立てます。

 抵抗、プッシュボタンをブレッドボードに取り付け、電気回路になるようにワイヤでつなげます。あと、LED(赤)をArduino上に直接ブスリ。これらは、Arduinoはじめようキット」に全て付属しています
 ブレッドボードに触れることすら初めてな自分ですが、特に難もなく。英数字で振り分けされたマス目は縦方向に電気的なつながりがあるらしいです。ただしABCDEとFGHIJは別セクションになってるとか。
 はんだ付けも視野に入れていますが、はんだ付けなしでも試験的に回路を組めるってすごく素敵。レゴブロック的ですね。
 小中学校の図画工作や理科技術等の教材に組み込んでもいいレベルではないでしょうか?安いし、難しくないし、比較的安全だし、ラジオを作るよりも感動的だと思います。
 自分はラジオを作らされましたが、言われた通りにはんだ付けをして、それっきりで終わりでした。
 電気回路も苦手で、未だに工学部を目指すきっかけに乏しい人生だったと思います。本当にどうしてこうなった。


 自分語りはその辺にしておいて、次はプログラミングです。
 オリジナリティ溢れるプログラムを書きたいところですが、とりあえずは参考書の通りに書いてみます。

const int LED    = 13;
const int BUTTON = 7;

int val = 0;

void setup() {
  pinMode(LED, OUTPUT);    // 出力: LED
  pinMode(BUTTON, INPUT);  // 入力: ボタン
}

void loop() {
  val = digitalRead(BUTTON);  // 入力読み取り
  
  if (val == HIGH) {
    digitalWrite(LED, HIGH);
  } else {
    digitalWrite(LED, LOW);
  }
}

 コメントは勝手に簡略化しています。

  • LEDとボタンの繋がったArduino上のピン番号を宣言して、出力、入力に指定。
  • 常に入力を監視
    • 入力がHIGHになったら出力をHIGHに
    • 入力がLOWになったら出力をLOWに

 というだけのプログラムです。
 プッシュボタンは回路図でいうところのスイッチと同じで、押されない限りは電気が通らないとのこと。
 実行すると、ボタンを押している間だけLEDちゃんがピカーと光ります。

 で、押している間だけピカーと光るので、離すと消えます。なんだか味気ない。
 参考書はそこまで見越して、プログラムの改良までフォローしてくれています。


 長々と参考書をなぞるだけというのもつまらないので、可能な限り自分で改良してみます。

const int LED    = 13;
const int BUTTON = 7;

int rec_val = 0;  // 現在の状態(HIGH, LOW)
int old_val = 0;  // 一つ前の状態(HIGH, LOW)

int led_st  = 0;  // LEDステータス

void setup() {
  pinMode(LED, OUTPUT);    // 出力: LED
  pinMode(BUTTON, INPUT);  // 入力: ボタン
}

void loop() {
  rec_val = digitalRead(BUTTON);  // 入力読み取り
  
  /*
  *  入力チェック & 出力チェック
  *  「スイッチONにした瞬間」を検知
  */
  if (rec_val == HIGH && old_val == LOW) {
    led_st = 1 - led_st;
    delay(10);
  }  
  old_val = rec_val;

  if (led_st == 1) {
    digitalWrite(LED, HIGH);
  } else {
    digitalWrite(LED, LOW);
  }
}

 しかし一部参考書のアシストあり。ていうか終わってみればまるっきり参考書通りです。さみC。
 ボタンが押された瞬間にLEDのステータスを変える、って内容になっています。
 参考書にも書いてありますが、無限ループなので「HIGHかLOWか」という現在状態だけでなく、一つ前の状態も含めた「LOW→HIGH」の変化を検知する必要があります。
 あと、delayで10〜50ミリ秒待った方がいいと参考書で書かれていたので、その通りにしています。
 これをやらないと、バウンシングとかいうニセの信号が発生してしまうのだとか。

閉路する時の接点が、衝突エネルギーにより跳躍振動する現象。
この現象の持続している時間をバウンシング時間といいます。

チャタリングは外部からの衝撃・振動により起こり、バウンシングはスイッチ
のON/OFFにより必ず起こる現象です。

http://www.fa.omron.co.jp/guide/faq/detail/faq02037.html

 ふうん(小学生並みの相槌)
 わかったようなわからないような感じですが、とりあえず実行してみます。


 まぶC。
 カチカチカチカチと連打しまくったので現在目がやられかけています。バルス
 連打をしてると怪しい動作をするときがありますが、まあまあきちんと動いてくれています。


 次回は光センサを用いたサンプルを動かしてみます。

*1:オームとフレミングと右ねじしか覚えてない勢