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


今回は、プログラミングを使った自由研究をやってみたい小中学生のお子さんに向けて、Arduino初心者キットだけで作れる「自分仕様の信号機」の作り方を紹介します。
赤・黄・緑のLED3色を、プログラムで決めたタイミングで光らせる装置です。本物の信号機の時間を測って同じように作ってもいいし、自分の家の前の通り用に短いサイクルにしてもOK。3つの時間設定を書き換えるだけで動きが変わる、自由研究にぴったりの題材です。
- 赤・黄・緑のLEDが信号機の順番で光る
- 歩行者用ボタンを押すと、黄色を1秒挟んでから赤に切り替わる
- 時間配分は緑・黄・赤の3つの数字を変えるだけで調整できる
- シリアルモニタで現在の状態が分かる
使う部品
| 部品 | 役割 | 個数 |
|---|---|---|
| Arduino UNO R3 | 装置の頭脳 | 1 |
| LED (赤、黄、緑) | 信号3色 | 各1 |
| 抵抗330Ω | LEDを保護 | 3 |
| タクトスイッチ | 歩行者ボタン | 1 |
| ブレッドボード | 配線をする台 | 1 |
| ジャンパーワイヤー | つなぐ線 | 9〜10本 |
プログラミング自由研究としての見どころ
この作例は「プログラムを書き換えると、装置の動きが変わる」体験そのものが研究テーマになります。本物の信号機を観察して、同じ時間配分を再現する、という工程まで含めるとレポートが厚くなります。
- 近所の信号機を観察して、赤・黄・緑の秒数を測る
- その時間を、Arduinoのプログラムに書き込む
- 実物と並べて、同じ動きをするか比べる
- もし違ったら、原因を考えて修正する
配線図 (ブレッドボード)
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);
}
プログラムの動き
これは「状態遷移図」と呼ばれる図で、どの状態から、どの状態に、どんな条件で移るかを表した図です。プログラミングではこの考え方がとても大事なので、覚えておくと役立ちます。
プログラムをいじって自由研究にしよう
プログラムが書き込めて動いたら、ここからが本番です。時間を変えて、いろいろ試してみましょう。
- 本物の交差点の信号と同じ時間にする
- 緑を短く、赤を長くしてみる (歩行者にやさしい信号)
- 黄を5秒に長くしてみる (なぜ黄は短いか考える)
- 歩行者ボタンを押した時の挙動を比較する


レポートの書き方
プログラミング自由研究のレポートは、コードを載せるだけだと弱いです。次の構成を意識すると評価が上がります。
- 研究のきっかけ (なぜ信号機を選んだか)
- 本物の信号機の観察記録 (秒数、場所、写真)
- 使った部品と配線図
- プログラムの解説 (どこを書き換えると何が変わるか)
- 実物と自分の信号を比べた結果
- 分かったこと、不思議に思ったこと
改造のアイデア
- 2つの方向用に、2セットのLED (合計6個) を交互に動かす
- パッシブブザーで「ピッピッ」と歩行者用音響信号を再現
- 夜モード (10秒ごとに黄点滅) を追加
- シリアルから時間設定をPC経由で変更できるようにする
まとめ
今回は、プログラミングを使った自由研究にぴったりな「自分仕様の信号機」の作り方を紹介しました。Arduino初心者キットだけで作れて、プログラム1行の書き換えで装置の動きが変わる、プログラミング学習として最高の題材です。
大切なのは、作って動かすだけでなく、本物と比べて違いを観察することです。なぜその設計になっているか、と考えることが、本当の研究の第一歩になります。

今日から始める電子工作 
