今回は、ヒットセンサーを自作してみました。
以前、子供も交えたゲームをやってみたのですが、
そのときのジャガーノート役のライフを風船で設定していました。
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 件のコメント:
コメントを投稿