用例③:POC-光センサ
ネットワークに直に接続できる計測器は通常、非常に高価です。そこで、簡単なPythonスクリプトを使用して、Raspberry Piをとてもフレキシブルなイーサーネットマルチメーターにしてみましょう。
使用したもの
- Raspberry Pi, model B, Ethernet 接続用
- POC-ディスプレーOLED スクリーン
- RaspBox
- POCセンサー 例)POC-サーモPOC-ボルト
- Raspberry Pi 上のスクリーンコントロールのためのPythonスクリプト
- バーチャルハブソフトウェア
組み立て
標準的なUSBデバイスを使っているので何ら難しいことはありません。RaspBoxの上に4つの小さな穴を開け、POC-ディスプレイを取り付けます。micro-B plug.より小型の1.27mmコネクタを使用してUSBケーブルとスクリーンを接続します。
インストール
"sudo raspi-config" または"update"を選択することでRaspberry Piの状態が最新か確認してください。
それから、POC-バーチャルハブをダウンロード・インストールすると自動的にセンサーへネットワークが提供されます。install the Yoctopuce for Python using PyPi . が提供
Pythonを少し書けば終わりです。
コーディング
簡単に使えるように接続した計測器を代わる代わる特定し、自動的にその計測器に合わせるようなコードにします。そのために、ライブラリのものを一般化し、計測器との関係を最新の状態に保つように変更を加えます。
# add sensor to dictionary when plugged
def deviceArrival(m):
global sensors, currentSensor
for i in range(m.functionCount()):
fctName = m.functionId(i) # eg. "voltage1"
fctType = re.sub("\d+$", "", fctName) # eg. "voltage"
hwId = m.get_serialNumber() + "." + fctName
yocto_mod = getattr(yoctopuce, "yocto_"+fctType.lower(), None)
if(yocto_mod is not None):
className = fctType[0].upper()+fctType[1:]# eg. "Voltage"
YClass = getattr(yocto_mod, "Y"+className)# eg. YVoltage
yFind = getattr(YClass, "Find"+className) # eg. YVoltage.FindVoltage
fct = yFind(hwId)
if getattr(fct, "get_unit", None) is not None:
currentSensor = fct.get_hardwareId()
sensors[currentSensor] = \
{ "name" : fct.get_friendlyName(),
"val" : fct.get_unit() }
fct.registerValueCallback(sensorChanged)
refreshDisplay()
# update display when sensor changes
def sensorChanged(fct,value):
hwId = fct.get_hardwareId()
if hwId in sensors: sensors[hwId]['val'] = value+" "+fct.get_unit()
refreshDisplay()
# remove sensor from dictionary when unplugged
def deviceRemoval(m):
deletePattern = m.get_serialNumber()+"\..*"
deleteList = []
for key in sensors:
if re.match(deletePattern, key): deleteList.append(key)
for key in deleteList:
del sensors[key]
refreshDisplay()
ディスプレーコードは数行で終わります。幾つかのセンサーを使用できるので機能の名前を様々に表示しておきます。
# Update the display value if needed (with double-buffering)
def refreshDisplay():
global currentSensor
if currentSensor not in sensors:
currentSensor = sensors.keys()[-1]
sensor = sensors[currentSensor]
dispLayer.clear()
dispLayer.selectFont("Small.yfm")
dispLayer.drawText(0,0,YDisplayLayer.ALIGN.TOP_LEFT,sensor["name"])
dispLayer.selectFont("Medium.yfm")
dispLayer.drawText(127,28,YDisplayLayer.ALIGN.BOTTOM_RIGHT,sensor["val"])
display.copyLayerContent(1,2)
ディスプレー昨日を変えるため、スクリーン上のボタンインプットを使います。ですから、本物のボタンを加える必要はありません。
# Callback whenever a button value changes
def buttonPressed(fct,value):
global currentSensor
if(int(value) > 500): # button is released
fct.set_userData(False)
return
if(fct.get_userData()): # button was already pressed
return
# Button was just pressed, cycle through sensors values
fct.set_userData(True)
delta = (1 if fct.get_hardwareId()[-1] == '1' else -1)
if(delta != 0):
keys = sensors.keys()
idx = len(keys)-1
for i in range(len(keys)):
if keys[i] == currentSensor:
idx = (i+delta+len(keys)) % len(keys)
currentSensor = keys[idx]
refreshDisplay()
便利に使用するため、表示可能な機能を加えます。Raspberry PiのIPアドレスです。
これで、直接表示するディスプレーの方は完了です。イーサーネットマルチメーターの方に取り掛かりましょう。バーチャルハブをインストールしたので同じAPIを使用してセンサーを遠隔操作できます。