ArduinoYunを使用した超音波マップメーカー
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 10 |
アプリとオンラインサービス
> |
| |||
|
このプロジェクトについて
ステップ1:理論
このプロジェクトでは、超音波距離センサーを使用しています。人間の可聴範囲を超えた音波を発生させ、これらの波が障害物に当たって戻ってくるまでにかかる時間を計算することで距離を測定します。これは、コウモリやクルーズ船で使用されている原理に似ています。
<図>これから使用するもう1つのコンポーネントは、サーボモーターです。通常のDCモーターとは異なり、特定の角度位置に非常に正確に回転し、その状態を保持できます。サーボモーターに特定の持続時間のパルスが与えられると、サーボモーターは対応する角度位置に移動します。
<図>これらのコンポーネントの両方を使用して、ロボットの180度の視野を取得します。
ステップ2:資料の収集
このプロジェクトでは、次のハードウェアを使用しています
- Arduino Uno / Yun(UnoまたはYunの代わりにArduinoフットプリントボードを使用できることに注意してください)
- Arduinoプロトタイピングシールド
- HC-04超音波センサー
- サーボモーター(非常にコンパクトなため、Tower Pro SG90を使用しました)
- ソフトウェア側では、次のプログラムを使用しています
- Arduino IDEは、制御コードをArduinoにアップロードして、サーボを回転させ、超音波センサーから距離データを取得し、シリアルポートにプッシュします。
- Mathworks MatLabを使用して、シリアルラインからデータを受信し、処理してグラフに視覚化します。
ステップ3:機械的組み立て <図>
汎用PCBの小片を使用して、HC-04の小さなヘッダーを作成し、両面テープを使用してサーボホーンに取り付けます。
<図>この手順はオプションですが、システムをよりコンパクトにするために、両面テープを使用してプロトボードシールドの突き出し部分にもサーボを取り付けました。
<図>最終的な結果は、ウォーリーの腹部のようになります。
ステップ4:Arduinoコード
Arduinoコードは、サーボモーターの動き、および超音波センサーからの読み取り値がキャプチャされるタイミングと頻度を制御します。また、センサーデータをシリアルポートにプッシュします。
- ライブラリをインポートする
- 変数とピンを初期化します。
- サーボオブジェクトを初期化します
- シリアル通信を開始します
- 3秒間待ちます
- カウンターを0に初期化します
- サーボを1度回転させます
- 超音波センサーデータを10回取得します(デフォルトで設定)
- データの平均化
- 平均をシリアルポートに送信
- 手順7に戻る
ステップ5:MatLabコード
MatLabコードは、ボードの実際の制御よりも多くのデータを処理するため、すべてのセンサーデータはシリアル経由でPCにプッシュされ、そこでMatLabによって読み取られます。
さて、Arduinoから受け取ったデータは2つのことを教えてくれます。サーボの回転角度とその方向の障害物の距離。したがって、この時点で得られるデータは極座標系にあります。視覚化したときに人間の目に意味をなすには、デカルト座標系またはX-Y座標系に変換する必要があります。
<図>したがって、MatLabコードはまさにこれを行います。 COMポートからシリアルにデータを取得し、回転角のある行列に保存してから、上記の式を使用してデカルト座標に変換します。
完了すると、グラフにポイントをプロットして出力が得られます。ボードを箱に入れたら、次のような結果になりました。
<図>ステップ6:結論
<図>システムは完璧ではありませんが、それは仕事を成し遂げます。ボックスの幅と長さの概算を取得し、データを正確に送信できます。
現時点で私が見ることができる唯一のエラーは、サーボが動いている間のセンサーの揺れとセンサー自体からの誤った読み取りによるものです。
これとは別に、このシステムは正常に機能し、奥行き知覚実験や基本的なコンピュータービジョンプロジェクトに使用できます。
コード
- matlab_code_to_run_on_pc.m
- Arduinoコード
matlab_code_to_run_on_pc.m MATLAB
PCでコンパイルおよび実行されるMatLabコードtheta =0:(pi / 180):pi; s =serial( 'COM10'); s.BaudRate =9600fopen(s)i =0; inc =1; while i <180 A =fgets(s); num(i + 1)=str2num(A); i =i + 1; endfclose(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 + 1end%figure%polar(theta、num)plot (tab(:、3)、tab(:、4))
Arduinoコード Arduino
ArduinoYunにアップロードされるArduinoコード#include#include #define TRIGGER_PIN 12 #define ECHO_PIN 11 #define MAX_DISTANCE 200 NewPing sonar(TRIGGER_PIN、ECHO_PIN、MAX_DISTANCE);サーボ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
回路図
サーボおよび超音波センサー接続用のフリッツファイル製造プロセス