スコアカウンター内蔵「イライラ棒」ゲームの製作:Arduino Nano 作品
プロジェクト概要
定番の「イライラ棒(Buzz Wire)」に、接触回数をカウントする 7 セグメント表示と、10 回失敗するとブザーと LED が激しく点滅する「ゲームオーバー演出」を追加した拡張版です。Arduino Nano とシフトレジスタ(74HC595)で 7 セグ LED を駆動し、シンプルな配線で実現しています。
主要パーツ
| パーツ | 数量 |
|---|---|
| Arduino Nano R3 | 1 |
| 74HC595 シフトレジスタ | 1 |
| 7 セグメント LED 表示器(赤、カソードコモン) | 1 |
| ブザー | 1 |
| 赤色 LED(ストップ表示用) | 1 |
| 緑色 LED(ゴー表示用) | 1 |
| 220Ω 抵抗 | 10 |
| 9V 電池 + スナップ | 1 |
必要な工具
- ドリル・ドライバー、はんだごて
ゲームルールとロジック
- リングをワイヤーに触れずにゴールまで運ぶ
- 接触するとブザーが鳴り、カウンターがインクリメント
- 接触後 500ms のグレース期間(コードで変更可)
- 10 回(閾値 9)失敗でゲームオーバー:ブザー高速ビープ + 7 セグ高速スクロール演出
- リングはキーホルダーの金具を流用(着脱容易)
配線のポイント
- 74HC595:Latch(D3), Clock(D4), Data(D2) → 7 セグメント各セグメントへ(220Ω 抵抗経由)
- ブザー → D8、赤 LED → D6、緑 LED → D7
- タッチ検知入力 → D10(内部プルダウン、ワイヤー接触で HIGH)
- 電源:9V 電池 → Nano VIN、GND 共通
ソースコード構成(3 ファイル)
nervous_meter_score.ino(メインループ)
int latchPin = 3, clockPin = 4, dataPin = 2;
const int STOP_LED = 6, GO_LED = 7, BUZZ = 8, TOUCH = 10;
const int fail_threshold = 9;
enum Status { STOP = 0, GO = 1 };
void setup() {
Serial.begin(9600);
displayInitialSetup();
gameInitialSetup();
}
Status status = GO;
int failCounter = 0;
void loop() {
while (failCounter > fail_threshold) { gameover(); }
switch (status) {
case GO:
digitalWrite(GO_LED, HIGH); digitalWrite(STOP_LED, LOW); digitalWrite(BUZZ, LOW);
if (digitalRead(TOUCH) == HIGH) status = STOP;
break;
case STOP:
digitalWrite(GO_LED, LOW);
failCounter++;
if (failCounter > fail_threshold) break;
displayDigit(failCounter);
Serial.println(failCounter);
failAlarm();
status = GO;
break;
}
}
void gameover() {
byte seg_spin[6] = { B10000000, B01000000, B00100000, B00010000, B00001000, B00000100 };
for (int i = 0; i < 6; i++) {
digitalWrite(BUZZ, HIGH); delay(5); digitalWrite(BUZZ, LOW); delay(50);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, seg_spin[i]);
digitalWrite(latchPin, HIGH); delay(10);
}
}
score_display.ino(7 セグ制御)
byte seg_digits[10] = {
B11111100, B01100000, B11011010, B11110010, B01100110,
B10110110, B10111110, B11100000, B11111110, B11100110
};
void displayDigit(int x) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, seg_digits[x]);
digitalWrite(latchPin, HIGH);
}
void displayInitialSetup() {
pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT);
displayDigit(0);
}
game.ino(効果音・初期化)
void gameInitialSetup() {
pinMode(STOP_LED, OUTPUT); pinMode(GO_LED, OUTPUT);
pinMode(BUZZ, OUTPUT); pinMode(TOUCH, INPUT_PULLDOWN);
}
void failAlarm() {
digitalWrite(STOP_LED, HIGH); beep(); delay(150);
digitalWrite(STOP_LED, LOW); digitalWrite(BUZZ, LOW); delay(500);
}
void beep() {
for (int i = 0; i < 3; i++) {
digitalWrite(BUZZ, HIGH); delay(50); digitalWrite(BUZZ, LOW); delay(50);
}
}
カスタマイズのヒント
- グレース期間(500ms)を長くして難易度調整
- LED 明るさが強ければ 220Ω → 470Ω 等に変更
- ワイヤー形状を複雑にしてコース難易度を上げる
- ゲームオーバー閾値(fail_threshold)を変更して長短調整
製造プロセス
- ティアラの芸術と職人技:歴史、素材、現代デザイン
- 有刺鉄線:歴史、構造、現代の用途
- Arduino Nano 33 IoT製 フライトシミュレーター2020用コックピットパネル - LCD&CDI表示
- Microsoft Flight Simulator 2020用Arduinoスイッチ&LEDパネル
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- 音声反応型 8 LED ライトディスプレイ
- MOSMusicプロジェクトキット: MOSFET、Arduinoで音楽同期照明制御
- E3.cableでE3.series電気プロジェクトのワイヤ挿入をマスター
- 複雑金型・ダイ生産向け先駆的ワイヤーEDMソリューション(重複記事:1007023971と同内容)
- タングステンワイヤメッシュは空気と反応するか?技術概観
- Python collections.Counter:効率的なカウント、更新、演算操作