[[プログラム周り]]
*PythonでGainerを制御する。 [#j29990a6]
[[Gainer:http://gainer.cc/wiki/index.php?title=Main_Page]]は、IAMASのプロジェクトで生まれたA/D,D/Aコンバータだ。USB接続で電源も、USBから供給できるので、A/Dコンバーターを手軽に行うことが出来る。
ProcessingやMax/MSP,Flashなどのライブラリがあるが、pythonのライブラリは無かった。見てみたら、シリアル通信の延長のようなものだったので、A/Dの部分をテストしてみた。
pythonでシリアル通信。pythonでシリアル通信をする際には、PySerialライブラリが必要なので、[[ここ:http://pyserial.sourceforge.net/]]でダウンロードする。
windowsの場合は、[[win32all extensions:http://starship.python.net/crew/mhammond/]]も必要なので一緒に落とす。
**大雑把な概要 [#zc7777ec]
gainerはシリアル通信で、たとえば、"I*"見たいなコマンドを送れば、"AFFFF00FF*"みたいな値を返してくる。それを使って、入出力をする。
はまったのは、送ったコマンドには、必ず返信があるので、それを全部読んで、バッファーに残さないことと、使い終わったら、"Q*"を送信して、リセット?をすることだと思います。
*簡単なサンプル [#p8aa5745]
簡単な使い方。
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()
***拡張 [#q4582a96]
[[pygameでgainerを制御する]]