2015年8月30日日曜日

BB弾ヒットセンサーの作成(Arduino)

サバゲー熱は電子工作熱へと変化しているようです。
今回は、ヒットセンサーを自作してみました。






以前、子供も交えたゲームをやってみたのですが、
そのときのジャガーノート役のライフを風船で設定していました。
10禁だとなかなか風船を割ることが出来ず、
折角子供たちが狙った位置に撃っても、それをちゃんと
反映させてあげることが出来ませんでした。
次に子供が参加するときには、ちゃんと当てたっていう実感を
持たせてあげたい!というのが、作成の動機です。

では、材料と値段から。
すべてをリンク先から買ったわけではないですが、参考までに。
アルミ板なんかは送料掛かるんで、ホームセンターとかの方が
良いでしょう。

arduino uno(互換品)    約600円
オルタネートプッシュスイッチ  400円
抵抗(1KΩ) 100円
ユニバーサル基盤 70円
抵抗入りLED(5V・赤・緑・黄)  120円×3
DCプラグ  30円
圧電素子 98円
自励式大音量ブザー  250円
ケース 594円
アルミ板 595円
緩衝材(両面付発砲ゴムシート)  476円

計3573円+α
(送料とか、電源がなければ電源とか9V電池とか、
7.4vリポの余ってる奴でOK)


コイツを下記の画像のように実装します。

で、スケッチ(プログラム)が下記となります。

int countdown = 2;                    //無敵回数
int waittime = 0;                     //無敵時間カウント用
int muteki = 5000;                    //無敵時間 
int valA ;                            //衝撃計算用
int valB ;
int valC ;
int val1;                             //ノイズ除去のため、平均取得用
int val2;
int val3;
int val4;
int val5;
int val6;
int val7;
int val8;
int val9;
int val10;
int palse = 255;                      //音量0-255
int flash = 100;                      //点滅スピード
int sense = 30;                       //感度
void setup() {
  Serial.begin(9600);
  pinMode(3, OUTPUT);                 //ブザー出力用
  pinMode(13, OUTPUT);                //LED点灯用(緑)
  pinMode(11, OUTPUT);                //LED点灯用(黄)
  pinMode(9, OUTPUT);                 //LED点灯用(赤)
  pinMode(5, OUTPUT);                 //LED点灯用(青)
}
void loop() {
  digitalWrite(5, HIGH);
  val1 = analogRead(5) ;
  val2 = analogRead(5) ;
  val3 = analogRead(5) ;
  val4 = analogRead(5) ;
  val5 = analogRead(5) ;
  val6 = analogRead(5) ;
  val7 = analogRead(5) ;
  val8 = analogRead(5) ;
  val9 = analogRead(5) ;
  val10 = analogRead(5) ;
  valA = (val1 + val2 + val3 + val4 + val5 + val6 + val7 + val8 + val9 + val10) / 10; 
 //ピエゾ素子の入力ばらつきを抑えるため、平均値出力

  val1 = analogRead(5) ;
  val2 = analogRead(5) ;
  val3 = analogRead(5) ;
  val4 = analogRead(5) ;
  val5 = analogRead(5) ;
  val6 = analogRead(5) ;
  val7 = analogRead(5) ;
  val8 = analogRead(5) ;
  val9 = analogRead(5) ;
  val10 = analogRead(5) ;
  valB = (val1 + val2 + val3 + val4 + val5 + val6 + val7 + val8 + val9 + val10) / 10; 
//ピエゾ素子の入力ばらつきを抑えるため、平均値出力
  valC = valB - valA;                                               //入力電圧の変動を検知
  Serial.println(abs(valC));
  if (millis() >= waittime) {
    if (countdown == 2 ) {
      if (abs(valC) > sense) {
        analogWrite(3, palse);

        digitalWrite(13, HIGH);
        delay(flash);
        digitalWrite(13, LOW);
        delay(flash);

        digitalWrite(13, HIGH);
        delay(flash);
        digitalWrite(13, LOW);
        delay(flash);

        digitalWrite(13, HIGH);
        delay(flash);
        digitalWrite(13, LOW);
        delay(flash);

        digitalWrite(13, HIGH);
        delay(flash);
        digitalWrite(13, LOW);
        delay(flash);
        digitalWrite(13, HIGH);
        delay(flash);
        analogWrite(3, 0);
        countdown = countdown - 1;
        waittime=millis()+muteki;
      }
    }
    else if (countdown == 1 ) {
      if (abs(valC) > sense) {
        analogWrite(3, palse);

        digitalWrite(11, HIGH);
        delay(flash);
        digitalWrite(11, LOW);
        delay(flash);

        digitalWrite(11, HIGH);
        delay(flash);
        digitalWrite(11, LOW);
        delay(flash);

        digitalWrite(11, HIGH);
        delay(flash);
        digitalWrite(11, LOW);
        delay(flash);

        digitalWrite(11, HIGH);
        delay(flash);
        digitalWrite(11, LOW);
        delay(flash);
        digitalWrite(11, HIGH);
        delay(flash);
        analogWrite(3, 0);
        countdown = countdown - 1;
        waittime=millis()+muteki;
      }
    }
    else if (countdown == 0 ) {
      if (abs(valC) > sense) {
        analogWrite(3, palse);

        digitalWrite(9, HIGH);
        digitalWrite(11, HIGH);
        digitalWrite(13, HIGH);
        delay(flash);
        digitalWrite(9, LOW);
        digitalWrite(11, LOW);
        digitalWrite(13, LOW);
        delay(flash);

        digitalWrite(9, HIGH);
        digitalWrite(11, HIGH);
        digitalWrite(13, HIGH);
        delay(flash);
        digitalWrite(9, LOW);
        digitalWrite(11, LOW);
        digitalWrite(13, LOW);
        delay(flash);

        digitalWrite(9, HIGH);
        digitalWrite(11, HIGH);
        digitalWrite(13, HIGH);
        delay(flash);
        digitalWrite(9, LOW);
        digitalWrite(11, LOW);
        digitalWrite(13, LOW);
        delay(flash);

        digitalWrite(9, HIGH);
        digitalWrite(11, HIGH);
        digitalWrite(13, HIGH);
        delay(flash);
        digitalWrite(9, LOW);
        digitalWrite(11, LOW);
        digitalWrite(13, LOW);
        delay(flash);

        digitalWrite(9, HIGH);
        digitalWrite(11, HIGH);
        digitalWrite(13, HIGH);
        delay(flash);
        digitalWrite(9, LOW);
        digitalWrite(11, LOW);
        digitalWrite(13, LOW);
        delay(flash);

        digitalWrite(9, HIGH);
        digitalWrite(11, HIGH);
        digitalWrite(13, HIGH);
        delay(flash);
        digitalWrite(9, LOW);
        digitalWrite(11, LOW);
        digitalWrite(13, LOW);
        delay(flash);

        digitalWrite(9, HIGH);
        digitalWrite(11, HIGH);
        digitalWrite(13, HIGH);
        delay(flash);
        digitalWrite(9, LOW);
        digitalWrite(11, LOW);
        digitalWrite(13, LOW);
        delay(flash);

        digitalWrite(9, HIGH);
        digitalWrite(11, HIGH);
        digitalWrite(13, HIGH);
        delay(flash);
        digitalWrite(9, LOW);
        digitalWrite(11, LOW);
        digitalWrite(13, LOW);
        delay(flash);

        digitalWrite(9, HIGH);
        digitalWrite(11, HIGH);
        digitalWrite(13, HIGH);
        delay(flash);
        digitalWrite(9, LOW);
        digitalWrite(11, LOW);
        digitalWrite(13, LOW);
        delay(flash);

        digitalWrite(9, HIGH);
        digitalWrite(11, HIGH);
        digitalWrite(13, HIGH);
        delay(flash);
        analogWrite(3, 0);
        countdown = countdown - 1;
      }
    }
    
  }
}                             //ここまで


久しぶりのプログラミングで、無駄が多いですが、
これで一応中々の精度で、ヒットの検出が可能となっております。



0 件のコメント:

コメントを投稿