シリアル制御
Marzhauser 電動ステージ制御
Zeissの倒立顕微鏡を連続撮影用にチューンアップする。しかし、ステージをジョイスティックで動かすところまでは簡単にできたが、TANGOコントローラをUSBでつないで制御するところではまる。
デバイスマネージャーを見ると、マルチポートシリアルアダプターという項目の下に TANGO USB-Controller というドライバができていて、こちらはほとんどいじれない。また、ポートの下に
TANGO USB-PORT(COM4) というドライバがあって、こちらはいろいろいじるところがある。COM4でTANGOの制御ができそう、というところまでわかったら後は早いかと思ったら、microManagerやSwitchBoard(純正のコントロールソフト)がぜんぜん動いてくれない。
問題を切り分けようということで、TeraTermを落としてきて、COM4にテキストを流し込んでみる。すると、送信した信号に対して反応があるではないか!最初のうちは間違ったコマンドに対してLEDが点滅するだけだったが、ステージを動かすコマンドにきちんと反応してくれている。しかし、verコマンドのような、応答を求めるコマンドには返事が返ってこない。どうもテキストの受信のほうに何か問題があるようだ。
結局いろいろ試行錯誤して、ドライバを会社のホームページにある最新の物でなく、CDに入っている昔の物に戻したら、コマンドに対する応答も帰ってくるようになったし、SwitchBoardは動くようになった。しかし、microManagerの方は、Wizardは通過するが動いてくれない。LEDの挙動から推測するに、更新は出来ているが送られているコマンドが間違っているようだ。
さらにいろいろ探っていると、Hardware configuration wizardのところでTANGO controllerのみではなく、XY Stage (何も指定がなかったので気がつかなかった)もチェックしてみると、エラーがかなり減った。また、Calibrationコマンドをmicromanager側から出したらステージが動くようになった。これは要するにドライバレベルではうまく動いているということなので、あとはmicroManager側で調整する。
MacOSXからシリアル制御
実験で、シリンジポンプ(KD scientific 社KD270)を外部から制御する必要がでてきた。とりあえず後ろ側を見るとRS-232Cらしきコネクタがついているので、こいつにテキストを流し込むことにする。で、なるべくMacOSXからやりたいので、対応している機器を探す。すると、アイ・オーデータの商品を発見。
http://www.iodata.jp/prod/mobile/serial/2004/usb-rsaq3/
こいつを注文して、ラボに転がっていたRS-232Cケーブルを繋いでいろいろいじってみるが全然つながらない。何かと思ったら、dsub9ピンの方は実はTTL信号の受け口で、シリアルポートはモジュラージャックの方だった。何じゃこりゃ。とりあえずケーブルをあさって電話線を確保し、さらに寺町に走ってdsubのコネクタを買ってきて10年ぶりぐらいにハンダ付けをする。で、つなげてから
http://www.hideshi.jp/macosx/minicom/index.html
http://a-tomo.notinc.net/blog/archives/2006/08/20060831_1202.php
この辺を参考にして、
というところをscreenで開いてテキストを送り込んでみたら、動いた!あとは目的に応じてスクリプトを書けばいいか。
玄人指向でシリアル制御のテスト
シリアル制御の練習として、赤外線リモコンの制御を試してみる.まずドライバ等をインストールし、
としてからrを入力すると”s”が出てきて止まる。この状態でリモコンを向けて信号を送ると、
というテキストが出てきて止まる.これはこれで動いているようだ.再試行するにはいったんUSBを抜いて差し直したら行けた。
さて、これだとテキストしか出力してくれないので、この信号を何とかバイナリで保存するやり方を考えないと行けない.適当に探して、Pythonで何とかならないかやってみる.pySerialというモジュールを
http://pyserial.sourceforge.net/
で配っていて、MacOSXでも動く。これをインストールしてから
でpythonに入り、
>>> ser = serial.Serial(‘/dev/tty.usbserial-00000e57’, 115200, timeout=1)
>>> ser.write(“r”)
>>> x=ser.read(1)
>>> print x}
とすると”Y”が出力される.入出力はうまく行っているようだ.次に
としてからリモコンの信号をセンサに当てて、
>>> print line
とすると、
という文字列が出力されるので、受信も行けている.こいつをバイナリで保存したらリモコン信号の抽出はできそう.
できたプログラムがこんな感じ.
import serial
import time
ser = serial.Serial(‘/dev/tty.usbserial-00000e57’, 115200, timeout=1)
raw_input(“Press return key and input remote control signal”)
ser.write(“r”)
time.sleep(10)
line = ser.readline()
print line
print(“¥nDetected signal:”)
print line
line2=line[2:-1]
print line2
f=open(‘signal.dat’, ‘wb’)
f.write(line2)
import serial
import time
ser = serial.Serial(‘/dev/tty.usbserial-00000e57’, 115200, timeout=1)
raw_input(“Press return key to start sending signal”)
f=open(‘signal.dat’, ‘rb’)
ser.write(“t”)
reply = ser.read(1)
if reply == “Y” :
raw_input(“Device ready: press return key”)
ser.flushInput()
ser.write(“1”)
reply = ser.read(1)
if reply == “Y” :
raw_input(“LED 1 ready: press return key”)
sig = f.read()
print sig
raw_input(“Stored Data: press return to send this signal”)
ser.write(sig)
reply = ser.read(1)
print reply
print(“Message sent”)
f.close()
ser.close()
cwgwinでシリアル制御
ぜんぜんMacではないが、その場にある機械で何とか制御をしないといけなくなったので試してみる。
まずcygwinをインストール時に、オプションでPythonを入れる。次にpyserialをダウンロードしてきてインストール。
次に、USB-RSAQ5のドライバをインストールして、コントロールパネル>システム>デバイスドライバで接続をチェック。最初うまくインストールされていなかったようなので、もう一度ドライバをインストールしなおす。するとCOM3のポートに割り当てられたそうなので、Pythonに入って以下のコードを打つ。
ser=serial.Serial(2)
ser.write(‘0 run\r\n’)
ser.write(‘0 stop\r\n’)
これで動いた!!あとはスクリプトを書いたらおしまいだ!!