障害物を発見したら「自動ブレーキ」をするロボットカー [Arduino]
ロボットカーで障害物との衝突を回避する「自動ブレーキ」を実現します。今回は「超音波距離センサー」で障害物を認識して15cm以内に障害物がある場合は自動ブレーキをかけます。
ロボットカーは最後まで組み立てていませんが、衝突を回避する原理はこんな感じになります。これ以外には赤外線やレーザー、画像処理などを使用する手法もあります。
使用部品・材料
総額で約3,844円です。(Arduino本体の値段を除く)
部品/材料 | 値段 | 備考 |
---|---|---|
サンハヤト SAD-101 ニューブレッドボード (2個) | ¥1000 | Amazon.com |
超音波距離センサー HC-SR04 | ¥400 | 秋月電子の通販コード(M-11009) |
モータードライバ(TA7291P) (2個) | ¥300 | 秋月電子の通販コード(I-02001) |
タミヤ ユニバーサルプレート 2枚セット (70157) | ¥468 | Amazon.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); }
今回の超音波センサーはカラダに当てると若干、不快感があるので、人体には向けないほうが良いかもです。
スポンサーリンク
掲示板
ArduinoやRaspberry Piなどの電子工作の掲示板を作成しました。質問やわからない事は電子工作 (Arduino・ラズパイ等)でユーザー同士で情報を共有して下さい。
関連記事
公開日:2017年12月02日 最終更新日:2017年12月09日
記事NO:02615