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

これは [CPS Lab Advent Calendar 2018](https://adventar.org/calendars/3058) 15日目の記事です．
14日目の記事は [Labmartの顔認証を実装してみる - aj1m0nの日記](https://aj1m0n.hatenablog.com/entry/2018/12/14/183422) ．
16日目の記事は [Visual Studio Code でも TeX がしたい - たこつぼ](http://takorras.hatenablog.com/entry/2018/12/24/235441)．

# 概要
**LEDで作った7セグ**で **電子サイコロ**(0 ~ 9)を作成した．

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

**A.**
![DSC_0690.JPG](https://qiita-image-store.s3.amazonaws.com/0/218217/580a6691-f937-e30f-6da0-2d1e02fcdb3f.jpeg)


**この [巨大7セグ](https://ja.aliexpress.com/item/5inch-1digit-red-7-segment-led-display-50101AS-50101BS-1pcs/32794195405.html) を** ~~2個ほど~~ **焼いたためです．**

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


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

# 使用したもの
- **Arduino UNO R3 : 1台**

- **LED**(適当) **: 7個**
[抵抗入りLED(25個パック) - 赤色](https://www.switch-science.com/catalog/3844/) を使用．

- **[ゲームスイッチ(赤)](http://akizukidenshi.com/catalog/g/gP-07248/)**
ｶﾁｶﾁしたかったのでゲームスイッチを選定．こだわりが無ければどんなスイッチでもOK．
強いて言えばオルタネイト動作スイッチの方が記述は楽です(今回は度外視)．
参考: [スイッチの動作方式と接点の構成 - 通販モノタロウ](https://www.monotaro.com/s/pages/productinfo/switch/)


- **[ブレッドボード用ダイナミックスピーカー](http://akizukidenshi.com/catalog/g/gP-12587/)**
賑やかし．無くても良い．

# 7セグもどきのLED配線
赤い番号の書いてある側と記載した番号のデジタルピンを接続，GはGND接続．
＊「2」なら，「2」の箇所と導通しているラインからデジタル2番ピンへ接続している．

<img src = "https://qiita-image-store.s3.amazonaws.com/0/218217/d3833a42-9ce9-bf1f-8a40-ee84726c9c9e.png" width="50%">

また，

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

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

として配線した．

# デモ
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">7セグ(?) で電子サイコロ <a href="https://twitter.com/hashtag/Arduino?src=hash&amp;ref_src=twsrc%5Etfw">#Arduino</a> <a href="https://t.co/Hcr2RCqPRT">pic.twitter.com/Hcr2RCqPRT</a></p>&mdash; Rone Loreto (@Rone_Loreto) <a href="https://twitter.com/Rone_Loreto/status/1073947967684411392?ref_src=twsrc%5Etfw">2018年12月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 動作フロー

`抽選`
 ↓ ボタンを押す
`番号の表示`
 ↓ ボタンを離す
`抽選`
 ↓
… 以下，繰り返し

# ソース

``` 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桁バージョンの作成**
  - 現状の構成・ソースでは桁数増加に対応するのが大変なので，変化させやすいように改修したい．