TOP > カテゴリ > ロボット・電子工作・マイコン >

障害物を発見したら「自動ブレーキ」をするロボットカー [Arduino]

ロボットカーで障害物との衝突を回避する「自動ブレーキ」を実現します。今回は「超音波距離センサー」で障害物を認識して15cm以内に障害物がある場合は自動ブレーキをかけます。

ロボットカーは最後まで組み立てていませんが、衝突を回避する原理はこんな感じになります。これ以外には赤外線やレーザー、画像処理などを使用する手法もあります。

使用部品・材料

総額で約3,844円です。(Arduino本体の値段を除く)

部品/材料値段備考
サンハヤト SAD-101 ニューブレッドボード (2個)¥1000Amazon.com
超音波距離センサー HC-SR04¥400秋月電子の通販コード(M-11009)
モータードライバ(TA7291P) (2個)¥300秋月電子の通販コード(I-02001)
タミヤ
ユニバーサルプレート 2枚セット (70157) 
¥468Amazon.com
3mmプラネジ(7mm)+六角スペーサー(14mm)セット(任意)ユニバーサルプレートの結合用。
秋月電子の通販コード(P-01861)
タミヤ
ツインモーターギヤーボックス (70097)
¥587ギアは低速ギヤー比203:1のCタイプを使用。
Amazon.com
タミヤ
マンモスダンプ 17013
¥819タイヤ2個のみを使用しています。
Amazon.com
電池ボックス 単3x3本 リード線¥60モーター用。
秋月電子の通販コード(P-02667)
単3電池
3本
¥100モーター用。
100円ショップ
コネクタ付コード(みの虫×ジャンパーワイヤ)¥110電池ボックス用。
秋月電子の通販コード(C-08916)

※超音波距離センサー及びモータードライバの詳細は表内のリンク先をご覧ください。

モーターにはリード線がありませんので「耐熱電子ワイヤー」(P-06756)や片側をカットした「ジャンパーワイヤー」を半田付けして下さい。その2本を繋ぐ場合は2本のリード線をつなぐをご参考にして下さい。

配線図

2つのタイヤが同じ回転方向になるように、モーターの配線を状況に応じて変更して下さい。(配線図で言うと、モーターの黄色・緑色を逆にする)

スケッチ(プログラム)

超音波距離センサーで障害物が15cm以内に出現すると、モーターの回転を停止して自動ブレーキをします。

int PIN_R_IN1  = 3;
int PIN_R_IN2  = 4;
int PIN_R_VREF = 5; // PWM

int PIN_L_IN1  = 7;
int PIN_L_IN2  = 8;
int PIN_L_VREF = 9; // PWM

int TRIGGER_PIN = 10;
int ECHO_PIN = 11;

boolean OnFlg = false;
 
void setup(){
  Serial.begin(9600);  
  
  pinMode(PIN_R_IN1,OUTPUT); 
  pinMode(PIN_R_IN2,OUTPUT);   
  pinMode(PIN_L_IN1,OUTPUT); 
  pinMode(PIN_L_IN2,OUTPUT); 

  pinMode(TRIGGER_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);  

  // モーターの回転速度を中間にする
  analogWrite(PIN_R_VREF,127); 
  analogWrite(PIN_L_VREF,127); 
}
 
void loop(){
  // [超音波の発射]
  // ※トリガーとなるHIGH時間は「10us ~ 60ms」まで
  digitalWrite(TRIGGER_PIN, LOW);
  delayMicroseconds(5);
  digitalWrite(TRIGGER_PIN, HIGH);
  delayMicroseconds(18);
  digitalWrite(TRIGGER_PIN, LOW);
 
  // [距離の取得]
  // ※echoピンに入力されるパルスの長さを検出する(HIGH時間の取得/μ秒)
  int duration = pulseIn(ECHO_PIN, HIGH);
  if (duration > 0) {
    // 距離(cm) = ECHOのHIGH時間 x 超音波速度(0.034cm/μ秒) / 2
    float distance = (duration * 0.034) / 2;
    Serial.print(distance);
    Serial.println("cm");

    if(distance >= 15){
      if (!OnFlg){
        // モーター回転 
        Serial.println("ok");
        digitalWrite(PIN_R_IN1,LOW);
        digitalWrite(PIN_R_IN2,HIGH);    
        digitalWrite(PIN_L_IN1,HIGH);
        digitalWrite(PIN_L_IN2,LOW);
        OnFlg = true;
      }
    }else{
      // モーター停止 
      OnFlg = false; 
      digitalWrite(PIN_R_IN1,HIGH);
      digitalWrite(PIN_R_IN2,HIGH);    
      digitalWrite(PIN_L_IN1,HIGH);
      digitalWrite(PIN_L_IN2,HIGH);
    }
  }
  delay(200);
}

今回の超音波センサーはカラダに当てると若干、不快感があるので、人体には向けないほうが良いかもです。





関連記事



公開日:2017年12月02日 最終更新日:2017年12月09日
記事NO:02615