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

障害物を避けて自動走行するロボットカー [Arduino]

前方に障害物があると自動的に回避して走行するロボットカーです。

あくまでも簡易的です。超音波センサーで前方の距離を計測して15cm以内ならば、車体をバックしてから左旋回をするようにしています。

写真

使用部品・材料

総額で約4,304円です。(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
タミヤ
ボールキャスター(2セット入)ボールキャスター(2セット入)
¥300前輪用。
右側がボールキャスター。左はホームセンターで購入。どちらでもOKです。

秋月電子の通販コード(K-10372)
タミヤ
マンモスダンプ 17013
¥819後輪用にタイヤ2個のみを使用しています。
Amazon.com
電池ボックス 単3x3本 リード線¥60モーター用。
秋月電子の通販コード(P-02667)
単3電池
3本
¥100モーター用。
100円ショップ
9V電池¥100Arduino用。
100円ショップ
2.1mmDCプラグ付バッテリースナップ(縦型)¥60Arduino用。
秋月電子の通販コード(P-07356)
コネクタ付コード(みの虫×ジャンパーワイヤ)¥110電池ボックス用。
秋月電子の通販コード(C-08916)
マスキングテープ(任意)ユニバーサルプレートにArduinoやら電池ボックスなどをこのテープで取り付けます。マスキングテープなので後から綺麗に剥がせます。

ホームセンター

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

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

配線図

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

前回の自動ブレーキの配線と同じです。

スケッチ(プログラム)

超音波センサーで障害物が15cm以内に出現すると、3秒間後進(車体をバック)して、1.25秒間左旋回をします。

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,HIGH);
        digitalWrite(PIN_R_IN2,LOW);    
        digitalWrite(PIN_L_IN1,LOW);
        digitalWrite(PIN_L_IN2,HIGH);
        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);

      // 後ろへ戻る
      digitalWrite(PIN_R_IN1,LOW);
      digitalWrite(PIN_R_IN2,HIGH);    
      digitalWrite(PIN_L_IN1,HIGH);
      digitalWrite(PIN_L_IN2,LOW);
      delay(3000);
      
      // 左へ旋回
      digitalWrite(PIN_R_IN1,HIGH);
      digitalWrite(PIN_R_IN2,LOW);    
      digitalWrite(PIN_L_IN1,HIGH);
      digitalWrite(PIN_L_IN2,HIGH);
      delay(1250);  
    }
  }
  delay(200);
}

あくまでも簡易的ですので、各自の環境に合わせて調整をして下さい。





関連記事



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