Arduino Yunで超音波マップメーカーを自作するステップバイステップガイド
コンポーネントと用品
| Arduino Yun | × | 1 |
| 超音波センサー (HC-SR04等) | × | 1 |
| サーボモーター (Tower Pro MG996R) | × | 1 |
| ジャンパーワイヤー (汎用) | × | 10本 |
アプリとオンラインサービス
| Arduino IDE |
| MATLAB |
このプロジェクトについて
ステップ1: 理論
このプロジェクトでは超音波距離センサーを使用します。人間の聴覚範囲を超えた音波を発生させ、その波が障害物に当たって戻ってくるまでの時間を計測することで距離を測定します。これはコウモリや巡航船が使用する原理と同じです。
もう一つのコンポーネントはサーボモーターです。通常のDCモーターとは異なり、指定された角度位置に精密に回転し、その位置を保持できます。特定の長さのパルスを与えると、対応する角度位置に移動します。
これら2つのコンポーネントを組み合わせて、ロボットに180度の視野角を持たせます。
ステップ2: 材料の準備
このプロジェクトで使用するハードウェア:
- Arduino Uno / Yun (UnoやYunのフォームファクタを持つ任意のArduino互換ボードで代用可能)
- Arduinoプロトタイピングシールド
- HC-SR04超音波センサー
- サーボモーター (Tower Pro SG90を使用。非常にコンパクト)
ソフトウェア側:
- Arduino IDE: サーボの回転制御、超音波センサーからの距離データ取得、シリアルポートへのデータ送信を行う制御コードをArduinoにアップロードするために使用
- MathWorks MATLAB: シリアルラインからデータを受信し、処理・可視化してグラフ化するために使用
ステップ3: 機械的組み立て
汎用基板の小片でHC-SR04用の小さなヘッダーを作り、両面テープでサーボホーンに取り付けます。
このステップは省略可能ですが、システムをよりコンパクトにするため、サーボをプロトシールドの突出部に両面テープで固定しました。
完成すると、ウォーリー(Wall-E)の腹部のような見た目になります。
ステップ4: Arduinoコード
Arduinoコードは、サーボモーターの動作制御、超音波センサーからの読み取りタイミングと頻度を制御し、センサーデータをシリアルポートに出力します。
- ライブラリのインポート
- 変数とピンの初期化
- サーボオブジェクトの初期化
- シリアル通信の初期化
- 3秒待機
- カウンターを0で初期化
- サーボを1度回転
- 超音波センサーデータを10回取得(デフォルト設定)
- データを平均化
- 平均値をシリアルポートに送信
- ステップ7に戻る
ステップ5: MATLABコード
MATLABコードはボードの制御よりもデータ処理を担当します。すべてのセンサーデータがシリアル経由でPCに送られ、MATLABで読み取られます。
Arduinoから受信するデータは2つの情報を含みます:サーボの回転角度と、その方向にある障害物までの距離。したがって、この時点で得られるデータは極座標系です。人間の目で見て理解しやすいように可視化するには、直交座標系(X-Y座標系)に変換する必要があります。
変換式:
x = distance × cos(角度)
y = distance × sin(角度)
MATLABコードはまさにこれを行います。COMポートからシリアルデータを取得し、回転角度とともに行列に保存し、上記の式で直交座標に変換します。完了したら、点をプロットしてグラフ出力します。ボードを箱の中に置いて実行した結果が以下です。
ステップ6: 結論
システムは完璧ではありませんが、目的を果たします。箱の幅と長さの大まかな推定が可能で、データは正確に送信されます。
現時点で見られる誤差は、サーボ移動時のセンサーの揺れと、センサー自体の誤読み取りによるものです。
これ以外は正常に動作し、奥行き知覚実験や基本的なコンピュータビジョンプロジェクトに活用できます。
コード
MATLABコード (PCで実行)
theta = 0:(pi/180):pi;
s = serial('COM10');
s.BaudRate = 9600;
fopen(s);
i = 0;
inc = 1;
while i < 180
A = fgets(s);
num(i+1) = str2num(A);
i = i + 1;
end
fclose(s);
j = 1;
while j < 181
tab(j,1) = (j-1) * inc;
tab(j,2) = num(j);
tab(j,3) = num(j) * cosd((j-1) * inc);
tab(j,4) = num(j) * sind((j-1) * inc);
j = j + 1;
end
plot(tab(:,3), tab(:,4));
Arduinoコード (Arduino Yunにアップロード)
#include <Servo.h>
#include <NewPing.h>
#define TRIGGER_PIN 12
#define ECHO_PIN 11
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
Servo myservo;
int pos = 0;
int it = 10;
void setup() {
myservo.attach(9);
Serial.begin(9600);
delay(3000);
}
void loop() {
int i = 0;
int t = 0;
int a = 0;
for (i = 0; i < 180; i++) {
unsigned int uS = sonar.ping();
myservo.write(i);
delay(20);
for (t = 0; t < it; t++) {
uS = sonar.ping();
a = uS / US_ROUNDTRIP_CM + a;
delay(30);
}
a = a / (it - 1);
t = 0;
Serial.println(a);
a = 0;
}
}
回路図
サーボと超音波センサーの接続用Fritzingファイル: YunConfig.fzz
製造プロセス
- Arduinoで作るモニター用Ambilightシステム:没入感アップの自作ガイド
- Arduino Unoベースの人間検知レスキューロボット:センサー統合ステップバイステップ
- Arduinoで超音波レベーション(浮遊)装置を自作:ステップバイステップガイド
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
- ArduinoとMAX30100で作るリアルタイムIoT心拍数モニター
- Android加速度センサーで操作するラジコン車両:Raspberry Pi・Arduino・モーターシールド連携
- ESP8266・Arduino・超音波センサーで作るスマートIoTジャー:リアルタイム中身監視
- Arduino UNO WiFi Webサーバー:ブラウザからLEDをON/OFF制御
- Arduino UNOで作る完全自律ライントラッカーロボット ─ 入門に最適な自作キット
- Arduinoで自動化するChrome恐竜ゲーム – LDRとPythonで障害物を検知してジャンプ