.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
レッスン6: 障害回避モジュールの探求
==============================================================
赤外線障害回避モジュールの世界に飛び込みます。マーズローバーの側面に配置されたこれらのセンサーは、ローバーの「目」として機能し、側面の障害物を回避して火星の景観を安全に移動するのに役立ちます。
これらのモジュールをローバーに統合し、その機能の背後にある魔法を解き明かし、ローバーが遭遇するあらゆる障害物をスマートに回避するコードを開発する方法を学びます。
ローバーに火星の障害物回避インテリジェンスを搭載する準備をしましょう!さあ、始めましょう!
.. raw:: html
.. note::
GalaxyRVRを完全に組み立てた後にこのコースを学習する場合は、コードをアップロードする前に、このスイッチを右に移動してください。
.. image:: ../img/camera_upload.png
:width: 500
:align: center
学習目標
----------------------
* 赤外線障害回避モジュールの動作原理と応用を理解する。
* Arduinoを使用して赤外線障害回避モジュールを制御する方法を学ぶ。
* 赤外線障害回避に基づく自動障害回避システムを設計・構築する練習をする。
必要な材料
---------------------
* 障害回避モジュール
* 基本工具と付属品(ドライバー、ネジ、配線など)
* マーズローバーモデル(ロッカーボギーシステム、メインボード、モーター搭載)
* USBケーブル
* Arduino IDE
* コンピューター
手順
-------------
**ステップ1: 障害回避モジュールの取り付け**
それでは、2つの障害回避モジュールをローバーに取り付けます。
.. raw:: html
組み立て手順は簡単でしたね。次のステップでは、これらのモジュールの動作原理と、それらがマーズローバーの障害物回避にどのように役立つかを学びます。お楽しみに!
**ステップ2: モジュールの謎を解く**
赤外線障害回避モジュールをご紹介します。これはローバーのスマートな相棒です。この小さなデバイスは驚きの詰まったパッケージです。見ていきましょう:
.. image:: img/ir_avoid.png
:width: 300
:align: center
各ピンの定義は次のとおりです:
* **GND**: これはモジュールのアンカーのようなもので、回路内のグランドまたは共通点に接続します。
* **+**: ここでモジュールはエネルギーを得ます。3.3〜5V DCの電源が必要です。
* **Out**: これはモジュールの通信機です。デフォルトではHigh状態を維持し、障害物を検出したときにのみLowになります。
* **EN**: モジュールのコントローラーです。この **イネーブル** ピンは、モジュールがいつ動作するかを決定します。デフォルトではGNDに接続されており、モジュールが常に動作状態にあることを意味します。
この小さなモジュールがどのように動作するのか、興味がありますか?とても面白いです!一対のIRコンポーネント、つまり送信器と受信器を使用します。送信器はモジュールの懐中電灯のようなもので、赤外線を放射します。障害物が現れると、赤外線が跳ね返って受信器で捉えられます。モジュールはLow信号を出力し、ローバーに障害物を知らせます。
.. image:: img/ir_receive.png
:align: center
この小さなモジュールは非常に堅牢で、2〜40cmの範囲の障害物を検出し、優れた耐干渉性を誇ります。ただし、物体の色はその感知に影響を与えます。暗い物体、特に黒色のものは、より短い距離で検出されます。白い壁に対しては、センサーは最も効率的で、2〜30cmの範囲で感知します。
**EN** ピンのLowレベル状態がモジュールを起動し、ジャンパーキャップが **EN** ピンをGNDに固定します。 **EN** ピンをコードで制御したい場合は、ジャンパーキャップを取り外す必要があります。
.. image:: img/ir_cap.png
:width: 400
:align: center
モジュールには2つのポテンショメーターがあります。1つは送信電力を調整するためのもの、もう1つは送信周波数を調整するためのものです。これらの2つのポテンショメーターを調整することで、有効距離を調整できます。
.. image:: img/ir_avoid_pot.png
:width: 400
:align: center
私たちの小さなモジュールについては以上です。次のステップでは、それをローバーに統合し、Arduinoを使用して制御する方法を学びます。お楽しみに!
**ステップ3: 2つのモジュールから読み取る**
好奇心旺盛な宇宙探検家のように、コードとセンサーの世界に飛び込みましょう!
#. 私たちのマーズローバーには、ピン7(右)とピン8(左)に配置された2つの特別な「エイリアンアイ」センサーが搭載されています。これらの「エイリアンアイ」センサーは実際には赤外線障害回避モジュールであり、ローバーの星間旅行における「宇宙岩」(障害物)を常に警戒して回避します!
.. image:: img/ir_shield.png
#. 次に、Arduinoコードという普遍的な言語を使用してローバーと通信する必要があります。
まず最初に、ローバーの各目にユニークな名前を付けましょう。``IR_RIGHT`` と ``IR_LEFT`` と呼びましょう。そうすれば混同しません。
.. code-block:: arduino
#define IR_RIGHT 7
#define IR_LEFT 8
次に、ローバーにこれらが特別な目であることを知らせます。これらは外界からの情報をローバーの電子頭脳に送り込みます。
.. code-block:: arduino
pinMode(IR_RIGHT, INPUT);
pinMode(IR_LEFT, INPUT);
ローバーが発見したことを私たちと共有するために、SF映画のスパイのように、秘密の通信回線を確立します。次の行は、9600ビット/秒の速度でシリアル通信を開始します。これは電光石火の速さのおしゃべりです!
.. code-block:: arduino
Serial.begin(9600);
ローバーは「エイリアンアイ」で周囲をスキャンし、発見したことを私たちに報告します。障害物を検出すると値は0になり、経路がクリアな場合は値は1になります。これらのメッセージを私たちに送り続け、状況を把握させてくれます。
.. code-block:: arduino
int rightValue = digitalRead(IR_RIGHT);
int leftValue = digitalRead(IR_LEFT);
Serial.print("Right IR: ");
Serial.println(rightValue);
Serial.print("Left IR: ");
Serial.println(leftValue);
最後に、ローバーは各送信後に少し(約200ミリ秒)一時停止します。この小さな休止により、ローバーが次のメッセージを送信する前に、私たちがそのメッセージを解釈する機会が得られます。
.. code-block:: arduino
delay(200);
完全なコードは次のとおりです:
.. raw:: html
#. コードの準備ができたら、正しいボードとポートを選択し、コードをマーズローバーに転送します。次に、右上のアイコンをクリックして、秘密の通信回線(シリアルモニター)を開きます。
.. image:: img/ir_open_serial.png
#. ローバーのメッセージを受信し始める前に、秘密の通信回線がローバーと同じ速度(9600ボー)に調整されていることを確認してください。これで、マーズローバーからのライブ情報が届きます!
.. image:: img/ir_serial.png
#. システムをテストするには、センサーの1つの前に「宇宙岩」(あなたの手)をかざします。値が0に変わり、モジュール上の対応するLEDが点灯するのがわかります。これはローバーが「注意、右側に宇宙岩!」と言っているのです。
.. code-block::
Right IR: 0
Left IR: 1
Right IR: 0
Left IR: 1
Right IR: 0
Left IR: 1
これで、宇宙旅行をしただけでなく、火星人の言葉も解読しました!次のミッションでどのような星間の秘密が明らかになるか、楽しみですね!
**ステップ4: 検出距離の調整**
現在の環境に基づいてセンサーの検出距離を調整するという重要なステップに到達しました。工場出荷時の設定が最適でない場合があります。
2つの赤外線モジュールの検出距離が短すぎると、マーズローバーが障害物に衝突する可能性があります。長すぎると、ローバーが障害物からまだかなり離れているのに曲がり始め、移動に影響を与える可能性があります。
調整方法は次のとおりです:
#. まず、右側の障害回避モジュールを調整します。輸送中に、赤外線モジュールの送信器と受信器が衝突によって傾くことがあります。そのため、手動でまっすぐにする必要があります。
.. raw:: html
#. 右モジュールの真正面約20cmの位置に障害物を置きます。ローバーキットの箱がこれに最適です!次に、モジュール上のポテンショメーターを、モジュールのインジケーターライトがちょうど点灯するまで回します。その後、障害物を前後に動かして、希望する距離でインジケーターライトが点灯するか確認します。正しい距離でライトが点灯しない場合、または消えずに点灯したままの場合は、もう一方のポテンショメーターを調整する必要があります。
.. raw:: html
#. もう一方のモジュールについても同じプロセスを繰り返します。
センサーの準備が整いましたので、次の旅に出発しましょう!
**ステップ5: 自動障害回避システムの設計**
では、宇宙探査において大きな飛躍を遂げ、ローバーからのこれらのメッセージを活用しましょう。自動障害回避システムを作成します!
計画は次のとおりです。右センサーが障害物を検出した場合、ローバーは右後方に曲がります。左センサーが障害物を検出した場合、ローバーは左後方に曲がります。両方のセンサーが障害物を検出した場合、ローバーは後退します。障害物が検出されない場合、ローバーは直進を続けます。
これをフローチャートで視覚化して、さらに明確にしましょう。フローチャートは、特にプログラミングにおいて、計画を論理的に概説する優れた方法です!
.. image:: img/ir_flowchart.png
この計画をローバーの言語(Arduinoコード)でローバーにささやきましょう:
.. raw:: html
このコードでは、``loop()`` 関数内で ``if...else`` 文を使用しています。
``if...else`` 文は、2つの選択肢の中からコードのブロックを実行するために使用されます。ただし、3つ以上の選択肢の中から選択する必要がある場合は、``if...else if...else`` 文を使用します。
``if...else if...else`` 文の構文は次のとおりです:
.. code-block:: arduino
if (condition1) {
// code block 1
}
else if (condition2){
// code block 2
}
else if (condition3){
// code block 3
}
else {
// code block 4
}
ここで、
* condition1が真の場合、コードブロック1が実行されます。
* condition1が偽の場合、condition2が評価されます。
* condition2が真の場合、コードブロック2が実行されます。
* condition2が偽の場合、condition3が評価されます。
* condition3が真の場合、コードブロック3が実行されます。
* condition3が偽の場合、コードブロック4が実行されます。
自動障害回避システムを設計したので、いよいよエキサイティングな部分、実際にテストする時です!
* ローバーが期待どおりに動くかどうかを観察できます。
* または、異なる照明条件に置いて、その動きがどのように変化するかを確認します。
科学を工学プロジェクトに統合することで、私たちは宇宙探偵になり、ローバーの行動の謎を解いています。これは単にエラーを修正することではなく、パフォーマンスを最適化し、ローバーを可能な限り最高のものにすることです。素晴らしい仕事を続けてください、宇宙探偵の皆さん!
**ステップ6: 振り返りとまとめ**
テスト段階で、マーズローバーの興味深い動作に気づいたかもしれません。左右の障害物を巧みに回避する一方で、真正面の小さな障害物を検出するのに苦労する可能性があります。
この課題をどのように解決できますか?
次のレッスンをお楽しみに。コーディング、センサー、障害物検出の魅力的な世界への探検を続けます。
すべての課題は、学習と革新の機会であることを忘れないでください。そして、宇宙探検の旅を続けるにつれて、発見し学ぶべきことはまだまだたくさんあります!