第10回 IoT×プログラミング教育
赤外線で障害物を避ける車を作ります。
モーターを使い、車体はレゴで組み立てます。
180度しか回らない!?サーボモーター
動力として手元にモーターが2つあります。
モーターの一つで車輪を回し、もう一つを舵取りに使うつもりです。
「よし!車作ろう!」
子供たちも期待しています。
手元にあるサーボモーター「SG90」の説明を読むと・・・
え?
180度しか回らない!?
それじゃ、車輪が回らないじゃん。
どうやらサーボモーターと、私の知っているミニ四駆で見たモーターとは、別物のようです。360度回りません。
・・・仕方ないので舵取りだけ作りましょう。
サーボモーターで舵の回転角度
サーボモーターの回転角度を制御するには、パルス信号を送る必要があるようです。
パルス信号の波の形で、回転角度が変わるようですが、深く追求しません。
デジタル出力3番ピンから、パルス信号を送る回路を作りましょう。
早くも小学レベルの理科知識では、厳しくなってきました。
回路が正しいのか分かりません。
もはやパーツが壊れても仕方ない・・・失敗から学びます。
サーボ制御のプログラム
パルス信号を作れということだったら、大変なことになりそうですが、ありがたいことにArduinoには、サーボモーターを動かすためのライブラリがあるようです。
#include <Servo.h> // サーボライブラリ読み込み Servo myservo; // サーボオブジェクト作成 void setup(){ myservo.attach(3); // サーボにパルスを送るピン } void loop(){ myservo.write(0); // 0度に回転 delay(1000); myservo.write(180); // 180度に回転 delay(1000); }
ありがたいほど、簡単に制御できます。
少し車の舵取りとしては、回転速度が早すぎでしょうか?
「1度ずつ回転→数ミリ秒遅延」の繰り返しで、回転速度を調整できるようにした方が良いかもしれません。
あとは、赤外線距離センサーで、障害物が近づいたときに舵をとるプログラミングを追加します。
#include <Servo.h> Servo myservo; int val = 0; // 距離センサーの変数 int pos = 0; // サーボの角度変数 void setup(){ myservo.attach(3); } void loop(){ val = analogRead(0); // 距離センサーの値取得 if(val > 300){ // 近くなったら for(pos = 0; pos < 45; ++pos){ // 45度になるまで myservo.write(pos); // 1度ずつ回転 delay(5); // 回転速度調整 } delay(1000); // 45度を1秒維持 for(pos = 45; pos > 0; --pos){ // 0度に戻す myservo.write(pos); delay(5); } }else{ myservo.write(0); // 遠いときはサーボを0度 } delay(100); }
これで、右か左か分かりませんが、45度舵をきって避けてくれるはずです。
レゴで車体組み立て
車体の組み立てにはレゴを使います。
Arduino本体と、ブレッドボードを載せる台は、てきとうに作れば大丈夫でしょう。
サーボモーターと赤外線センサーの固定は、レゴのジョイントパーツとかを駆使して作りました。
これに、車体と車輪を結合して・・・
全体像は、こうなりました。
自走することができないので、手押しです!
やってみましょう。
ハイテクそうで、ハイテクではない。
手で押しているのなら、手で向きを変えればいいので、微妙です。
長男「・・・」
お父さん「避けたの分かった?」
長男「うん。」
ちくしょう。驚きも何もない。
360度回転するモーターを買って、自走するようにします。