PythonでGainerを制御する。 †Gainerは、IAMASのプロジェクトで生まれたA/D,D/Aコンバータだ。USB接続で電源も、USBから供給できるので、A/Dコンバーターを手軽に行うことが出来る。 ProcessingやMax/MSP,Flashなどのライブラリがあるが、pythonのライブラリは無かった。見てみたら、シリアル通信の延長のようなものだったので、A/Dの部分をテストしてみた。 pythonでシリアル通信。pythonでシリアル通信をする際には、PySerialライブラリが必要なので、ここでダウンロードする。 windowsの場合は、win32all extensionsも必要なので一緒に落とす。 大雑把な概要 †gainerはシリアル通信で、たとえば、"I*"見たいなコマンドを送れば、"AFFFF00FF*"みたいな値を返してくる。それを使って、入出力をする。 はまったのは、送ったコマンドには、必ず返信があるので、それを全部読んで、バッファーに残さないことと、使い終わったら、"Q*"を送信して、リセット?をすることだと思います。 簡単なサンプル †簡単な使い方。 ser=serial.Serial(3,115200,timeout=1) ##COM番号は適当、環境に合わせてください。 def spr(ser): ##ser.read()をして、バッファが空になるまで読んで、値を返す関数 k="" while True: p=ser.read() if p=='*': break k+=p return k ser.write('KONFIGURATION_1*') ##モードを設定する。 print ser.readline() ser.write('R*') print spr(ser) ##R0001*みたいな値が帰ってくる ser.write('Q*') #rebootして初期化しておく ser.close() 色々と試してみた,AD,DAを色々と試してみた。 import serial,time ser=serial.Serial(3,38400,timeout=1) print ser.portstr print ser #ser.write('Q') #ser.read(2) ser.write('?*') print ser.read(20) #ser.write('V1*') #print ser.read(3) ser.write('KONFIGURATION_1*') print ser.readline() #time.sleep(0.1) def spr(ser): k="" while True: p=ser.read() if p=='*': break k+=p return k def ain(ser): k="" numa=[] while True: p=ser.read() if p=='*': break k+=p k=k[1:] for i in range(0,8,2): num=k[i:i+2] num=int(num,16) numa.append(num) return numa for i in range(10): ser.write('h*') print spr(ser) # time.sleep(0.1) ser.write('l*') print spr(ser) # time.sleep(0.1) for i in range(8): k=31*(i+1) str='a0%0X*' % k print str ser.write(str) print spr(ser) time.sleep(0.1) ser.write('a000*') print spr(ser) time.sleep(0.1) for i in range(200): str='I*' ser.write(str) print ain(ser) time.sleep(0.1) for i in range(10): str='S0*' ser.write(str) print spr(ser) str='S1*' ser.write(str) print spr(ser) time.sleep(0.1) str='E*' ser.write(str) print spr(ser) for i in range(10): str='R*' ser.write(str) print spr(ser) time.sleep(0.1) ser.write('AFFFFFFFF*') time.sleep(0.1) print ser.read(2) ser.write('Q*') ser.close() 拡張 † |