MENU

マイコンArduinoで電子工作!交差点の信号機を作ろう🚥(Part1)

みなさんのお子さんは信号機好きですか?(笑)
うちのともしくんは、信号機がとても大好きです!

いつも、トミカの信号機で遊んでいるのですが、

つい最近、ともしくんがこんなこと↓を言い出しまして・・・

ともしくん

本物の交差点みたいに、連動してる信号機で遊びたい!

でも、そんなの売ってないし・・・じゃあ、マイコン買って作ってみようか!
ってことで、作ってみました^^

Part1(本ページ)では、“ブレッドボード上でPC接続で動く信号機”を紹介します。

目次

作りたい信号機のイメージ

こんな感じの、典型的な十字路交差点の信号機を作ろうと思います。

パターンA:東西の道路が通行(青)、南北の道路が停止(赤)
パターンB:東西の道路が停止(赤)、南北の道路が通行(青)
パターンAとBを交互に繰り返します。

使用したマイコン

マイコンは、ELEGOOのArduino UNO R3スターターキットを購入しました。

信号機以外にも何か作りたくなるかも?と思ってこのセットにしたのですが、他のパーツは不要、と言う方は↓の初心者スターターキットでもいいと思います。

ArduinoのIDE(統合開発環境)は以下ページから取得できます。
>>https://www.arduino.cc/en/software/
日本語化は、ArduinoIDEの「File -> Preferences」 を選択し、Languageを日本語に変更すればOKです。

スターターキットには色々な部品が入っていますが、今回は信号機を作るので、使用する部品は以下になります。
(すべてスターターキットに含まれています。)

  • Arduino本体
  • USBケーブル
  • ブレッドボード
  • ジャンパー線×11本
  • 抵抗(10kΩ)×10個
  • LED(赤)×4個
  • LED(黄)×2個
  • LED(青)×4個

電子回路

まずは、ブレッドボード上で回路を組んで信号を作ってみます。

抵抗に向きはありませんが、LEDには向きがあるので注意してください。
足が長い方が+側(アノード)、足が短い方が-側(カソード)です。

実際の回路はこんな感じです。
LEDと抵抗とジャンパー線が、ぎゅうぎゅうに並んでいます(笑)

プログラム(スケッチ)

プログラムはこんな感じ。長い・・・
分かりやすさ優先で、コメント多め&かなりべた書きな感じのコードになっています。

// 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 青 点灯
  digitalWrite(CAR_SIG1_B,HIGH);
  // 歩行者信号機1 青 点灯
  digitalWrite(PED_SIG1_B,HIGH);

  // 車両信号機2 赤 点灯
  digitalWrite(CAR_SIG2_R,HIGH);
  // 歩行者信号機2 赤 点灯
  digitalWrite(PED_SIG2_R,HIGH);

  delay(10000);

  //====== 道路1停止(黄)-道路2停止(赤) ======//
  // 車両信号機1 青 消灯
  digitalWrite(CAR_SIG1_B,LOW);
  // 車両信号機1 黄 点灯
  digitalWrite(CAR_SIG1_Y,HIGH);
  // 歩行者信号機1 青 点滅
  for( int i=0 ; i<6; i++){
    digitalWrite(PED_SIG1_B,HIGH);
    delay(500);
    digitalWrite(PED_SIG1_B,LOW);
    delay(500);
  }

  // 車両信号機2 赤 点灯維持
  // 歩行者信号機2 赤 点灯維持

  //====== 道路1停止(赤)-道路2停止(赤) ======//
  // 車両信号機1 黄 消灯
  digitalWrite(CAR_SIG1_Y,LOW);
  // 車両信号機1 赤 点灯
  digitalWrite(CAR_SIG1_R,HIGH);
  // 歩行者信号機1 青 消灯維持
  // 歩行者信号機1 赤 点灯
  digitalWrite(PED_SIG1_R,HIGH);

  // 車両信号機2 赤 点灯維持
  // 歩行者信号機2 赤 点灯維持

  // 信号切替待ち
  delay(3000);
  
  //====== 道路1停止(赤)-道路2通行(青) ======//
  // 車両信号機1 赤 点灯維持
  // 歩行者信号機1 赤 点灯維持

  // 車両信号機2 赤 消灯
  digitalWrite(CAR_SIG2_R,LOW);
  // 車両信号機2 青 点灯
  digitalWrite(CAR_SIG2_B,HIGH);
  // 歩行者信号機2 赤 消灯
  digitalWrite(PED_SIG2_R,LOW);
  // 歩行者信号機2 青 点灯
  digitalWrite(PED_SIG2_B,HIGH);

  delay(10000);

  //====== 道路1停止(赤)-道路2停止(黄) ======//
  // 車両信号機1 赤 点灯維持
  // 歩行者信号機1 赤 点灯維持

  // 車両信号機2 青 消灯
  digitalWrite(CAR_SIG2_B,LOW);
  // 車両信号機2 黄 点灯
  digitalWrite(CAR_SIG2_Y,HIGH);
  // 歩行者信号機2 青 点滅
  for(int i=0; i<6; i++) {
    digitalWrite(PED_SIG2_B,HIGH);
    delay(500);
    digitalWrite(PED_SIG2_B,LOW);
    delay(500);
  }

  //====== 道路1停止(赤)-道路2停止(赤) ======//
  // 車両信号機1 赤 点灯維持
  // 歩行者信号機1 赤 点灯維持

  // 車両信号機2 黄 消灯
  digitalWrite(CAR_SIG2_Y,LOW);
  // 車両信号機2 赤 点灯
  digitalWrite(CAR_SIG2_R,HIGH);
  // 歩行者信号機2 青 消灯維持
  // 歩行者信号機2 赤 点灯
  digitalWrite(PED_SIG2_R,HIGH);

  // 信号切替待ち
  delay(3000);
  
   //====== 全信号 消灯 ======//
  all_low();
}

動かしてみよう!

作った回路をPCに接続して、プログラムを実行してみます。

いい感じに信号が動きました!
達成感ありますね✨無駄に、じーっと見てしまいます。(笑)

おわりに

今回は、ともしくんの「本物の交差点みたいに、連動してる信号機で遊びたい!」を叶えるべく、マイコンArduinoを使用した信号機作り(part1)を紹介しました。

元エンジニアの性なのか、息子のためと言いつつ、思いのほかワクワク楽しんでいる自分がいることに驚きました(笑)

電子工作はプログラミングを学べますし、論理的思考力・創造力・問題解決能力などなど、たくさんの力が身に付くので、ものづくりが大好きなお子さんには特におすすめしたい遊びです。

ともしくん

ママが勤めてた会社でも、業務外の活動で電子工作やってたよね?
電子工作は、エンジニアに必要な力がすごく鍛えられる遊びなんだね!!

トミカで遊べるような信号機にするには、↓が残っていますが、Part2以降でまたご紹介したいと思います^^
①PC駆動から、電池駆動に変更する
②ブレッドボードの回路から、本物っぽい信号機の形に変更する
(②が重い・・・)

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

CAPTCHA


目次