【プログラミング自由研究】初心者キットで作る「自分仕様の信号機」|LED3色をプログラムで動かす1日完結ガイド

プログラミングで動かす 信号機の自由研究

画面の中だけじゃない、物理が動くプログラミングの自由研究

学校でScratchをやってるんだけど、自由研究では画面の中だけじゃなくて、もう少し本物っぽいプログラミングをやってみたいんだ。

いい目線だね。プログラムで物理を動かす体験は、Scratchから次のステップとして最高なんだ。今日は「自分仕様の信号機」を作るよ。LED3色を順番に光らせて、しかも時間配分は自分で自由に決められるんだ。

今回は、プログラミングを使った自由研究をやってみたい小中学生のお子さんに向けて、Arduino初心者キットだけで作れる「自分仕様の信号機」の作り方を紹介します。

赤・黄・緑のLED3色を、プログラムで決めたタイミングで光らせる装置です。本物の信号機の時間を測って同じように作ってもいいし、自分の家の前の通り用に短いサイクルにしてもOK。3つの時間設定を書き換えるだけで動きが変わる、自由研究にぴったりの題材です。

この記事で作るもの
  1. 赤・黄・緑のLEDが信号機の順番で光る
  2. 歩行者用ボタンを押すと、黄色を1秒挟んでから赤に切り替わる
  3. 時間配分は緑・黄・赤の3つの数字を変えるだけで調整できる
  4. シリアルモニタで現在の状態が分かる

使う部品

部品役割個数
Arduino UNO R3装置の頭脳1
LED (赤、黄、緑)信号3色各1
抵抗330ΩLEDを保護3
タクトスイッチ歩行者ボタン1
ブレッドボード配線をする台1
ジャンパーワイヤーつなぐ線9〜10本

プログラミング自由研究としての見どころ

この作例は「プログラムを書き換えると、装置の動きが変わる」体験そのものが研究テーマになります。本物の信号機を観察して、同じ時間配分を再現する、という工程まで含めるとレポートが厚くなります。

研究の流れ
  1. 近所の信号機を観察して、赤・黄・緑の秒数を測る
  2. その時間を、Arduinoのプログラムに書き込む
  3. 実物と並べて、同じ動きをするか比べる
  4. もし違ったら、原因を考えて修正する

配線図 (ブレッドボード)

        a b c d e
       +─────────+
[+]rail| . . . . . | ← 5V (使わない)
[-]rail| . . . . . | ← GND (Arduino GND から)
       +─────────+
row 3  | X . . . . | ← SW 片足 (D2)
row 5  | X . . . . | ← SW 反対足 ([-]rail)
row 9  | X . . . . | ← 330Ω 上足 (D11 から)
row 10 | X . . . . | ← 330Ω 下足+赤LED アノード
row 12 | X . . . . | ← 赤LED カソード ([-]rail)
row 15 | X . . . . | ← 330Ω 上足 (D12 から)
row 16 | X . . . . | ← 330Ω 下足+黄LED アノード
row 18 | X . . . . | ← 黄LED カソード ([-]rail)
row 21 | X . . . . | ← 330Ω 上足 (D13 から)
row 22 | X . . . . | ← 330Ω 下足+緑LED アノード
row 24 | X . . . . | ← 緑LED カソード ([-]rail)
       +─────────+

部品同士のつながり

Arduino      役割
  D2  ←──   歩行者ボタン
  D11 ──→   330Ω → 赤LED → GND
  D12 ──→   330Ω → 黄LED → GND
  D13 ──→   330Ω → 緑LED → GND

歩行者ボタンは内蔵プルアップを使うので、片足をD2に、もう片足をGNDに繋ぐだけです。LEDは色が違っても回路の組み方は同じなので、3色とも同じパターンの配線になります。

プログラム

#define RED_PIN 11
#define YELLOW_PIN 12
#define GREEN_PIN 13
#define BUTTON_PIN 2

// 各色の点灯時間 (ミリ秒) — ここを変えて自分仕様に!
int greenTime = 5000;
int yellowTime = 2000;
int redTime = 5000;

void setup() {
  Serial.begin(9600);
  pinMode(RED_PIN, OUTPUT);
  pinMode(YELLOW_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  Serial.println("信号機 スタート!");
}

void loop() {
  showState("緑");
  digitalWrite(GREEN_PIN, HIGH);
  if (waitOrButton(greenTime)) { switchToRed(); return; }
  digitalWrite(GREEN_PIN, LOW);

  showState("黄");
  digitalWrite(YELLOW_PIN, HIGH);
  delay(yellowTime);
  digitalWrite(YELLOW_PIN, LOW);

  showState("赤");
  digitalWrite(RED_PIN, HIGH);
  delay(redTime);
  digitalWrite(RED_PIN, LOW);
}

// ボタンが押されたら true を返す (= 緊急で赤へ)
bool waitOrButton(int ms) {
  unsigned long start = millis();
  while (millis() - start < (unsigned long)ms) {
    if (digitalRead(BUTTON_PIN) == LOW) return true;
  }
  return false;
}

void switchToRed() {
  digitalWrite(GREEN_PIN, LOW);
  showState("黄 (歩行者ボタン)");
  digitalWrite(YELLOW_PIN, HIGH);
  delay(1000);
  digitalWrite(YELLOW_PIN, LOW);

  showState("赤 (歩行者ボタン)");
  digitalWrite(RED_PIN, HIGH);
  delay(redTime);
  digitalWrite(RED_PIN, LOW);
}

void showState(const char* state) {
  Serial.print("[状態] ");
  Serial.println(state);
}

プログラムの動き

stateDiagram-v2 [*] --> 緑 緑 --> 黄 : 5秒経過 緑 --> 緊急黄 : ボタン押下 緊急黄 --> 赤 : 1秒 黄 --> 赤 : 2秒経過 赤 --> 緑 : 5秒経過

これは「状態遷移図」と呼ばれる図で、どの状態から、どの状態に、どんな条件で移るかを表した図です。プログラミングではこの考え方がとても大事なので、覚えておくと役立ちます。

プログラムをいじって自由研究にしよう

プログラムが書き込めて動いたら、ここからが本番です。時間を変えて、いろいろ試してみましょう。

時間の調整実験 (試してみよう)
  1. 本物の交差点の信号と同じ時間にする
  2. 緑を短く、赤を長くしてみる (歩行者にやさしい信号)
  3. 黄を5秒に長くしてみる (なぜ黄は短いか考える)
  4. 歩行者ボタンを押した時の挙動を比較する
「黄を5秒に長くする」って、なんでそれが研究になるの?

本物の信号機の黄色は、道路や制限速度によって長さが違うんだ。近所の信号を実際に測って、自分の観察結果としてレポートにまとめると面白い研究になるよ。プログラムで5秒の黄色を作ってみると、長く感じることに気付けるはず。

レポートの書き方

プログラミング自由研究のレポートは、コードを載せるだけだと弱いです。次の構成を意識すると評価が上がります。

レポート構成のおすすめ
  1. 研究のきっかけ (なぜ信号機を選んだか)
  2. 本物の信号機の観察記録 (秒数、場所、写真)
  3. 使った部品と配線図
  4. プログラムの解説 (どこを書き換えると何が変わるか)
  5. 実物と自分の信号を比べた結果
  6. 分かったこと、不思議に思ったこと

改造のアイデア

発展アイデア
  1. 2つの方向用に、2セットのLED (合計6個) を交互に動かす
  2. パッシブブザーで「ピッピッ」と歩行者用音響信号を再現
  3. 夜モード (10秒ごとに黄点滅) を追加
  4. シリアルから時間設定をPC経由で変更できるようにする

まとめ

今回は、プログラミングを使った自由研究にぴったりな「自分仕様の信号機」の作り方を紹介しました。Arduino初心者キットだけで作れて、プログラム1行の書き換えで装置の動きが変わる、プログラミング学習として最高の題材です。

大切なのは、作って動かすだけでなく、本物と比べて違いを観察することです。なぜその設計になっているか、と考えることが、本当の研究の第一歩になります。

他にも初心者キットだけで作れるプログラミング作例を別の記事で紹介しているので、興味があれば見てみてね。