これは CPS Lab Advent Calendar 2018 15日目の記事です.
14日目の記事は Labmartの顔認証を実装してみる - aj1m0nの日記 .
16日目の記事は Visual Studio Code でも TeX がしたい - たこつぼ.
概要
LEDで作った7セグで 電子サイコロ(0 ~ 9)を作成した.
Q.なぜ7セグを使わないの?
この 巨大7セグ を 2個ほど 焼いたためです.
当初予定ではコイツを使って電子サイコロを作る予定でしたが,
壊れてしまった以上どうしようもなかったため,ラボに転がっていたLEDで代用し事なきを得ました.
巨大7セグについては後日改めて書きます.
使用したもの
-
Arduino UNO R3 : 1台
-
LED(適当) : 7個
抵抗入りLED(25個パック) - 赤色 を使用. -
ゲームスイッチ(赤)
カチカチしたかったのでゲームスイッチを選定.こだわりが無ければどんなスイッチでもOK.
強いて言えばオルタネイト動作スイッチの方が記述は楽です(今回は度外視).
参考: スイッチの動作方式と接点の構成 - 通販モノタロウ -
ブレッドボード用ダイナミックスピーカー
賑やかし.無くても良い.
7セグもどきのLED配線
赤い番号の書いてある側と記載した番号のデジタルピンを接続,GはGND接続.
*「2」なら,「2」の箇所と導通しているラインからデジタル2番ピンへ接続している.
また,
-
ゲームスイッチ: 常開端子をデジタル13番ピン,共通端子をGNDに接続
-
スピーカー: デジタル11番ピン,GNDに接続
として配線した.
デモ
7セグ(?) で電子サイコロ #Arduino pic.twitter.com/Hcr2RCqPRT
— Rone Loreto (@Rone_Loreto) 2018年12月15日
動作フロー
抽選
↓ ボタンを押す
番号の表示
↓ ボタンを離す
抽選
↓
… 以下,繰り返し
ソース
#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桁バージョンの作成
- 現状の構成・ソースでは桁数増加に対応するのが大変なので,変化させやすいように改修したい.