レッスン12:アプリでローバーを操作

前回の冒険では、SunFounderコントローラーを使い、ローバーの目を通じて世界を探索し、チルト機構を制御してその視線を調整する技術を習得しました。まるで、私たちの火星ローバーに視力を与えたかのようでした!

今度は、この火星探検車を自分の意志で操り、その道筋を指示できたらどうでしょう。このレッスンでは、まさにそれを実現します!SunFounderコントローラーについての理解を深め、ローバーを操る方法を学びます。まるで火星ローバーのドライバーになったようなスリリングな体験が待っています!

生き生きとしたSTEAMコースを通じて、子供たちはただ学ぶだけでなく、宇宙探査の興奮と驚きを体験します!準備を整え、ワクワクする旅に出発しましょう!

学習目標

  • SunFounderコントローラーについての理解を深める。

  • モバイルアプリを使用して火星ローバーを操作する方法を学ぶ。

材料

  • 全部品を装備した火星ローバーモデル(ソーラーパネルと底板を除く)

  • Arduino IDE

  • コンピューター

  • SunFounderコントローラーアプリがインストールされたタブレットまたはスマートフォン

手順

ステップ1:SunFounderコントローラーをより深く理解する

前回のレッスンでは、SunFounderコントローラーの基本的な操作と使用法を初めて体験しました。しかし、まだ疑問が残っているのではないでしょうか?この好奇心を満たし、この技術の驚異についてさらに深く掘り下げてみましょう。

新しいコントローラーを作成すると、最初は謎のように見える画面が表示されます。

_images/app_blank.png

長方形、短方形、大きな正方形など、さまざまな形のカレイドスコープが、AからQまでの識別子でユニークにタグ付けされています。

その多様性はなぜでしょうか?AからQの識別子は何を意味するのでしょうか?

この探索の旅に出発しましょう!

  • 形の解読

    たとえば、長方形のエリアをタップしてみてください。宝箱を開けるように、いくつかのウィジェットが現れます。前回のクラスで使った Slider を覚えていますか?左右にスワイプすると、火星ローバーのカメラのチルトを制御しました。次に、 Gauge があります。これは、あなたのローバーの個人的な速度計として使うことができます。そして、他にも多くのウィジェットがあります!

    _images/app_long.png

    短い長方形をタップすると、異なるウィジェットセットが現れます。 Button ウィジェットは、バイナリスイッチのように単一のコマンドを発行し、 Microphone ウィジェットはあなたの声のコマンドを聞いてローバーを制御することができます。

    _images/app_short.png

    正方形ブロックはどうでしょうか? Joystick ウィジェット、Dパッドウィジェット、スロットルウィジェットが入っています。もちろん、それだけではありません!

    _images/app_square.png

    この時点で、各ウィジェットの機能や使用法について心配する必要はありません。どの形がどのウィジェットを収容しているかを知り、それに慣れることが大切です。

  • ウィジェットの活用

    上記の内容から、さまざまなウィジェットがあることがわかります。では、これらのウィジェットは何に使えるのでしょうか?

    これらのウィジェットは、コントロール ウィジェットと表示ウィジェットの 2 つのタイプに分類されます。

    • コントロールウィジェット は主にアプリの操作を可能にし、その後、火星ローバーがこれらの制御コマンドを受け取り、対応する動作を行います。

    • ショーウィジェット は、アプリ内でセンサー値などの値を表示するために使用できます。

    これらのウィジェットの詳細な説明については、以下を参照してください:Widgets List

    また、これらのウィジェットに関連する機能、パラメーターなどについては、以下を参照してください:Widgets Usage

  • 識別子の役割

    各形には右下に識別子が付いています。なぜでしょうか?例を挙げて説明しましょう。

    前回のクラスでは、 D 領域に Slider ウィジェットを追加しました。その値を取得するコードは次のようなものでした:

    int16_t sliderD = aiCam.getSlider(REGION_D);
    

    もし、 B 領域に Slider ウィジェットを追加したら、コードはどのように変わるでしょうか?単に REGION_DREGION_B に置き換えるだけです。

    int16_t sliderD = aiCam.getSlider(REGION_B);
    

    簡単ですよね?これらの識別子は、どの領域にどのウィジェットを追加したかを識別するのに役立ちます。

注釈

  • ウィジェットの作成・追加、SunFounderコントローラーの接続・操作に関する詳細な指示は、 レッスン11ステップ3 で利用可能です。

  • より深い操作については、 Page Introduction をご覧ください。

ステップ2:デュアルスロットルで火星ローバーを制御

SunFounderコントローラーウィジェットの内外を掘り下げたので、2つのスロットルウィジェットを組み込んで火星ローバーの動きをコントロールすることで、私たちのゲームをレベルアップしましょう。

  1. K 領域と Q 領域に Throttle ウィジェットをそれぞれ配置します。編集モードに切り替えるために右上の app_edit ボタンを押し、設定が完了したら、変更を保存するために app_save をクリックします。

    _images/app_throttle.png
  2. 2つの Throttle ウィジェットを使用してローバーの移動を制御する予定なので、それに応じてローバーの動きを指示する機能を調整しましょう:

    // Function to set the power of the motors
    void carSetMotors(int8_t power_L, int8_t power_R) {
        // Set power for the left motor
        if (power_L >= 0) {
            SoftPWMSet(in1, map(power_L, 0, 100, 0, 255));
            SoftPWMSet(in2, 0);
        } else {
            SoftPWMSet(in1, 0);
            SoftPWMSet(in2, map(power_L, 0, -100, 0, 255));
        }
    
        // Set power for the right motor
        if (power_R >= 0) {
            SoftPWMSet(in3, 0);
            SoftPWMSet(in4, map(power_R, 0, 100, 0, 255));
        } else {
            SoftPWMSet(in3, map(power_R, 0, -100, 0, 255));
            SoftPWMSet(in4, 0);
        }
    }
    

    もちろんです。 carSetMotors() 関数を詳しく見てみましょう。この関数は2つの引数 power_Lpower_R を受け取り、これらは左右のモーターの電力設定であると思われます。これらの引数の値は、マイナス100から100までで、負の値は後退を示し、0は停止を示し、正の値は前進を示します。

    • 左モーターの電力を設定する:

      • power_L が0以上の場合、左モーターは前進するように設定されます。

      • SoftPWMSet(in1, map(power_L, 0, 100, 0, 255)) はArduinoの map 関数を使用して、入力範囲(0から100)を出力範囲(0から255)にマッピングします。これは、ArduinoのPWM値が0(0%デューティサイクル)から255(100%デューティサイクル)の間であるためです。このマッピングされた値は、 SoftPWMSet 関数に in1 とともに渡されます。

      • power_L が0未満の場合、左モーターは逆方向に動くように設定され、 map 関数の入力範囲は0からマイナス100になります。

    • 右モーターの電力を設定する:

      • これは左モーターの電力を設定するのと同じロジックに従いますが、 in3in4 を使用し、入力電力値は power_L の代わりに power_R です。

    全体として、この関数は2つのモーターの電力値を受け取り、それを適切なPWM値に変換し、所望の動きを実現するために正しいモーター制御ピンにPWM値を設定します。

  3. onReceive() 関数内で、2つの Throttle ウィジェットから値を取得し、火星ローバーの左右のモーターの電力として使用します。

    void onReceive() {
        // Get the value of the slider in region D
        int16_t sliderD = aiCam.getSlider(REGION_D);
    
        // Move the servo to the angle indicated by the slider
        myServo.write(int(sliderD));
    
        // Get the throttle values for the left and right
        int throttle_L = aiCam.getThrottle(REGION_K);
        int throttle_R = aiCam.getThrottle(REGION_Q);
    
        // Set the power for the motors
        carSetMotors(throttle_L, throttle_R);
    }
    

完全なコードはこちらです:

コードを再実行するたびに、以下の4つのステップを繰り返す必要があります:

  • コードをアップロードする前に、スイッチが右に向いていることを確認してください。

    _images/camera_upload.png
  • コードが正常にアップロードされたら、左にスイッチを切り替えてESP32 CAMを起動します。

  • GalaxyRVR ネットワークに接続します。

  • コントローラーを接続し、実行します。

これで、 Throttle ウィジェット上で指を滑らせるだけで、火星ローバーが動き出し、新たな精神で力強くピボットします。探索を始めましょう!

ステップ3:センサー読み取りの視覚化

SunFounderコントローラーとの旅では、チルト調整のためのスライダーや、ローバーの動きを指示するスロットルなど、制御ウィジェットを通じて火星ローバーと積極的にやり取りしてきました。では、表示ウィジェットの力を利用して、ローバーの周囲の鮮明なイメージを描くのはどうでしょうか?

左右の赤外線(IR)回避モジュールと、超音波モジュールによって捕捉された距離の値を視覚化することで、これを実現しましょう。このリアルタイムデータにより、ローバーの運用環境の明確なスナップショットを提供します。

これを達成する方法は以下の通りです:

  1. まず、SunFounderコントローラーに3つのナンバーウィジェットを追加します。設定ボタンを使用して、それらの名前や単位をカスタマイズすることを忘れないでください。

    _images/app_show.png
  2. 次に、コードに取り掛かりましょう。前回のレッスンからIR回避モジュールと超音波モジュールのコードスニペットを持ってきます。

    ...
    // Define the pin for the ultrasonic module
    #define ULTRASONIC_PIN 10
    
    // Define the pins for the IR modules
    #define IR_RIGHT 7
    #define IR_LEFT 8
    
    void setup() {
        ...
    
        // Set the IR module pins as inputs
        pinMode(IR_RIGHT, INPUT);
        pinMode(IR_LEFT, INPUT);
    }
    
    
    float readSensorData() {
        // A 4ms delay is required, otherwise the reading may be 0
        delay(4);
    
        //Set to OUTPUT to send signal
        pinMode(ULTRASONIC_PIN, OUTPUT);
    
        ...
    }
    
  3. onReceive() 関数内で、回避モジュールと超音波センサーから値を抽出し、それらの値を sendDoc[] 辞書に更新します。 NPO のキーは、追加した3つのナンバーウィジェットの領域コードに対応しています。

    // Function to execute when data is received from the Controller
    void onReceive() {
    
        ...
    
        // Read values from IR sensors
        int leftValue = digitalRead(IR_LEFT);
        int rightValue = digitalRead(IR_RIGHT);
        aiCam.sendDoc["N"] = leftValue;
        aiCam.sendDoc["P"] = rightValue;
    
        // ultrasonic
        float distance = readSensorData();
        aiCam.sendDoc["O"] = distance;
    }
    

完全なコードはこちらです:

コードが正常にアップロードされたら、SunFounderコントローラーを起動します。回避モジュールと超音波センサーが検出した距離のリアルタイム値が表示され、ローバーの直接的な環境の明確なイメージが描かれます。

_images/app_show_ir_ultrasonic.png

このステップを終えると、表示ウィジェットの世界を無事にナビゲートできました。興味のある情報を表示するために、さまざまなウィジェットを試してみてください。探索を楽しんでください!

ステップ4:振り返りと結論

このレッスンでは、SunFounderコントローラーについての理解を深め、そのウィジェットを使用して火星ローバーを操縦するだけでなく、リアルタイムで環境データをモニタリングする方法を把握しました。

ここで挑戦です:

SunFounderコントローラーにスイッチウィジェットを追加してみませんか?これらのスイッチをアクティブにすると、火星ローバーは回避モードとフォローモードを切り替えることができます。または、ライトストリップを制御するためにスイッチを使用し、オンまたはオフにする、または色を変えるのはどうでしょうか?

この挑戦を受ける自信はありますか?

この挑戦を克服するあなたを楽しみにしています!