Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | |
| 16×2 キャラクタLCD (HD44780互換, 白文字/青背景) | 1 | Adafruit標準等 |
| タクトスイッチ (12mm, ブレークアウトボード付推奨) | 1 | 振動/衝撃センサー代用可 |
| 可変抵抗器 (10kΩ) | 1 | LCDコントラスト調整用 |
| ブレッドボード | 1 | |
| ジャンパーワイヤー | 1式 | |
| USBケーブル (A-B) | 1 | 電源/書き込み用 |
プロジェクト概要
物理ダイスに飽きた筆者が、ArduinoとLCDで「デジタルダイス」を自作したプロジェクトです。ボタン (または振動センサー) を押すと「Rolling dice...」表示後、1〜6の乱数を2個生成して表示します。シンプルながら、乱数シード生成やLCD制御、入力デバウンスの基礎が学べます。

配線 (LCD 4ビットモード)
| LCDピン | Arduinoピン | 備考 |
|---|---|---|
| VSS (GND) | GND | |
| VDD (VCC) | 5V | |
| VO (コントラスト) | 可変抵抗器中間端子 | 両端を5V/GND |
| RS | 7 | |
| RW | GND | 書き込み固定 |
| E | 8 | |
| D4 | 9 | |
| D5 | 10 | |
| D6 | 11 | |
| D7 | 12 | |
| A (バックライト+) | 5V (抵抗経由推奨) | |
| K (バックライト-) | GND |
ボタン/衝撃センサー
- 信号ピン → デジタルピン 2
- もう一方 → GND
- 内部プルアップ使用 (
pinMode(2, INPUT_PULLUP)) でアクティブLOW
スケッチ (改良版)
元コードの Shock 変数名を buttonPin に改名、randomSeed をアナログノイズから取得、デバウンス処理追加、カスタム文字 (ダイス風アイコン) 表示機能追加。
#include
// LCDピン定義 (RS, E, D4, D5, D6, D7)
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
const int buttonPin = 2; // ボタン/衝撃センサー入力
const int ledPin = 13; // 内蔵LED (ロール中点滅用)
// カスタム文字: ダイスの「・」パターン (8x5ドット)
byte diceDot[] = {
B00000,
B00000,
B01110,
B01110,
B01110,
B01110,
B00000,
B00000
};
unsigned long lastPress = 0;
const unsigned long debounceDelay = 200; // 200msデバウンス
void setup() {
lcd.begin(16, 2);
lcd.createChar(0, diceDot); // カスタム文字0登録
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
randomSeed(analogRead(A0)); // フローティングピンのノイズでシード生成
// 起動画面
lcd.clear();
lcd.write(byte(0));
lcd.print(F(" Digital Dice "));
lcd.write(byte(0));
delay(1500);
showStandby();
}
void loop() {
int btnState = digitalRead(buttonPin);
// 押下検出 (LOWアクティブ、デバウンス付き)
if (btnState == LOW && (millis() - lastPress > debounceDelay)) {
lastPress = millis();
rollDice();
}
}
void showStandby() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("Press to Roll"));
lcd.setCursor(0, 1);
lcd.write(byte(0));
lcd.print(F(" Ready! "));
lcd.write(byte(0));
}
void rollDice() {
lcd.clear();
lcd.print(F("Rolling dice..."));
// ロール演出: LED点滅 + 待機
for (int i = 0; i < 8; i++) {
digitalWrite(ledPin, i % 2);
delay(250);
}
digitalWrite(ledPin, LOW);
// 乱数生成 (1-6)
int dice1 = random(1, 7);
int dice2 = random(1, 7);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(F("Dice 1 = "));
lcd.print(dice1);
lcd.print(F(" "));
lcd.write(byte(0)); // ドットアイコン
lcd.setCursor(0, 1);
lcd.print(F("Dice 2 = "));
lcd.print(dice2);
lcd.print(F(" "));
lcd.write(byte(0));
// 合計値表示 (オプション)
lcd.setCursor(12, 1);
lcd.print(F("Sum:"));
lcd.print(dice1 + dice2);
delay(3000); // 3秒表示
showStandby();
}
動作確認
- 配線完了後、スケッチをアップロード
- LCDコントラストを可変抵抗で調整 (文字が見える位置)
- ボタンを押すと「Rolling dice...」→ 2個のダイス目表示
- 3秒後に待機画面に戻る
発展アイデア
- サイコロ個数を可変に (ボタン長押しで切替等)
- 履歴表示機能 (最後の10回分等)
- OLEDグラフィックディスプレイでダイス目をドット絵表示
- 加速度センサー (MPU6050等) で「振って振る」ジェスチャー対応
- ブザーでロール音效果音追加
- TRPG用: 任意面ダイス (d4, d8, d10, d20等) 対応
- バッテリー駆動 + スリープモードで携帯型ダイス化
製造プロセス
- TinyML言語検出器:Edge ImpulseとArduino Nano 33 BLE Senseで「はい」を多言語判別
- Arduino NanoとMPU-6050で作るリアルタイムジャイロスコープゲーム
- Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
- Arduino超音波センサーとProcessingで作るリアルタイム距離測定ソナー
- Arduino Nanoで作る音声反応デスクライト:音楽に合わせて光るイルミネーション
- Arduino Nanoで作るNeoPixelマトリックス版Pongゲーム
- ゲーム用カスタムArduinoジョイスティックハンドルの製作
- Arduino 101で作る万歩計:DHT11温湿度センサー&LCD表示付き
- Arduino RGBカラーミキサーの製作 - ステップバイステップチュートリアル