[[FrontPage]]
[[Funnelまとめ]]

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};
- Processing2.0およびfunnel1.0r806にて動作確認 -- [[kazushi]] &new{2012-12-09 (日) 13:09:23};

#comment

*Funnel [#i2989870]
&ref("fio.JPG");
~
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つでやってみた。~

-XBeeとは
シリアルポート接続によるPCのデータを送受信する無線モジュール。使い方は[[ここ:http://www.alpha-denshi.co.jp/seihin/toriatukai/Digi/TechDB/]]~

利用にあたってはブレッドボードなどを用いて3.3V電源などを用意する必要があるが、ピンのピッチ幅がGainerなどで使われるブレッドボードと違うのでそのままでは手軽に使えない。手っ取り早く使うにはXBeeスターターキットについてくる評価ボードを使う。しかし、これは余分な機能も付いているのでボードが大きい。よって以下の2つを用いるととても便利。

 SparkFun XBeeエクスプローラUSB(完成品)
 http://www.switch-science.com/products/detail.php?product_id=30
 SparkFun XBeeピッチ変換基板とソケットのセット(キット)
 http://www.switch-science.com/products/detail.php?product_id=28

評価ボード(大きい)~
&ref("evaluation_board_usb.jpg"); &ref("evaluation_board_enddevice.jpg");~
~
XBeeエクスプローラUSB(コンパクト!ブレッドボード直!)~
&ref("explorer_usb.JPG"); &ref("xbee_valicon.jpg");~
~
**XBee単体 [#v392bc2a]
PC<-USB->(エクスプローラ(XBee))  ------ (XBee)~
***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");~
利点)ポートが多い。電源がある。ブレッドボードに刺さる。~
欠点)まだ製品になっていない。~
-Fioとは
Funnel I/Oのこと。GainerにGainerI/OがあるようにFunnelにFunnelI/Oがある。まだ評価段階であるが今回特別に貸与してもらっている。~
*XIO(XBee単体) [#md780815]
&color(red){※この情報は2012/12/09時点のものです。};~
&color(red){※XBeeの抜き差しや配線の変更は必ず電源を切って行うこと。};~

*可変抵抗でやってみた。 [#h07785d4]
**XBee単体 [#md780815]
**可変抵抗でやってみた。 [#h07785d4]

&color(red){※XBeeの抜き差しや配線の変更は必ず電源を切って行うこと。};
*** 1.Funnel008bのダウンロード [#i1a10d10]
http://funnel.googlecode.com/files/funnel-1.0-r806.zip ~

*** 1.Funnel007のダウンロード [#i1a10d10]
http://funnel.googlecode.com/files/funnel_007.zip ~
最新版の008b4では動作しなかった。~
接続はするが後述するサンプルでは値を得られない。謎~

*** 2.ProcessingにFunnelのライブラリをインストールする [#n2e57e4e]
processingはビルド0148(2008-09-11時点の最新安定板)を使用。~
libraries/processing/library~
の~
funnel.jar~
javaosc.jar~
Processingは2.0 Beta 7 (7 December 2012)を使用。~
libraries/processing/funnel~
を~
processing-0098/libraries/funnel/library~
に入れる。(ディレクトリがなければ作成)~
(My document)/Processing/libraries/~
にコピーあるいは移動する。(ディレクトリがなければ作成)~
Processingを起動してSketch>Import Library...>Contributedにfunnelと表示されていればOK

*** 3.X-CTUでXbeeの値を設定する [#f3966afc]
設定に関してほかのパラメータをいじったことがあればrestoreして初期設定に戻す。~
1:1の通信を行う。~
//1:1の通信を行う。~

 コーディネータ(ホスト)側
 ATID 1111 <-PAN(グループ)ID
 ATID 3111 <-PAN(グループ)ID
 ATDH 0000
 ATDL 0002 <-相手のID
 ATMY 0001 <-自分のID
 ATDL 0000 <-相手のID
 ATMY 0000 <-自分のID
 ATBD 6    <-シリアルポートの速度(57600)
 ATAP 2    <-APIモードの設定
 
 エンドデバイス(クライアント)側
 ATID 1111 <-PAN(グループ)ID
 ATID 3111 <-PAN(グループ)ID
 ATDH 0000
 ATDL 0001 <-相手のID
 ATMY 0002 <-自分のID
 ATDL 0000 <-相手のID
 ATMY 0001 <-自分のID
 ATBD 6    <-シリアルポートの速度(57600)
 ATD0 2    <-ピン20をアナログ入力AD0に設定
 ATIT 5    <-ここで指定したサンプル数ごとに送信
 ATIR 64   <-サンプリング間隔(0x64 = 100ms)

&color(red){レスポンスが悪い!と思ったら…};
 エンドデバイス(クライアント)側
 ATIT 1    <-ここで指定したサンプル数ごとに送信
 ATIR 0A   <-サンプリング間隔(0x0A = 10ms)

*** 4.Funnel Serverを設定する [#ub6be0b3]
settings.yamlを次のようにする~
*** 4.Funnelライブラリを設定する [#ub6be0b3]
(My document)/Processing/libraries/funnel/libraryの~
settings.xbee.txtを次のようにする~
 server:
   command port: 9000
   notification port: 9001
   port: 9000
 
 io:
   type: XBee
   com: COM22 <-ここはコーディネータをつなげているCOMポート番号を指定
   baudrate: 9600
   com: COM5 <-ここはコーディネータをつなげているCOMポート番号を指定
   baudrate: 57600 <-ATBDで設定した速度

*** 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 007 (2008-04-21)
 
 I/Oモジュールと接続中です…
 baudrate: 9600
 I/Oモジュールと接続が完了しました:COM22
 FIRMWARE VERSION: 10a5
 SOURCE ADDRESS: 01
 PAN ID: 1111
 コマンドポート:サーバの起動中…
 通知ポート:サーバの起動中…
 通知ポート:サーバが起動しました:9001
 コマンドポート:サーバが起動しました:9000
 NODE: MY=2, SH=13a200, SL=400107f0, dB=59, NI=' '

-チェックポイント
--FIRMWARE VERSIONなどの情報が表示されているか?→されていなければATAPの結果を確認
--エンド・デバイスが表示されているか?→リトライしても表示されなければATIDの結果を確認

*** 8.Processingを起動する [#ca085054]
以下のスケッチを作成。フォントはサンプルのものを流用する。~
*** 7.Processingを起動する [#ca085054]
以下のスケッチを作成。~
#geshi(java){{
 /*
 analog in
 */
  

 import processing.funnel.*;
  

 final int id = 1; // end device ID
 
 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); 

   int[] moduleIDs = {id};
   xbee = new XBee(this, moduleIDs);
 }
  

 void draw()
 {
   background(0);
   text("analogInput[0]: " + xbee.iomodule(2).port(0).value,10,80);  
   text("analogInput[0]: " + xbee.iomodule(id).analogPin(0).value,10,80);  
 }
}}

*** 9.動作確認 [#p35e6827]
-チェックポイント
--FIRMWARE VERSIONなどの情報が表示されているか?→されていなければATAPの結果を確認

*** 8.動作確認 [#p35e6827]
可変抵抗のつまみを回すと、値が0.0から1.0で変わる。ヤフー:-D~
値が震えていたりしたらエンド・デバイスの電源を切って、14番ピンに基準電圧(+3.3V)をとっているか確認すること。~
XBee単体をエンドデバイスにするとどうしても電源レギュレータも用意しないといけないので配線がややこしい。~

**XBee+Fio [#mdc8d463]
**加速度センサ(KXM52-1050モジュール)でやってみた。 [#xd9dbc94]
KXM52-1050モジュール~
http://akizukidenshi.com/catalog/g/gI-01425/~

&color(red){※XBeeの抜き差しや配線の変更は必ず電源を切って行うこと。};

*** 1.Funnel008b4のダウンロード [#i1a10d10]
http://funnel.googlecode.com/files/funnel_008b4.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の値を設定する [#za93f04c]
以下の設定ファイルをX-CTUから読んで設定する。この際、必要に応じてPAN ID(ATID)は変更。
 
 コーディネータ(ホスト)側
 hardware/fio/fio_v1.0/xbee/coordinator.pro
 エンドデバイス(クライアント)側
 hardware/fio/fio_v1.0/xbee/end_device.pro

*** 4.Funnel Serverを設定する [#ub6be0b3]
Funnel008b4を使用する。~
settings.yamlを次のようにする~
 server:
   port: 9000
 
 io:
   type: Fio
   port: COM23 <-ここはコーディネータをつなげているCOMポート番号を指定
   baudrate: 19200

*** 5.回路を組む [#u6d40cfe]

&ref("fio_valicon.JPG");~
(そのうち、ここに回路図をいれる)~

*** 6.XBeeコーディネータ・Fioエンドデバイスとも電源を入れる [#g315301c]
&color(red){※XBeeなどの3.3vで動くモジュールには3.4v以上の電圧を与えないこと!};

*** 7.Funnel Serverを起動する [#v7084a01]
以下のメッセージを確認~
 Funnel 008 (r430) [EXPERIMENTAL]
 
 I/Oモジュールと接続中です…
 baudrate: 19200
 I/Oモジュールと接続が完了しました:COM23
 API MODE: 2
 FIRMWARE VERSION: 10a5
 コマンドポート:サーバの起動中…
 コマンドポート:サーバが起動しました:9000
 SOURCE ADDRESS: 00
 PAN ID: 1111
 NODE: MY=1, SH=13a200, SL=400107f0, dB=42, NI=' '
 Firmata Protocol Vesrion: 2.0

-チェックポイント
--メッセージが出ない場合、baudrateが19200になっているかを確認

*** 8.Processingを起動する [#ca085054]
以下のスケッチを作成。フォントはサンプルのものを流用する。~
 /*
  Fio 
  analog in
 */
 
 import processing.funnel.*;
 
 Fio fio;
 PFont myFont;
 
 void setup()
 {
   size(400,130);
  
   myFont = loadFont("CourierNewPSMT-24.vlw");
   textFont(myFont, 24);
  
   int[] moduleIDs = {1};
  
   fio = new Fio(this,moduleIDs,Fio.FIRMATA);
 }
 
 void draw()
 {
   background(0);
   text("analogInput[0]: " + fio.iomodule(1).port(14).value,10,80);
 }

*** 9.動作確認 [#hee53ed6]
可変抵抗のつまみを回すと、値が0.0から1.0で変わる。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
 ATID 3111 <-PAN(グループ)ID
 ATDH 0000
 ATDL 0001 <-相手のID
 ATMY 0002 <-自分のID
 ATDL 0000 <-相手のID
 ATMY 0001 <-自分の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に設定
 ATD1 2    <-ピン19をアナログ入力AD1に設定
 ATD2 2    <-ピン18をアナログ入力AD2に設定

*** 2.回路を組む [#uf6b40bf]
&ref("IMG_4010.JPG");~
XBee単体でやってみた。~
以前に比べて3.3vレギュレータと電源スイッチそして配線を整理してある。~
(そのうちここに回路図を入れる)
~
*** 3.XBeeコーディネータ・エンドデバイスとも電源を入れる [#g315301c]
*** 2.回路を組む [#db0a0147]
回路図~
&ref("xio_kxm52.png",zoom,320x240);~
pdfはこちら。&ref("xio_kxm52.pdf");~
eagleスケマティックはこちら。&ref("xio_kxm52.sch");~

*** 3.XBeeコーディネータ・エンドデバイスとも電源を入れる [#s2956941]
&color(red){※XBeeなどの3.3vで動くモジュールには3.4v以上の電圧を与えないこと!};
~
*** 4.Funnel Serverを起動する [#v7084a01]
~
*** 5.Processingを起動する [#ca085054]
以下のスケッチを作成。フォントはサンプルのものを流用する。~
 /**

*** 4.Processingを起動する [#ca085054]
以下のスケッチを作成。~
#geshi(java){{
/**
  * SimpleScope XBee
  */
 

 import processing.funnel.*;
 
 final int kChannles = 5;  // the number of channels to display

 final int kChannles = 3;  // the number of channels to display
 final int kPoints = 200;  // the number of points to display
 final int id = 2; // end device ID
 
 final int id = 1; // end device ID

 XBee xbee;
 PFont fixedWidthFont;
 float values[][];
 int index = 0;
 

 void setup()
 {
   size(400, 700);
   size(400, 400);
   frameRate(30);
 
   fixedWidthFont = loadFont("CourierNewPSMT-12.vlw");
 

   int[] moduleIDs = {id};
   xbee = new XBee(this, moduleIDs);
   
   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 ++) {

   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;
 
     text("val: " + xbee.iomodule(id).pin(channel).value, kLeft + kPoints + 8, kTop + 8 + offset);
     text("max: " + xbee.iomodule(id).pin(channel).maximum, kLeft + kPoints + 8, kTop + 20 + offset);
     text("min: " + xbee.iomodule(id).pin(channel).minimum, kLeft + kPoints + 8, kTop + 32 + offset);
     text("avg: " + xbee.iomodule(id).pin(channel).average, kLeft + kPoints + 8, kTop + 44 + offset);

     values[channel][index] = xbee.iomodule(id).pin(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
で、動作を確認してみた。
~
~
つづきはこれから書く。つぎはカルマンフィルタ!?
-方位角の出し方。
これどう?
http://www.jae.co.jp/gihou/pdf28/g_12.pdf
//**ジャイロでやってみた。 [#xd9dbc94]
//IMU 5 DOFモジュール~
//http://www.sparkfun.com/commerce/product_info.php?products_id=741 ~
//~
//*** 1.X-CTUにてエンドデバイスのXBeeの設定をかえる。 [#y8ceed4c]
// ATID 3111 <-PAN(グループ)ID
// ATDH 0000
// ATDL 0000 <-相手のID
// ATMY 0001 <-自分の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単体でやってみた。~
//回路図~
//&ref("xio_imu5dof.jpg");~
//大きなファイルはこちら。&ref("xio_imu5dof.bmp");~
//~
//*** 3.XBeeコーディネータ・エンドデバイスとも電源を入れる [#g315301c]
//&color(red){※XBeeなどの3.3vで動くモジュールには3.4v以上の電圧を与えないこと!};
//~
//*** 4.Processingを起動する [#ca085054]
//以下のスケッチを作成。フォントはサンプルのものを流用する。~
//#geshi(java){{
//}}
//~
//*** 6.動作確認 [#hee53ed6]
//ブレッドボードを大きく動かす(ここがポイント)と、それぞの値が変わる。実際に角//度を出す時は得られた値を積分する(足し合わせる)ため、小さく動かしても値の変化//はそれほどない。だから向きを変えたから値が変わるということではない。今回の場合は
// 0 -> x-accel
// 1 -> y-accel
// 2 -> z-accel
// 3 -> x-rate
// 4 -> y-rate
//で、動作を確認してみた。
//~

}}


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS