サーボモーターで舵取り!障害物を避ける車

第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度回転するモーターを買って、自走するようにします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)