こんばんは!
今回はArduinoを使って壁にぶつからないロボットを作ってみました。
超音波センサで壁(障害物)までの距離を計測し、距離が近かったらバックし、左右どちらかの広い方向へ移動するように設定しました。
完成品は以下の動画のように動作します。
使用するもの
・Arduinoメインボード(https://amzn.to/2vkPIUH)
・USBケーブル(https://amzn.to/2UHhntl)
・ブレッドボード(https://amzn.to/38eNi8u)
・ジャンパワイヤ (https://amzn.to/39uBU8T)
・超音波センサ(https://amzn.to/2Czq5iV)
・サーボモータ(https://amzn.to/2CyElIE)
・9V電池(https://amzn.to/2FLzLtJ)
・DCモータ+タイヤ+シャーシ(https://ru.aliexpress.com/item/DOIT-4wd-C101/32856899357.html?spm=a2g0s.9042311.0.0.274233edy2nluU)
・DCモータコントローラ(https://amzn.to/2CyEhso)
組み立て・配線
まず、TTモータとタイヤ、シャーシを組み立てします。
今回はすべてセットになっているこちらのものを購入しました。
https://ru.aliexpress.com/item/DOIT-4wd-C101/32856899357.html?spm=a2g0s.9042311.0.0.274233edy2nluU
次に配線をしていきます。
以下の図のように全ての部品を接続します。
プログラム
次にArduino IDEを起動して次のコードを書き込んでいきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include <Servo.h> #define TRG 2 #define ECH 3 #define HIGHTIME 10 int in1 = 11; int in2 = 10; int in3 = 9; int in4 = 8; int enA = 5; int enB = 6; Servo myservo; void setup() { pinMode(TRG, OUTPUT); pinMode(ECH, INPUT); myservo.attach(12); pinMode(enA, OUTPUT); pinMode(enB, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); pinMode(in3, OUTPUT); pinMode(in4, OUTPUT); Serial.begin(9600); } void loop() { moveGo(); neckSwing(); } int checkDistance() { int diff; float dis; digitalWrite(TRG, HIGH); delayMicroseconds(HIGHTIME); digitalWrite(TRG, LOW); diff = pulseIn(ECH, HIGH); dis = (float)diff * 0.01715; delayMicroseconds(10); return dis; } void neckSwing() { int f = checkDistance(); Serial.println(f); if (f < 15 && f >= 0) { moveStop(); moveBack(); moveStop(); myservo.write(30); int s = checkDistance(); delay(500); myservo.write(150); int t = checkDistance(); delay(500); myservo.write(90); if (s > t) { moveLeft(); } else if (t > s) { moveRight(); } } else { } } void moveStop() { digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); delay(1000); } void moveGo() { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(enA, 140); analogWrite(enB, 140); delayMicroseconds(10); } void moveBack() { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); analogWrite(enA, 180); analogWrite(enB, 180); delay(500); } void moveLeft() { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); analogWrite(enA, 180); analogWrite(enB, 180); delay(800); } void moveRight() { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(enA, 180); analogWrite(enB, 180); delay(800); } |
checkDistance()関数は超音波センサで障害物までの距離を計測するためのものです。
neckSwing()は正面の障害物までの距離を計測して15cm以上あったら何もせず、15cm以内であったら、少しバック→左右の障害物までの距離を計測→距離が遠い方向へ方向転換という処理をしています。
今回のコードはDCモータコントローラの記事などで記述したコードの応用なので詳しくはそちらをご覧ください。
これでArduinoボードに書き込むと冒頭の動画のように動くはずです。
まとめ・考察
今回はサーボモータ、モータコントローラ、超音波センサなどを使って壁を避けるロボットを作ってみました。
今回のロボットには正面にしか超音波センサがついていないため、壁に対して斜めになってしまった場合に上手く検知できないこともありました。
この問題は、超音波センサを複数使用することで解決できるかもしれないのでまたやっていきたいと思います。
今回はこれで終わります。
ではまた!