*複数のWiiリモコンへの対応化実施中\n*WiiリモコンのインスタンスとしてMorphに変更中\n**MorphはImageMorphとして、赤ハロメニューより接続・切断を選択するように変更中\n**etoyでモーション情報を取得できるようにしている
*複数のWiiリモコンへの対応化完了(共有ライブラリのみ)\n*Wiiリモコン自動検出対応(ただし事前にペアリング必要)\n*WiiリモコンのインスタンスとしてMorphに変更中\n**進捗無し
Linuxの標準Bluetoothプロトコルスタック.\n!!!Ubuntuでのインストール\n*BlueZパッケージの導入\nSynapticパッケージマネージャで'bluez'で検索し、'bluez-*'関係,'libbluetooth2-dev','bluetooth'パッケージを導入します.[[WMD]],[[Wiiewer]]を使いたい場合はpython-bluezも導入しておきます.最後に'適用'でインストールします.\n
[[Welcome]]\n[[News]]\n[[作業履歴]]
*[[使用方法]]\n*プログラム解説\n**[[WiiRemoteMorph]](工事中)\n**[[Wiiリモコンドライバ]]
*Download\n**Ver 0.1 : http://squeak.qp.land.to/work/sqWii.0.2.tar.gz\n*Install\n**BlueZ\n[[BlueZ]]を参考\n**インストール後確認\n***Bluetoohデーモン起動\n{{{\nkawa90@kawa90-desktop:~$ sudo /etc/init.d/bluetooth start\n * Starting Bluetooth services [ ok ] \n}}}\n***bluetoothドライバ([[BlueZ]])動作確認\nWiiリモコンのボタン'1'とボタン'2'を同時に押して、次のコマンドでWiiリモコンが検出できるか確認します.\n{{{\n> hcitool scan\nScanning ...\n 00:19:1D:XX:XX:XX Nintendo RVL-CNT-01\n}}}\n**Downloadファイルの展開\n適当なディレクトリで展開してください\n{{{\ntar xvzf <download file>\n}}}\n**Squeakドライバコンパイル(Optional)\nコンパイル済みドライバを同梱しています.必要な場合はコンパイルしてください。現在Makefile,configureが用意していないのでコマンドラインから次のようにしてコンパイルして共有ファイルを作成してください.\n{{{\ngcc -Wall -shared -fPIC -o sqWii.so sqWii.c -lbluetooth -lpthread\n}}}\n作成されたsqWii.soをSqueakデフォルトディレクトリへコピーしてください.\n*展開ファイルのインストール\n# 同梱のsqWii.soをSqueakデフォルトディレクトリへコピーしてください.\n# 同梱の画像ファイル(*.gif,*.png)をSqueakデフォルトディレクトリへコピーしてください.\n# Squeakを起動して同梱の[[WiiRemote]]-Base.stをファイルインしてください.
*Download\n**Ver 0.1 : http://squeak.qp.land.to/work/sqWii.0.1.tar.gz\n*Install\n**BlueZ\n[[BlueZ]]を参考\n**インストール後確認\n***Bluetoohデーモン起動\n{{{\nkawa90@kawa90-desktop:~$ sudo /etc/init.d/bluetooth start\n * Starting Bluetooth services [ ok ] \n}}}\n***bluetoothドライバ([[BlueZ]])動作確認\nWiiリモコンのボタン'1'とボタン'2'を同時に押して、次のコマンドでWiiリモコンが検出できるか確認します.\n{{{\n> hcitool scan\nScanning ...\n 00:19:1D:XX:XX:XX Nintendo RVL-CNT-01\n}}}\n**Downloadファイルの展開\n適当なディレクトリで展開してください\n{{{\ntar xvzf <download file>\n}}}\n**Squeakドライバコンパイル\n現在Makefile,configureが用意していないのでコマンドラインから次のようにしてコンパイルして共有ファイルを作成してください.\n{{{\ngcc -Wall -shared -fPIC -o sqWii.so sqWii.c -lbluetooth -lpthread\n}}}\n作成されたsqWii.soをSqueakデフォルトディレクトリへコピーしてください.\n**Wiiリモコンドライバサポートプログラムのインストール\nSqueakを起動して同梱の[[WiiRemote]]-Base.stをファイルインしてください.ファイルインしたら、WiiRemote class>>defalultAddrの内容の値を上記hcitoolの結果に変更してください.現在はここで登録したWiiリモコンのみが対象となります.\n{{{\ndefalultAddr\n ^ '00:19:1D:31:E7:03'.\n}}}
/***\n|''Name:''|LegacyStrikeThroughPlugin|\n|''Description:''|Support for legacy (pre 2.1) strike through formatting|\n|''Version:''|1.0.1|\n|''Date:''|Jul 21, 2006|\n|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|\n|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|\n|''License:''|[[BSD open source license]]|\n|''CoreVersion:''|2.1.0|\n|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|\n\n***/\n\n//{{{\n\n// Ensure that the LegacyStrikeThrough Plugin is only installed once.\nif(!version.extensions.LegacyStrikeThroughPlugin)\n {\n version.extensions.LegacyStrikeThroughPlugin = true;\n\nconfig.formatters.push(\n{\n name: "legacyStrikeByChar",\n match: "==",\n termRegExp: /(==)/mg,\n element: "strike",\n handler: config.formatterHelpers.createElementAndWikify\n});\n\n} // end of "install only once"\n//}}}\n
*プロジェクト\n**[[WiiLi|http://www.wiili.org/index.php/Main_Page]]\n***リバースエンジニアリング情報,ドライバ情報など\n\n*ドライバソフト\n**[[WMD|http://forthewiin.org/]]\n***BlueZと[[pyBluez|http://org.csail.mit.edu/pybluez/]]を使ってXでマウスとして使えるようにしている\n\n*ユーティリティ\n**[[Wiiewer|http://www.wiili.org/index.php/Wiiewer]]\n***Pythonで書かれた非常に小さなmotion sensorデータをプロットするプログラム\n\n*Blog\n**[[Wii-Linux|http://www.wii-linux.com/]]\n**[[LiquidIce's Nintendo Wii Hacks|http://wiihacks.blogspot.com/]]\n\n*BlueZ\n**Official Home Page\n***http://www.bluez.org/\n**API documentation\n***[[An Introduction to Bluetooth programming in GNU/Linux|http://people.csail.mit.edu/albert/pubs/2005-ashuang-sm-thesis.pdf]](PDF)\n****サンプルプログラムが参考になります.[[Online版|http://people.csail.mit.edu/albert/bluez-intro/]]\n\n*Squeak\n**[[BlueS - Bluetooth for Squeak|http://minnow.cc.gatech.edu/squeak/3321]]\n
[[Welcome]]\n[[News]]\n[[Download & Install]]\n[[Documentation]]\n[[Links]]\n\n[[TODO]]
!!!0.2をリリースしました(2006/12/30)。\n*改良点\n# 複数台のWiiリモコンに対応した。\n**動作確認は2台で行ってます。\n# Etoys用に加速度X,Y,Z軸方向の値,加速度ベクトルの大きさ,roll,pitch,Wiiリモコンボタン情報,LED,バイブレーションのタイルを出せるようにした。\n# キャリブレーションを行うようにした(±3g)\n# バイブレーション On/Off\n# ペアリングを行うようにした。\n# ペアリングしたWiiリモコンのインスタンスとしてWiiリモコン形状のアイコンを表示するようにした。\n# 自動接続機能でWiiリモコンのボタン1とボタン2を同時押しすると自動で接続するようにした。\n# 接続が成功するとWiiリモコンのアイコンを変更して接続していることが明確にわかるようにした。\n\n
SqueakでWiiリモコンを使う
Squeak Wii Remote
/*{{{*/\n* html .tiddler {\n height: 1%;\n}\n\nbody {\n font-size: .75em;\n font-family: arial,helvetica;\n margin: 0;\n padding: 0;\n}\n\nh1,h2,h3,h4,h5 {\n font-weight: bold;\n text-decoration: none;\n padding-left: 0.4em;\n}\n\nh1 {font-size: 1.35em;}\nh2 {font-size: 1.25em;}\nh3 {font-size: 1.1em;}\nh4 {font-size: 1em;}\nh5 {font-size: .9em;}\n\nhr {\n height: 1px;\n}\n\na{\n text-decoration: none;\n}\n\ndt {font-weight: bold;}\n\nol { list-style-type: decimal }\nol ol { list-style-type: lower-alpha }\nol ol ol { list-style-type: lower-roman }\nol ol ol ol { list-style-type: decimal }\nol ol ol ol ol { list-style-type: lower-alpha }\nol ol ol ol ol ol { list-style-type: lower-roman }\nol ol ol ol ol ol ol { list-style-type: decimal }\n\n.txtOptionInput {\n width: 11em;\n}\n\n#contentWrapper .chkOptionInput {\n border: 0;\n}\n\n.externalLink {\n text-decoration: underline;\n}\n\n.indent {margin-left:3em;}\n.outdent {margin-left:3em; text-indent:-3em;}\ncode.escaped {white-space:nowrap;}\n\n.tiddlyLinkExisting {\n font-weight: bold;\n}\n\n.tiddlyLinkNonExisting {\n font-style: italic;\n}\n\n/* the 'a' is required for IE, otherwise it renders the whole tiddler a bold */\na.tiddlyLinkNonExisting.shadow {\n font-weight: bold;\n}\n\n#mainMenu .tiddlyLinkExisting, \n#mainMenu .tiddlyLinkNonExisting,\n#sidebarTabs .tiddlyLinkNonExisting{\n font-weight: normal;\n font-style: normal;\n}\n\n#sidebarTabs .tiddlyLinkExisting {\n font-weight: bold;\n font-style: normal;\n}\n\n.header {\n position: relative;\n}\n\n.header a:hover {\n background: transparent;\n}\n\n.headerShadow {\n position: relative;\n padding: 1.5em 0em 1em 1em;\n left: -1px;\n top: -1px;\n}\n\n.headerForeground {\n position: absolute;\n padding: 1.5em 0em 1em 1em;\n left: 0px;\n top: 0px;\n}\n\n.siteTitle {\n font-size: 3em;\n}\n\n.siteSubtitle {\n font-size: 1.2em;\n}\n\n#mainMenu {\n position: absolute;\n left: 0;\n width: 10em;\n text-align: right;\n line-height: 1.6em;\n padding: 1.5em 0.5em 0.5em 0.5em;\n font-size: 1.1em;\n}\n\n#sidebar {\n position: absolute;\n right: 3px;\n width: 16em;\n font-size: .9em;\n}\n\n#sidebarOptions {\n padding-top: 0.3em;\n}\n\n#sidebarOptions a {\n margin: 0em 0.2em;\n padding: 0.2em 0.3em;\n display: block;\n}\n\n#sidebarOptions input {\n margin: 0.4em 0.5em;\n}\n\n#sidebarOptions .sliderPanel {\n margin-left: 1em;\n padding: 0.5em;\n font-size: .85em;\n}\n\n#sidebarOptions .sliderPanel a {\n font-weight: bold;\n display: inline;\n padding: 0;\n}\n\n#sidebarOptions .sliderPanel input {\n margin: 0 0 .3em 0;\n}\n\n#sidebarTabs .tabContents {\n width: 15em;\n overflow: hidden;\n}\n\n.wizard {\n padding: 0.1em 0em 0em 2em;\n}\n\n.wizard h1 {\n font-size: 2em;\n font-weight: bold;\n background: none;\n padding: 0em 0em 0em 0em;\n margin: 0.4em 0em 0.2em 0em;\n}\n\n.wizard h2 {\n font-size: 1.2em;\n font-weight: bold;\n background: none;\n padding: 0em 0em 0em 0em;\n margin: 0.2em 0em 0.2em 0em;\n}\n\n.wizardStep {\n padding: 1em 1em 1em 1em;\n}\n\n.wizard .button {\n margin: 0.5em 0em 0em 0em;\n font-size: 1.2em;\n}\n\n#messageArea {\nposition:absolute; top:0; right:0; margin: 0.5em; padding: 0.5em;\n}\n\n*[id='messageArea'] {\nposition:fixed !important; z-index:99;}\n\n.messageToolbar {\ndisplay: block;\ntext-align: right;\n}\n\n#messageArea a{\n text-decoration: underline;\n}\n\n.popup {\n font-size: .9em;\n padding: 0.2em;\n list-style: none;\n margin: 0;\n}\n\n.popup hr {\n display: block;\n height: 1px;\n width: auto;\n padding: 0;\n margin: 0.2em 0em;\n}\n\n.listBreak {\n font-size: 1px;\n line-height: 1px;\n}\n\n.listBreak div {\n margin: 2px 0;\n}\n\n.popup li.disabled {\n padding: 0.2em;\n}\n\n.popup li a{\n display: block;\n padding: 0.2em;\n}\n\n.tabset {\n padding: 1em 0em 0em 0.5em;\n}\n\n.tab {\n margin: 0em 0em 0em 0.25em;\n padding: 2px;\n}\n\n.tabContents {\n padding: 0.5em;\n}\n\n.tabContents ul, .tabContents ol {\n margin: 0;\n padding: 0;\n}\n\n.txtMainTab .tabContents li {\n list-style: none;\n}\n\n.tabContents li.listLink {\n margin-left: .75em;\n}\n\n#displayArea {\n margin: 1em 17em 0em 14em;\n}\n\n\n.toolbar {\n text-align: right;\n font-size: .9em;\n visibility: hidden;\n}\n\n.selected .toolbar {\n visibility: visible;\n}\n\n.tiddler {\n padding: 1em 1em 0em 1em;\n}\n\n.missing .viewer,.missing .title {\n font-style: italic;\n}\n\n.title {\n font-size: 1.6em;\n font-weight: bold;\n}\n\n.missing .subtitle {\n display: none;\n}\n\n.subtitle {\n font-size: 1.1em;\n}\n\n.tiddler .button {\n padding: 0.2em 0.4em;\n}\n\n.tagging {\nmargin: 0.5em 0.5em 0.5em 0;\nfloat: left;\ndisplay: none;\n}\n\n.isTag .tagging {\ndisplay: block;\n}\n\n.tagged {\nmargin: 0.5em;\nfloat: right;\n}\n\n.tagging, .tagged {\nfont-size: 0.9em;\npadding: 0.25em;\n}\n\n.tagging ul, .tagged ul {\nlist-style: none;margin: 0.25em;\npadding: 0;\n}\n\n.tagClear {\nclear: both;\n}\n\n.footer {\n font-size: .9em;\n}\n\n.footer li {\ndisplay: inline;\n}\n\n* html .viewer pre {\n width: 99%;\n padding: 0 0 1em 0;\n}\n\n.viewer {\n line-height: 1.4em;\n padding-top: 0.5em;\n}\n\n.viewer .button {\n margin: 0em 0.25em;\n padding: 0em 0.25em;\n}\n\n.viewer blockquote {\n line-height: 1.5em;\n padding-left: 0.8em;\n margin-left: 2.5em;\n}\n\n.viewer ul, .viewer ol{\n margin-left: 0.5em;\n padding-left: 1.5em;\n}\n\n.viewer table {\n border-collapse: collapse;\n margin: 0.8em 1.0em;\n}\n\n.viewer th, .viewer td, .viewer tr,.viewer caption{\n padding: 3px;\n}\n\n.viewer table.listView {\n font-size: 0.85em;\n margin: 0.8em 1.0em;\n}\n\n.viewer table.listView th, .viewer table.listView td, .viewer table.listView tr {\n padding: 0px 3px 0px 3px;\n}\n\n.viewer pre {\n padding: 0.5em;\n margin-left: 0.5em;\n font-size: 1.0em;\n line-height: 1.4em;\n overflow: auto;\n}\n\n.viewer code {\n font-size: 1.2em;\n line-height: 1.4em;\n}\n\n.editor {\nfont-size: 1.1em;\n}\n\n.editor input, .editor textarea {\n display: block;\n width: 100%;\n font: inherit;\n}\n\n.editorFooter {\n padding: 0.25em 0em;\n font-size: .9em;\n}\n\n.editorFooter .button {\npadding-top: 0px; padding-bottom: 0px;}\n\n.fieldsetFix {border: 0;\npadding: 0;\nmargin: 1px 0px 1px 0px;\n}\n\n.sparkline {\n line-height: 1em;\n}\n\n.sparktick {\n outline: 0;\n}\n\n.zoomer {\n font-size: 1.1em;\n position: absolute;\n padding: 1em;\n}\n\n.cascade {\n font-size: 1.1em;\n position: absolute;\n overflow: hidden;\n}\n/*}}}*/
*0.3\n**ドライバ\n***終了処理をちゃんと実装する\n***リングバッファの実装(全てのデータを取得したい場合に)\n**Etoyの日本語辞書\n**Bluetoothサービスの有効を検出(有効ではない時は警告を出す)\n**MorphのIDに応じて初期LEDの点灯を行う(複数ある場合どれかわからなくなる)\n**Wiiリモコンモーフをプロジェクト間を行き来できるようにする\n**Wiiリモコンモーフを削除して再作成した場合にちゃんと接続できるようにする
SqueakでWiiリモコンを使うためのドライバを作ってます。ただし、ポインティングデバイスとしてではなく、motion sensor情報の取得が目的です。なのでSqueakでWiiリモコンがマウスの代りになるわけではない。\n*[[動作条件]]\n*[[Download & Install]]\n*[[使用方法]]\n*プログラム解説\n**[[WiiRemoteMorph]](工事中)\n**[[Wiiリモコンドライバ]]\n*[[サンプルプログラム]](工事中)\n*[[Links]]
WiiRemoteドライバからFFIでモーション情報を取得するSqueakプログラムです.\n*使用方法\n[[サンプルプログラム]]も参照してください.例えばWorkspaceより使う場合は次のようにします.\n{{{\nWiiRemote open "このSmalltalk式をDo itする直前にWiiリモコンのボタン1とボタン2を同時に押します"\nWiiRemote default sendReportMotion\nWiiRemote default readStatus x\n ->X軸方向の動き[0-255]を得ます.WiiReportクラス参照\nWiiRemote default readStatus y\n ->Y軸方向の動き[0-255]を得ます.WiiReportクラス参照\nWiiRemote default readStatus z\n ->Z軸方向の動き[0-255]を得ます.WiiReportクラス参照\nWiiRemote default readStatus btn\n ->ボタン押下状態を得ます.WiiReportクラス参照\nWiiRemote close\n}}}\n**クラスメソッド\n***WiiRemote class>>initialize\nWiiRemoteクラスを初期化します.\n***WiiRemote class>>open\nWiiリモコンと接続します.このメソッドを実行すると指定されたWiiリモコンアドレス(WiiRemote class>>defalultAddr)との接続を行います.このため実行直前にWiiリモコンのボタン'1'とボタン'2'を同時に押す必要があります.\n***WiiRemote class>>default sendReportMotion\nドライバのインスタンスを得ます.\nexample:\n{{{\nWiiRemote default sendReportMotion\n}}}\n***WiiRemote class>>close\nWiiリモコンとの接続を切断します.\n**インスタンスメソッド\n***openDevice: addr\n指定アドレスでWiiリモコンと接続します.\n***readStatus\nMotionセンサ情報とボタン状態を得ます.戻り値にWiiReportクラスのインスタンスが帰ります.\n***sendReportMotion\nWiiリモコンから連続してMotionセンサ情報を取得するモードにします.\n
*使用方法\n**インスタンスメソッド\n***x\nX方向の情報(raw)を得ます.\n***y\nY方向の情報(raw)を得ます.\n***z\nZ方向の情報(raw)を得ます.\n***btn\nボタン情報を得ます.\n|!値|!ボタン|\n|0x01|2|\n|0x02|1|\n|0x04|B|\n|0x08|A|\n|0x10|-|\n|0x80|HOME|\n|0x100|←|\n|0x200|→|\n|0x400|↓|\n|0x800|↑|\n|0x1000|+|
BlueZを使ってWiiリモコンと通信を行う共有ライブラリです.現在の実装では==位置==情報を受信スレッドで受けて,readStatus関数でコール側にイベント情報を通知しています.
リモコンの動きで音色をかえるプログラム\n{{{\n'From Squeakland 3.8-05 of 7 September 2005 [latest update: #527] on 24 December 2006 at 10:11:34 pm'!\nSimpleButtonMorph subclass: #WiiPlay\n instanceVariableNames: 'snd'\n classVariableNames: ''\n poolDictionaries: ''\n category: 'WiiRemote-Demo'!\n\n!WiiPlay methodsFor: 'as yet unclassified' stamp: 'hkawa 12/24/2006 13:02'!\ninitialize\n | p |\n super initialize.\n snd _ FMSound new.\n p _ OrderedCollection new.\n p add: 0@0; add: 60@1.0; add: 110@0.8; add: 200@1.0; add: 250@0.0.\n snd addEnvelope: (VolumeEnvelope points: p loopStart: 2 loopEnd: 4).\n! !\n\n!WiiPlay methodsFor: 'as yet unclassified' stamp: 'hkawa 12/24/2006 13:51'!\nsetDefaultLabel\n self label: 'Play'.! !\n\n!WiiPlay methodsFor: 'as yet unclassified' stamp: 'hkawa 12/24/2006 13:07'!\nstep\n | status x y z |\n super step.\n status := WiiRemote default readStatus.\n x := status x.\n x := x * 2.\n y := status y.\n y := y / 255.\n z := status z.\n z := z / 255.\n (snd setPitch: x dur: y loudness: z) play! !\n}}}
Wiiリモコンの先端とおしり方向と水平線とのなす角
Wiiリモコンを持った状態で手首をひねる方向
*[[28 December 2006]]\n*[[27 December 2006]]
!!!Bluetoothサービスの起動\n本プログラムを使用するにはBluetoothサービスが稼働している必要があります.Linuxによってはサービスが自動実行されるものもあります.\n{{{\nsudo /etc/init.d/bluetooth start\n * Starting Bluetooth services [ ok ] \n}}}\n!!!初期化\n初期化は通常行う必要がありません.次のペアリングで登録したWiiリモコンを削除する場合に行います.Workspaceから次のSmalltalk式を'Do-it'(Alt-d)します.\n{{{\nWiiRemoteMorph initialize\n}}}\n!!!ペアリング\nSqueakとWiiリモコンをペアリングします.あらかじめ次のSmalltalk式を'Workspaceに書いておいて、利用するWiiリモコンのボタン'1'とボタン'2'を同時に押して、すぐに次のSmalltalk式を'Do-it'(Alt-d/Cmd-d)します.\n{{{\nWiiRemoteMorph scan\n}}}\n複数のWiiリモコンを登録する場合は複数回この操作を行ってください.この操作で利用するWiiリモコンのID(Bluetoothアドレス)を記憶します.\n*登録したWiiリモコンID確認方法\n登録したWiiリモコンID確認する場合は、Workspaceから次のSmalltalk式を'print-it'(Alt-p/Cmd-p)します.\n{{{\nWiiRemoteMorph scanList\n}}}\n登録されたIDが表示されます.\n{{{\nWiiRemoteMorph scanList\n -> a Set('00:19:1D:XX:XX:XX' '00:19:1D:XX:XX:XX')\n}}}\n!!!Wiiリモコンモーフ\nこの操作は上記scan後、WiiリモコンのLED点滅が終わってからにしてください。Wiiリモコンモーフを次のSmalltalk式を'Do-it'(Alt-d/Cmd-d)して作成します.Wiiリモコンからの情報取得にMorphを使っています.\n{{{\nWiiRemoteMorph open\n}}}\n!!!Wiiリモコンとの接続\nWiiリモコンのボタン'1'とボタン'2'を同時に押してください。しばらくするとアイコンが変化(影が出来る)します.この状態で接続が完了します.\n!!!Wiiリモコンから情報取得\n接続状態からはEtoyのビューワを使って状態の取得、変更が可能になります.Etoyを使ってWiiリモコンを使って他のモーフと連携してあそぶことが出来るようになります.\n*取得可能な情報\n**加速度のX/Y/Z軸方向の大きさ、加速度の大きさ(legnth), [[ロール]](roll)[度],[[ピッチ]](pitch)[度],Wiiリモコンボタン情報\n***ヨー(yaw)はIRセンサを使わないと精度が出ないようです.\n*変更可能な情報\n**LEDの点灯,Force Feedback(ぶるぶる)\n!!!制限事項\n# 接続状態ときにWiiリモコンの電源ボタンを押さないでください\n# Wii本体とは同時使用できません(Wii本体が優先されます).\n# 現行版ではWiiリモコンモーフはプロジェクト間を行き来できないので、Wiiリモコンを削除して、再度Wiiリモコンモーフを作成してください。このとき一旦Squeakを終了して、再起動してください。
*Linux\n**2.6以上を推奨\n***動作確認はUbuntu 6.10, Edgy(Kernel 2.6.17-10)\n*Bluetoothドライバ[[BlueZ]]がインストールされていること\n*Bluetoothが使えるPC\n**動作確認はplanexのUSBドングルを使ってます.\n*Squeak\n**[[SqueakLand2005J|http://squeakland.jp/developer/]]開発版を推奨