電子工作を始めて数ヶ月になりますが、これまではセンサを用いた実務的なものばかりを作ってきました。
この手のものばかりを作っていてもつまらないので、たまにはおもちゃを作ってみようと思い立ちました。
何かに反応して動くようなものを作りたいと思い、素材を探していると、これが見つかりました。
子供が数年前に買って、組み立て途中で放ったらかしになっていた「タミヤ 楽しい工作シリーズ組み立てキット リモコンロボット(クローラータイプ)」です。
これにArduinoを搭載し、スケッチに従って動く「ロボット」を作りたいと思います。
前後左右に動くだけで良いので、上のアーム部分とリモコンボックスは撤去し、各部のネジを締め直しました。
モーター2個で、前後左右の動きをコントロールできる状態になりました。
次に、Arduinoと、モータドライバIC(TA7291P) 2個を追加しました。ロボットが前後に動くだけのスケッチを作成し、正常に動くことを確認しました。
その後、四角を描くように動いたり、丸を描くように動いたりするようにスケッチを改良し、いずれも正常動作しました。見ていた子供は大喜びでした(やっぱり動くものは、子供の食いつきが違います)。
ロボットがArduinoで制御できるようになったので、次に、ロボットの全面左右に光センサを取り付けました。ロボットが左右の明るさの差を認識して、懐中電灯のある方向を向くようにしました。思ったより簡単に正常動作させることができました。
さらに、子供の提案を活かして、ロボットの後面にも光センサを追加しました。後ろから光をあてた時に、ロボットが反転するようにします。
あわせて、モータードライバICのVREF端子に、Arduino出力信号を繋ぐように変更しました。左右の明るさの差が大きい時には速く、差が小さい時にはゆっくり動くようにスケッチを改良しました。
できあがりです。
最終的な回路図は以下のとおりです。
また、スケッチは以下のとおりです。
int L1 = 5; int L2 = 6; int R1 = 3; int R2 = 4; int VREF = 9; int MaxSpeed = 200; int MinSpwwd = 120; void setup() { Serial.begin(9600); pinMode( A0, INPUT ); pinMode( A1, INPUT ); pinMode( A2, INPUT ); pinMode( L1, OUTPUT ); pinMode( L2, OUTPUT ); pinMode( R1, OUTPUT ); pinMode( R2, OUTPUT ); pinMode( VREF, OUTPUT ); } void loop() { int Beye = analogRead(A0); int Leye = analogRead(A1); int Reye = analogRead(A2); Serial.print(" L:"); Serial.print(Leye); Serial.print(" R:"); Serial.print(Reye); Serial.print(" B:"); Serial.print(Beye); Serial.println(); if(Beye-Leye>50 && Beye-Reye>50){ if(Leye>Reye){ analogWrite( VREF, MaxSpeed ); digitalWrite( L1, LOW ); digitalWrite( L2, HIGH ); digitalWrite( R1, HIGH ); digitalWrite( R2, LOW ); delay( 3000 ); } else{ analogWrite( VREF, MaxSpeed ); digitalWrite( L1, HIGH ); digitalWrite( L2, LOW ); digitalWrite( R1, LOW ); digitalWrite( R2, HIGH ); delay( 3000 ); } } else if(Leye-Reye>50){ int Speed = Leye-Reye+100; if(Speed>MaxSpeed){ Speed=MaxSpeed; } analogWrite( VREF, Speed ); digitalWrite( L1, LOW ); digitalWrite( L2, HIGH ); digitalWrite( R1, HIGH ); digitalWrite( R2, LOW ); delay( 50 ); } else if(Reye-Leye>50){ int Speed = Reye-Leye+100; if(Speed>MaxSpeed){ Speed=MaxSpeed; } analogWrite( VREF, Speed ); digitalWrite( L1, HIGH ); digitalWrite( L2, LOW ); digitalWrite( R1, LOW ); digitalWrite( R2, HIGH ); delay( 50 ); } else{ digitalWrite( L1, HIGH ); digitalWrite( L2, HIGH ); digitalWrite( R1, HIGH ); digitalWrite( R2, HIGH ); delay( 50 ); } }
動きはガタガタしていて、スケッチの各数値をチューニングする必要はありますが、とりあえず当初考えていた動作は実現できました。