【Make:】プラレール3灯式信号試作中

Arduinoというマイコンがあります。これとおもちゃを組み合わせてなにか出来ないかな?と考えて出した答えがプラレールとの組み合わせ。むかしNゲージに手を伸ばしていたのですが、お金かかりすぎるため止めました。

プラレールとeBayで買った中華製の電子部品を組み合わせて、いろいろ作って行きます。

まずは信号機から。この本のコードがベースですが、この本とうりにすると、黄色で突入してもすぐに赤にはなりません。これは困るので、いじりました。

まずは配線図から。

コードです。

//3灯式信号機 for プラレール
//Arduino nanoのコピー用のコード
//赤ー黄黄ー黄ー青
//
//
//2019/02/17 V1.0 スクラッチ
//2019/03/16 v1.1 サーボ追加
//2019/03/17 LEDの明るさ調整のためアナログ出力へ
//2019/03/21 4灯はPWM出力が上手くいかないので3灯へ
//
#include <Servo.h> 

const int led_R = 3;
const int led_Y = 5;
const int led_G = 6;
const int servo_pin = 11;

const int buttonpin = 7; //センサー

int val = HIGH; //列車がいなければHIGH
int flag = 0 ; //信号判定用のフラグ 赤だったら1を代入
//int yflag = 0; //黄信号時に進入してきたときの対策用フラグ

// ledの明るさ 抵抗に頼らないようにPWM出力で明るさ調整。
const int led_R_on = 200;
const int led_Y_on = 220;
const int led_G_on = 50;

Servo servo;

void setup() {

  pinMode(led_R, OUTPUT);
  pinMode(led_Y, OUTPUT);
  pinMode(led_G, OUTPUT);
  pinMode(buttonpin, INPUT);
  
  servo.attach(servo_pin);
  
  Serial.begin(9600);
}

void loop() {
  int val = digitalRead(buttonpin);
  //赤信号の処理
  if (val == LOW ) {
    servo.write(45);  //サーボでストップレールを上げる
    Serial.println("停止");
    analogWrite(led_R , led_R_on);
    analogWrite(led_Y , 0);
    analogWrite(led_G ,  0);
    delay(1000);
    flag  = 1; //赤信号だから1を代入
  }
  //通過してもしばらくは赤信号
  else if (val == HIGH ) {
    if (flag == 1 ) {
      Serial.println("まだ停止"); //暫く赤信号
      analogWrite(led_R , led_R_on);
      analogWrite(led_Y ,  0);
      analogWrite(led_G ,  0);
      delay(500);
      flag = 2; //黄信号でいいから2にする
    }
    else if (flag == 2) {
      Serial.println("注意");
      servo.write(5);   //サーボでストップレールを下げる 5にするとサーボの変な挙動がない。
      analogWrite(led_R ,  0);
      analogWrite(led_Y , led_Y_on);
      analogWrite(led_G ,  0);
      delay(1000);
      flag = 0; //初期化
    }
  //青信号の処理
  else {
    Serial.println("進行");
    servo.write(5);   //サーボでストップレールを下げる。ないとサーボがじっじっ言うのでこの1行必要
    analogWrite(led_R ,  0);
    analogWrite(led_Y ,  0);
    analogWrite(led_G , led_G_on);
    delay(250);
  }
  }
}

そうそう、ひとつ忘れちゃいけない。Arudino nanoのコピー品なんだけど、D9とD10のPWM出力が出来ないか、PWM接続が出来るピンの数が4つまでかどちらかの制限があるっぽいです。本当は4灯式にしたかったのですが、この現象が起きるため3灯式になりました。

当初はCdsで車両が通ったら暗くなると赤信号になるようにしたのですが、Cdsとの相性がいまいちで上手くいきませんでした。