用例③:POC-光センサ

yoctopuce

USB環境センサー

*用例1/2/3
- POC光センサ100K                   
*用例1
-POC-高度計                       
*用例1
- POC-メテオ                       
*用例1/2/3/4/5/6/7/8
- POC-サーモ               
*用例1/2/3/4
- PT100                       
*用例1
- POC-VOCセンサ               
*用例1/2
 

USB電圧センサー

*用例1
*用例1/2/3/4/5/6/7/8
- POC-Amp           
*用例1/2/3/4
- POC-Knob         
*用例1/2/3/4/5/6/7/8/9/10/11/12/13
*用例1
- POC-PWM-Rx     
*用例1/2
- POC-RS232         
*用例1
- POC-ボルト
- POC-ワット
- POC-ミリボルト-Rx
- POC-ミリボルト-BNC
 

USB位置センサー

*用例1/2/3
-POC-高度計                       
*用例1
 -POC-GPS
*用例1 

USBアクチュエーター

- POC-ブザー
- POC-カラー      
*用例1/2/3/4/5/6/7/8
*用例1/2/3/4/5/6
- POC-マキシIO     
*用例1
*用例1/2/3/4/5
- POC-マキシパワーリレー
*用例1/2
- POC-モーターDC     
*用例1/2/3/4
- POC-PWM—Tx    
*用例1
*用例1/2/3/4/5
*用例1/2/3/4/5/6/7/8/9
- POC-リレー      
*用例1/2/3/4/5/6/7/8/9
- POC-サーボ      
*用例1/2/3/4/5/6
*用例1

 USBディスプレー  

*用例1/2/3/4/5
*用例1/2/3/4/5/6/7
*用例1/2/3/4/5/6/7
*用例1/2/3

 エクステンションとネットワーキング 

- POC-マイクロUSBハブ 
*用例1
*用例1/2/3/4/5/6/7
*用例1/2/3
*用例1/2/3/4/5/6/7/8/9/10/11
*用例1/2/3/4
*用例1

 アクセサリとコネクター

- POC-Board2Board-127  
*用例1

 エンクロージャー 

 
 
 
Raspberry Piをネットワークマルチメーターへ
 

ネットワークに直に接続できる計測器は通常、非常に高価です。そこで、簡単な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ケーブルとスクリーンを接続します。

raspi voltage 1

インストール

"sudo raspi-config" または"update"を選択することでRaspberry Piの状態が最新か確認してください。

それから、POC-バーチャルハブをダウンロード・インストールすると自動的にセンサーへネットワークが提供されます。install the Yoctopuce for Python using PyPi . が提供

Pythonを少し書けば終わりです。

コーディング

簡単に使えるように接続した計測器を代わる代わる特定し、自動的にその計測器に合わせるようなコードにします。そのために、ライブラリのものを一般化し、計測器との関係を最新の状態に保つように変更を加えます。

 

# List of sensors to display (discovered by Plug-and-play)
sensors = { }
currentSensor = ""

# 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()
 

 

 

ディスプレーコードは数行で終わります。幾つかのセンサーを使用できるので機能の名前を様々に表示しておきます。

 

# Get the display object
display = YDisplay.FirstDisplay()
if display is None:
    sys.exit("Display not connected")
display.resetAll()
dispLayer = display.get_displayLayer(1)
dispLayer.hide()

# 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)
 

 

ディスプレー昨日を変えるため、スクリーン上のボタンインプットを使います。ですから、本物のボタンを加える必要はありません。

 

# Get the buttons objects, get an event when "pressed"
serial = display.get_module().get_serialNumber()
prevButton = YAnButton(serial+".anButton1")
nextButton = YAnButton(serial+".anButton6")
prevButton.set_userData(False)   # False = released
nextButton.set_userData(False)   # False = released
prevButton.registerValueCallback(buttonPressed);
nextButton.registerValueCallback(buttonPressed);

# 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 PiIPアドレスです。

 

# Put the Raspberry Pi itself as default sensor, to show IP address
sensors[""] = { "name" : socket.gethostname(),
                "val"  : findMyIP() }
refreshDisplay()
  

 

これで、直接表示するディスプレーの方は完了です。イーサーネットマルチメーターの方に取り掛かりましょう。バーチャルハブをインストールしたので同じAPIを使用してセンサーを遠隔操作できます。

cosm small 1