十字路交差点の信号機をマイコンArduinoで作成する記事↓を紹介しましたが、

うちのともしくんが、

歩者分離式の信号機でも遊んでみたい・・・
なんて言うので、歩者分離式信号機のプログラムを作って、自作信号機で動かしてみたので紹介します!
歩者分離式の信号機とは
みなさんは、歩者分離式の信号機、見たことありますか?
都会などの交通量の多い場所で、最近よく見かけるようになってきた印象です。


歩者分離式の信号機には、こんな感じで「歩者分離式」のプレートが付いています。
信号好きの子どもを持つ親としては、分かりやすくてありがたいです(笑)
車両と歩行者の青になるタイミングが完全にずれているので、より安全に交差点を通過することができます。
信号の切替を図化すると、こんな感じ↓


この信号のプログラムを作って、自作信号機で動かしてみます^^
歩者分離式信号機のプログラム
基本的には、「マイコンArduinoで電子工作!交差点の信号機を作ろう🚥(Part1)」で紹介したコードとほぼ同じですが、歩者分離式なので、歩行者信号が青にするコードを分離して、最後に持ってきています。
// Separation Crossroad Signal
// 十字路交差点(歩者分離式)の車両信号・歩行者信号のプログラム
// Define Pins
// 車両信号機1
#define CAR_SIG1_R 12 // 赤
#define CAR_SIG1_Y 11 // 黄
#define CAR_SIG1_B 10 // 青
// 歩行者信号機1
#define PED_SIG1_R 9 // 赤
#define PED_SIG1_B 8 // 青
// 車両信号機2
#define CAR_SIG2_R 6 // 赤
#define CAR_SIG2_Y 5 // 黄
#define CAR_SIG2_B 4 // 青
// 歩行者信号機2
#define PED_SIG2_R 3 // 赤
#define PED_SIG2_B 2 // 青
// 全信号消灯
void all_low(){
// 車両信号機1 消灯
digitalWrite(CAR_SIG1_B, LOW);
digitalWrite(CAR_SIG1_Y, LOW);
digitalWrite(CAR_SIG1_R, LOW);
// 歩行者信号機1 消灯
digitalWrite(PED_SIG1_B, LOW);
digitalWrite(PED_SIG1_R, LOW);
// 車両信号機2 消灯
digitalWrite(CAR_SIG2_B, LOW);
digitalWrite(CAR_SIG2_Y, LOW);
digitalWrite(CAR_SIG2_R, LOW);
// 歩行者信号機2 消灯
digitalWrite(PED_SIG2_B, LOW);
digitalWrite(PED_SIG2_R, LOW);
}
void setup() {
// 車両信号機1 初期化
pinMode(CAR_SIG1_B, OUTPUT);
pinMode(CAR_SIG1_Y, OUTPUT);
pinMode(CAR_SIG1_R, OUTPUT);
// 歩行者信号機1 初期化
pinMode(PED_SIG1_B, OUTPUT);
pinMode(PED_SIG1_R, OUTPUT);
// 車両信号機2 初期化
pinMode(CAR_SIG2_B, OUTPUT);
pinMode(CAR_SIG2_Y, OUTPUT);
pinMode(CAR_SIG2_R, OUTPUT);
// 歩行者信号機2 初期化
pinMode(PED_SIG2_B, OUTPUT);
pinMode(PED_SIG2_R, OUTPUT);
// 全信号 消灯
all_low();
}
void loop() {
//====== 車両1通行(青)-車両2停止(赤) -歩行者1&2停止(赤)======//
// 車両信号機1 青 点灯
digitalWrite(CAR_SIG1_B,HIGH);
// 車両信号機2 赤 点灯
digitalWrite(CAR_SIG2_R,HIGH);
// 歩行者信号機1 赤 点灯
digitalWrite(PED_SIG1_R,HIGH);
// 歩行者信号機2 赤 点灯
digitalWrite(PED_SIG2_R,HIGH);
delay(10000);
//====== 車両1停止(黄)-車両2停止(赤)-歩行者1&2停止(赤) ======//
// 車両信号機1 青 消灯
digitalWrite(CAR_SIG1_B,LOW);
// 車両信号機1 黄 点灯
digitalWrite(CAR_SIG1_Y,HIGH);
// 車両信号機2 赤 点灯維持
// 歩行者信号機1 赤 点灯維持
// 歩行者信号機2 赤 点灯維持
delay(3000);
//====== 車両1停止(赤)-車両2停止(赤) -歩行者1&2停止(赤)======//
// 車両信号機1 黄 消灯
digitalWrite(CAR_SIG1_Y,LOW);
// 車両信号機1 赤 点灯
digitalWrite(CAR_SIG1_R,HIGH);
// 車両信号機2 赤 点灯維持
// 歩行者信号機1 赤 点灯維持
// 歩行者信号機2 赤 点灯維持
// 信号切替待ち
delay(3000);
//====== 車両1停止(赤)-車両2通行(青)-歩行者1&2停止(赤) ======//
// 車両信号機1 赤 点灯維持
// 車両信号機2 赤 消灯
digitalWrite(CAR_SIG2_R,LOW);
// 車両信号機2 青 点灯
digitalWrite(CAR_SIG2_B,HIGH);
// 歩行者信号機1 赤 点灯維持
// 歩行者信号機2 赤 点灯維持
delay(10000);
//====== 車両1停止(赤)-車両2停止(黄)-歩行者1&2停止(赤) ======//
// 車両信号機1 赤 点灯維持
// 車両信号機2 青 消灯
digitalWrite(CAR_SIG2_B,LOW);
// 車両信号機2 黄 点灯
digitalWrite(CAR_SIG2_Y,HIGH);
// 歩行者信号機1 赤 点灯維持
// 歩行者信号機2 赤 点灯維持
delay(3000);
//====== 車両1停止(赤)-車両2停止(赤)-歩行者1&2停止(赤) ======//
// 車両信号機1 赤 点灯維持
// 車両信号機2 黄 消灯
digitalWrite(CAR_SIG2_Y,LOW);
// 車両信号機2 赤 点灯
digitalWrite(CAR_SIG2_R,HIGH);
//歩行者信号機1 赤 点灯維持
//歩行者信号機2 赤 点灯維持
// 信号切替待ち
delay(3000);
//====== 車両1停止(赤)-車両2停止(赤)-歩行者1&2通行(青) ======//
// 車両信号機1 赤 点灯維持
// 車両信号機2 赤 点灯維持
// 歩行者信号機1 赤 消灯
digitalWrite(PED_SIG1_R,LOW);
// 歩行者信号機1 青 点灯
digitalWrite(PED_SIG1_B,HIGH);
// 歩行者信号機2 赤 消灯
digitalWrite(PED_SIG2_R,LOW);
// 歩行者信号機い2 青 点灯
digitalWrite(PED_SIG2_B,HIGH);
delay(10000);
//====== 車両1停止(赤)-車両2停止(赤)-歩行者1&2停止(青点滅) ======//
// 車両信号機1 赤 点灯維持
// 車両信号機2 赤 点灯維持
// 歩行者信号機1&2 青 点滅
for(int i=0; i<6; i++) {
digitalWrite(PED_SIG1_B,HIGH);
digitalWrite(PED_SIG2_B,HIGH);
delay(500);
digitalWrite(PED_SIG1_B,LOW);
digitalWrite(PED_SIG2_B,LOW);
delay(500);
}
//====== 車両1停止(赤)-車両2停止(赤)-歩行者1&2停止(青点滅) ======//
// 車両信号機1 赤 点灯維持
// 車両信号機2 赤 点灯維持
// 歩行者信号機1 赤 点灯
digitalWrite(PED_SIG1_R,HIGH);
// 歩行者信号機2 赤 点灯
digitalWrite(PED_SIG2_R,HIGH);
delay(3000);
//====== 全信号 消灯 ======//
all_low();
}
自作信号機で動かしてみた
上のプログラムを自作信号機に書き込んで動かすとこんな感じです↓
いい感じに動作しました♪
おわりに
今回は、自作信号機を使って、歩者分離式の信号機を再現してみましたが、いかがでしたでしょうか?
要求元のともしくんは、この信号機を使って満足そうにトミカで遊んでいたので、私も大満足です(笑)
プログラムを少し書き換えるだけで、色々なパターンの信号機に変更できるのがいいですよね。
こうなってくると、押しボタン式の信号機とかも作ってみたくなってきますね!
みなさんもよかったら、本記事を参考に色々な信号機を作ってみてください^^
作り方が分からないので詳しく知りたい!などありましたら、コメントやXのDMでご連絡いただけたら嬉しいです♪
コメント