= !PowerMateをLinux + EPICSで使う = この文書はもともと2006年7月27日にKEK所内ネットワーク向けのWebに掲載したものです。 epics-users MLで関連する話題があったので所外向けのこのサイトに転載します。 (そのため、少し情報が古い部分もありますが御容赦願います 2012/06/19追記 T. Obina) == !PowerMateとは == !PowerMateとはGriffin Technologies社製のUSBマルチメディアコントローラです。 といっても、見た目は単なる高級なボリューム (写真は約3年前に購入した私物です) [[Image(photo1.jpg)]] アルミ削り出しの質感がなかなか良く、気に入っています。底面のLED もなかなか良い感じ。日本での販売代理店はFocalが行っています。 * ~~Focal社の製品ページ~~ 既に無い? * [http://store.griffintechnology.com/powermate-622 Griffin社の製品ページ(英語)] 最初は面白がっていたのですが、接続しっぱなしにしておくほどのブツでも無く、だんだん 使わなくなってしまいました。ありがちですね。 さて、2006年7月にインドへEPICSセミナーに出かけたのですが、このとき向こうの研究所では エンコーダーをLinuxマシンにつないで制御しようとしていました。この方式の是非はともかく、 これならPowerMate使った方が簡単だよなぁ...と思ったのも事実。そこで日本に帰ってから Linux用のドライバを探してみました。この文書はそのときの覚え書きです。 == Linux用ドライバ == googleで検索すると、色々な情報にあたるのですが、Kernel2.6対応となると ~~Gentoo Wiki~~が一番まとまっていて、分かりやすかったです。 (2012/6 追記:リンク切れ。HOWTO_Griffin_PowerMate_with_UDEV_and_Kernel_2.6.x などで検索するしかない) しかも、Scientific Linux 4.2 ではカーネルのパッチもすでにあたっているため再構築は不要。 何も考えずにPowerMateを差し込んで、dmesgを見てみると: {{{ usb 2-1: new low speed USB device using address 3 usbhid: probe of 2-1:1.0 failed with error -5 input: Griffin PowerMate on usbcore: registered new driver powermate }}} failedとか出ているのが嫌ですが、ともかくpowermateドライバは自動的に組み込まれます。 次に [http://www.sowerbutts.com/powermate/ こちらのサイト]においてある Linux用ドライバ(powermate-1.0.tgz)を持ってきて 展開、コンパイルします。 (同じサイトにpython用のインターフェースファイルもありますがこちらはテストしていません。) rootになって、同梱されていたrotomaticというプログラムを実行すると {{{ Button was rotated 1 units; Offset from start is now 1 units Warning: unexpected event type; ev->type = 0x0000 Button was rotated 1 units; Offset from start is now 2 units Warning: unexpected event type; ev->type = 0x0000 }}} とか出力されます。とりあえずプログラムから何がしかの制御は出来ているようです。 == イベント詳細 == どのようなイベントが起きているかについては [wiki:epics/powermate-event /dev/input/eventに関するメモ]に置いておきます。 == EPICSでどのように使うか? == WindowsやMacで使う場合、最も簡単なのはPowerMateの回転動作を カーソルの上下ボタン(または左右ボタン)にアサインしてしまう方法。 少なくともGUIの中で、数値を変更するのには使えるでしょう。 Linuxの場合、EPICSのDevice Supportにするメリットがあるかどうか....苦労の割には報われない 作業に思えます。ただし、教育用のexampleとしては面白いかもしれない。 とりあえずDevice Supportを書くのは先の話にするとして、 どんな感じのことができるかどうかを確認しようと思います。お手軽に。 まずはLinux上でSoftware IOC を 実行し、そこへcaputで値を書き込むプログラムを別に動かします(CA Client の サンプルプログラムに上記のrotomatic.cを組み込み、EPICS lib を呼び出すようにしただけ。 プログラム所要時間は約5分。) で、実行した画面が下のような感じ。 [[Image(photo2.jpg)]] 適当にPowerMateをぐりぐりと動かし、同時にcamonitorで値を確認。右下のウィンドウをみると、 15-20msごとに値は更新されている模様。これなら十分か。 早く動かしているとCPU負荷が50%近くまで上がりますが、これはグラフ表示と camonitorの画面更新のためにXウィンドウプロセスの負荷が上がったことが原因です。 !PowerMateやEPICS sequencerが重いのではありません。 == Sequencerにしてみる == 上のように捌プログラムでも良いのですが、sequencerから呼び出すように変えました。 まとめたソースを [attachment:pmateApp.tar.gz pmateApp.tar.gz]におきます。 展開してconfigure/RELEASEを編集するだけで、あとはmake。(追記:pmateApp/displayディレクトリ にはEDM用の表示ファイルもおきました。) st.cmdを実行するときにはrootにならないと/dev/input/event* のアクセス権が取れません。 中味は簡単なのでソースを見て頂く方が簡単ですが、 PowerMateのノブを左に回すと-1, 右に回すと+1レコードの値が変化します。 ノブを押しながら左右に回すと、10倍の大きさで増減します。 == トラブル == この作業をした後、ノートPCを再起動したあとで動作が非常に重くなる現象が起きました。 dmesgをみると、USB4-1デバイスを自動検出→取り外しを延々と繰り返しています。 再起動しても変わりません。ちょっと途方に暮れかけたのですが、やはり怪しいのは powermateのドライバです。カーネルモジュールになっているので試しに {{{ # modprobe -r powermate }}} としてやったところ、暴走は止まりました。めでたい。 他のデスクトップマシンでも試してみましたが、このような暴走は起きませんでした。 また、このノートPCで再現させようと何度かpowermateの抜き差しを試しても この現象が起きません。PowerMateも問題なく動作しています。なぜだろう??? 後で判明したのですがUSB4-1は指紋認証デバイスでした。その後この現象は全く 起きていないので、どのタイミングで起きるのか....再現したらチェックします。 == 今後は == 特に予定無し。 今回は読み込みしかやっていませんが、書き込みをすればLEDの明るさを変更できるらしい。 ボリュームの回転に応じて明るくなったり暗くなったりするのは悪くないかも。