« 見た目はMZ-80C でも中身は・・・”IchigoJam”!? | トップページ | 今度の”RPGツクールMV”はスマホゲームも作成可能 »

2015年12月31日 (木)

Raspberry Piにシャープ製の赤外線距離センサー”GP2Y0A710K”つけてみた

実はこの年末、Raspberry Pi 2を使って細々と「電子工作」してましたが、基本部分は完成したため公開します。

今回作ったのは”Raspberry Pi + シャープ製赤外線距離センサー”による距離計です。

以前Raspberry Pi大和の”レーダー”として超音波距離計”HC-SR04”を使いましたが、手軽な反面、いまいち測定距離が短い(~4m弱)のと湿気に弱いなどの欠点を抱えてます。

実はRaspberry Piを使って、車の”死角センサー”(ミラーの死角となる斜め後ろ付近の物体の有無を感知するセンサー)を作りたいなぁと思っているんですが、走行中の車では車周辺の風切りや騒音で、超音波距離センサーはますます使い物にならないようです(市販車でも駐車時などの低速なら超音波で障害物との距離を測るクリアランスソナーはありますが)。

てことで、他に距離を測定する手段がないかと探ったら出てきたのが”赤外線方式”。

赤外線センサーの反射で距離を測定する方式。ガラス越しに使えて、しかも車間距離センサーに使われたこともある測定方法。これはいい!!

ってことで、散々ググって見つけたのがこのセンサー。

Img_0876

シャープ製の測距モジュール”GP2Y0A710K”というセンサー。秋月電子通商で1,200円。予備を含めて2個買いました。

販売元:シャープ測距モジュール GP2Y0A710K: センサ一般 秋月電子通商 電子部品 ネット通販

Img_0878

なんだかディズニーの”ウォーリー”に出てくるロボットの目のような形のセンサー。しかし測定可能距離は1~5.5m。超音波センサーよりはちょっと長いです。

さて、これをRaspberry Piにつければいいんですが。

買ってから気づいた問題が2点。

(1) Raspberry Piにつけた事例が見つからない

Arduinoで使ってる事例はたくさんある(短距離用の姉妹品含む)んですが、Raspberry Piで使った事例がみつからないんですよ、このセンサー。

で、なんで使用事例が少ないかという理由でもあるんですが

(2) このセンサー、アナログ出力しか対応していない

Raspberry Piってアナログ出力を受け付けられないんです。直接つけてもだめ。A/D変換かけてやらないと認識できません。

そんな問題突きつけられても、電子工作に関してはまったくのド素人といっていいほどの私。

さて、どうやって乗り切るか・・・

唯一救いだったのは、過去に一度アナログ-デジタル変換を経験しているってことでしょうか。

この記事です。

Raspberry Piで部屋の気温をモニタリンクさせてみた: EeePCの軌跡

このころはちんぷんかんぷん(いや今もか!?)でしたが、このときの回路図とA/D変換チップ”MCP3002”を使えば、とりあえずこのセンサーを使うことが出来そうな予感。

だめなら「Arduino買えばいいや」と割り切って、とりあえず取り組むことに。

Img_0871

このセンサー、背面にコネクタが付いてて、計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

アナログデータを読み込む

setup easy - 検索結果

で、この辺を解釈しつつ組んだ回路はこちら。

Ir_radar201

(公開時に一箇所間違えてました。1/9 修正いたしました。)

線が雑ですいません。。。

Img_0860

写真にするとこう。

途中、ジャンパ線のオス-メスタイプが足りなくなってしまい、スイッチサイエンスに注文。なんとか完成。

で、早速テスト。今度はこちらのサイトを参照。

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

と実行すると

Gp2y0a710k_01

なにやら3桁の数字がずらずらと出てきます。

センサーを動かすと変化するので、どうやら

成功!!

したっぽい。

とはいえ、このままでは使い物にならないため、変換しなくてはいけません。

まず、この値の意味ですが、

・ MCP3002ってやつはアナログ値を0~1023で返す

・ GP2Y0A710Kってセンサーは、距離に応じて電圧値を返している

つまり、彼は0~5Vの電圧を1024段階で表示しているようです。

なので、この出力値に”5/1023”をかけると電圧に変わるというわけで。

数値を電圧値に変えるのはわかったとして、問題は電圧をどうやって”距離”に変換するのか?ですが、

Img_0879

こんなややこしい関係をしてるんだそうで。

このセンサーは距離に反比例した電圧値を返すようですね。遠くなると出力差が拾いにくくなり測定困難、また近すぎても電圧がダウンするため1メートル未満が判別できないようです。

てことで、先ほどの”value = (resp[0] * 256 + resp[1]) & 0x3ff”の下に

volt = value * 5.0 / 1023

という行を追加し”print value”を”print volt”に変えて電圧を表示させます。

この状態で距離と電圧値を調べて換算式を作ることにしました。

Img_0862

で、Raspberry Pi 2とセンサー、モバイルバッテリーを無理やり引っ付けて持ち歩けるようにし

Img_0863

壁から1m置きにテープを張って、各距離と電圧値をプロット。

Gp2y0a710k_02

かなり怪しいデータですが、そこから上のような電圧(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秒おきに表示されます。

Img_0872

実際に約1.5mほど先の壁までの距離を測定してみたら

Img_0873

大体1.5mくらいの値を返してきます。

いくつか測定してみましたが、まあまあの精度で測定できます。

距離を表示するだけではつまらないので、調子に乗って3メートル以内に物体を検知したらLEDが光るようにしてみました。

その前に”Lチカ”配線とPythonコードを組まなきゃいけないんですが、それはここを参考に作成。

RaspberryPi - Raspberry PiでPythonのRPi.GPIOを使ってLチカする - Qiita

1KΩの電気抵抗が必要ですが、うちではとりあえず手元にあった330Ωの抵抗を3つつなげて強引に作っております。

ますます配線がぐちゃぐちゃですが・・・

Img_0880

とりあえず、上のリンク先のサンプルを使って点灯することを確認。

元の”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メートル以内に物体が近づくと

20151230_18_13_28

・・・見難いですが、光ってます。

Img_0882

LED部分を拡大、この通り光ってます。

ちょっと黄色は見えにくいかなぁ・・・いずれもうちょっとましなLEDを買ってきます。

とりあえずは、一定距離以内の物体の有無を感知できる仕組みが出来ました。

個人的には満足。

なんといっても、ある程度自力でRaspberry Piでこのシャープ製赤外線センサーを使えるように出来たのは快挙でしたね。よく一発で動いたものだ。

そういえば最近、Kindleストアで”ハルロック”1巻が99円と安かったので思わず全4巻丸ごと買って読んでたんですが。

あの主人公の気持ちがよくわかりますねぇ。

さて、このまま車に積んでテストしてもいいんですが、ただLEDで知らせるというのも芸がなさ過ぎ。もうちょっといいインターフェースはないか?まったりと考えることにします。

ハルロック(1) (モーニングコミックス)

« 見た目はMZ-80C でも中身は・・・”IchigoJam”!? | トップページ | 今度の”RPGツクールMV”はスマホゲームも作成可能 »

Raspberry Pi・Arduino・電子工作」カテゴリの記事

コメント

こんにちは。
参考にさせていただきました。
でも、実は動かないのです。
SPI driverが無効のままなのか、ゼロのデータしか表示されません。
色々としらべてテストしたのですが、SPIがNGではないようです。他のプログラムでは動く。
Pi 3 B で、OSのVersion は9.3 です。内部仕様が変わってしまったのでしようあかね。

こんにちは、まっくさん。

アナログ、デジタル変換がうまくいっていないかもしれません。これは配線を見直していただくしかありませんが、センサーそのものに通電できていない恐れもあります。

センサーが生きているかどうかのチェックであれば、iPhoneなどこのスマホのカメラを向けて、カメラアプリでセンサーの奥を見ることでできます。センサーに通電されていれば、奥で紫っぽい光がちかちか光ってるのが見えるはずです(デジカメでも可)。とりあえず、それでチェックしてみるしかないですね…

コメントを書く

(ウェブ上には掲載しません)

トラックバック

« 見た目はMZ-80C でも中身は・・・”IchigoJam”!? | トップページ | 今度の”RPGツクールMV”はスマホゲームも作成可能 »

無料ブログはココログ

スポンサード リンク

ブログ村