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.
