固定された「目」から、左右を見渡すセンサーヘッドへ
前回の実験では、ESP32と超音波距離センサー「HC-SR04」を使い、物体までの距離を測定した。
しかし、センサーを固定した状態では、正面方向の距離しか分からない。
そこで今回は、小型サーボモーター「SG90」にHC-SR04を取り付け、センサーの向きを左右へ変えながら距離を測定する実験を行った。
サーボモーターの角度と超音波センサーの距離情報を組み合わせることで、次の情報を取得できる。
どの方向に障害物があるか
左右のどちらが開けているか
障害物までのおおよその距離
これは、ロボットや自律移動機、将来のe-NOXにおける障害物検知の基本となる仕組みである。
今回使用した部品
ESP32開発ボード
HC-SR04超音波距離センサー
SG90小型サーボモーター
ブレッドボード
ジャンパーワイヤ
ECHO信号分圧用抵抗
直角形状のプラスチック板
固定用の小ねじ
USBケーブル
Arduino IDE
ESP32Servoライブラリ
HC-SR04のECHO端子は約5Vの信号を出力する。
ESP32のGPIOは3.3V系であるため、ECHO端子を直接接続せず、抵抗による分圧回路を介してGPIO27へ入力した。
配線
今回の主な接続は次のとおりである。
機器 端子 ESP32接続先
SG90 信号線(橙または黄) GPIO33
SG90 電源(赤) 5V
SG90 GND(茶または黒) GND
HC-SR04 TRIG GPIO25
HC-SR04 ECHO 分圧回路を介してGPIO27
HC-SR04 VCC 5V
HC-SR04 GND GND
ESP32、SG90、HC-SR04のGNDは共通にした。HC-SR04のECHO端子は約5Vを出力するため、ESP32へ直接接続せず、抵抗による分圧回路を介してGPIO27へ入力した。
サーボモーターは動き始める瞬間に比較的大きな電流を必要とする。
動作中にESP32が再起動する場合や、サーボが細かく震える場合は、配線の接触不良だけでなく、電源容量の不足も確認する必要がある。
最初にサーボモーター単体を試験
いきなり超音波センサーを取り付けるのではなく、最初にSG90単体で角度制御を確認した。
サーボモーターを次の順番で動かした。
約10度
約90度
約170度
約90度
試験に使用したコードは次のとおりである。
#include <ESP32Servo.h>
Servo scanServo;
const int servoPin = 33;
void setup() {
Serial.begin(115200);
scanServo.setPeriodHertz(50);
scanServo.attach(servoPin, 500, 2400);
Serial.println(“サーボ試験開始”);
}
void loop() {
Serial.println(“10度”);
scanServo.write(10);
delay(1500);
Serial.println(“90度”);
scanServo.write(90);
delay(1500);
Serial.println(“170度”);
scanServo.write(170);
delay(1500);
Serial.println(“90度”);
scanServo.write(90);
delay(1500);
}
サーボは約1.5秒ごとに指定位置へ移動し、最後に中央付近へ戻る動作を繰り返した。
移動後に停止し、一定時間が経過してから次の角度へ動くため、断続的な動作に見える。
これはコードどおりの正常な挙動である。
端の位置でサーボが唸り続けないこと、細かく振動しないこと、ESP32が再起動しないことも確認した。
HC-SR04をサーボモーターへ固定
超音波センサーをサーボモーターへ載せる方法として、当初は両面テープ、結束バンド、ホットボンドなども候補に挙がった。
しかし今回は、これらを使用しなかった。
直角形状のプラスチック板をHC-SR04の寸法に合わせて切り出し、センサー基板とサーボホーンをネジで固定した。
プラスチック板を介して、次の部分を機械的に接続している。
HC-SR04の基板
サーボホーン
SG90の回転軸
完成した超音波センサーヘッド
HC-SR04は、SG90の回転軸の上部に配置した。
センサー基板とサーボホーンの間には、寸法に合わせて加工した直角プラ板を使用している。
接着剤を使った固定と比較すると、ネジ止めには次の利点がある。
センサーの向きがずれにくい
回転中の揺れを抑えやすい
分解と再調整が可能
センサーの交換が容易
同じ構造を再製作しやすい
試作段階であっても、機械部分を安定して固定することで、サーボの角度とセンサーの向きの関係を保ちやすくなる。
左右を走査して距離を測定
HC-SR04をサーボモーターへ取り付けた後、角度ごとに停止して距離を測定するコードを作成した。
今回の測定角度は次の5方向である。
30度
60度
90度
120度
150度
左から右へ測定した後、反対方向へ戻る。
#include <ESP32Servo.h>
Servo scanServo;
const int servoPin = 33;
const int trigPin = 25;
const int echoPin = 27;
// 1回の距離測定
float measureDistanceOnce() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// 約4m相当でタイムアウト
unsigned long duration = pulseIn(echoPin, HIGH, 23500);
if (duration == 0) {
return -1.0;
}
float distanceCm = duration * 0.0343 / 2.0;
if (distanceCm < 2.0 || distanceCm > 400.0) {
return -1.0;
}
return distanceCm;
}
// 3回測定して中央値を使用
float measureDistanceMedian() {
float values[3];
for (int i = 0; i < 3; i++) {
values[i] = measureDistanceOnce();
delay(60);
}
for (int i = 0; i < 2; i++) { for (int j = i + 1; j < 3; j++) { if (values[i] > values[j]) {
float temp = values[i];
values[i] = values[j];
values[j] = temp;
}
}
}
return values[1];
}
void measureAtAngle(int angle) {
scanServo.write(angle);
// サーボが指定位置で停止するまで待つ
delay(600);
float distanceCm = measureDistanceMedian();
Serial.print(“角度: “);
Serial.print(angle);
Serial.print(“度 距離: “);
if (distanceCm < 0) {
Serial.println(“測定不能”);
} else {
Serial.print(distanceCm, 1);
Serial.println(” cm”);
}
}
void setup() {
Serial.begin(115200);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
digitalWrite(trigPin, LOW);
scanServo.setPeriodHertz(50);
scanServo.attach(servoPin, 500, 2400);
scanServo.write(90);
delay(1000);
Serial.println(“超音波スキャン開始”);
}
void loop() {
// 左から右へ
measureAtAngle(30);
measureAtAngle(60);
measureAtAngle(90);
measureAtAngle(120);
measureAtAngle(150);
Serial.println(“—– 反転 —–“);
// 右から左へ
measureAtAngle(120);
measureAtAngle(90);
measureAtAngle(60);
Serial.println(“===== 1周終了 =====”);
delay(1500);
}
シリアルモニターへの表示
Arduino IDEのシリアルモニターには、角度と距離が次のような形式で表示される。
角度: 30度 距離: 82.4 cm
角度: 60度 距離: 45.1 cm
角度: 90度 距離: 118.6 cm
角度: 120度 距離: 37.9 cm
角度: 150度 距離: 測定不能
—– 反転 —–
角度: 120度 距離: 38.2 cm
角度: 90度 距離: 119.1 cm
角度: 60度 距離: 44.8 cm
===== 1周終了 =====
これにより、正面だけでなく、複数方向の距離を順番に確認できるようになった。
表示が速く流れて確認しにくい場合は、1周終了後の待ち時間を長くする。
delay(3000);
Arduino IDEのシリアルモニターで自動スクロールを止め、表示位置を固定して確認する方法もある。
この場合、通信速度の115200bpsを変更する必要はない。
実験結果
今回の実験では、次の動作を確認した。
ESP32からSG90サーボモーターを制御できた
約10度、90度、170度の位置へ移動できた
HC-SR04をサーボモーターへ機械的に固定できた
サーボの角度ごとに距離を測定できた
左右を往復しながら周囲を走査できた
これまで固定されていた超音波センサーに回転機構を加えたことで、単なる「距離」だけでなく、「方向と距離」を組み合わせた情報を取得できるようになった。
差し込み式配線で分かったこと
今回の実験では、ブレッドボードとジャンパーワイヤによる差し込み式配線を使用した。
差し込み式配線は、回路を何度も変更できるため、試作には適している。
一方、センサーやサーボが動く構造では、配線の振動や引っ張りによって接触が不安定になることがある。
想定される症状は次のとおりである。
距離が突然「測定不能」になる
サーボが途中で停止する
ESP32が再起動する
配線に触れると動作が変わる
測定値が大きく乱れる
ホットボンドでコネクタを固定する方法もある。
ただし、ホットボンドはコネクタの抜け止めにはなるが、電気的な接触そのものを改善するものではない。
今回はセンサー本体の固定にホットボンドや結束バンドを使用せず、直角プラ板とネジによる固定構造とした。
今後、飛行機体や移動する試験装置へ搭載する場合は、はんだ付けやロック付きコネクタへの変更も必要になる。
今回の実験の意味
固定されたセンサーは、一方向しか観測できない。
そこへ回転機構を加えることで、一つの距離センサーを使って複数方向を測定できる。
今回製作したものは簡易的なセンサーヘッドだが、基本構造は次のようなシステムにつながる。
移動ロボットの障害物回避
自律走行車両の周辺確認
室内飛行機の壁面検知
進行可能方向の選択
物体の存在方向の推定
簡易的な周辺距離マップの作成
e-NOXは今回、固定された一方向のセンサーから、左右を見渡す機構へ進んだ。
次の課題
次の段階では、以下の内容を検討する。
角度ごとの距離情報を表やグラフで表示する
最も距離が長い方向を自動的に判定する
障害物の近い方向を避ける処理を追加する
PIRセンサーの検知方向と組み合わせる
配線をはんだ付けまたはコネクタ化する
小型のToF距離センサーへ置き換える
XIAO ESP32S3 Senseとの組み合わせを試す
Pixel 7aへ距離情報を送信する
超音波センサーは、サーボの動き、周辺の形状、対象物の角度、表面材質などによって測定結果が変化する。
その不安定さも含めて確認することが、実機開発では重要になる。
まとめ
今回の実験では、SG90サーボモーターとHC-SR04超音波センサーを組み合わせ、左右方向を走査するセンサーヘッドを製作した。
HC-SR04は、寸法に合わせて加工した直角プラスチック板を使い、サーボホーンへネジ止めした。
その結果、固定された正面方向だけでなく、複数の角度における距離を取得できるようになった。
小さな機構ではあるが、方向と距離を組み合わせて周辺を認識するための基礎となる。
e-NOXの「目」は、正面を見るだけの状態から、左右を見渡す段階へ進んだ。


コメントを残す