GSBee + Geta XBee + サーボモータ制御
菅工房さんやgalileo 7で購入できる、Wifiモジュール GSBeeと、mbedとXBeeを簡単に繋げられるGeta XBeeを使用して、Wifi経由でサーボモータを制御してみた。
1.Geta XBee
Geta XBeeは、TX p9, RX p10, CTS 無, RTS 無, RESET p21として、配線しています。また、RESETにつながるR5の抵抗のみ使用し、TX, RXは、そのままジャンパしている。
2.Wifiモジュール
Wifiモジュールに関しては、菅工房さんの低消費電流 Wi-FiモジュールやMoo SoftさんのGainSpan WI-FI モジュールが、とても参考になる。
また、mbedのライブラリに関しては、下記に情報がある。
まず、GSBeeをPCにつないで簡単に動作確認するためには、下記のような製品が必要。また、互換品もある。
XBeeエクスプローラUSBドングル XBeeエクスプローラUSB
動作確認のためにMoo SoftさんのGainSpan ユーティリティページにあるGainSpan.zipをダウンロードし、設定して実行を行った。
モジュールは、初期の通信速度は9600bpsとなっており、ユーティリティを使用し、下記のコマンドで通信速度を変更できる。
通信速度変更コマンド
ATB=115200
まず、第一に、下のプログラムを動作させた。
Import programGSwifiInterface_HelloWorld
GSwifiInterface (interface for GainSpan Wi-Fi GS1011 modules) see https://mbed.org/users/gsfan/notebook/GSwifiInterface/
Import libraryGSwifiInterface
GSwifiInterface library (interface for GainSpan Wi-Fi GS1011 modules) Please see https://mbed.org/users/gsfan/notebook/GSwifiInterface/
こちらのサンプルの通信速度設定は、9600bpsとなっているので、注意が必要。 下記のように修正することにより、通信速度の変更ができる。
/GSwifiInterface/GSwifi/GSwifi.h40行目あたり
#define CFG_DATA_SIZE 1000 //#define CFG_UART_BAUD 9600 #define CFG_UART_BAUD 115200 #define CFG_WREGDOMAIN "2" // 0:FCC, 1:ETSI, 2:TELEC
また、Wifiモジュールの動作を追うために、DEBUGログやINFOログの出し方は以下の通り。 下記を修正することにより、該当ログが出力されるようになる。
/GSwifiInterface/GSwifi/GSwifi.h45行目から60行目あたり
//Debug is disabled by default //#if (0 && !defined(TARGET_LPC11U24)) #if (1 && !defined(TARGET_LPC11U24)) #define DBG(x, ...) std::printf("[GSwifi : DBG]" x "\r\n", ##__VA_ARGS__); #define WARN(x, ...) std::printf("[GSwifi : WARN]" x "\r\n", ##__VA_ARGS__); #define ERR(x, ...) std::printf("[GSwifi : ERR]" x "\r\n", ##__VA_ARGS__); #else #define DBG(x, ...) #define WARN(x, ...) #define ERR(x, ...) #endif //#if (0 && !defined(TARGET_LPC11U24)) #if (1 && !defined(TARGET_LPC11U24)) #define INFO(x, ...) printf("[GSwifi : INFO]\r\n"x"\r\n", ##__VA_ARGS__); #else #define INFO(x, ...) #endif
★★★今回、Wifiのアクセスポイントに接続できない状態に陥り、菅工房の菅さんに上記の修正やデバッグ方法等、色々とアドバイス頂きました。ありがとうございました。★★★
2013/2/6現在、ファームウェアの更新を行おうと思い、GainSpan社のサイトに登録したのですが、ログインできない状態です。
2.サーボモータを制御するプログラム
ネットワーク経由でサーボモータを制御するプログラムは、以下のサイトを参考にさせて頂いた。
Robot No.8080のブログ: RCサーボモータをmbed+LAN+ProcessingでGUI制御(その1) 【mbed編】
Robot No.8080のブログ: RCサーボモータをmbed+LAN+ProcessingでGUI制御(その2) 【Processing編】
2-1.Processing用コード
Wifiを介してPCからサーボモータを制御しますが、その際Processingおよび、controlP5ライブラリを使用している。
参考サイトのプログラムは、3つのサーボモータ制御用だったので、2つのみ制御するよう、削除及び修正を行った。
/* * Servo Controler */ import controlP5.*; import processing.net.*; ControlP5 controlP5; Client myClient; int[] cmd1 = {255,0,4,0,128,128}; boolean init = false; void setup() { size(200,290); Textlabel title; controlP5 = new ControlP5(this); title = controlP5.addTextlabel("title", "Servo Controller",10,10); title.setHeight(30); title.setWidth(400); title.setFont(ControlP5.synt24); // create sliders for (int i = 0 ; i < 2 ; i++ ) { // add a vertical slider controlP5.addSlider("servo" + i, 0, 255, 90, (50 + i * 80), 60, 10, 181); Slider ss = (Slider)controlP5.controller("servo" + i); ss.setNumberOfTickMarks(7); ss.setSliderMode(Slider.FLEXIBLE); ss.snapToTickMarks(false); ss.setValue(128); } myClient = new Client(this, "192.168.1.17", 10002); init = true; } void draw() { background(100); } void servoCmd(int[] data) { if(!init) return; for(int i = 0; i < data.length; i++) { myClient.write((byte)data[i]); } } void servo0(int value) { cmd1[4] = value; servoCmd(cmd1); } void servo1(int value) { cmd1[5] = value; servoCmd(cmd1); }
有線で動作させた場合は次のようになります。
2-2.mbed用コード
無線化するにあたり、GSwifiInterfaceライブラリがEthernetInterfaceライブラリと使い方が互換とのことだったので、下記を参考にした。
但し、私の環境では、モジュールに固定IPを振る際に、うまく動作しなかった。 Wifiモジュールのプロファイルに設定してある、固定IPが呼び出されてしまう。
この現象は、XBeeエクスプローラUSBドングルを使用した際にも起きていたので、モジュールのファームウェアのバグかもしれない。
main.cpp
gs.init("192,168,1,17", "255,255,255,0", "192,168,1,254");
動作したプログラムはこちら。
Import programGSwifiInterface_HelloServo
Servo controll with gainspan GS1011M wifi module
成功した動画。PCからProcessingで作ったインタフェースを使って、操作している。
Please log in to post comments.