iPhone nano の作り方(後編) XBeeで加速度センサーの値を無線送信+Flashで受けて3Dモデルを描画
![]()
2008-10-19(Sun) 23:50
![]()
投稿者: kisocci
FPS2008でご紹介したiPhone nano!
後編はXBeeを搭載する中身についてのご紹介です。
■ 材料
- XBee Starter Kit – XB24-DKSJ (購入先:アルファ電子)
- 2mmピッチピンソケット
- 2mmピッチユニバーサル基盤
- ボタン電池ソケット
- 3軸加速度センサーモジュール – KXM52-1050 (購入先:秋月電子通商)
- ボタン電池 – CR2032
- FRISK空箱
■ 電子工作
まず、iPhone nano本体の電子工作を行います。
簡単な回路図。
ボタン電池と3軸加速度センサーとXBeeとを基盤上で接続します。
回路図のように、電池ケースと各素子のVCC,GNDを直結。
3軸加速度センサーのX,Y,Z出力を、XBeeのAD0/DIO0,1,2にそれぞれ接続します。
3軸加速度センサーのSelfTestはGNDに落としておきます。
XBeeのVREF端子(14番)がADCのリファレンスとなりますので、VCC3Vに接続します。
注意:XBeeの端子のピッチが2mmでして、一般のインチ系(2.54mmピッチ)の基盤では合いません。基盤のピッチにはご注意ください。また、同様に一般的なブレッドボードもちょっと使えませんので、とりあえず2mmピッチのピンソケットを購入しいろいろ自作する必要があると思います。
追記20081031:XBeeのピッチ変換基盤がSparkfunから発売されています(BOB-08276)。また、スイッチサイエンスではピンソケットをセットにして販売しています。XBeeをブレッドボードで使う場合は便利です。
![]()
またボタン電池では数分ももちませんでした。テスト中はACアダプタや006P/9V電池から3端子レギュレータを使って3Vを供給して行いました。デモ時にのみボタン電池でFRISKケースに納めます。
参考:3軸加速度センサーモジュール – KXM52-1050
秋月電子通商で購入。
カイオニクス社製加速度センサーにコンデンサをつけて8ピンモジュール化した製品です。
入力範囲:±2G x,y,z
出力感度:660mV/G
オフセットがVdd/2なので、電源3.3Vで0Gの場合、1.65Vを出力します。
参考:FRISKケースに本当におさめるために
最初、FRISKケースにいれることを意図せずに作りました。
配線完成間近でふとFRISKケースの幅にXBeeが収まることにヒラメキました。
電池ボックスの位置を工夫すれば入りそう(フタもしまりそう)でしたが
タイムリミットで断念。
Starter Kitに同梱されているXBeeのアンテナはウィップアンテナ(XB24-AWI-001J)という棒状のアンテナがとびだしているタイプのため、ケースにアンテナを通過させる穴をあけて、ふたを無理矢理おさえています。
XBeeのアンテナには他にチップタイプ(XB24-ACI-001J)のもあるので、それを別途調達して基盤をもう少し工夫すれば、真にFRISKケースに入る(フタがしまる)ものになると思います。
■ XBeeのコンフィギュレーション
XBeeの動作設定を行います。
XBeeを評価ボードを介してUSB/Serial接続します。![]()
キットに付属の「X-CTU ソフトウェア(Windows版のみ)」を起動します。
「Modem Configuration」タブをクリックし、各パラメータを入力します。
ポイントは、iPhone nano側のXBeeのDIO0〜2ピンを[2:ADC]としてアナログ入力+ADCとして設定するところでしょうか
XBeeのシリアル設定
Speed: 38400bps FlowControl: None DataBits: 8 Parity: None StopBit: 1
PCホスト側XBeeの設定
XB24_15_4_10A5.mxi FE 0 231 10A5 0 [A]CH=C [A]ID=3332 [A]DH=0 [A]DL=5678 [A]MY=1234 [A]RR=0 [A]RN=0 [A]MM=0 [A]NT=19 [A]CE=0 [A]SC=1FFE [A]SD=4 [A]A1=0 [A]A2=0 [A]EE=0 [A]NI= [A]PL=4 [A]CA=2C [A]SM=0 [A]ST=1388 [A]SP=0 [A]DP=3E8 [A]BD=5 [A]RO=3 [A]AP=0 [A]PR=FF [A]D8=0 [A]D7=1 [A]D6=0 [A]D5=1 [A]D4=0 [A]D3=0 [A]D2=0 [A]D1=0 [A]D0=0 [A]IU=1 [A]IT=1 [A]IC=0 [A]IR=0 [A]IA=5678 [A]T0=FF [A]T1=FF [A]T2=FF [A]T3=FF [A]T4=FF [A]T5=FF [A]T6=FF [A]T7=FF [A]P0=2 [A]P1=2 [A]PT=FF [A]RP=28 [A]CT=64 [A]GT=3E8 [A]CC=2B
iPhone nano側XBeeの設定
XB24_15_4_10A5.mxi FE 0 231 10A5 0 [A]CH=C [A]ID=3332 [A]DH=0 [A]DL=1234 [A]MY=5678 [A]RR=0 [A]RN=0 [A]MM=0 [A]NT=19 [A]CE=0 [A]SC=1FFE [A]SD=4 [A]A1=0 [A]A2=0 [A]EE=0 [A]NI= [A]PL=4 [A]CA=2C [A]SM=0 [A]ST=1388 [A]SP=0 [A]DP=3E8 [A]BD=5 [A]RO=3 [A]AP=0 [A]PR=FF [A]D8=0 [A]D7=1 [A]D6=0 [A]D5=1 [A]D4=0 [A]D3=0 [A]D2=2 [2:ADCに設定しています] [A]D1=2 [2:ADCに設定しています] [A]D0=2 [2:ADCに設定しています] [A]IU=1 [A]IT=1 [A]IC=0 [A]IR=19 [A]IA=FFFFFFFFFFFFFFFF [A]T0=FF [A]T1=FF [A]T2=FF [A]T3=FF [A]T4=FF [A]T5=FF [A]T6=FF [A]T7=FF [A]P0=1 [A]P1=0 [A]PT=FF [A]RP=28 [A]CT=64 [A]GT=3E8 [A]CC=2B
■ Flash
加速度データを受け、実際に画面上にiPhone nanoの3Dイメージを描画するのはFlashの担当となります。
iPhone nanoからの加速度データはXBeeを経由し、シリアル経路上をバイナリデータとして送出されてきます。
PC上でSerialProxyというプログラムを用いてシリアルをTCPに変換し、それをFlashのSocketクラスで受け取るようにします。
データはバイナリで届きますが、データの先頭が00 01 1E 00となりますので、それをトリガーにして、続くの6バイトを2バイトずつx,y,zの値として取得します。XBeeは10bit ADCを搭載するため、値の範囲は0×0000〜0x03FFとなります。Flashではこの値からG値を復元しています。
(計算)電源は3Vですので0Gの時、ADCの出力電圧は1.5V。
出力電圧は1Gあたり660mV振れますので(@3.3Vですが)、-1Gであれば0.84V、+1Gであれば1.16Vの出力電圧となります。
前述のようにXBee内蔵のADCは10bitのサンプリングをします。リファレンスをVCCにしましたので、入力=VCCの時0x3FFの出力、入力=VCC/2の時0×200あたりの出力が得られることになります。また比で考えますと、660mVは0xCCに相当するとみまして、
Gx = (ADCx – 0×200) / 0xCC
として加速度(G)の値を算出しています。1G以上(もしくは-1G以下)の加速度が感知された場合は、1Gに丸めてしまい±1Gに収まるようにしています。
あとは、iPhone Flashと同様です。
基本的に傾きを
iphonenano.rotationX = Math.atan(accY/accZ)*180/Math.PI;(手前に倒れる角度)
として求めて、Papervision3Dでモデルを傾けています(軸回転させています)。
実際には座標系(回転の原点(0度の位置))を調整して、現物の傾きとあわせています。
if (accZ>0) {
iphonenano.rotationX = 90 - Math.atan(accY/-accZ)*180/Math.PI ;
} else {
iphonenano.rotationX = 270 - Math.atan(accY/-accZ)*180/Math.PI ;
}
if (accY>0) {
iphonenano.rotationZ = (-1)* Math.atan(accX/accY)*180/Math.PI;
} else {
iphonenano.rotationZ = Math.atan(accX/accY)*180/Math.PI;
}
この値をもとに、3Dモデルを動かす仕組みは、iPhone Flashと同様です。
trackback URL:
http://www.blocco-deli.co.jp/blog/2008/10/19/fps2008-3/trackback/
![]()
