![見出し画像](https://assets.st-note.com/production/uploads/images/96139031/rectangle_large_type_2_3fd824a7cff68736a30028cd82a63189.jpeg?width=1200)
手作り感のあるイライラ棒を自作してみた
0.完成品
動画は(https://youtu.be/fCAyP-paiOs)でご覧になれます。(表面)(表面)
![](https://assets.st-note.com/img/1674287808596-cxpsFysPqT.jpg)
![](https://assets.st-note.com/img/1674287824696-yDZTbM9UX3.jpg)
1.動機
マイコンの勉強を兼ねて変なものを作りたい気分だった。実用性のあるものではなく、かといってマニアが喜ぶものではなく、純粋に遊べるものが良いと思ったので。完成度は高くないけど、なんかやった気分にはなった。地味にイライラします。
2.製作したもの
① マイコンと周辺回路について
マイコンにはArduinoを用いた。スタート&各ステージの入り口&ゴールの合計5ヶ所にマイクロスイッチを配置し入力とした。また、導電性の棒を用意し線で繋ぎ、それも入力へと接続した。いずれにせよプルアップ抵抗を用いている。棒がアルミホイルに触れたらブザーが鳴りスタートから出戻る必要がある。また、マイクスイッチにてステージの切り替えを判断する。出力は以下ステージごとに説明する。
② ステージについて
3つのステージに分かれている。1つ目のステージには音が鳴るギミックを用意した。ゲームに音楽がなければ面白くない。ゲームが始まると音楽が鳴り出し、ステージ2に入った瞬間に音が消えるようにした。3端子メロディICを利用した。この部品は電源とGNDを接続したら音のデータを出力するというもの。Arduinoの出力ピンをICの電源とすることで音を出すか否かを制御する。その後段には2SC1815で簡易的に増幅する回路を入れてスピーカーを接続した。
2つ目のステージはLEDを点灯させるギミックである。華やかさを演出している。1つのシフトレジスタで8つのLEDが扱えるので5つシフトレジスタを用意して合計で40個のLEDを点灯させることにした。この配線作業が難しかった。
3つ目のステージはステッピングモータを回転させて障害物を避けるギミックである。サーボモータの駆動にはAmazonで売っている安いドライバを用いた。
![](https://assets.st-note.com/img/1674287853881-2kAGd95nJi.jpg)
![](https://assets.st-note.com/img/1674287864300-owwsBB1riC.jpg)
![](https://assets.st-note.com/img/1674287874245-tZLoMQJe7M.jpg)
![](https://assets.st-note.com/img/1674287886968-u6E30qotFN.jpg)
![](https://assets.st-note.com/img/1674287896890-9rZmJExBxh.jpg)
![](https://assets.st-note.com/img/1674287905548-X5QK3QlAWO.jpg)
3.プログラムについて
ピンの設定と点灯パターンの定義は次の通り。
#include <Stepper.h>
/*入力ピンの名前を設定*/
#define MSW1 A3
#define MSW2 A0
#define MSW3 A1
#define MSW4 A2
#define BIRISW A4
/*出力ピンの名前を設定*/
#define MOTPIN1 2
#define MOTPIN2 3
#define MOTPIN3 4
#define MOTPIN4 5
#define SER 8
#define LATCH 9
#define CLK 10
#define MUSIC 7
#define BIRIBIRI 11
/*ピンの入出力を設定*/
void setup() {
pinMode(MSW1, INPUT);
pinMode(MSW2, INPUT);
pinMode(MSW3, INPUT);
pinMode(MSW4, INPUT);
pinMode(BIRISW, INPUT);
pinMode(SER, OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLK, OUTPUT);
pinMode(MUSIC, OUTPUT);
pinMode(BIRIBIRI, OUTPUT);
}
/*LEDの点灯パターンの定義*/
byte patternsA[] = {
B10000000,
B01000000,
B00100000,
B00010000,
B00001000,
B00000100,
B00000010,
B00000001,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
};
byte patternsB[] = {
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B10000000,
B01000000,
B00100000,
B00010000,
B00001000,
B00000100,
B00000010,
B00000001,
};
シフトレジスタへの信号の関数は次の通り。
/*LEDの関数*/
void LED(bool OnOff) {
if (OnOff == true) {
while (1) { //digitalRead(BIRISW) != HIGH && digitalRead(MSW3) != HIGH
for ( int i = 0; i < sizeof(patternsA) / sizeof(byte); i++ ) {
digitalWrite( LATCH, LOW );
shiftOut( SER, CLK, LSBFIRST, patternsA[i] );
shiftOut( SER, CLK, LSBFIRST, patternsB[i] );
digitalWrite( LATCH, HIGH );
delay(200);
if (digitalRead(BIRISW) == HIGH) {
break;
}
if (digitalRead(MSW3) == HIGH) {
break;
}
}
if (digitalRead(BIRISW) == HIGH) {
break;
}
if (digitalRead(MSW3) == HIGH) {
break;
}
}
} else {
for ( int i = 0; i < sizeof(patternsA) / sizeof(byte); i++ ) {
digitalWrite( LATCH, LOW );
shiftOut( SER, CLK, LSBFIRST, 00000000 );
shiftOut( SER, CLK, LSBFIRST, 00000000 );
digitalWrite( LATCH, HIGH );
}
}
}
モータとゴールの音を鳴らす関数は次の通り。
/*モータの設定*/
#define STEP 2048 //ステッピングモーター(出力軸)が1回転するのに必要なステップ数
Stepper stepper(STEP, MOTPIN1, MOTPIN3, MOTPIN2, MOTPIN4); // オブジェクトの作成
int i,pulse;
/*ステッピングモータの関数*/
void motor(float angle) {
pulse=angle*2048/360;
stepper.setSpeed( 15 );
while (1) {
for (i = 0; i < pulse ; i++) {
stepper.step( 1 );
if (digitalRead(BIRISW) == HIGH) {break;}
if (digitalRead(MSW4) == HIGH) {break;}
}
if (digitalRead(BIRISW) == HIGH) {break;}
if (digitalRead(MSW4) == HIGH) {break;}
for (i = 0; i < pulse ; i++) {
stepper.step( -1 );
if (digitalRead(BIRISW) == HIGH) {break;}
if (digitalRead(MSW4) == HIGH) {break;}
}
if (digitalRead(BIRISW) == HIGH) {break;}
if (digitalRead(MSW4) == HIGH) {break;}
}
}
/*ゴールの関数*/
void goal() {
tone(BIRIBIRI,262,200) ; // ド
delay(100) ;
tone(BIRIBIRI,294,200) ; // レ
delay(100) ;
tone(BIRIBIRI,330,200) ; // ミ
delay(200) ;
}
メイン関数は次の通り。
void loop() {
/*ステージ変数の切り替え*/
int stage;
stage = 0;
if (digitalRead(MSW1) == LOW) {
stage = 1; //開始のマイクロスイッチが押されたとき
} else if (digitalRead(MSW2) == HIGH) {
stage = 2; //ステージ2の入口のスイッチが押されたとき
} else if (digitalRead(MSW3) == HIGH) {
stage = 3; //ステージ3の入口のスイッチが押されたとき
} else if (digitalRead(MSW4) == HIGH) {
stage = 4; //終了のスイッチが押されたとき
} else {
stage = 0; //押された瞬間以外はとりあえずstageに0が代入される
}
/*LED表示の切り替え*/
if (stage == 1) {
digitalWrite( MUSIC, HIGH );
LED(false);
} else if (stage == 2) {
digitalWrite( MUSIC, LOW );
LED(true);
} else if (stage == 3) {
digitalWrite( MUSIC, LOW );
LED(false);
motor(120);
} else if (stage == 4) {
digitalWrite( MUSIC, LOW );
LED(false);
goal();
} else {
if (digitalRead(BIRISW) == HIGH) {
LED(false);
digitalWrite( MUSIC, LOW );
tone(BIRIBIRI,262,200);
} else {
LED(false);
}
}
}
この記事が気に入ったらサポートをしてみませんか?