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
これがやりたかったんじゃよ。ふふふ。