用例③: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を使用してセンサーを遠隔操作できます。

 

 
    

