Raspberry Piにシャープ製の赤外線距離センサー”GP2Y0A710K”つけてみた
実はこの年末、Raspberry Pi 2を使って細々と「電子工作」してましたが、基本部分は完成したため公開します。
今回作ったのは”Raspberry Pi + シャープ製赤外線距離センサー”による距離計です。
以前Raspberry Pi大和の”レーダー”として超音波距離計”HC-SR04”を使いましたが、手軽な反面、いまいち測定距離が短い(~4m弱)のと湿気に弱いなどの欠点を抱えてます。
実はRaspberry Piを使って、車の”死角センサー”(ミラーの死角となる斜め後ろ付近の物体の有無を感知するセンサー)を作りたいなぁと思っているんですが、走行中の車では車周辺の風切りや騒音で、超音波距離センサーはますます使い物にならないようです(市販車でも駐車時などの低速なら超音波で障害物との距離を測るクリアランスソナーはありますが)。
てことで、他に距離を測定する手段がないかと探ったら出てきたのが”赤外線方式”。
赤外線センサーの反射で距離を測定する方式。ガラス越しに使えて、しかも車間距離センサーに使われたこともある測定方法。これはいい!!
ってことで、散々ググって見つけたのがこのセンサー。
シャープ製の測距モジュール”GP2Y0A710K”というセンサー。秋月電子通商で1,200円。予備を含めて2個買いました。
販売元:シャープ測距モジュール GP2Y0A710K: センサ一般 秋月電子通商 電子部品 ネット通販
なんだかディズニーの”ウォーリー”に出てくるロボットの目のような形のセンサー。しかし測定可能距離は1~5.5m。超音波センサーよりはちょっと長いです。
さて、これをRaspberry Piにつければいいんですが。
買ってから気づいた問題が2点。
(1) Raspberry Piにつけた事例が見つからない
Arduinoで使ってる事例はたくさんある(短距離用の姉妹品含む)んですが、Raspberry Piで使った事例がみつからないんですよ、このセンサー。
で、なんで使用事例が少ないかという理由でもあるんですが
(2) このセンサー、アナログ出力しか対応していない
Raspberry Piってアナログ出力を受け付けられないんです。直接つけてもだめ。A/D変換かけてやらないと認識できません。
そんな問題突きつけられても、電子工作に関してはまったくのド素人といっていいほどの私。
さて、どうやって乗り切るか・・・
唯一救いだったのは、過去に一度アナログ-デジタル変換を経験しているってことでしょうか。
この記事です。
Raspberry Piで部屋の気温をモニタリンクさせてみた: EeePCの軌跡
このころはちんぷんかんぷん(いや今もか!?)でしたが、このときの回路図とA/D変換チップ”MCP3002”を使えば、とりあえずこのセンサーを使うことが出来そうな予感。
だめなら「Arduino買えばいいや」と割り切って、とりあえず取り組むことに。
このセンサー、背面にコネクタが付いてて、計5本の線が出てます。
右から1~5の番号をつけると、1と5がGND、3と4がVcc、そして2が出力用の端子のようです。
ややこしいのは、MCP3002自体は3.3Vにつなぎ、このセンサーは5Vにつけなきゃいけないということ。
何はともあれ、まずは回路作りです。
参考にしたサイトは以下。
Raspberry Piで温度センサー。部屋の気温を取得しよう - Raspberry Pi 電子工作
JavaScript Robotics: Proximity - GP2Y0A710K0F with Johnny-Five
で、この辺を解釈しつつ組んだ回路はこちら。
(公開時に一箇所間違えてました。1/9 修正いたしました。)
線が雑ですいません。。。
写真にするとこう。
途中、ジャンパ線のオス-メスタイプが足りなくなってしまい、スイッチサイエンスに注文。なんとか完成。
で、早速テスト。今度はこちらのサイトを参照。
RaspberryPi - Raspberry PiにA/DコンバータMCP3002をつなぐ - Qiita
以前温度センサーをつないだときにRubyのコードで作りましたが、あのコードが使えなくなったため、急遽上のサイトのPythonを使う方法に切り替えました。
さて、上のサイトの通りにやるとまた動かない・・・ということで、ちょっと補足。
”SPI driverを有効にする”ところはそのままでいけるんですが、”py-spidev”をインストールするくだりで、リンク先の通りに
git clone git://github.com/doceme/py-spidev
cd py-spidev
とコードを入手した後
sudo python setup.py install
とやるとエラーが出ます。
あらかじめ
sudo apt-get install python-dev
sudo apt-get install libevent-dev
をやった後に
sudo python setup.py install
としないとだめでした。要注意。
さて、まずはテスト用コードを組みます。
#!/usr/bin/env python
# Read the analog sensor value via MCP3002.
import spidev
import time
import subprocess
# open SPI device 0.0
spi = spidev.SpiDev()
spi.open(0, 0)
try:
while True:
resp = spi.xfer2([0x68, 0x00])
value = (resp[0] * 256 + resp[1]) & 0x3ff
print value
time.sleep(1)
except KeyboardInterrupt:
spi.close()
上のサイトのコードをそのまま使ってみました。
このコードを”test.py”とし、
python test.py
と実行すると
なにやら3桁の数字がずらずらと出てきます。
センサーを動かすと変化するので、どうやら
成功!!
したっぽい。
とはいえ、このままでは使い物にならないため、変換しなくてはいけません。
まず、この値の意味ですが、
・ MCP3002ってやつはアナログ値を0~1023で返す
・ GP2Y0A710Kってセンサーは、距離に応じて電圧値を返している
つまり、彼は0~5Vの電圧を1024段階で表示しているようです。
なので、この出力値に”5/1023”をかけると電圧に変わるというわけで。
数値を電圧値に変えるのはわかったとして、問題は電圧をどうやって”距離”に変換するのか?ですが、
こんなややこしい関係をしてるんだそうで。
このセンサーは距離に反比例した電圧値を返すようですね。遠くなると出力差が拾いにくくなり測定困難、また近すぎても電圧がダウンするため1メートル未満が判別できないようです。
てことで、先ほどの”value = (resp[0] * 256 + resp[1]) & 0x3ff”の下に
volt = value * 5.0 / 1023
という行を追加し”print value”を”print volt”に変えて電圧を表示させます。
この状態で距離と電圧値を調べて換算式を作ることにしました。
で、Raspberry Pi 2とセンサー、モバイルバッテリーを無理やり引っ付けて持ち歩けるようにし
壁から1m置きにテープを張って、各距離と電圧値をプロット。
かなり怪しいデータですが、そこから上のような電圧(V) → 距離(m)に置き換える近似式をExcel使って導きました。
参考サイトはこちら:EXCELであるグラフからy=(a/x)+b (a,bともに定数)という反比例の近似式を... - Yahoo!知恵袋
これでようやく”距離(m)”がアウトプットできます。
最終的には、下のようなコードを作りました。
#!/usr/bin/env python
# Read the analog sensor value via MCP3002.
import spidev
import time
import subprocess
# open SPI device 0.0
spi = spidev.SpiDev()
spi.open(0, 0)
try:
while True:
resp = spi.xfer2([0x68, 0x00])
value = (resp[0] * 256 + resp[1]) & 0x3ff
volt = value * 5.0 / 1023
distance = ( 18.679 / volt ) -4.774
print distance
time.sleep(0.1)
except KeyboardInterrupt:
spi.close()
これで距離が0.1秒おきに表示されます。
実際に約1.5mほど先の壁までの距離を測定してみたら
大体1.5mくらいの値を返してきます。
いくつか測定してみましたが、まあまあの精度で測定できます。
距離を表示するだけではつまらないので、調子に乗って3メートル以内に物体を検知したらLEDが光るようにしてみました。
その前に”Lチカ”配線とPythonコードを組まなきゃいけないんですが、それはここを参考に作成。
RaspberryPi - Raspberry PiでPythonのRPi.GPIOを使ってLチカする - Qiita
1KΩの電気抵抗が必要ですが、うちではとりあえず手元にあった330Ωの抵抗を3つつなげて強引に作っております。
ますます配線がぐちゃぐちゃですが・・・
とりあえず、上のリンク先のサンプルを使って点灯することを確認。
元の”test.py”をベースに、以下のような”led_dist.py”というのを作りました。
#!/usr/bin/env python
# Read the analog sensor value via MCP3002.
import spidev
import time
import RPi.GPIO as GPIO
import subprocess
# open SPI device 0.0
spi = spidev.SpiDev()
spi.open(0, 0)
# LED GPIO
PIN = 11
GPIO.setmode(GPIO.BOARD)
GPIO.setup(PIN,GPIO.OUT)
try:
while True:
resp = spi.xfer2([0x68, 0x00])
value = (resp[0] * 256 + resp[1]) & 0x3ff
volt = value * 5.0 / 1023
distance = ( 18.679 / volt ) -4.774
print distance
if distance < 3:
GPIO.output(PIN,True)
else:
GPIO.output(PIN,False)
time.sleep(0.1)
except KeyboardInterrupt:
spi.close()
GPIO.cleanup()
もう”print distance”は要らないかな?と思いつつ、とりあえず残しております。
このLチカを実行する際はroot権限が必要なため、頭に”sudo”をつけて実行します。
sudo python led_dist.py
で、センサー前3メートル以内に物体が近づくと
・・・見難いですが、光ってます。
LED部分を拡大、この通り光ってます。
ちょっと黄色は見えにくいかなぁ・・・いずれもうちょっとましなLEDを買ってきます。
とりあえずは、一定距離以内の物体の有無を感知できる仕組みが出来ました。
個人的には満足。
なんといっても、ある程度自力でRaspberry Piでこのシャープ製赤外線センサーを使えるように出来たのは快挙でしたね。よく一発で動いたものだ。
そういえば最近、Kindleストアで”ハルロック”1巻が99円と安かったので思わず全4巻丸ごと買って読んでたんですが。
あの主人公の気持ちがよくわかりますねぇ。
さて、このまま車に積んでテストしてもいいんですが、ただLEDで知らせるというのも芸がなさ過ぎ。もうちょっといいインターフェースはないか?まったりと考えることにします。
« 見た目はMZ-80C でも中身は・・・”IchigoJam”!? | トップページ | 今度の”RPGツクールMV”はスマホゲームも作成可能 »
「Raspberry Pi・Arduino・電子工作」カテゴリの記事
- 名古屋 大須へ行ってきました(2024.04.28)
- Raspberry Pi 5用電源購入(2024.04.19)
- Interface 2024年5月号はRaspberry Pi 5特集(2024.03.26)
- Raspberry Pi 5とPCがつながらなかった理由は「プライバシーセパレーター機能」のせいでした(2024.03.12)
- Raspberry Pi 5に日本語LLM(ELYZA-Japanese-Llama-2-7b-fast-Instruct)を入れてみた(2024.03.10)
コメント
« 見た目はMZ-80C でも中身は・・・”IchigoJam”!? | トップページ | 今度の”RPGツクールMV”はスマホゲームも作成可能 »
こんにちは。
参考にさせていただきました。
でも、実は動かないのです。
SPI driverが無効のままなのか、ゼロのデータしか表示されません。
色々としらべてテストしたのですが、SPIがNGではないようです。他のプログラムでは動く。
Pi 3 B で、OSのVersion は9.3 です。内部仕様が変わってしまったのでしようあかね。
投稿: まっく | 2018年3月27日 (火) 13時16分
こんにちは、まっくさん。
アナログ、デジタル変換がうまくいっていないかもしれません。これは配線を見直していただくしかありませんが、センサーそのものに通電できていない恐れもあります。
センサーが生きているかどうかのチェックであれば、iPhoneなどこのスマホのカメラを向けて、カメラアプリでセンサーの奥を見ることでできます。センサーに通電されていれば、奥で紫っぽい光がちかちか光ってるのが見えるはずです(デジカメでも可)。とりあえず、それでチェックしてみるしかないですね…
投稿: arkouji | 2018年3月30日 (金) 13時33分