Pythonを使ってGainerをコントロールする実験

こないだ初台のNTT ICCで衝動買いした「Gainer」 (IAMAS・トリガーデバイス)

なんかアレですね。

公式サイトの http://gainer.cc/ は、見れば見るほど「うーん」な感じです。

ICCの解説の文中に「アーティストやデザイナーなど,より多くの人が利用しやすいように」と、あるので、電子回路の知識が全く無い人がターゲットなのかもしれませんが。(でもこのサイト、電子回路の知識が無い人が見てスッとわかるもんですか?)

……って、俺もデジタル回路の知識はほとんど全く無いのですがね。(アナログ回路の知識もありませんが)

ま、それはともかく、とりあえず、PythonにpySerialというやつを入れて、PythonからGainerをコントロールする実験をしてみました。

こんな感じです。

左下にCdS、右手の丸いのはガラス玉で、下部にLEDが仕込んであります。

動画で撮影してみました。

http://youtubech.com/test/read.cgi%3Fdl%3DwwnHgo8aoog%26ext%3D.flv

動画が出ないときはこちら↓から

http://www.youtube.com/watch?v=wwnHgo8aoog

以下のようなスクリプトで動かしています。

import time, math, sys, serial, threading, os, atexit, random, re

#
# A script for controlling Gainer
#
# You need "pySerial"
#

def reader():
    """loop forever and copy serial->console"""
    global alldata, sdata
    while 1:
        data = s.read()

        alldata = alldata + data
        if len(alldata) > 12:
            alldata = alldata[len(alldata)-12:]

        indata = hexin.match(alldata)

        if indata:
            sdata = []
            for i in indata.groups():
                sdata.append(int(i,16))
        

def onquit():
    if s:
        s.close()

atexit.register(onquit)
random.seed()

hexin = re.compile(r'I([0-9A-F][0-9A-F])([0-9A-F][0-9A-F])
([0-9A-F][0-9A-F])([0-9A-F][0-9A-F])\*')
alldata = ""
sdata = []
s = False
port = 13
baudrate = 38400
useserial = True

if useserial:
    try:
        s = serial.Serial(port, baudrate)
    except:
        sys.stderr.write("Could not open port\n")
        sys.exit(1)

    r = threading.Thread(target=reader)
    r.setDaemon(1)
    r.start()

m = 20
w = 50
t = 0.05
d = 0

while 1:
    v = 128
    v2 = 0
    if len(sdata) == 4:
        x = sdata[3] * 2
        if x > 255:
            x = 255
        v = x
        v2 = 255 - x

    c = "a1%02X*" % v
    c2 = "a2%02X*" % v2

    if useserial:
        s.write(c)
        s.write(c2)

    print v, ("*" * int(w * v / 256))
    print v2, ("*" * int(w * v2 / 256))

    time.sleep(t)

    d += 1
    if (d * t) > 0.1:
        d = 0
        s.write('I*')

追記: センサー(CdS)をガラス玉の下に移動。

http://youtubech.com/test/read.cgi%3Fdl%3DD0GfR34tdV4%26ext%3D.flv

これがやりたかったんじゃよ。ふふふ。

http://www.youtube.com/watch?v=D0GfR34tdV4