PyMataでArduinoを操作する(set_analog_latch)


今回はPyMataのanalog_latchの機能を紹介します。
Arduinoのアナログポートにライトセンサーをつけて、明るさに応じてLEDをON/OFFします。
ライトセンサーにはNJL7502Lを使い470Kの抵抗を挟んでいます。



Raspberry側のコードは以下のようになります。
アナログ値がTRIGGERの値を超えたら(暗くなったら)、cb_lightsensor_latch()への割り込みが発生しLEDを点灯し ます。
cb_lightsensor_latch()の中でさらにタイマー割り込みを設定し、1秒後にLEDを消灯していますが
cb_lightsensor_latch()実行中にタイマー割り込みが発生したときには、何も処理をしないようにIN_CALLBACK変数 で制御 しています。
TRIGGERの値は使用するセンサーと抵抗値で適当に調節してください。

#!/usr/bin/env python
import time
import signal
import sys

import threading

from PyMata.pymata import PyMata

# Digital pins
GREEN_LED = 6

# Analog pin
LIGHTSENSOR = 0
TRIGGER = 500

# Switch states
ON = 1
OFF = 0

# Indices for data list passed to latch callback
LATCH_TYPE = 0
LATCH_PIN = 1
LATCH_DATA_VALUE = 2
LATCH_TIME_STAMP = 3

# Global value
IN_CALLBACK = 0

# Callback functions
def cb_timer():
    global IN_CALLBACK

    if IN_CALLBACK == OFF:
        board.digital_write(GREEN_LED, OFF)

# Callback functions
# Set the LED to current state of the pushbutton switch
def cb_lightsensor(data):
    pass

def cb_lightsensor_latch(data):
    global IN_CALLBACK
    IN_CALLBACK = ON

    # Turn on LEDs
    board.digital_write(GREEN_LED, ON)

    # Print all data from the latch callback including time stamp
    print('Latching Event Mode:%x  Pin:%d  Data Value:%d Time of Event:%s' %
          (data[LATCH_TYPE], data[LATCH_PIN],
           data[LATCH_DATA_VALUE],
           time.asctime(time.gmtime(data[LATCH_TIME_STAMP]))))

    # Re-Set the latch
    board.set_analog_latch(LIGHTSENSOR, board.ANALOG_LATCH_GT, TRIGGER,
                       cb_lightsensor_latch)

    t = threading.Timer(1, cb_timer)
    t.start()
    IN_CALLBACK = OFF

# Create a PyMata instance
board = PyMata("/dev/ttyUSB0", verbose=True)

def signal_handler(sig, frame):
    print('You pressed Ctrl+C')
    if board is not None:
        board.close()
    sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)

# Set pin modes
board.set_pin_mode(GREEN_LED, board.OUTPUT, board.DIGITAL)
board.set_pin_mode(LIGHTSENSOR, board.INPUT, board.ANALOG, cb_lightsensor)

# Set the latch
board.set_analog_latch(LIGHTSENSOR, board.ANALOG_LATCH_GT, TRIGGER,
                       cb_lightsensor_latch)


# A forever loop until user presses Ctrl+C
while 1:
    pass

部屋の明かりを暗くするとLEDが点灯し、部屋の明かりを明るくするとLEDが消灯します。

PyMataにはこれ以外にもアナログブザーのための関数や、i2cのRead/Write関数も含まれていますが、
アナログブザーやi2cのI/Oは直接Raspberry上に実装したほうが簡単かもしれません。

複雑な回路でRaspberryのGPIOピンが不足するときには、MCP23017 MCP23S17 PCF8574Pなど
こちらで紹介しているIOエクスパン ダーを使うことになりますが、IOエクスパンダーでは
ディジタルIOピンしか増やすことができないので、アナログ入力やPWM出力(アナログ出力)を追加したいときには
PyMataは便利だと思います。

PyMataの紹介はこれで終わりです。

WiringPiの作者であるGordonsさんがこ ちらのページで「Drogon Remote Control(DRC)」という
シリアルでArduinoを操作するプロトコルを紹介しています。
DRCを使えばProMiniやATtinyなど、USBを持っていないAVRマイコンをRaspberryから操作することができます。
こちらで紹介していま す。