検索コード

レッスン28/31:カー6 SunFounder自動運転Arduinoカー使用 | Robojax

レッスン28/31:カー6 SunFounder自動運転Arduinoカー使用 | Robojax

このプロジェクトでは、Arduino、超音波センサー、および2つの赤外線センサーを使用して、基本的な自動運転車を構築します。これは、自律ナビゲーション、センサーフュージョン、および意思決定ロジックについて学ぶための素晴らしい入門プロジェクトです。この車は前進、後退、および障害物を回避するための旋回ができ、効果的に自分でクリアな経路を見つけます。このプロジェクトはSunFounder 3-in-1 Arduinoキットに基づいており、RobojaxのArduinoコースの一部です。

このプロジェクトは単におもちゃを組み立てるだけではなく、自律ロボット工学の背後にある中核概念への実践的な入門です。同じロジックとセンサーは、ロボット掃除機、倉庫内の自動搬送車、さらにはより複雑なロボットのナビゲーションシステムなど、実際の用途で使用されています。距離センシングと単純なナビゲーションルールを組み合わせる方法を理解することで、次のようなさまざまなプロジェクトを作成できます。

  • 部屋を移動し、家具を回避できる小さなロボットを構築する。
  • 単純な経路をたどったり、エリアを巡回したりできる自動車両を作成する。
  • より大規模なロボットプロジェクト向けの基本的な障害物回避アルゴリズムを実装する方法を学ぶ。

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

このプロジェクトでは、SunFounder 3-in-1キットのコンポーネントを使用します。主要な部品は次のとおりです。

  • Arduino Unoボード
  • モーター付きSunFounder 2WDまたは3-in-1カーシャーシ
  • モータードライバーモジュール(例:L298Nまたは同等品)
  • HC-SR04超音波距離センサー
  • 2つのIR障害物センサー
  • ジャンパーワイヤーとモーター用の電源

配線ガイド

配線は、自動運転車を動かすための重要な最初のステップです。接続は簡単ですが、コンポーネントを損傷しないように各接続を再確認することが不可欠です。配線のロジックは、Arduinoの制御ピンをモータードライバーとセンサーに接続し、Arduinoがデータを読み取り、コマンドを送信できるようにすることです。

  • モータードライバーピン(A-1B、A-1A、B-1B、B-1A): これらのピンは、2つのモーターの速度と方向を制御します。これらはPWM対応のArduinoピン5、6、9、10に接続され、可変速度制御が可能です。
  • 超音波センサー(TrigおよびEcho): Trigピンは超音波パルスを送信し、Echoピンは反射信号を受信します。TrigピンはArduinoピン3に接続され、EchoピンはArduinoピン4に接続されます。
  • IRセンサー(左および右): これらのセンサーは、障害物がすぐ前にあるかどうかを検出します。左IRセンサーはArduinoピン8に接続され、右IRセンサーはピン7に接続されます。これらは車の側面のスペースを確認するために使用されます。

詳細な視覚ガイドについては、各接続を明確に示す以下の配線図を参照してください。

コードの説明

コードはArduinoプログラミング言語(C++)で記述されています。完全なプログラムは、ビデオの説明にリンクされているリソースページからダウンロードできます。このスケッチの主要なユーザー設定可能な部分を詳しく見ていきましょう。

ピン定義

コードの先頭で、Arduinoをさまざまなコンポーネントに接続するピンを定義します。ボード上の異なるピンを使用する場合は、これらを変更できます。

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

const int echoPin = 4;
const int trigPin = 3;

const int rightIR = 7;
const int leftIR = 8;

A_1BA_1AB_1B、およびB_1AピンはHブリッジモータードライバーを制御します。これらのピンをさまざまな組み合わせでHIGHまたはLOWに設定することで、各モーターの方向を制御できます。echoPintrigPinは超音波センサー用であり、rightIRleftIRは赤外線センサー用です。

動作変数とロジック

自動運転動作の中核ロジックはloop()関数にあります。車はIRセンサーと超音波センサーの読み取り値に基づいて決定を下します。コードは特定のアクションをトリガーする特定の距離を定義します。たとえば、distance変数はセンチメートル単位で測定されます。ロジックは次のとおりです。

  • 距離が50 cmを超える場合: 前方の経路はクリアなので、車は速度200で前進します。
  • 距離が2 cmから10 cmの間の場合: 車は障害物に近すぎます。1秒間後退し、その後0.5秒間左後方に旋回して新しい経路を見つけます。
  • 距離が10 cmから50 cmの間の場合: 車は「注意ゾーン」にあります。前進しますが、速度は遅い150です。

これらのしきい値(50 cm、10 cm、2 cm)と速度(200および150)は、車の動作を変更するために調整できる主要な変数です。たとえば、車が速く動く場合は、「安全」距離を60 cmに増やすことができます。

カスタム関数

コードには、車の動きを制御するためのいくつかのカスタム関数が含まれています。これらはメインループ全体で使用され、コードをよりクリーンで理解しやすくします。

  • moveForward(int speed): この関数はモーターピンを設定して車を前進させます。speedパラメータ(0〜255)はモーターの回転速度を制御します。
  • moveBackward(int speed): moveForwardと似ていますが、モーターの方向を逆にして車を後退させます。
  • backLeft(int speed)およびbackRight(int speed): これらの関数は、一方のモーターを逆回転させ、もう一方を停止させることで車を旋回させます。これは、車が効率的に方向を変えるのに役立つピボットターンです。
  • stopMove(): この関数は、すべての制御ピンをLOWに設定してすべてのモーターを停止させます。
  • readSensorData(): この関数は超音波センサーからパルスを送信し、エコーが戻るまでの時間を測定します。その後、距離をセンチメートルで計算して値を返します。

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

(ビデオの07:09で)デモでは、車は箱や壁などのさまざまな障害物がある環境に置かれています。車のロジックは、ナビゲートする際に確認できます。超音波センサーが50cm以上離れた壁や障害物を検出すると、自信を持って前進します。近づくにつれて、側面のIRセンサーが空きスペースを確認します。

左側に障害物が検出された場合、車はそれを避けるために後退右旋回を行い、その逆も同様です。車がテーブルの下など狭い場所にいる場合(ビデオの07:49で)、逆進および旋回機能を使用して脱出し、明確な経路を見つけます。車は環境を継続的に読み取り、意思決定を行い、事前に計画された経路に依存しない反応制御システムを示しています。

ビデオチャプター

  • [00:00] 自動運転車プロジェクトの紹介
  • [00:28] SunFounder 3-in-1キットについて
  • [01:32] コードを開いて概要を確認
  • [02:02] コード構造と新機能の説明
  • [03:11] セットアップ関数でのピン設定
  • [03:28] ループ内の主要な意思決定ロジック
  • [05:41] ライブデモ:車の動作
  • [07:09] 障害物と壁追従のデモ
  • [09:58] 結論と最終的な考察

画像

28 SunFounder Car 6 self-driving path
28 SunFounder Car 6 self-driving path
Car 7 8 28 self driving
Car 7 8 28 self driving
897-Lesson 28/31: Car-6 SunFounder self Driving Arduino car
言語: C++
/*
Lesson 28/31: Car-6 SunFounder self Driving Arduino car
Get this code and watch video Download and resource page https://robojax.com/RJT611
https://www.youtube.com/watch?v=IyninXUcsn0
*/
const int A_1B = 5;
const int A_1A = 6;
const int B_1B = 9;
const int B_1A = 10;

const int echoPin = 4;
const int trigPin = 3;

const int rightIR = 7;
const int leftIR = 8;

float readSensorData() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  float distance = pulseIn(echoPin, HIGH) / 58.00; //Equivalent to (340m/s*1us)/2
  return distance;
}


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 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);
}

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

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

  //ultrasonic
  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);

  //IR obstacle
  pinMode(leftIR, INPUT);
  pinMode(rightIR, INPUT);
}

void loop() {

  int left = digitalRead(leftIR);  // 0: Obstructed   1: Empty
  int right = digitalRead(rightIR);

  if (!left && right) {
    backLeft(150);
  } else if (left && !right) {
    backRight(150);
  } else if (!left && !right) {
    moveBackward(150);
  } else {
    float distance = readSensorData();
    Serial.println(distance);
    if (distance > 50) { // Safe
      moveForward(200);
    } else if (distance < 10 && distance > 2) { // Attention
      moveBackward(200);
      delay(1000);
      backLeft(150);
      delay(500);
    } else {
      moveForward(150);
    }
  }
}

リソースと参考文献

ファイル📁

Arduinoライブラリ(zip)