工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作

必要な部品と材料

部品数量備考
Arduino UNO1
16×2 キャラクタLCD (HD44780互換, 白文字/青背景)1Adafruit標準等
タクトスイッチ (12mm, ブレークアウトボード付推奨)1振動/衝撃センサー代用可
可変抵抗器 (10kΩ)1LCDコントラスト調整用
ブレッドボード1
ジャンパーワイヤー1式
USBケーブル (A-B)1電源/書き込み用

プロジェクト概要

物理ダイスに飽きた筆者が、ArduinoとLCDで「デジタルダイス」を自作したプロジェクトです。ボタン (または振動センサー) を押すと「Rolling dice...」表示後、1〜6の乱数を2個生成して表示します。シンプルながら、乱数シード生成やLCD制御、入力デバウンスの基礎が学べます。

Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作

配線 (LCD 4ビットモード)

LCDピンArduinoピン備考
VSS (GND)GND
VDD (VCC)5V
VO (コントラスト)可変抵抗器中間端子両端を5V/GND
RS7
RWGND書き込み固定
E8
D49
D510
D611
D712
A (バックライト+)5V (抵抗経由推奨)
K (バックライト-)GND

ボタン/衝撃センサー

スケッチ (改良版)

元コードの 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();
}

動作確認

  1. 配線完了後、スケッチをアップロード
  2. LCDコントラストを可変抵抗で調整 (文字が見える位置)
  3. ボタンを押すと「Rolling dice...」→ 2個のダイス目表示
  4. 3秒後に待機画面に戻る

発展アイデア

製造プロセス

  1. TinyML言語検出器:Edge ImpulseとArduino Nano 33 BLE Senseで「はい」を多言語判別
  2. Arduino NanoとMPU-6050で作るリアルタイムジャイロスコープゲーム
  3. Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
  4. ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
  5. DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
  6. Arduino超音波センサーとProcessingで作るリアルタイム距離測定ソナー
  7. Arduino Nanoで作る音声反応デスクライト:音楽に合わせて光るイルミネーション
  8. Arduino Nanoで作るNeoPixelマトリックス版Pongゲーム
  9. ゲーム用カスタムArduinoジョイスティックハンドルの製作
  10. Arduino 101で作る万歩計:DHT11温湿度センサー&LCD表示付き
  11. Arduino RGBカラーミキサーの製作 - ステップバイステップチュートリアル