2020年2月2日
Ardiunoでレーザーガンの的を作ってみた
息子がサンタからもらったらしいレーザーガンの的として、レーザーが当たったら止まると言う車を作ってみた。土台とモーターは、学校で使ってた理科の教材。これにマルツで買ってきた、マイコン、赤外線センサー諸々を載っけてみた。久々に半田ゴテを握ったけど、やっぱりオモチャ作りは面白い.
赤外線センサーで受信し、LEDを光らせる程度から、あっと言う間に完成なのだが、モーターをからめたところでかなり難儀した。モーターからのノイズでセンサーがご検出してしまうのだ。電源も振られるようで、電源やモーターまわりにコンデンサを追加したりと、いろいろ苦労した。
ということでレシピの材料。
- レーザーガン: メガハウス レーザークロスシューティング
- Arduino:Maruduino UNO R3
- モータードライバシールド: Cytron SHIELD-2AMOTOR
- 赤外線センサー:KY-22
レーザーガンじゃなくとも赤外線であれば、なんにでも反応するので普通のリモコンでもOK。当初は、レーザガンのみに反応するようしたかったが、受信したコードを見ても???だったので断念。
基板を乗せる台座や、車輪、モーターなどは、息子が理科の授業でつかった教材を流用。
Arduinoとモーター用シールドの電源は別にしてる。そのためにシールドの電源ジャンパをPWRINに変更。回路図は以下の通り。
モータ端子のコンデンサはモータ本体に直付けした。
コードはこんな感じにした。
#include <Shield2AMotor.h>//モーター用シールドのヘッダファイル
#include <IRremote.h>//赤外線センサーのヘッダファイル
int recvpin = 2;//赤外線センサーピン
int buttonpin = 9;//スイッチボタンピン
int ledpin = 13;//LEDピン
IRrecv irrecv(recvpin);//赤外線センサーのオブジェクト
decode_results results;//センサー受信結果のオブジェクト
int swflg = 0;//モーターON-OFFのフラグ
//long ir_code;//センサー受信コード
int j = 0;//スイッチ切り替え直後のスイッチ操作を無効にするためのカウンター
int m = 0;//モーターを逆回転させるためのカウンター
int n = 0;//停止中のモーターを再回転させるためのカウンター
int mtrspeeds[] = {100, -100};//モータの回転角度。100=360度。
long mtr;//mtrspeedsの回転を指定する変数。
Shield2AMotor motor(SIGNED_MAGNITUDE);//モータシールドのモードをSIGNED_MAGNITUDEに。
//signed int motor1Speed;
void setup() {
pinMode(buttonpin, INPUT_PULLUP);
pinMode(ledpin, OUTPUT);
irrecv.enableIRIn(); //赤外線受信開始
}
void loop() {
j++;
//スイッチ切り替え直後(j=0)はスイッチ切り替えしないようjでカウント
if (digitalRead(buttonpin) == LOW && j > 10)
{
//モーターON-OFFのフラグを反転
if (swflg == 0)
{
swflg = 1;
}
else
{
swflg = 0;
m = 0;//モータのカウンタもリセット。
}
j = 0;//スイッチ切り替えのカウンタをリセット。
delay(10);
}
//赤外線を受信したら。
if (irrecv.decode(&results))
{
irrecv.resume();//赤外線センサーをリセット。
//ir_code = results.value;
//赤外線タイプ-1、3でモーター停止。
if ((results.decode_type == -1||results.decode_type == 3)&&j>10)
{
//モーター回転中ならこれを停止。
if (swflg == 1)
{
swflg = 0;//モーターON-OFFフラグを停止に。
digitalWrite(ledpin, HIGH);//LEDを点灯。
n=1;//モータ再回転カウンターを1に。
}
j = 0;//スイッチ切り替えのカウンタをリセット。
delay(10);
}
}
//モーターON-OFFフラグが回転なら。
if (swflg == 1)
{
m++;//モーター逆回転カウンターをカウントアップ。
digitalWrite(ledpin, LOW);//回転中はLED消灯。
if(m < 15)
{
mtr = 0;//モーター逆回転カウンターが15未満なら正回転に。
}
else
{
mtr = 1;//モーター逆回転カウンターが15以上なら逆回転に。
if(m > 30)
{
m = 0;//モーター逆回転カウンターが30超えならカウンターリセット。
}
}
delay(10);
//モーター逆回転カウンターに応じてモーターを回転。
motor.control(mtrspeeds[mtr], 0);
delay(10);
}
else
{
motor.control(0, 0);//モーターを停止。
delay(10);
//モーター再回転カウンターが1以上100未満はカウントアップ。
if(n>0&&n<100)
{
n++;
}
//モーター再回転カウンターが100以上でカウンターリセット。モーターON-OFFフラグを回転に。
else if(n>99)
{
n = 0;
swflg = 1;
}
}
delay(100);
}
スイッチONでモータースタート。そのままだと同距離で往復を繰り返す。赤外線があたると、モータは停止し、赤LEDが点灯。しばらくすると、LEDが消灯し、モーターが回転し始める。
台座がしょぼいので、こどもが遊ぶにはもうちょっと強化すべきかも・・・。