こんばんは!
今回は超音波センサとサーボモータを使って障害物の検出をしてみようと思います。
概要
サーボモータを回し、超音波センサで距離を測り、一定の距離以内に障害物があった場合、圧電スピーカーで警告音を鳴らす。
使用するもの
・Arduinoメインボード(https://amzn.to/2vkPIUH)
・USBケーブル(https://amzn.to/2UHhntl)
・ブレッドボード(https://amzn.to/38eNi8u)
・ジャンパワイヤ (https://amzn.to/39uBU8T)
・サーボモータsg90(https://amzn.to/2D66wQK)
・超音波センサ(https://amzn.to/2FnpvID)
・圧電スピーカ(https://amzn.to/2Fnfuv0)
手順
まずハード側からやっていきます。
写真のようにグルーガンでサーボモータと超音波センサを取り付けます。
次に以下の図のように配線していきます。
これでハード側は終了です。
次に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 | #include <Servo.h> Servo myservo; #define PIN 8 #define TRG 12 #define ECH 11 #define HIGHTIME 10 int loopdis = 100; int newloopdis = 100; void setup() { myservo.attach(10); myservo.write(30); pinMode(TRG, OUTPUT); pinMode(ECH, INPUT); } void loop() { myservo.write(30); for (int i = 30; i <= 150; i++) { myservo.write(i); delay(5); loopdis = measure(); if (loopdis < 10) { while(true){ tone(PIN, 445, 50); newloopdis = measure(); if(newloopdis > 10){ break; } } } } for (int i = 150; i >= 30; i--) { myservo.write(i); delay(5); loopdis = measure(); if (loopdis < 10) { while(true){ tone(PIN, 445, 50); newloopdis = measure(); if(newloopdis > 10){ break; } } } } } float measure() { int diff; float dis; digitalWrite(TRG, HIGH); delayMicroseconds(HIGHTIME); digitalWrite(TRG, LOW); diff = pulseIn(ECH, HIGH); dis = (float)diff * 0.01715; return dis; } |
コードの説明をします。
setup()以前はピン番号の設定とサーボモータのオブジェクトを作成しています。
setup()内ではサーボモータを30°の位置(スタート位置)にし、超音波センサのtrigピンとechoピンの初期化をしています。
measure()関数は超音波センサで距離を計測するものです。
loop()内ではサーボモータを30°~150°まで回転させ、1°ずつmeasure関数を呼び出して距離を計測し、値が10cm以内であったら圧電スピーカーで音を鳴らすというコードを書いています。
150°までいったら反対に150°~30°まで同様のことをします。
今回のコードは過去の3つの記事を応用して書いています。
ぜひご覧ください。
これをメインボードに書き込んでみます。
動作している様子を動画にしたのでご覧ください。
ちゃんと障害物を検出して音を出していますね!
まとめ
今回はこれまで使った圧電スピーカー、サーボモータ、超音波センサの3つの部品を組み合わせて1つのユニットを作ってみました。
今回のを応用すれば壁を避けれるようなロボットも作れそうな気がします。
今回はこれで終わります。
ではまた!