SHARPの赤外線測距モジュール「GP2Y0A02YK」をArduinoで使う方法を説明します。
データシートからセンサの出力電圧を距離に変換する近似式を算出し、Arduinoのシリアルプロットで距離を確認します。
GP2Y0A02YKとは
赤外線で物体までの距離を測定することができるSHARPの測距センサです。
測定できる距離違いでいくつかのセンサが販売されています。
今回は20cm~150cmまで測定可能な GP2Y0A02YK の使い方を説明しますが、他のセンサも使い方はほぼ同じです。
センサー名 | 測定距離 |
---|---|
GP2Y0A21YK | 10 – 80cm |
GP2Y0A02YK | 20 – 150cm |
GP2Y0A710K | 1 – 5.5m |
実物は単三電池と同じくらいの大きさです。
電源電圧などの詳細仕様はデータシートをご確認ください。
配線
センサ付属のケーブルに対応するピン配置は以下のようになっています。
ケーブルの色 | ピン |
---|---|
赤 | Vcc(4.5~5.5V) |
黒 | GND |
黄 | アナログ出力 |
Arduinoとの配線は以下のようにしました。
VccとGND間には10μFのコンデンサ、アナログ出力とGND間には0.1μFのコンデンサを入れています。
※ 下の部品は GP2Y0A21YK の図となっていますが、配線は同じです。
距離の算出方法
センサのアナログ出力と距離の関係は以下のようになっています。
約15cm以下は測定できません(15cm以上と見分けがつきません)。
アナログ出力 0 – 5V をAD変換した AD値 0 -1023 と距離の近似は以下のようになります。
上記の近似式は以下です。
$$ 距離 [ cm ] = 25391 * (AD値)^{-1.136} $$
スケッチ(プログラム)
スケッチ(プログラム)は以下のようにしました。
int val = 0; // 受信するシリアルデータのために準備
float dis = 0; // 距離の計算値
float l_t = 0.7; // センサのフィルタ定数
void setup() { Serial.begin(9600); // シリアルポートを開き,データレートを9600 bpsにセットする
}
void loop() { val = analogRead(A0); if(val < 82){ // AD値が小さい場合に近似式で距離が無限になってしまうので、AD値が82未満は82とする val = 82; } dis = l_t * dis + (1 - l_t) * 25391 * pow(val, -1.136); // 距離算出。指数移動平均で平滑化。 Serial.print("AD: "); Serial.print(val); Serial.print(" / 距離: "); Serial.print(dis); Serial.println(" cm");
}
距離算出は上記の近似式を使っていますが、センサ値がばらつくので指数移動平均で平滑化しています。
フィルタの定数を変更する場合は、3行目のfloat l_t = 0.7;
の値を変更します。
上記の値でセンサ値を平滑した様子は以下です。
横軸は時間(msec)、縦軸はAD値。
青が平滑前、赤が平滑後のAD値。
距離の測定結果
シリアルモニタにはAD値と距離が出力されます。
下記のように距離を測定し、実際の距離と測定値を比較してみました。
実際の距離 | 測定値 |
---|---|
20cm | 約21cm |
25cm | 約24cm |
30cm | 約31cm |
35cm | 約35cm |
40cm | 約43cm |
45cm | 約45cm |
50cm | 約57cm |
上記のように対象物との距離をある程度正確に測定できています。
ただし、測定対象物の位置が3cmほど移動すると測定値が10cmほどずれるということもあります。
測定環境や測定対象物が一定条件の場合は距離を測定することも可能ですが、物体の有り無しを検出するというような使い方が向いていると思います。
ラップタイマを自作したい
実家の畑に父親がラジコンのサーキットを作りました。
ラップを測定するために、上記のセンサでラップタイマーを作ってみようと思います。
上記のセンサとは別に、超音波距離センサでも試してみる予定です。