PS3は汎用メディアプレイヤーの夢を見るか(Wiiリモコンで操作向上編)
導入編に引き続き、WiiリモコンでPS3Linux上の動画プレイヤーを操作できる環境を整えるための手順をまとめてみる。
◆まずは加速度センサーで小手調べ
Wii本体はなかなか入手が難しい状態が続いているが、WiiリモコンであればAmazonで在庫あり状態が続いているので容易に入手できた。とりあえずはということで、加速度センサのみでマウスポインタ操作を試してみることにした。Windows環境であれば、WiinRemoteをインストールして、Blutooth機器としてWiiリモコンを認識させてやれば、サクっと試すことができる。Blutooth内臓のノートPCを使ってトライしてみたが、ITmediaのPPT操作レポートにあるように、加速度センサーだけでは到底細かい操作は実現できないことを身をもって体験した。
◆センサーバーを用意する
より精度の高いマウスポインタ操作を実現するためには、やはりIRセンサの運用が必須と言える。しかし、そこで障壁となるのがセンサーバーの準備である。Wii本体を持っていない以上、自前で用意する必要があるのだが、センサーバーとは言っても中身は赤外線LEDが配置されているだけでセンサーがあるわけではない。(【続報:Wii分解】「センサーバー」にはセンサがなかった - 要登録)
現在のところ選択できるソリューションは以下の通り。
1.サードパーティ製の電池式センサーバーを購入する($24.99)
2.自作する(材料費350円以下とのこと)
3.ロウソクをたてる(赤外線が出るからね...)
3.は論外として、1と2は迷ったのだが、ポケットニュースさんの記事を読んでこれならなんとか出来そうだと思い、秋葉原に部品を買いに走った。電池式とは異なりUSBポートから電源をとる方式であれば、PS3に接続することで電源の心配はなくなる。事前にあたりをつけていた秋月商会が定休日だったので、急遽千石電商3号店に購入先を変更した。ロクにスペックも事前調査しないでなんとなく安さで選んだのが東芝のTLN110だったのだが、何のことはない、、、これが大はずれだった。後からいまいち反応が悪いなぁと思って東芝半導体のサイトを調べてみたら、指向角半値幅が±8しかない光電スイッチ用の赤外LEDであったことが判明....。明らかに直線性を重視したスペックなのでセンサーバーとしては不向きなものを選んでしまった。
同じ価格帯(1個50円程度)で選ぶならば、放射強度はTLN110よりやや低いが、半値角が±23.5もあるTLN105Bか、もう少し高くてもよければ光出力と放射強度を重視して、TLN231(F)あたりが良いだろう。ただし、TLN1xxシリーズよりTLN2xxシリーズのほうが、ピーク発光波長が少し短いようなのだが、これがCMOSセンサーにどう影響を及ぼすのかは理解できていないので詳しい方教えてくださいm(_ _)m
次に回路に必要な抵抗の計算をしてみた。赤外LEDを3個直列でつなぐとすれば、TLN105B(TLN110も同じ)の標準順電圧が1.35Vで、If=100mAなので、USB電源が5Vであることを考えると、計算上は(5-1.35*3)/0.1=9.5Ωの抵抗を挟んでやる必要がある。10Ω程度なら無視しても良いかなぁ、なんて甘い考えで最初はUSB電源と直結していたのだが、ものの数十秒のうちにどんどんLEDが熱くなってきて、ついには触れないほどに加熱してしまった。慌てて抵抗をいれてみたところ、触っても温度の変化は感じられなくなった。
また、USBから電源をとるためのVBus/GNDの判別は、USBのコードをばらして赤コードがVBusで、黒コードがGNDという区別の仕方が確実だろう。詳しくはUSB2.0規格のSection6あたりを参照のこと。千石電商2号店でUSB2.0延長ケーブルを190円で購入した。
LEDからちゃんと赤外線が出ているかどうかは、目視では判別できないが、デジカメのモニタでみればちゃんと光っていることを確認できる。
早速、出来上がったLED3個直列接続な基盤2つを約20cm程度の間隔をとり、ノートPCのモニタ上部に設置して、先述のWiinRemoteを使って、マウスポインタをIRモードで操作してみた。Wiiユーザーからすれば当たり前な体験なのだろうが、フリーポインタ(マウスカーソル)をマウス以外のデバイスで空を切って操作するのはかなり新鮮な感覚であった。そして、ウィンドウの移動やリサイズ、スタートメニューからのアプリ起動、アイコンのドラッグ&ドロップなどの、いわゆるWIMPの基本操作を難なくこなすことができた。
◆PS3Linux(FC5)にWiiリモコンを接続する
基本はyaegashiさんの切り開いてくださった道を後追いする方向で進める。必要なパッチがWikiページにまとめられているので、必要に際して随時ダウンロードしていくものとする。
Pythonで実装されたWMDでは、/dev/uinput(or /dev/misc/uinput)を使用するのだが、FC5のカーネルのデフォルト設定ではCONFIG_INPUT_UINPUTが定義されておらず(/boot/config.2.6.16の内容から判断)、uinput.koも存在しない状態なので、カーネルの再構築を行ってやる必要がある。カーネスソースツリーが必要になるのだが、ソースはフルインストールをしても対象からは外れているので、自前でひっぱってくる必要がある。
カーネルソースは、インストール時に使用したAddOnPackageCDから持ってくることにする。srcフォルダにあるlinux-20061208.tar.gz2ファイルを展開して、解凍して出来上がったlinux-20061208フォルダには、/lib/modules/2.6.16配下にあるsource/buildの名前でシンボリックリンクを貼っておく。
カーネルの再構築のオプション設定では、Bluetooth関連のモジュールはすでに有効になっていたので、InputDeviceのuinputだけ変更に出来れば良い。
#cd /lib/modules/2.6.16/build
#make menuconfig
で、/boot/config.2.6.16ファイルの設定値を読み込んだ上でメニューが表示される。そこで、
DeviceDrivers --->
Input Device Support--->
[*] Miscellaneous devices --->
[M]User level driver support
としてやればok。自分の場合は、(M)にしておいて、起動時にinsmodでuinput.koをロードするようにしている。
カーネルのコンパイルを実行する。
#cd /lib/modules/2.6.16/build
#make
完了したら、uinput.cにパッチを当てる。uinput_compat.patchファイルをResouceの項目からダウンロードしておいて、/lib/modules/2.6.16/build/drivers/input/miscフォルダに配置しておき、patchコマンドで適用する。
#cd /lib/modules/2.6.16/build/drivers/input/misc
#patch < uinput_compat.patch
パッチをあてたuinput.cだけを再コンパイルする。miscフォルダ配下にあるMakefileは別名で残しておいて、別途以下の内容のMakefileを作成して、makeを実行する。
obj-m := uinput.o
KDIR := /lib/modules/2.6.16/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
再構築したドライバモジュール群をKernelフォルダにインストールする
#cd /lib/modules/2.6.16/build
#make modules_install
カーネルイメージをインストールする。念のために、/bootフォルダに存在しているvmlinux,System.map,initrd.imgファイルは別名で保存をしておくと良いかも。
#installkernel 2.6.16 vmlinux System.map
なぜか処理に一時間以上かかり、しかもinitrd.imgの生成には失敗したが、vmlinux,System.mapファイルはきちんと更新されたのでよしとする...。再起動後に、uinputドライバをロードしてみる。確認はlsmodで行う。
#insmod /lib/modules/2.6.16/kernel/drivers/misc/uinput.ko
#lsmod | grep uinput
#uinput 8832 0(IDは環境により異なる)
Python本体にもパッチを当てる必要があるので、オフィシャルサイトからソースコードをDLする。バージョンは2.4.4にしておいた。
python_ioctl.patchファイルをResouceの項目からダウンロードしておいて、Python-2.4.4/Modulesフォルダに配置しておき、パッチをあてる
#cd Python-2.4.4/Modules
#patch < python_ioctl.patch
Hunkが3箇所ほど適用されるが問題なくパッチはあたる。
Python本体のコンパイル&インストールをする
#./configure --enable-unicode=ucs4
#make & make install
あとはWMDの動作に必要なPython系ライブラリをひたすらインストールしていく
Bluez
#yum install bluez-libs-devel
PyBluez
公式サイトからpybluez-src-0.9.1.tar.gzをDL&インストールをして、パッケージとしてbluetooth.pyファイルを配置しておく
#python setup.py install
#cp pybluez-0.9.1/bluetooth.py /usr/lib/python2.4/site-packages/
Python-Xlib
プロジェクトページから0.13をインストールする
#python setup.py install
#grep self.socket.recv /usr/lib/python2.4/site-packages/Xlib/protocol/display.py
もし、self.socket.recv(4096)の引数が2048になっていたら、4096に変更しておく
いよいよWiiリモコンを接続してみる。PS3側でBluetooth機器のスキャンを実施してから、Wiiリモコンの電池蓋の裏にある赤いSyncボタンを押すと、ユニークなIDを参照することができる。
#hcitool scan | grep Nintendo
# 00:19:1D:XX:XX:XX Nintendo RVL-CNT-01
WMD本体を公式サイトからDLして展開する。トップディレクトリにあるWMD.pyの代わりに、WMD-PS3.pyを使用する。WMD-PS3.pyファイルの以下の部分を編集する
・130行目あたりのMY_WIIMOTE_ADDR="00:19:1D:25:16:43"を先ほど参照したIDに変更する
・141行目あたりのO_MODESは以下のように設定
IO_MODES = { # SET TO TRUE IF YOU HAVE:
'UINPUT': True, ## the uinput kernel module loaded.
'XLIB': True, ## python-xlib with the buffer overflow patch.
'X_EVDEV': False, ## evdev_drv and a customized xorg.conf.
'PYOSD': False
}
・152行目あたりのUINPUT_DEV = "/dev/misc/uinput"を "/dev/uinput"に変更しておく
あとは、WMD-PS3.pyを実行して、再度赤いSyncボタンを押せばWiiリモコンの動作が確認できるはずだ。
#python WMD-PS3.py
以上が冬休みの前半で実施した作業のすべてだ。年明けの冬休み後半では、赤外LEDを交換して基盤を再作成したり、リモコン操作系の改善を図ったりしてみたい。

