LoginSignup
3
0

More than 3 years have passed since last update.

7セグもどきで電子サイコロ

Last updated at Posted at 2018-12-15

これは CPS Lab Advent Calendar 2018 15日目の記事です.
14日目の記事は Labmartの顔認証を実装してみる - aj1m0nの日記
16日目の記事は Visual Studio Code でも TeX がしたい - たこつぼ

概要

LEDで作った7セグ電子サイコロ(0 ~ 9)を作成した.

Q.なぜ7セグを使わないの?

A.
DSC_0690.JPG

この 巨大7セグ 2個ほど 焼いたためです.

当初予定ではコイツを使って電子サイコロを作る予定でしたが,
壊れてしまった以上どうしようもなかったため,ラボに転がっていたLEDで代用し事なきを得ました.

巨大7セグについては後日改めて書きます.

使用したもの

7セグもどきのLED配線

赤い番号の書いてある側と記載した番号のデジタルピンを接続,GはGND接続.
*「2」なら,「2」の箇所と導通しているラインからデジタル2番ピンへ接続している.

また,

  • ゲームスイッチ: 常開端子をデジタル13番ピン,共通端子をGNDに接続

  • スピーカー: デジタル11番ピン,GNDに接続

として配線した.

デモ

動作フロー

抽選
↓ ボタンを押す
番号の表示
↓ ボタンを離す
抽選

… 以下,繰り返し

ソース

7seg_fake.ino
#define speakerPin 11
#define rollTone  349
#define stopTone  523

int number;
int buttonState;
unsigned long duration = 0;
unsigned long interval = 50;

void zero(){
  digitalWrite(2,HIGH);
  digitalWrite(3,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(6,HIGH);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);
}

void one(){
  digitalWrite(2,LOW);
  digitalWrite(3,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
}

void two(){
  digitalWrite(2,HIGH);
  digitalWrite(3,HIGH);
  digitalWrite(4,LOW);
  digitalWrite(5,HIGH);
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,HIGH);
}

void three(){
  digitalWrite(2,HIGH);
  digitalWrite(3,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,HIGH);
}

void four(){
  digitalWrite(2,LOW);
  digitalWrite(3,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,HIGH);
}

void five(){
  digitalWrite(2,HIGH);
  digitalWrite(3,LOW);
  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,HIGH);
}

void six(){
  digitalWrite(2,HIGH);
  digitalWrite(3,LOW);
  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(6,HIGH);
  digitalWrite(7,HIGH);
  digitalWrite(8,HIGH);
}

void seven(){
  digitalWrite(2,HIGH);
  digitalWrite(3,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);
}

void eight(){
  digitalWrite(2,HIGH);
  digitalWrite(3,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(6,HIGH);
  digitalWrite(7,HIGH);
  digitalWrite(8,HIGH);
}

void nine(){
  digitalWrite(2,HIGH);
  digitalWrite(3,HIGH);
  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,HIGH);
}

void diceRoll(){
  switch(number){
    case 0:
      zero();
      number = 1;
      break;

    case 1:
      one();
      number = 2;
      break;

    case 2:
      two();
      number = 3;
      break;

    case 3:
      three();
      number = 4;
      break;

    case 4:
      four();
      number = 5;
      break;

    case 5:
      five();
      number = 6;
      break;

    case 6:
      six();
      number = 7;
      break;

    case 7:
      seven();
      number = 8;
      break;

    case 8:
      eight();
      number = 9;
      break;

    case 9:
      nine();
      number = 0;
      break;
  }
  tone(speakerPin,rollTone,20);  
}

void setup(){
  // LED
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);

  // button
  pinMode(13, INPUT);
  buttonState = 0;
}

void loop(){
  switch(buttonState) {
    case 0:
      // check buttonState
      if (digitalRead(13) == HIGH) {
        buttonState = 1;
      }
      break;

    case 1:
      // dice Roll
      if ((unsigned long)(millis() - duration) >= interval) {
        duration = millis();
        diceRoll();
        if (digitalRead(13) == LOW) {
          tone(speakerPin,stopTone,50);  
          buttonState = 0;
          break;
        }
      }
      break;
  }
}

*補足: 数字遷移は50msで行なっている.

今後の予定

  • ゲームスイッチ操作による状態遷移の調整

    • 現状ではボタンを押している間しか数字が止まらない.
    • 折角c接点のスイッチを用いているので,スタート・ストップがスムーズに連続で行なえる様に改修したい.
  • 巨大7セグへの対応

    • 本来行なう予定だったことなので後日.
  • 2桁バージョンの作成

    • 現状の構成・ソースでは桁数増加に対応するのが大変なので,変化させやすいように改修したい.
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0