PICK UP

Raspberry Pi で距離センサを動かしてみよう

LAB

山本 允葵

自社プロダクト「ZUGYUUUN!」の基礎研究のため、
DFROBOT社 製の 超音波センサー URM37 V3.2を駆動させました。

1.1 接続と設定

URM37 からデータを受け取る方法は、PWM もしくはシリアル通信を利用することができます。 シリアル通信は2つの(RS232C or TTL)信号レベルに対応しており、設定はジャンパで切り替えます。 今回は RaspberryPi に接続して使用するので、TTLのシリアル通信で使用します。

また、URM37 の電源を RaspberryPi から直接給電すると、 RaspberryPi が落ちるので URM37 駆動用の5V電源は外部から供給します。

RaspberryPi と下図のように接続します。

1.2 RaspberryPi のシリアルポートを RaspberryPi 上のアプリから利用可能に変更する

RaspberryPi のOS Raspbian の標準状態だと、 アプリケーションからシリアルポートを使おうとすると、Permission denied エラーで利用できません。 以下手順で利用可能に変更します。

dialout グループに存在するかチェック。存在しない場合はグループにjoinさせる

pi@raspberrypi ~ $ id
uid=1000(pi) gid=1000(pi) groups=1000(pi),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),105(netdev),999(input),1002(spi),1003(gpio)

[/boot/cmdline.txt] の書き換え

/boot/cmdline.txt

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

を、以下に置き換えます。

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

―具体的修正項目としては、以下のような、シリアルポートに関わる削除項目を削除します。

console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 

[/etc/inittab] の書き換え

[/etc/inittab] から ttyAMA0 についての記述の行をコメント化する

#TO:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

2.1 URM37 のシリアル通信仕様

URM37 のシリアル通信仕様は、4バイトの送受信で構成されます。 詳細規則は以下のようになっています。

  • 送信・受信は4バイトのバイナリを1単位とする
  • バイナリのルールは以下

    Header, HighByte, LowByte, Sum Sum = (Header + HighByte + LowByte) & 0xff

例)

0x44,0x02,0xaa,0xf0  (0x44 + 0x02 + 0xaa = 0xf0)
  • 送信バイナリ内のHeaderによってHighByte, LowByteの意味と許容される値が変わる
Header Function Parameters Description
0x11 温度計測 0x11 + NC + NC + SUM
0x22 距離計測 0x22 + DEGREE + NC+ SUM DEGREE でサーボの角度を入力する(サーボ制御時)
0x33 EEPROMから読込 0x33 + ADD + NC + SUM メモリアドレス ADD の内容を表示
0x44 EEPROMへ書込 0x44 + ADD + DATA + SUM メモリアドレス ADD を DATA の内容に設定

URM37 はサーボを制御出来たり、計測結果をPWM出力できたりと多彩な機能を持っていますが、 今回は計測のみ行います。

・受信バイナリは、送信バイナリと同じヘッダを持ち、HighByte, LowByte にデータが格納されている。SUMのルールは同じ

2.2 python で動作検証

原理確認のために python の対話型シェルで動作を確認します。

まず、シリアル通信用のプラグイン pyserial を pip 経由でインストールします。

curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | sudo python
sudo pip install pyserial

python の対話型シェルで動作を確認します。

python

import serial import binascii
ser = serial.Serial(‘/dev/ttyAMA0′, 9600)
ser.write(“\x22\x00\x00\x22″)
4
str = ser.read(4)
print(binascii.b2a_hex(str))
22001032
ser.write(“\x11\x00\x00\x11″)
4
str = ser.read(4)
print(binascii.b2a_hex(str))
11014052
ser.close()

無事繋がりました。これで安心してコードを組むことができます。

2.3 node.js で計測

node.js で連続で計測するコードを作成しました。

結果は以下の動画でご確認ください。 画面上に 「Distance : ○○ cm」の表示がされておりますが、
物体を近づけると、その数字が小さくなっていることがわかります。
(ちょっと見えづらくてスミマセン。。)

ここから、通信を挟んだり、モーター等のデバイスと連動させたり夢が広がるところですが、 今回は基礎動作の確認なのでここまで。

さいごに

弊社プロダクト ZUGYUUUN! 、鋭意バージョンアップ中です!
今回の記事のようなシリアル通信でデバイスをコントロールする仕組みも、遠隔で操作、確認が可能になります。 お楽しみに!   

blog_banner