私の入門記録であって、入門者向け解説サイトではありません。

鉄道信号

  • 投稿日:
  • Category:

次の課題は鉄道信号だ。前項で光センサーは日没と共に照明が点灯するという想定で使用したが、今回は車両がセンサーを覆う事をトリガーに赤信号を点灯させる。なので、前項のLEDはそのまま赤信号と思えば良いわけだ。これに黄と緑の信号を加え、赤点灯で6秒後に黄に切り替え、さらに6秒後に緑に戻すというロジックで実験を行なった(教科書76ページ)。まずは結果の動画をご覧あれ。左下がセンサーだ。

スケッチは下記の通り、前回の「IfStatementConditional1」を改造し、緑(led2Pin)と黄(led3Pin)の信号部分を追加し、6秒間のdelay処理を入れたもの。教科書には他に2灯式や4灯式の信号例も載っていたが、基本的に数の増減だけなので実験は省略した。

[ スケッチ:IfStatementConditional3]

// These constants won't change:
const int analogPin = A0;    // pin that the sensor is attached to
const int ledPin = 13;       // pin that the RED LED is attached to
const int led2Pin = 12;      // pin that the GRN LED is attached to
const int led3Pin = 11;      // pin that the YEL LED is attached to
const int threshold = 150;   // an arbitrary threshold level that's in the range of the analog input
void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);   // RED
  pinMode(led2Pin, OUTPUT);  // GRN
  pinMode(led3Pin, OUTPUT);  // YEL
  // initialize serial communications:
  Serial.begin(9600);
}
void loop() {
  // read the value of the potentiometer:
  int analogValue = analogRead(analogPin);
  // if the analog value is high enough, turn on the LED:
  if (analogValue < threshold) {
    digitalWrite(ledPin, HIGH);       // RED *
    digitalWrite(led2Pin, LOW);       // GRN
    digitalWrite(led3Pin, LOW);       // YEL
    delay(6000);
    digitalWrite(ledPin, LOW);        // RED
    digitalWrite(led2Pin, LOW);       // GRN
    digitalWrite(led3Pin, HIGH);      // YEL *
    delay(6000);
  } else {
    digitalWrite(ledPin, LOW);        // RED
    digitalWrite(led2Pin, HIGH);      // GRN *
    digitalWrite(led3Pin, LOW);       // YEL
  }
  // print the analog value:
  Serial.println(analogValue);
  delay(1);        // delay in between reads for stability
}