[[Funnelまとめ]] - 公開 -- [[kazushi]] &new{2008-09-11 (木) 21:12:23}; - IMU 5 DOFモジュールのセットアップ方法を追加 -- [[kazushi]] &new{2008-09-14 (日) 16:54:56}; - Funnel008b5用にXBee単体での方法を更新 -- [[kazushi]] &new{2008-09-18 (木) 14:19:18}; - FIOv1.3とFunnel009用に更新 -- [[kazushi]] &new{2009-04-24 (金) 14:56:51}; - XIOの章の回路図を追加 -- [[kazushi]] &new{2009-05-07 (木) 18:15:32}; - VCP driversの情報を追加 -- [[kazushi]] &new{2009-05-12 (火) 22:15:25}; - XBeeのend device側paketization timeout(RO)は10より3(デフォルト)のほうが滑らかになる。 -- [[kazushi]] &new{2009-11-10 (火) 13:37:19}; - XIO単体のみの説明に変更 -- [[kazushi]] &new{2011-07-02 (土) 03:13:24}; #comment //*Funnel [#i2989870] //&ref("fio_v13front.jpg"); &ref("fio_v13back.jpg");~ //写真はFIOv1.3+XBee(チップアンテナ型)+EIC-801+リチウムイオンポリマー電池(1000mAh)の組み合わせ~ //~ //2009/04/24現在のバージョンは009です。~ //~ //IAMASの[[小林茂:http://www.yapan.org/diary/]]先生が考案したフィジカル・コンピューティング・ツールキットが[[Gainer:http://gainer.cc/]]。その無線版。~ //公式サイトは[[ここ:http://funnel.cc/]] ~ //開発状況は[[ここ:http://code.google.com/p/funnel/]] ~ //名前の由来は[[ここ:http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%83%B3%E3%83%8D%E3%83%AB_(%E6%A9%9F%E5%8B%95%E6%88%A6%E5%A3%AB%E3%82%AC%E3%83%B3%E3%83%80%E3%83%A0)#.E3.83.95.E3.82.A1.E3.83.B3.E3.83.8D.E3.83.AB]] ~ //**動作モデル [#ub9d0d3b] //Funnel専用I/Oモジュール(Fio)だけなく、XBee, Gainer, ArdinoなどいろいろなI/Oモ//ジュールを利用できる。基本的にどれもXBee経由。よって、 // -XBee単体 // -XBee+Fio //の2つでやってみた。~ //~ ***XIO(XBee単体) [#v392bc2a] PC<-USB->(エクスプローラUSB(XBee)) ------ (XBee)~ &ref("explorer_usb_s.JPG"); ------ &ref("xbee_valicon_s.jpg");~ 利点)fioなしで始められる。コンパクト~ 欠点)ポート数が少ない。電源を制作しなければならない。そのままではブレッドボードに刺さらない。~ -XBeeとは シリアルポート接続によるPCのデータを送受信する無線モジュール。~ //***XBee+Fio [#a2c9ba84] //PC<-USB->(エクスプローラUSB(XBee)) ------ ((XBee)Fio)~ //&ref("explorer_usb_s.JPG"); ------ &ref("fio_valicon_s.JPG");~ //利点)ポートが多い。電源がある。ブレッドボードに刺さる。~ //欠点)XIOより大きい。~ //-FIOとは //Funnel I/Oのこと。GainerにGainerI/OがあるようにFunnelにFunnelI/Oがある。~ //*FIO [#r54123f4] //&color(red){※この情報は2009/04/24時点のものです。};~ //&color(red){※XBeeの抜き差しや配線の変更は必ず電源を切って行うこと。};~ //&color(red){※リチウムリチウムイオンポリマー電池の取り扱いには十分注意すること。[[間違えると発火・爆発します:http://www.switch-science.com/products/detail.php?product_id=48]]};~ //***ハードウェアの準備 [#cca48a71] //http://funnel.cc/Hardware/FIO //をよく読んでそろえる。私が購入したものは以下のとおり~ //-[[FIOボード:http://www.switch-science.com/products/detail.php?product_id=123]] x 1個 //-[[XBee無線モデム(802.15.4モデル):http://www.switch-science.com/products/detail.php?product_id=96]] x 2個 //-[[XBee Explorer USB(XBee⇔USB変換モジュール):http://www.switch-science.com/products/detail.php?product_id=30]] x 1個 //-[[リチウムイオンポリマー電池1000mAh:http://www.switch-science.com/products/detail.php?product_id=48]] x 1個 //-[[ピンヘッダ(14穴以上):http://www.switch-science.com/products/detail.php?product_id=93]] x 2本 //-[[ピンソケット(14穴以上):http://akizukidenshi.com/catalog/g/gP-00241/]] x 2本 -USBケーブル(A⇔mini-B)x 1本 //-[[ブレッドボードEIC-801:http://akizukidenshi.com/catalog/g/gP-00315/]] x 1枚 //-[[ジャンプワイヤ:http://www.sunhayato.co.jp/products/details.php?u=904&id=06064]] x 数本 ~ //***半田付け [#r67e9953] //1.FIOは購入直後はピンソケットがないので用意して半田付けする。~ //2.FIO:電源スイッチ近くのはんだジャンパを閉じる。~ //&ref("http://farm4.static.flickr.com/3379/3214685928_25d0ae6111_m.jpg");~ //3.XBee Explorer USBまたはXBee starter kit:RTSとD3の間をジャンパで接続する。~ //&ref("http://farm4.static.flickr.com/3307/3214685994_3d3fd6d333_m.jpg");~ //~ //***電池の充電 [#s02b717e] //一晩待つ^^; //~ //***ソフトウェアの入手 [#xb14ac7b] //以下はWindows用。macの場合は公式サイトを参照のこと。ダウンロードしたら解凍する。40002637_c.exeはインストールする。~ //-funnel_009.zip //-processing-1.0.3.zip //-arduino-0015-win.zip //-40002637_c.exe(X-CTU v5.1.4.1) //-FTDI Virtual COM port (VCP) drivers~ //http://www.ftdichip.com/Drivers/VCP.htm~ //~ //***XBeeのファームウェアの設定 [#x437eeb1] //1.XBeeエクスプローラとUSBケーブルを使ってXBeeをUSBに接続。~ //2.ハードウェアの検出ウィザードが起動したら、FTDI VCP driversを解凍してそのフォルダをドライバインストールフォルダとして指定する。このドライバインストールは2回聞かれる。~ //3.コントロールパネル>システム>デバイスマネージャにてポート(COMとLPT)にUSB //Serial Portが正常に表示されていることを確認。この場合はCOM7。~ //4.ついでにCOMポート設定を変更しておく。(Windowsのみ)~ //4.1. デバイスマネージャからCOMポートのプロパティを表示する~ //4.2. 「詳細設定」ボタンを押して設定画面を開く~ //4.3. 「その他のオプション」で「クローズ時のRTS設定」をチェックする~ //5.X-CTUを起動。~ //6.modem configurationのreadを押してXBeeの接続を確認。ここでファームウェアが1.0.C.Dではなかったらwriteしてファームウェアをアップデート。~ //7.hardware/fio/xbee/coordinator_auto_reset.proをloadしてコーディネータ(PCに接続した)側にアップロード~ //8.XBeeを交換。~ //9.modem configurationのreadを押してXBeeの接続を確認。ここでファームウェアが1.0.C.Dではなかったらwriteしてファームウェアをアップデート。~ //10.hardware/fio/xbee/enddevice.proをエンドデバイス(FIOに搭載した)側にアップロード~ //11.XBeeを交換。~ //※この設定ファイルではPAN IDは1234,コーディネータIDは0,エンドデバイスIDは1になっている。複数で勉強するときはこれらの値を必要に応じて変える。~ //※エンドデバイス側paketization timeout(RO)は10より3(デフォルト)のほうが滑らかになる。 //~ //***FIOのファームウェアの設定 [#ub9b97ac] //1.FIOにエンドデバイス側に設定したXBeeを付ける。向きに注意!~ //2.XBeeエクスプローラとUSBケーブルを使ってコーディネータ側XBeeをUSBに接続。~ //3.Arduino-0015を起動~ //※vistaでrduino-0015が動かない場合はフォルダ内のjavaディレクトリを削除する。//vistaにjavaが入っていれば起動する。入っていなければvista対応のjavaを別途入手する。~ //4.Tools/Board/Arduino Pro or Pro Mini (8MHz)を選択する~ //5.Tools/Serial Portで適切なシリアルポートを選択する~ //6.File/Sketchbook/Openからfunnel_009/hardware/fio/firmware/FioStandardFirmata/FioStandardFirmata.pdeを開く。~ //7.FIOの電源を入れる。~ //8.すぐにUploadボタンを押してファームウェアをアップロード~ //※結構失敗します。シリアルポートの速度(19200が適当のはず)などを確認してうまくいくまで何回も試してみる。~ //9.FIOの電源を切る。~ //~ //***Funnel Serverの設定 [#v8c0daa6] //1.funnel_009/serverのsettings.txtを以下のようにする。~ // server: // port: 9000 // // io: // type: Fio // port: COM7 // baudrate: 19200 //※COM7は各自の環境によって変わります。~ //2.FIOの電源を入れる。~ //4.Funnel Server.exeを起動する。正常に起動していれば~ // Funnel 009 BETA (r588) // // I/Oモジュールと接続中です… // baudrate: 19200 // I/Oモジュールと接続が完了しました:COM7 // API MODE: 2 // FIRMWARE VERSION: 10CD (XBee 802.15.4) // PAN ID: 1234 // SOURCE ADDRESS: 00 // コマンドポート:サーバの起動中… // コマンドポート:サーバが起動しました:9000 // Discovering nodes... // NODE: MY=1, SH=13a200, SL=40526a6c, dB=45, NI='FIO #1' // Firmata Protocol Version: 2.0 // Discovering nodes... //と表示される。~ //※特にFirmata Protocol Version: 2.0が表示されているか確認。~ // //***ソフトウェアライブラリの設定(Processing) [#x467d294] //1.Processing1.0.3を起動。ホームディレクトリにProcessingフォルダができていることを確認。~ //2.Processing/libraries/funnel/libraryを作成しfunnel_009/libraries/processing/libraryの中身をコピーする。~ //3.Processing/libraries/funnel/library/settings.fio.txtを~ // server: // port: 9000 // // io: // type: Fio // port: COM7 // baudrate: 19200 //としてCOMポート番号を指定する。~ //※シリアルポートは各自の環境によって変わります。~ //~ //***シンプルスコープの起動 [#w98c42ec] //1.可変抵抗を以下のように接続する。(わかりにくいけどA0ピン)~ //&ref("vr_with_fio13.jpg");~ //~ //2.ホームディレクトリのProcessingフォルダに以下のディレクトリを作成し以下のソースを作成する。~ //SimpleScopeFIO/SimpleScopeFIO.pde~ //SimpleScopeFIO/Scope.pde~ //~ //-SimpleScopeFIO.pdeのソースコード //#geshi(java){{ //import processing.funnel.*; // //final int id = 1; // end device ID //final int kChannles = 3; // the number of channels to display // //Fio fio; //PFont myFont; //Scope[] scope; // //void setup() //{ // size(340, 35+150*kChannles); // frameRate(30); // // myFont = createFont("CourierNewPSMT", 12); // textFont(myFont); // // int[] moduleIDs = {id}; // fio = new Fio(this, moduleIDs, Fio.FIRMATA); // // scope = new Scope[kChannles]; // for (int channel = 0; channel < kChannles; channel++) { // scope[channel] = new Scope(30, 35+150*channel, 200, 100, "A"+channel); // } //} // //void draw() //{ // background(0); // for (int channel = 0; channel < kChannles; channel++) { // scope[channel].updateAndDraw(fio.iomodule(id).analogPin(channel)); // } //} //}} //-Scope.pdeのソースコード //#geshi(java){{ ///** // * A simple oscilloscope class // */ //import processing.funnel.*; // //class Scope { // private int l; // private int t; // private int h; // private float values[]; // private int index = 0; // private int points = 200; // private String title; // // Scope(int l, int t, int w, int h, String title) { // this.l = l; // this.t = t; // this.h = h; // this.points = w; // this.title = title; // // values = new float[this.points]; // } // // public void updateAndDraw(IOModule.Pin pin) { // values[index] = pin.value; // // smooth(); // // textSize(12); // text(title, l - 24, t - 8); // text("1.0", l - 24, t + 8); // text("0.0", l - 24, t + h); // text("val: " + pin.value, l + points + 8, t + 8); // text("max: " + pin.maximum, l + points + 8, t + 20); // text("min: " + pin.minimum, l + points + 8, t + 32); // text("avg: " + pin.average, l + points + 8, t + 44); // // // draw outlines // stroke(200); // noFill(); // beginShape(); // vertex(l - 1, t - 1); // vertex(l + points, t - 1); // vertex(l + points, t + h); // vertex(l - 1, t + h); // endShape(CLOSE); // // // draw the signal // stroke(255); // beginShape(); // for (int i = 1; i < points; i++) { // vertex(l + i, t + h - values[(index + i) % points] * (float)h); // } // endShape(); // // index = (index + 1) % points; // } //} //}} //3.Processing1.0.3を起動。~ //4.File/Sketchbookを開くとSimpleScopeFIOがあるので選択。~ //5.FIOの電源を入れる。~ //6.SimpleScopeFIOを起動。~ //7.可変抵抗をまわすとそれに応じてA0のグラフが変化する。~ //~ *XIO(XBee単体) [#md780815] &color(red){※この情報は2008/09/18時点のものです。};~ &color(red){※XBeeの抜き差しや配線の変更は必ず電源を切って行うこと。};~ **可変抵抗でやってみた。 [#h07785d4] *** 1.Funnel008bのダウンロード [#i1a10d10] http://funnel.googlecode.com/files/funnel_008b5.zip ~ *** 2.ProcessingにFunnelのライブラリをインストールする [#n2e57e4e] processingはビルド0148(2008-09-11時点の最新安定板)を使用。~ libraries/processing/library~ の~ funnel.jar~ javaosc.jar~ を~ processing-0098/libraries/funnel/library~ に入れる。(ディレクトリがなければ作成)~ *** 3.X-CTUでXbeeの値を設定する [#f3966afc] 設定に関してほかのパラメータをいじったことがあればrestoreして初期設定に戻す。~ 1:1の通信を行う。~ コーディネータ(ホスト)側 ATID 1111 <-PAN(グループ)ID ATDH 0000 ATDL 0002 <-相手のID ATMY 0001 <-自分のID ATAP 2 <-APIモードの設定 エンドデバイス(クライアント)側 ATID 1111 <-PAN(グループ)ID ATDH 0000 ATDL 0001 <-相手のID ATMY 0002 <-自分のID ATD0 2 <-ピン20をアナログ入力AD0に設定 ATIT 5 <-ここで指定したサンプル数ごとに送信 ATIR 64 <-サンプリング間隔(0x64 = 100ms) &color(red){レスポンスが悪い!と思ったら…}; エンドデバイス(クライアント)側 ATIT 1 <-ここで指定したサンプル数ごとに送信 ATIR 0A <-サンプリング間隔(0x0A = 10ms) *** 4.Funnel Serverを設定する [#ub6be0b3] settings.yamlを次のようにする~ server: port: 9000 io: type: XBee com: COM3 <-ここはコーディネータをつなげているCOMポート番号を指定 baudrate: 9600 *** 5.回路を組む [#od4005fe] &ref("xbee_valicon.jpg");~ 回路図~ &ref("xio_n_v-resistor_thumb.jpg");~ 大きなファイルはこちら。&ref("xio_n_v-resistor.bmp");~ エンドデバイス側の回路を組む際の注意点~ &color(red){電源電圧は必ず2.8〜3.4Vの範囲で使用};→5Vを加えるとモジュールが破壊!~ &color(red){Vref(14番ピン)はVCC(1番ピン)に接続};→A/D変換のための基準電圧~ *** 6.ここでXBeeのコーディネータ・エンドデバイスとも電源を入れる [#vf567fde] *** 7.Funnel Serverを起動する [#v7084a01] 以下のメッセージを確認~ Funnel 008 BETA (r465) I/Oモジュールと接続中です… baudrate: 9600 I/Oモジュールと接続が完了しました:COM3 Configuring the XBee module... コマンドポート:サーバの起動中… コマンドポート:サーバが起動しました:9000 FIRMWARE VERSION: 10a5 (XBee 802.15.4) API MODE: 2 SOURCE ADDRESS: 01 PAN ID: 1111 -チェックポイント --FIRMWARE VERSIONなどの情報が表示されているか?→されていなければATAPの結果を確認 *** 8.Processingを起動する [#ca085054] 以下のスケッチを作成。フォントはサンプルのものを流用する。~ #geshi(java){{ /* analog in */ import processing.funnel.*; XBee xbee; PFont myFont; void setup() { size(400,130); myFont = loadFont("CourierNewPSMT-24.vlw"); textFont(myFont, 24); int[] moduleIDs = {2}; xbee = new XBee(this,moduleIDs); } void draw() { background(0); text("analogInput[0]: " + xbee.iomodule(2).port(0).value,10,80); } }} *** 9.動作確認 [#p35e6827] 可変抵抗のつまみを回すと、値が0.0から1.0で変わる。ヤフー:-D~ 値が震えていたりしたらエンド・デバイスの電源を切って、14番ピンに基準電圧(+3.3V)をとっているか確認すること。~ XBee単体をエンドデバイスにするとどうしても電源レギュレータも用意しないといけないので配線がややこしい。~ **ジャイロでやってみた。 [#xd9dbc94] IMU 5 DOFモジュール~ http://www.sparkfun.com/commerce/product_info.php?products_id=741 ~ ~ *** 1.X-CTUにてエンドデバイスのXBeeの設定をかえる。 [#y8ceed4c] ATID 1111 <-PAN(グループ)ID ATDH 0000 ATDL 0001 <-相手のID ATMY 0002 <-自分のID ATIT 1 <-ここで指定したサンプル数ごとに送信 ATIR 0A <-サンプリング間隔(0x0A = 10ms) ATD0 2 <-ピン20をアナログ入力AD0に設定 ATD1 2 <-ピン19をアナログ入力AD0に設定 ATD2 2 <-ピン18をアナログ入力AD0に設定 ATD3 2 <-ピン17をアナログ入力AD0に設定 ATD4 2 <-ピン11(注意!)をアナログ入力AD0に設定 *** 2.回路を組む [#uf6b40bf] &ref("IMG_4010.JPG");~ XBee単体でやってみた。~ 以前に比べて3.3vレギュレータと電源スイッチそして配線を整理してある。~ 回路図~ &ref("xio_imu5dof.jpg");~ 大きなファイルはこちら。&ref("xio_imu5dof.bmp");~ ~ *** 3.XBeeコーディネータ・エンドデバイスとも電源を入れる [#g315301c] &color(red){※XBeeなどの3.3vで動くモジュールには3.4v以上の電圧を与えないこと!}; ~ *** 4.Funnel Serverを起動する [#v7084a01] ~ *** 5.Processingを起動する [#ca085054] 以下のスケッチを作成。フォントはサンプルのものを流用する。~ #geshi(java){{ /** * SimpleScope XBee */ import processing.funnel.*; final int kChannles = 5; // the number of channels to display final int kPoints = 200; // the number of points to display final int id = 2; // end device ID XBee xbee; PFont fixedWidthFont; float values[][]; int index = 0; void setup() { size(400, 700); frameRate(30); fixedWidthFont = loadFont("CourierNewPSMT-12.vlw"); values = new float[kChannles][kPoints]; for (int channel = 0; channel < kChannles; channel++) { for (int i=0; i < kPoints; i++) { values[channel][i] = 0; } } int[] moduleIDs = { id }; xbee = new XBee(this, moduleIDs); } final int kLeft = 35; final int kTop = 25; final int kHeight = 100; void draw() { background(0); smooth(); for (int channel = 0; channel < kChannles; channel ++) { int offset = channel * 130; textFont(fixedWidthFont); textSize(12); text("analogInput(" + channel + ")", kLeft - 24, kTop - 8 + offset); text("1.0", kLeft - 24, kTop + 8 + offset); text("0.0", kLeft - 24, kTop + kHeight + offset); text("val: " + xbee.iomodule(id).port(channel).value, kLeft + kPoints + 8, kTop + 8 + offset); text("max: " + xbee.iomodule(id).port(channel).maximum, kLeft + kPoints + 8, kTop + 20 + offset); text("min: " + xbee.iomodule(id).port(channel).minimum, kLeft + kPoints + 8, kTop + 32 + offset); text("avg: " + xbee.iomodule(id).port(channel).average, kLeft + kPoints + 8, kTop + 44 + offset); values[channel][index] = xbee.iomodule(id).port(channel).value; // draw outlines stroke(200); noFill(); beginShape(); vertex(kLeft - 1, kTop - 1 + offset); vertex(kLeft + kPoints, kTop - 1 + offset); vertex(kLeft + kPoints, kTop + kHeight + offset); vertex(kLeft - 1, kTop + kHeight + offset); endShape(CLOSE); // draw the signal stroke(255); beginShape(); for (int i = 1; i < kPoints; i++) { vertex(kLeft + i, kTop + kHeight - values[channel][(index + i) % kPoints] * (float)kHeight + offset); } endShape(); } index = (index + 1) % kPoints; } }} ~ *** 6.動作確認 [#hee53ed6] ブレッドボードを大きく動かす(ここがポイント)と、それぞの値が変わる。実際に角度を出す時は得られた値を積分する(足し合わせる)ため、小さく動かしても値の変化はそれほどない。だから向きを変えたから値が変わるということではない。今回の場合は 0 -> x-accel 1 -> y-accel 2 -> z-accel 3 -> x-rate 4 -> y-rate で、動作を確認してみた。 ~