ロボットの”目”をつくろう
先日こちらの記事で、測距センサーの測定原理について概説しました。測距センサーは、最近では当たり前の光景になりつつあるファミレスの猫型配膳ロボットたちの”目”になりうる要素です。
他にも、自動ドアや、コロナ禍で特によく見かけるようになったハンドソープのディスペンサーなど、人が近づいたら反応するような機器で使われます。
今回は、シャープの赤外線距離センサ「GP2Y0A21YK」を使って、Arduinoで距離を測ってみることにしました。
ゴール
測距センサーを使って、測定対象物までの距離をリアルタイムでグラフ化する!
使用するもの
- Arduino Uno(または互換機)
- GP2Y0A21YK(赤外線測距モジュール)
- ブレッドボード、ジャンパーワイヤ
- USBケーブル
回路図・配線方法
スケマは至って単純。測距センサーの3つの端子(Vo(出力), GND(接地), Vcc(電源入力))をそれぞれ、Arduinoの対応するピンと接続して終わりです。

実際の配線はこのようになります。

スケッチ(コード)
以下のスケッチをArduino IDEで実行すると、測距データが電圧値(voltage変数)として取り込まれます。
const int sensorPin = A0;
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(sensorPin);
float voltage = sensorValue * (5.0 / 1023.0); // 電圧に変換
Serial.println(voltage); // 数値だけを改行付きで送信
delay(500);
}
「ゴール」で書いたとおり、最終的にやりたいことは「距離の測定」です。なので、対象物までの距離を●●cmみたいな形でデータとして取得したいわけです。
キャリブレーション
そこで、電圧値を距離データに変換するため、あらかじめ、電圧値と距離データの間にどういう関係があるかを把握しておく必要があります。これを、キャリブレーションといいます。こんな感じで、測距センサーからある距離にモノを置いたときに、測定される電圧値がどうなるかというデータをいくつか取得することによって、電圧と距離の関係を探ることができます。

測距センサーからの距離を、5cm、10cm、15cm、20cm、25cmと変えていったときの電圧値の変化をシリアルプロッタで捉えた様子は次のようになりました。グラフの値が全体的にガクッと変化するタイミングが、測定対象物の距離をいじった瞬間です。
なぜか頻繁にスパイクが観測されるようですが、これを無視して距離と電圧の関係をいったん表にまとめると次のようになりました。
| 距離[cm] | 電圧[V] |
| 5 | 3.05 |
| 10 | 1.96 |
| 15 | 1.28 |
| 20 | 1.07 |
| 25 | 1.00 |
これをグラフ化すると以下のようになります。

電圧V、距離Lとすると${V=9.96L^{-0.732}}$ということなので、${L=(\frac{9.96}{V}^{\frac{1}{0.732}})}$です。
この計算式の精度を、今度は測定対象物を適当な距離においてみたときの電圧値から距離を計算し、実測した距離と突き合わせてみることで確認してみましょう。
試してみたところ、電圧値がだいたい2Vとなりました。これを先ほどの式に代入すると、L=8.96[cm]となりました。実際に測ってみると・・・

ほぼドンピシャですね!!(対象物が14cm、測距センサーが5cmの位置にあります)
このキャリブレーションは有効そうだ、と言えそうです。
今後の課題
先ほどのグラフからもわかるように、距離が20cmを超えたあたりで既に、グラフが寝てきてしまいます(理系界隈では、これを”サチる”(Saturationする)といいますね)。
つまり、電圧が微妙に変わると距離がメッチャぶれるということで、この領域の測定精度は落ちるということです。これでは、20cm以上の測距精度は悪いということになり、あまり実用的ではなさそうです。
そもそも、東芝のデータシートで示されているグラフとも微妙にずれがあるので、その点について詰めていく必要がありそうです。

まとめ
というわけで今回は、シャープの赤外線距離センサ「GP2Y0A21YK」を使って距離測定する一連の流れをざっと見てみました。
実用品に応用するためには詰める部分がありそうですが、たとえば「対象物までの距離が●●cm以下だったら□□する」みたいなロジックの仕掛けをつくろうと思ったときに使えそうです。
皆さんならどんな仕掛けつくりますか?コメント欄に残していただけると嬉しいです。

