SHIROのIchigoJam日記

マイコン「IchigoJam」(イチゴジャム)の電子工作とプログラミングをメインに

Arduino+7セグメントLEDでルーレット

数年前から、マイコンArduino」を使った電子工作をいろいろ試しています。
昨年末に開発環境「Arduino IDE」のVer1.0が出て、使いやすくなったのではないかと思います。
自分が電気工作が好きなこともあるのですが、本業の情報センターで子ども向けの「ICTジュニア」(上田パソコンクラブ)や、中学生向けの職場体験を担当しているので、子ども向けにマイコンを使って何かおもしろい事ができないかと考えています。

簡単な所で、7セグメントLEDを使ったルーレットの作例。
2枚のブレッドボードを使って、片方がArduino nanoを装着したCPU基板、もう片方を7セグメントLEDを載せたディスプレイ基板としています。
動作動画はこちら。

実体写真はこちら。

回路図は以下のとおり。
なお、作図にはフリーの回路図作成ソフト「BSch3V」を使っています。

Arduinoのプログラムは以下のとおりです。
2進数8桁でフォントを設定しているのですが、中学生には難しいかも。
数字によってifやcaseで条件分けしてLEDを点灯させた方がわかりやすいかもしれません。

/*
7セグメントLED1桁ルーレット
押しボタンで動作
*/

/* 7セグメントLEDパターン
   0
  5 1
   6
  4 2
   3 7
*/
// LEDポート変換
int LedPort[] = {2,3,5,6,7,9,8,4};

// スイッチポート
int PortSw = 13;

// インターバル、ループ
long Interval0 = 50;
long Interval1 = 100;
int Loop1 = 8;
long Interval2 = 1000;
int Loop2 = 5;

// フォント
//         bit 76543210
int Font[] = {B00111111  //0
             ,B00000110  //1
             ,B01011011  //2
             ,B01001111  //3
             ,B01100110  //4
             ,B01101101  //5
             ,B01111101  //6
             ,B00100111  //7
             ,B01111111  //8
             ,B01101111  //9
             ,B00000001  //LED-A
             ,B00000010  //LED-B
             ,B00000100  //LED-C
             ,B00001000  //LED-D
             ,B00010000  //LED-E
             ,B00100000  //LED-F
             };

void setup()
{
  // LEDポートを出力モードに
  for (int i = 0; i <= 7; i++){
    pinMode(LedPort[i], OUTPUT);
  }
  
  // スイッチポートを入力モードに
  pinMode(PortSw, INPUT);
  
  // 乱数初期化
  randomSeed(analogRead(0));
}

void loop()
{
  int x;
  int RoundLoop;
  int r;
  
  // ボタンが押されるまでぐるぐる回る
  RoundLoop = 10;
  while (digitalRead(PortSw) == HIGH) {
    x = LedNumberOn(RoundLoop);
    delay(Interval0);
    RoundLoop++;
    if (RoundLoop > 15) {
      RoundLoop = 10;
    }
  }
  
  // 数字を減速しながら表示
  for (int i = 0; i <= Loop1; i++) {
    r = random(0, 10);
    x = LedNumberOn(r);
    delay(Interval1 * i);
  }
  
  // 数字を決定、点滅
  r = random(0, 10);
  
  for (int i = 0; i <= Loop2; i++) {
    x = LedNumberOn(r);
    delay(Interval2);
    x = LedClr();
    delay(Interval2);
  }
}

/* LED1桁数字表示関数 */
int LedNumberOn(int p){

  int Mask = 1;
  
  for (int i = 0; i <= 7; i++){
    if ((Font[p] & Mask) != 0){
      digitalWrite(LedPort[i], HIGH);
    }
    else {
      digitalWrite(LedPort[i], LOW);
    }
    Mask = Mask * 2;
  }

}
/* LEDクリア関数 */
int LedClr(){

  for (int i = 0; i <= 7; i++){
    digitalWrite(LedPort[i], LOW);
  }

}