検索コード

レッスン27/31:SunFounderスマートカーがArduinoを使って手に追従する | Robojax

レッスン27/31:SunFounderスマートカーがArduinoを使って手に追従する | Robojax

はじめに

あなたの存在に直感的に反応するロボットを組み立てたいと思ったことはありませんか?このプロジェクトは、標準のSunFounder Smart Carを、手に追従するジェスチャー制御車両に変身させます。リモコンやスマートフォンアプリの代わりに、この車は超音波センサーと赤外線センサーの組み合わせを使用して、手の位置と距離を検出し、簡単な自然な動きで左、右、または前方に誘導できるようにします。

27-SunFounder-Car-5-Follow-Hand

このプロジェクトは、Robojax Arduinoコース(レッスン27/31)の一部であり、SunFounder 3-in-1 Arduinoキットを使用して構築されています。これは、複数のセンサーが連携してより複雑で応答性の高い動作を生み出すセンサーフュージョンについて学ぶ優れた方法です。ここでの実際の価値は、ロボット工学と自動化の基本概念である、異なるタイプの入力を組み合わせて意思決定を行う方法を理解することにあります。

このロジックを基に構築できる実用的なアイデアをいくつか紹介します:

  • インタラクティブ展示:訪問者に追従して注意を引く小さなロボットディスプレイを作成します。
  • 自律型障害物回避プラットフォーム:手に追従する代わりに障害物を回避して部屋を移動するようにコードを変更します。
  • 教育用ロボットキット:センサー統合、ロジック、モーター制御について学生に教えるための基礎プロジェクトとして使用します。
  • スマート配達トロリー:管理された環境では、このロジックを倉庫や工場の設定で人に追従する小型トロリーに適合させることができます。

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

このプロジェクトでは、SunFounder 3-in-1 Arduinoキットに含まれるコンポーネントを使用します。使用する主要なコンポーネントは以下のとおりです:

  • SunFounder Smart Carシャーシ:車輪とモーターを備えた物理的なプラットフォーム。
  • Arduinoボード:コードを実行する車の「頭脳」。
  • 超音波センサー(HC-SR04):車の前方にある物体(あなたの手)までの距離を測定するために使用されます。
  • 2つのIR(赤外線)障害物回避センサー:左右に取り付けられ、その側面に手があるかどうかを検出します。
  • モータードライバー:Arduinoからの信号に基づいて車のモーターの速度と方向を制御するために使用されるモジュール(多くの場合L298Nまたは類似品)。
  • 電源:Arduinoとモーターに電力を供給するバッテリー。

配線ガイド

car_7_8_follow_hand

ビデオで述べたように、このプロジェクトの配線は、以前のレッスンで障害物回避車について説明したものと同一です。センサーとモーターはすべてArduinoのデジタルおよびアナログピンに接続されています。視覚的な参考については、SunFounder Smart Carの配線図を参照してください。

コードは各コンポーネントに使用される特定のピンを定義しており、次のセクションで詳しく説明します。

コードの説明

このセクションでは、自分の車に合わせて調整したいコードのユーザー設定可能な部分に焦点を当てます。完全なプログラムは、Robojaxリソースページからダウンロードできます。

スケッチの最上部に、ピン定義があります。これらは、インストラクターとは異なる方法で車を配線した場合に理解すべき最も重要な行です。

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

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

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

各ピングループの機能は次のとおりです:

  • モーターピン(A_1A、A_1B、B_1A、B_1B):これらは、2つのモーターを制御するためにモータードライバーに接続されたピンです。「A」と「B」のラベルは通常、それぞれ左と右のモーターを指します。モータードライバーが異なるArduinoピンに接続されている場合は、これらを変更する必要があります。
  • IRセンサーピン(rightIR、leftIR):これらのデジタル入力ピンは、左右の赤外線障害物センサーからの信号を読み取ります。0の値は障害物(あなたの手)が検出されたことを意味し、1は経路がクリアであることを意味します。
  • 超音波センサーピン(trigPin、echoPin):trigPinは短い超音波パルスを送信する出力であり、echoPinは反射パルスの持続時間を読み取って距離を計算する入力です。

loop()関数内に、メインの動作ロジックがあります。調整したい変数が1つあります:

int speed = 150;

このspeed変数は、移動中にモーターに送られる電力を制御します。0(停止)から255(最大速度)の範囲です。より速い車にするにはこの値を増やし(例:200)、より制御されたゆっくりした動きにするには減らす(例:100)ことができます。

コードには、moveForward()turnLeft()turnRight()などの関数も含まれています。これらの関数は車の動きを制御するために使用され、センサーの読み取り値に基づいて呼び出されます。これらを変更する必要はありませんが、独自のカスタム動作を作成するための構成要素として使用できます。

「手に追従する」ロジックの仕組み

このプロジェクトの魅力は、Arduinoが3つのセンサーからのデータをどのように解釈するかにあります。そのロジックはシンプルで、loop()関数内で継続的に実行されます。

まず、車は超音波センサーを使って正面の物体までの距離を測定します。次に、2つの赤外線センサーをチェックし、左右どちらかに物体があるかを確認します。判断プロセスは次のとおりです:

  1. 前進:超音波センサーで測定した距離が5cmより大きく10cm未満の場合、車は前進します。これにより、車があなたの手に追従する「スイートスポット」ゾーンが生まれます。
  2. 左折:距離がそのゾーンにない場合、車はIRセンサーをチェックします。左センサーが遮られ(左手が左側にある)、右センサーがクリアなら、車は左折します。
  3. 右折:逆に、右センサーが遮られ、左センサーがクリアなら、車は右折します。
  4. 停止:これらの条件のいずれも満たされない場合(例えば、手が遠すぎる、または近すぎる場合)、車は停止します。

このシンプルなルールセットにより、車は手の位置に動的に反応し、スムーズで直感的な追従動作を実現します。

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

ビデオデモンストレーションでは、講師が車の動作をリアルタイムで紹介しています。シリアルモニターを使用して、超音波センサーが読み取った距離を表示します。車がアイドル状態で手が遠い場合(例:36cm)、停止したままです。手を車の前の5〜10cmゾーンに置くとすぐに、前進し始めます。

デモでは、旋回ロジックも強調されています。車の左側に手を置くと、左のIRセンサーが反応し、車は左折します。同様に、右側に手を置くと、車は右折します。手を動かすと車は追従し続け、手がセンサー範囲から外れるか、近すぎる場合にのみ停止します。これにより、センサーフュージョンとロジックが意図どおりに機能し、応答性が高く楽しいプロジェクトが実現していることが確認できます。

チャプター

  • [00:00] ハンド追従スマートカーの紹介
  • [00:35] Robojax Arduinoコースとキットについて
  • [01:41] プロジェクト概要とコード設定
  • [02:19] ピン定義とセットアップの説明
  • [03:19] 手に追従するコードロジック
  • [05:48] 車の動作のライブデモンストレーション
  • [07:28] 最終デモと性能レビュー

画像

Car 7 8 follow hand
Car 7 8 follow hand
27 SunFounder Car 5 follow hand
27 SunFounder Car 5 follow hand
898-Lesson 27/31: Car-5 SunFounder Smart Car Follows Your Hand
言語: C++
/*
Lesson 27/31: Car-5 SunFounder Smart Car Follows Your Hand
Get this code and watch video Download and resource page https://robojax.com/RJT610
YouTube video https://www.youtube.com/watch?v=mcbJlE7-8ro

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

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

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

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

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

  //IR obstacle
  pinMode(leftIR,INPUT);
  pinMode(rightIR,INPUT);
  
  //ultrasonic
  pinMode(echoPin, INPUT);
  pinMode(trigPin, OUTPUT);
}

void loop() {

  float distance = readSensorData();

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

  if (distance>5 && distance<10){
    moveForward(speed);
  }else if(!left&&right){
    turnLeft(speed);
  }else if(left&&!right){
    turnRight(speed);
  }else{
    stopMove();
  }
}

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 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 stopMove() {
  analogWrite(A_1B, 0);
  analogWrite(A_1A, 0);
  analogWrite(B_1B, 0);
  analogWrite(B_1A, 0);
}

リソースと参考文献

ファイル📁

Arduinoライブラリ(zip)