見出し画像

手作り感のあるイライラ棒を自作してみた

0.完成品

動画は(https://youtu.be/fCAyP-paiOs)でご覧になれます。(表面)(表面)

(表面)


(裏面)


1.動機

マイコンの勉強を兼ねて変なものを作りたい気分だった。実用性のあるものではなく、かといってマニアが喜ぶものではなく、純粋に遊べるものが良いと思ったので。完成度は高くないけど、なんかやった気分にはなった。地味にイライラします。

2.製作したもの


① マイコンと周辺回路について

マイコンにはArduinoを用いた。スタート&各ステージの入り口&ゴールの合計5ヶ所にマイクロスイッチを配置し入力とした。また、導電性の棒を用意し線で繋ぎ、それも入力へと接続した。いずれにせよプルアップ抵抗を用いている。棒がアルミホイルに触れたらブザーが鳴りスタートから出戻る必要がある。また、マイクスイッチにてステージの切り替えを判断する。出力は以下ステージごとに説明する。


② ステージについて

3つのステージに分かれている。1つ目のステージには音が鳴るギミックを用意した。ゲームに音楽がなければ面白くない。ゲームが始まると音楽が鳴り出し、ステージ2に入った瞬間に音が消えるようにした。3端子メロディICを利用した。この部品は電源とGNDを接続したら音のデータを出力するというもの。Arduinoの出力ピンをICの電源とすることで音を出すか否かを制御する。その後段には2SC1815で簡易的に増幅する回路を入れてスピーカーを接続した。

2つ目のステージはLEDを点灯させるギミックである。華やかさを演出している。1つのシフトレジスタで8つのLEDが扱えるので5つシフトレジスタを用意して合計で40個のLEDを点灯させることにした。この配線作業が難しかった。

3つ目のステージはステッピングモータを回転させて障害物を避けるギミックである。サーボモータの駆動にはAmazonで売っている安いドライバを用いた。


(3端子メロディICと2SC1815)


(シフトレジスタの配線とマイクロスイッチ)


(モータードライバとブザー)


(シフトレジスタの配線とマイクロスイッチ)


(Arduino nanoを無理やり固定) 


(表から見たマイクロスイッチ)


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);
    }
  }
}

この記事が気に入ったらサポートをしてみませんか?