検索コード

レッスン29/31:カー7 SunFounderスマートカーをリモコンで制御する | Robojax

レッスン29/31:カー7 SunFounderスマートカーをリモコンで制御する | Robojax

このレッスンでは、SunFounderスマートカーを、赤外線(IR)リモコンを使った遠隔操作車両に変身させます。有線接続やスマートフォンアプリに頼る代わりに、標準的なIRリモコンのボタンをマッピングして、前進、後退、旋回、さらには斜め移動などの車の動きを制御し、その場で速度も調整する方法を学びます。このプロジェクトは、モーター制御とIR通信の基本を学んだ後の次のステップとして最適で、両方を1つのインタラクティブなシステムに組み合わせます。

ここでの実用的な価値は、ロボットプラットフォーム用の堅牢でユーザーフレンドリーな制御インターフェースを作成する方法を理解することにあります。学ぶ原則は、以下のような幅広いプロジェクトに直接適用できます。

  • 小型配達ロボットなど、ホームオートメーションタスク用の遠隔操作ロボットを構築する。
  • 教育用ロボット競技会向けのプログラム可能な車両を作成する。
  • カメラスライダーやパン・チルト機構用のカスタムリモコンを開発する。
  • より大規模で複雑な自動化システム用のユーザーインターフェースをプロトタイピングする。

ハードウェアとコンポーネント

このプロジェクトは、SunFounder 3-in-1 Arduinoキットを基にしています。進めるには、以下にリストされたコンポーネントが必要です。配線は簡単で、コースの前のレッスンから拡張されています。

  • SunFounder 3-in-1 Arduinoキット:スマートカーのシャーシ、モータードライバーボード、Arduinoボードが含まれます。
  • 赤外線リモコン:キットに付属の標準リモコン。
  • IRレシーバーモジュール:リモコンからの信号をデコードするセンサー。
  • LEDと330オーム抵抗:キーが押されたことを確認する視覚インジケーターとして使用。(ビデオの04:08で)
  • ジャンパーワイヤー:ブレッドボード上で必要な接続を行うため。

配線ガイド

car_9_lesson_29_wriing_for_IR

コードに飛び込む前に、ハードウェアが正しく接続されていることを確認しましょう。IRレシーバーとモータードライバーの配線は、このシリーズの前のレッスンと一貫しています。プロジェクトをよりインタラクティブにするために、視覚的なフィードバックインジケーターとして、外部LEDをピン13に接続します。

接続のステップバイステップガイドは次のとおりです。

  1. IRレシーバー:IRレシーバーには3つのピンがあります。プラスのピンはブレッドボードの5Vレールに接続します。グランドピンはGNDレールに接続します。最後のピンであるシグナルピンは、Arduinoボードのデジタルピン11に接続します。(ビデオの05:29で)
  2. 外部LED:330オーム抵抗の一方の足をArduinoのデジタルピン13に接続します。抵抗のもう一方の足をLEDの長い方(アノード)の足に接続します。LEDの短い方(カソード)の足は、ブレッドボードのGNDレールに接続する必要があります。(ビデオの04:08で)
  3. モータードライバー:モータードライバーの4つのピン(A_1B、A_1A、B_1B、B_1A)は、それぞれArduinoのピン5、6、9、10に接続します。この設定は前のレッスンで説明されています。(ビデオの06:44で)

これらの接続の視覚的な参考については、以下の配線図を参照してください。

コードの説明

このプロジェクトのコードは直感的に理解できるように設計されています。IRremoteライブラリを使用して、IR信号のデコードという複雑なタスクを処理します。独自のプロジェクト用に調整したいユーザー設定可能な部分を詳しく見ていきましょう。

スケッチの先頭に、ピン定義があります。コンポーネントをこの例で使用されているものと異なるピンに配線した場合は、最初にこれらを確認する必要があります。

const int IR_RECEIVE_PIN = 12;  // IRセンサーのピン番号を定義
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;
  • IR_RECEIVE_PIN:この定数は、IRレシーバーのシグナルピンに接続されたデジタルピンを定義します。別のピンに接続した場合は、ここで番号を変更します。
  • A_1BA_1AB_1BB_1A:これらの定数は、モータードライバーの4つの制御ピンに対応します。左右のモーターの速度と方向を制御します。

次に、車の動作を制御する重要な変数があります。

int speed = 150;
  • speed:この変数は、車の初期速度を設定します。値は0から255の範囲です。このプロジェクトでは、リモコンの「+」および「-」キーを使用して変更できます。コードには、速度が255を超えたり0未満にならないようにするロジックも含まれています。(ビデオの09:22で)

リモコンのコアロジックはloop()関数で処理されます。キーが押されると、decodeKeyValue()関数が生のIRコードを「2」(前進)や「+」(速度アップ)などの単純な文字列に変換します。これにより、後続のifステートメントが非常に読みやすく、変更しやすくなります。(ビデオの07:58で)

moveForward()turnRight()moveLeft() などのカスタム関数がモーター制御を行う場所です。各関数は現在のspeedを引数として受け取ります。例えば、moveForward(speed)は指定された速度で両方のモーターを前進させます。「ターン」と「ムーブ」の主な違いは、ターンは両方のホイールを反対方向に回転させて車をその場で回転させるのに対し、ムーブは片方のホイールだけを回転させて、車が静止しているホイールの周りを弧を描くように動くことです。(ビデオの10:14時点)

ライブプロジェクトデモンストレーション

コードがアップロードされ、車の電源が入ると、リモコンが主要なインターフェースになります。ビデオのデモンストレーションでは、いくつかの主要な動作が強調されています:

  • 速度制御:「+」キーを押すと速度が50増加し、「-」キーを押すと減少します。速度はモーターを保護するために最大255、最小0に制限されています。(ビデオの11:56時点)
  • 瞬間移動:「2」(前進)や「8」(後退)などの方向キーを押すと、車は1秒間動いてから自動的に停止します。これはコードに組み込まれた安全機能です。(ビデオの13:09時点)
  • 旋回と操縦:リモコンの十字パターンに配置されたキーはジョイスティックのように機能します。「4」または「6」を押すと、車はその場で左または右に旋回します。「1」や「3」などの斜めのキーを押すと、「左移動」または「右移動」が実行され、片方のホイールが静止したままのより鋭い旋回になります。(ビデオの16:42時点)

気づくかもしれないことの1つは、車が常に完全に直線で走行するわけではないということです。これは多くの場合、モーターのわずかな違いや車の組み立ての張力によるもので、これらのキットでは一般的で正常な特性です。(ビデオの15:14時点)

チャプター

  • [00:00] スマートカー用IRリモコン制御の紹介
  • [01:15] 前提条件と必要な以前のレッスン
  • [01:56] プロジェクトドキュメントの概要
  • [02:29] リモコンキー機能の理解
  • [03:29] IRレシーバーとLEDのステップバイステップ配線ガイド
  • [05:51] プロジェクトコードの開き方と読み込み方
  • [07:41] コードの説明:ループ、キー解読、アクション
  • [09:22] コード内の速度制限と安全機能
  • [10:08] モーター移動機能の説明
  • [11:49] ライブデモ:速度制御とLED点滅のテスト
  • [13:27] ライブデモ:前進、後退、旋回
  • [14:31] 電源と動きを備えたフルカーデモンストレーション

画像

Car 9 lesson 29 wiring for IR
Car 9 lesson 29 wiring for IR
896-Lesson 29/31: Car-7 Controlling SunFounder Smart Car using Remote Controller
言語: C++
/*
Lesson 29/31: Car-7 Controlling SunFounder Smart Car using Remote Controller
Get this code and watch video Download and resource page https://robojax.com/RJT612

*/
#include <IRremote.h>

const int IR_RECEIVE_PIN = 12;  // Define the pin number for the IR Sensor

const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;


int speed = 150;

void setup() {
  Serial.begin(9600);

  //motor
  pinMode(A_1B, OUTPUT);
  pinMode(A_1A, OUTPUT);
  pinMode(B_1B, OUTPUT);
  pinMode(B_1A, OUTPUT);

  //IR remote
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);  // Start the IR receiver // Start the receiver
  Serial.println("REMOTE CONTROL START");

}

void loop() {

  if (IrReceiver.decode()) {
    //    Serial.println(results.value,HEX);
    String key = decodeKeyValue(IrReceiver.decodedIRData.command);
    if (key != "ERROR") {
      Serial.println(key);

      if (key == "+") {
        speed += 50;
      } else if (key == "-") {
        speed -= 50;
      } else if (key == "2") {
        moveForward(speed);
        delay(1000);
      } else if (key == "1") {
        moveLeft(speed);
      } else if (key == "3") {
        moveRight(speed);
      } else if (key == "4") {
        turnLeft(speed);
      } else if (key == "6") {
        turnRight(speed);
      } else if (key == "7") {
        backLeft(speed);
      } else if (key == "9") {
        backRight(speed);
      } else if (key == "8") {
        moveBackward(speed);
        delay(1000);
      }

      if (speed >= 255) {
        speed = 255;
      }
      if (speed <= 0) {
        speed = 0;
      }
      delay(500);
      stopMove();
    }

    IrReceiver.resume();  // Enable receiving of the next value
  }
}

void moveForward(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void moveBackward(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void turnRight(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void turnLeft(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void moveLeft(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, speed);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

void moveRight(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, speed);
  analogWrite(B_1A, 0);
}

void backLeft(int speed) {
  analogWrite(A_1B, speed);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

void backRight(int speed) {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, speed);
}

void stopMove() {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}


String decodeKeyValue(long result)
{
  switch(result){
    case 0x16:
      return "0";
    case 0xC:
      return "1"; 
    case 0x18:
      return "2"; 
    case 0x5E:
      return "3"; 
    case 0x8:
      return "4"; 
    case 0x1C:
      return "5"; 
    case 0x5A:
      return "6"; 
    case 0x42:
      return "7"; 
    case 0x52:
      return "8"; 
    case 0x4A:
      return "9"; 
    case 0x9:
      return "+"; 
    case 0x15:
      return "-"; 
    case 0x7:
      return "EQ"; 
    case 0xD:
      return "U/SD";
    case 0x19:
      return "CYCLE";         
    case 0x44:
      return "PLAY/PAUSE";   
    case 0x43:
      return "FORWARD";   
    case 0x40:
      return "BACKWARD";   
    case 0x45:
      return "POWER";   
    case 0x47:
      return "MUTE";   
    case 0x46:
      return "MODE";       
    case 0x0:
      return "ERROR";   
    default :
      return "ERROR";
    }
}

リソースと参考文献

ファイル📁

Arduinoライブラリ(zip)