障害物回避ロボットは、組み込みプロジェクトを盛り上げるもう1つの有名なロボットです。新しい障害物回避ロボットである人にとって、それは障害物にぶつかることなくその道を進むことができる単なる通常の車輪付きロボットです。プロジェクトで障害物回避ロボットを構築する方法はたくさんあります。ロボットが3方向すべてに目を向けるように、1つの超音波センサー(前面)と2つのIRセンサー(左/右)を使用します。このように、3つの側面すべてでオブジェクトを検出し、それに応じて操作することで、よりスマートかつ高速にできます。ここでは、この障害物回避ロボットのためにPICマイクロコントローラーPIC16F877Aを訴えています。
障害物回避ロボットの動作は、ホームクリーニングロボットと呼ばれるリアルタイム製品から観察できます。これらで使用される技術とセンサーは非常に複雑ですが、概念は同じです。通常のセンサーとPICマイクロコントローラーを使用してどれだけ達成できるかを見てみましょう。
また、他の障害物回避ロボットも確認してください。
- ラズベリーパイベースの障害物回避ロボット
- Arduinoを使用したDIYスマート掃除機ロボット
必要な材料:
- PIC16F877A
- IRセンサー(2Nos)
- 超音波センサー(1Nos)
- DCギアモーター(2Nos)
- L293Dモータードライバー
- 椅子(段ボールを使って自分で作ることもできます)
- パワーバンク(利用可能な電源)
障害物回避ロボットの概念:
障害物回避ロボットの概念は非常に単純です。センサーを使用してロボットの周囲の物体の存在を検出し、このデータを使用してロボットがそれらの物体に衝突しないようにします。オブジェクトを検出するには、IRセンサーや超音波センサーなどのあらゆる用途のセンサーを使用できます。
私たちのロボットでは、USセンサーをフロントセンサーとして使用し、2つのIRセンサーを左右にそれぞれ使用しました。ロボットの前に物体がない場合、ロボットは前進します。そのため、ロボットは超音波(US)センサーが物体を検出するまで前進します。
USセンサーで物体を検出したら、ロボットの方向を変えます。左または右に曲がって、IRセンサーを使用して回転方向を決定し、ロボットの左側または右側の近くに物体が存在するかどうかを確認します。
ロボットの正面と右側に物体が検出された場合、ロボットは戻って左に曲がります。ロボットを一定の距離だけ後方に走らせ、旋回中に物体に衝突しないようにします。
ロボットの前面と左側に物体が検出された場合、ロボットは戻って右に曲がります。
ロボットが部屋の隅に到達すると、 4つすべてに存在するオブジェクトを感知します。この場合、いずれかの側が自由になるまでロボットを後方に駆動する必要があります。
もう1つの考えられるケースは、前にオブジェクトがあるが、左側にも右側にもオブジェクトがない可能性がある場合です。この場合、任意の方向にランダムに回転する必要があります。
これにより、障害物回避機能がどのように機能するかについての大まかなアイデアが得られたと思います。次に、回路図に進んでこのボットを構築し、実際に楽しんでみましょう。
回路図と説明:
このPICベースの障害物回避ロボットの完全な回路図を上の写真に示します。ご覧のとおり、ロボットの左側と右側にある物体をそれぞれ検出するために2つのIRセンサーを使用し、ロボットの前方に存在する物体の距離を測定するために超音波センサーを使用しました。また、L293Dモータードライバーモジュールを使用して、このプロジェクトに存在する2つのモーターを駆動しました。これらはホイール用の通常のDCギアモーターであるため、非常に簡単に導出できます。次の表は、接続に役立ちます。
S.No |
から接続 |
に接続されています |
1 |
IRセンサーのピンを省略 |
RD2(ピン21) |
2 |
IRセンサーライトアウトピン |
RD3(ピン22) |
4 |
モーター1チャンネルAピン |
RC4(ピン23) |
5 |
モーター1チャンネルBピン |
RC5(ピン25) |
6 |
モーター2チャンネルAピン |
RC6(ピン26) |
7 |
モーター2チャンネルBピン |
RC7(ピン27) |
8 |
米国のトリガーピン |
RB1(ピン34) |
9 |
USエコーピン |
RB2(ピン35) |
DCギアモーターの実行に必要な電流量はPICマイクロコントローラーのI / Oピンから供給できないため、L293Dのようなモータードライバーモジュールは必須です。センサーとモジュールは、7805によって調整されている+ 5V電源から電力を供給されます。モータードライバーモジュールは+ 12Vを使用しても電力を供給できますが、このプロジェクトでは、利用可能な+ 5Vに固執しました。
私の場合、完全なロボットはパワーバンクから電力を供給されています。上記の回路図に示すように、通常のパワーバンクを使用してレギュレータセクションをバイパスするか、上記の回路を使用してロボットに9Vまたは12Vのバッテリーを使用することもできます。接続が完了すると、次のようになります。
PICマイクロコントローラーのプログラミング:
障害物回避のために働くようにPICをプログラミングするのは本当に簡単です。これら3つのセンサーの値を読み取り、それに応じてモーターを駆動する必要があります。このプロジェクトでは、超音波センサーを使用しています。超音波とPICマイクロコントローラーのインターフェース方法についてはすでに学習しました。ここで初めての場合は、チュートリアルに戻って、米国のセンサーがPICでどのように機能するかを理解してください。繰り返しを避けるために、ここでは詳細をスキップします。
完全なプログラムまたはこのロボットは、このページの最後にあり、私はさらに、以下のプログラムの重要なチャンクを説明しました。
ご存知のとおり、すべてのプログラムは入力ピンと出力ピンの宣言から始まります。ここでは、モータードライバーモジュールの4つのピンとトリガーピンが出力ピンであり、エコーピンと2つのIR出力ピンが入力されます。超音波センサーで使用するには、タイマー1モジュールを初期化する必要があります。
TRISD = 0x00; // PORTDはLCDTRISB1 = 0とのインターフェース用の出力として宣言されています。// USセンサーのトリガーピンは出力ピンTRISB2 = 1として送信されます。// USセンサーのエコーピンは入力ピンとして設定されますTRISB3 = 0; // RB3はLEDTRISD2 = 1の出力ピンです。TRISD3 = 1; //両方のIRセンサーピンが入力として宣言されていますTRISC4 = 0; TRISC5 = 0; //出力として宣言されたモーター1ピンTRISC6 = 0; TRISC7 = 0; //出力として宣言されたモーター2ピンT1CON = 0x20;
このプログラムでは、センサーとオブジェクトの間の距離を頻繁にチェックする必要があるため、 calculate_distance() という名前の関数を作成しました。この関数内で、米国のセンサーインターフェイスチュートリアルで説明した方法で距離を測定します。コードを以下に示します
voidcalculate_distance()//米国の距離を計算する関数{TMR1H = 0; TMR1L = 0; //タイマービットをクリアしますTrigger = 1; __delay_us(10); トリガー= 0; while(Echo == 0); TMR1ON = 1; while(Echo == 1); TMR1ON = 0; time_taken =(TMR1L-(TMR1H << 8)); 距離=(0.0272 * time_taken)/ 2; }
次のステップは、超音波センサーとIRセンサーの値を比較し、それに応じてロボットを動かすことです。ここで、このプログラムでは、ロボットが方向を変更し始める臨界距離としてcmの値を使用しました。お好みの値を使用できます。オブジェクトがない場合、ロボットは前進するだけです
if(distance> 5){RC4 = 0; RC5 = 1; //モーター1フォワードRC6 = 1; RC7 = 0; //モーター2フォワード}
物体が検出された場合、距離はcmを下回ります。この場合、左右の超音波センサーの値を考慮します。この値に基づいて、左に曲がるか右に曲がるかを決定します。方向の変化が見えるように、msの遅延が使用されます。
if(RD2 == 0 && RD3 == 1 && distance <= 5)//左センサーがブロックされている{back_off(); RC4 = 1; RC5 = 1; //モーター1ストップRC6 = 1; RC7 = 0; //モーター2フォワード__delay_ms(500); } calculate_distance(); if(RD2 == 1 && RD3 == 0 && distance <= 5)//右センサーがブロックされている{back_off(); RC4 = 0; RC5 = 1; //モーター1フォワードRC6 = 1; RC7 = 1; //モーター2停止__delay_ms(500); }
超音波センサーが物体を検出することもありますが、IRセンサーによって検出される物体はありません。この場合、ロボットはデフォルトで左に曲がります。好みに応じて、右またはランダムな方向に曲がることもできます。両側にオブジェクトがある場合は、後方に移動します。同じことを行うためのコードを以下に示します。
計算距離(); if(RD2 == 0 && RD3 == 0 && distance <= 5)//両方のセンサーが開いている{back_off(); RC4 = 0; RC5 = 1; //モーター1フォワードRC6 = 1; RC7 = 1; //モーター2停止__delay_ms(500); } calculate_distance(); if(RD2 == 1 && RD3 == 1 && distance <= 5)//両方のセンサーがブロックされている{back_off(); RC4 = 1; RC5 = 0; //モーター1リバースRC6 = 1; RC7 = 1; //モーター2停止__delay_ms(1000); }
動作中の障害物回避ロボット:
プロジェクトの作業は非常に興味深く、見るのが楽しいです。回路とコードが完成したら、ボットの電源を入れて地面に置いたままにします。障害物を特定し、それらを賢く回避できる必要があります。しかし、ここに楽しい部分があります。コードを変更して、階段を避けたり、貴重なターンを保存してスマートにするなど、より多くのことを実行できるようにすることができます。
このロボットは、プログラミングの基本を理解し、実際のハードウェアがコードにどのように応答するかを学ぶのに役立ちます。このロボットをプログラムして、実際のコードでどのように動作するかを見るのはいつでも楽しいことです。
ここでは、PICマイクロコントローラーを使用してLEDを点滅させるために作成したものと同じPICパフォーマンスボードを使用し、このボードをPICチュートリアルシリーズの他のプロジェクトで使用しました。
ロボットは上の写真のように見えるはずです。このプロジェクトの完全な動作は、以下のビデオに示されています。
あなたがプロジェクトを理解し、それを構築することを楽しんだことを願っています。疑問がある場合や行き詰まった場合は、コメントセクションを使用して質問を投稿してください。できる限り回答します。