OnStepを載せたTeensyを動かしていますが、Ubuntu環境においてTeensyのmicsoUSBを使用したシリアル通信ができませんでした。
「これはできないものなんだ」と思ってたんですが、Windowsではできるらしい。。と言うことを最近知ったのでした(ベースシステムがLinuxだとWindows音痴になる典型(^^;)
そういえば、思い当たる節があります。
myFocuserProを使用した自作の電動フォーカサーをINDIで制御していますが、ArduinoのUSBシリアルが繋がらない現象が発生していました。
リトライで問題なくつながるのであまり気にしていませんでしたが、この現象に似ているなーと。
なんとなく、原因はINDI側でもOnStep側でも無いような気がしたので調べてみると、なんと、トラップはModemManager でした。
これはいわゆるLinuxデスクトップ上でモデムを管理するためのバックグラウンドプロセスです。
ADSLや光有線のモデムが繋がれると自動的に検知し初期化してネットワークマネージャで使用できるように管理するものらしいです。今どきだとモバイルルータを接続すると自動的に接続する、なんて場面で使うことがあるでしょうか。
で、これがシリアルデバイスの接続を監視し、接続されているモデムを調べるためにポーリングをしているようです。
この応答にTeensy側のコードが反応したり、意図しない通信が行われ、タイムアウトなどでキャンセルされるまで、他のプロセスが正しくデバイスを使用できない状態になるようです。
なるほど。
で、対策は、udev rulesにて特定のデバイスをModemManagerの管理対象外にする方法、ModemManagerを使用しない方法の2つがあります。
「modemmanager 停止」でgoogleさんに聞けば回答は得られますが、私は面倒なのでModemManagerを削除しました。
# sudo apt-get remove modemmanager
赤道儀に載せるRasPiで、モバイルルータに直接つなげる運用なんてしないし、後々悩むくらいなら最初からなかったことにしてしまえ!と(^^;
もちろん、それでは困る方は、udevで除外指定がいいでしょう。
これで無事、OnStepのTennsy USBシリアルが使用可能になり、INDIで制御できるようになりました。
(あと、myFocuserProのArduino USBシリアルも)
あー、すっきり。
0 件のコメント:
コメントを投稿