障害物回避ロボットは、前方の障害物を自動的に感知し、別の方向に回転することで障害物を回避できるインテリジェントデバイスです。この設計により、自律移動ロボットの主要な要件である衝突を回避することで、ロボットが未知の環境をナビゲートできるようになります。障害物回避ロボットの用途は制限されておらず、現在ほとんどの軍事組織で使用されており、兵士が実行できない多くの危険な仕事を遂行するのに役立ちます。
以前、RaspberryPiとPICマイクロコントローラーを使用して障害物回避ロボットを構築しました。今回は、超音波センサーとArduinoを使用して障害物回避ロボットを構築します。ここでは、超音波センサーを使用して、ロボットと障害物の間の距離を計算することにより、経路内の障害物を検知します。ロボットが障害物を見つけると、方向を変えて動き続けます。
超音波センサーを使用して障害物回避ロボットを構築する方法
超音波センサーは障害物の検出に重要な役割を果たすため、ロボットを構築する前に、超音波センサーがどのように機能するかを理解することが重要です。超音波センサーの動作の背後にある基本原理は、センサーが超音波ビームを送信し、表面に当たった後に超音波ビームを受信するのにかかる時間を書き留めることです。次に、式を使用して距離がさらに計算されます。このプロジェクトでは、広く利用可能なHC-SR04超音波センサーが使用されます。このセンサーを使用するには、上記で説明した同様のアプローチに従います。
したがって、HC-SR04のTrigピンは少なくとも10usの間Highになります。音波ビームは、それぞれ40KHzの8つのパルスで送信されます。
その後、信号は表面に当たり、戻ってHC-SR04のレシーバーエコーピンによってキャプチャされます。エコーピンは、ハイを送信した時点ですでにハイになっています。
ビームが戻るのにかかる時間は変数に保存され、以下のような適切な計算を使用して距離に変換されます
距離=(時間x空気中の音速(343 m / s))/ 2
私たちは多くのプロジェクトで超音波センサーを使用しました。超音波センサーの詳細については、超音波センサーに関連する他のプロジェクトを確認してください。
この障害物回避ロボットのコンポーネントは簡単に見つけることができます。シャーシを作成するために、任意のおもちゃのシャーシを使用することも、カスタムメイドすることもできます。
必要なコンポーネント
- Arduino NANOまたはUno(任意のバージョン)
- HC-SR04超音波センサー
- LM298Nモータードライバーモジュール
- 5VDCモーター
- 電池
- ホイール
- シャーシ
- ジャンパー線
回路図
Arduino nanoを使用していることがわかるように、このプロジェクトの完全な回路図を以下に示します。ただし、同じ回路(同じピン配置に従う)とコードでArduino UNOを使用して、障害物回避ロボットを構築することもできます。
回路の準備ができたら、以下に示すように、ロボットシャーシの上に回路を組み立てて、障害物を回避する車を構築する必要があります。
Arduinoを使用した障害物回避ロボット-コード
このプロジェクトの最後に、デモビデオ付きの完全なプログラムが提供されます。プログラムには、HC-SR04モジュールのセットアップと、それに応じてモーターの方向を移動するための信号をモーターピンに出力することが含まれます。このプロジェクトではライブラリは使用されません。
まず、プログラムでHC-SR04のトリガーとエコーピンを定義します。このプロジェクトでは、トリガーピンはGPIO9に接続され、エコーピンはArduinoNANOのGPIO10に接続されます。
int trigPin = 9; // HC-SR04のトリガーピン intechoPin = 10; // HC-SR04のエコーピン
LM298Nモータードライバーモジュールの入力用のピンを定義します。LM298Nには、接続されているモーターの方向を制御するために使用される4つのデータ入力ピンがあります。
int revleft4 = 4; //左モーターの逆運動 intfwdleft5 = 5; //左モーターのForWarDモーション intrevright6 = 6; //右モーターの逆運動 intfwdright7 = 7; //右モーターのForWarDモーション
設定() 関数、利用GPIOピンのデータ方向を定義します。4つのモーターピンとトリガーピンは出力として設定され、エコーピンは入力として設定されます。
pinMode(revleft4、OUTPUT); //モーターピンを出力として設定 pinMode(fwdleft5、OUTPUT); pinMode(revright6、OUTPUT); pinMode(fwdright7、OUTPUT); pinMode(trigPin、OUTPUT); // トリガーピンを出力として設定pinMode(echoPin、INPUT); //反射波をキャプチャするための入力としてエコーピンを設定します
内 ループ() 関数、HC-SR04からの距離を取得し、距離に基づいてモータの方向を移動させます。距離は、ロボットの前に来るオブジェクトの距離を示します。距離は、10 usまでの超音波ビームをバーストし、10us後に受信することによって取得されます。超音波センサーとArduinoを使用した距離の測定の詳細については、リンクをたどってください。
digitalWrite(trigPin、LOW); delayMicroseconds(2); digitalWrite(trigPin、HIGH); // 10 usのウェーブを送信します delayMicroseconds(10); 期間= pulseIn(echoPin、HIGH); //反射波を受信 距離=持続時間/58.2; //距離 delay(10);に変換します
距離が定義された距離よりも大きい場合は、その経路に障害物がなく、前方に移動することを意味します。
if(distance> 19) { digitalWrite(fwdright7、HIGH); //前に 進みますdigitalWrite(revright6、LOW); digitalWrite(fwdleft5、HIGH); digitalWrite(revleft4、LOW); }
障害物を回避するために距離が定義された距離よりも短い場合は、前方に障害物があることを意味します。したがって、この状況では、ロボットはしばらく停止し、その後、再びしばらく停止してから、別の方向に向きを変えます。
if(distance <18) { digitalWrite(fwdright7、LOW); // digitalWrite(revright6、LOW);を 停止します digitalWrite(fwdleft5、LOW); digitalWrite(revleft4、LOW); delay(500); digitalWrite(fwdright7、LOW); // movebackword digitalWrite(revright6、HIGH); digitalWrite(fwdleft5、LOW); digitalWrite(revleft4、HIGH); delay(500); digitalWrite(fwdright7、LOW); // digitalWrite(revright6、LOW);を 停止します digitalWrite(fwdleft5、LOW); digitalWrite(revleft4、LOW); delay(100); digitalWrite(fwdright7、HIGH); digitalWrite(revright6、LOW); digitalWrite(revleft4、LOW); digitalWrite(fwdleft5、LOW); delay(500); }
これが、ロボットがどこにも行き詰まることなく、経路上の障害物を回避する方法です。以下の完全なコードとビデオを見つけてください。