前置き
先日、IoTフォーラムに出展するに当たってブラッシュアップもとい機能拡張を模索したところ下記のサイトにてサーボを簡単に制御できるライブラリがあることを知った。
今までRaspberryPi(以降ラズパイ)でPWM制御やI2Cなどを用いる際にはwiringpiを使ってきたが、参考サイトにも書いてあるように高精度PWMに使えるピンは2本しかなく使い物にならなかった。
しかしこのpigpioは全てのピン(32本)が高精度PWMを使えるという素晴らしい性能を持っている。しかもサーボを動かすのに必要なコード数も
import pigpio
pi = pigpio.pi()
pi.set_servo_pulsewidth(7, 1500) # GPIO7にパルス幅1500を設定
これだけで済みます。突貫工事にはもってこい
実際には事前にコンソールにてsudo pigpiod
を実行しなければならない点に注意が必要。
またI2CやSPIにも対応しているようなので、いつものように備忘録としてここに残します。
本題
下記のpigpioのライブラリを読み、実際のセンサに当てはめながら説明して行きます。
-
pigpio library
ちなみに全て英語で記述されているので、細かい部分に関しては読み飛ばしています。英語力のなさ
使用するセンサについて
このセンサは直線性に優れており、測定可能範囲は実測で2-60cm程度。お値段は少し高めだけど、なかなか精度がいいので重宝してます。3月26日現在在庫切れの状況。
プログラム
import pigpio
ADDRESS = 0x40 # センサ固有のアドレス
# 確認には sudo i2cdetect -y 1 を実行
REGISTER = 0x81 # 要データシート
# 今回使用したセンサの場合はアプリケーションノートの
# Register Mapに記載されている。Slave ID(read cycle)
BYTE = 2 # 距離データが格納されているbyte数
# 詳しくはRegister Map参照
pi = pigpio.pi()
sensor = pi.i2c_open(1, ADDRESS)
b, d = pi.i2c_read_i2c_block_data(sensor, REGISTER, BYTE)
ans = ((d[0]*16+d[1]) / 16) / 4 # ここの計算式も同様にRegister Map参照
print("%f cm" % ans)
所々の説明はコメントにて記述していますが、全体的に非常に短いコードでI2Cができていることがわかります。
今回使用したセンサ以外にもADDRESSやREGISTER, BYTE等を書き換えることによって簡単に通信を行うことができるので今後はこちらのライブラリを使って行きたいと思います。
最新版のRaspbianだとデフォルトでインストールされているみたいですし…。