[[プログラム周り]]

*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を制御する]]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS