実際のプログラミングの手順について説明します。ここでは作例として2輪駆動のロボットを想定し、2個のDCモータをPCからWi-Fi経由で制御するしくみを作ります。
Locomoに電池スナップとモータのコードをつなぎます。ターミナルブロックのオレンジ色のつまみを押しこんだ状態でコードを挿しこむと固定されます。 電池スナップは赤の線を+に、黒の線を-につないでください。XBee Wi-FiはXBee端子にとりつけます。モジュールの向きに注意し、XBeeのすべてのピンが端子にはまるように挿してください。
PCとの接続はUSBケーブルで行います。LocomoとPCに繋ぐとUSBシリアルポートとして認識されます。WindowsはVista以降であれば、PCに接続したタイミングでドライバが自動的にインストールされます。 Macの場合やドライバが自動的にインストールされない場合は、FTDIのドライバダウンロードページからVCP(Virtual COM port)ドライバをダウンロードして手動インストールしてください。
LocomoではArduino IDEを使ってプログラミングを行います。プログラミングをはじめる前に以下の設定を行ってください。
以下はシリアル通信で左右輪のモータを制御するArduinoのコードです。そのままArduino IDEにコピー&ペーストしてLocomoに書きこんでください。
static int FWD_L = 2; // 左モータのFWDピン
static int REV_L = 4; // 左モータのREVピン
static int PWM_L = 3; // 左モータのPWMピン
static int FWD_R = 5; // 右モータのFWDピン
static int REV_R = 7; // 右モータのFEVピン
static int PWM_R = 6; // 右モータのPWMピン
int speed_L = 0; // 左モータの回転速度(0~255)
int speed_R = 0; // 左モータの回転速度(0~255)
void setup() {
// 通信速度の設定
Serial.begin(9600);
// モータの制御ピンを出力に設定
pinMode( FWD_L, OUTPUT );
pinMode( REV_L, OUTPUT );
pinMode( PWM_L, OUTPUT );
pinMode( FWD_R, OUTPUT );
pinMode( REV_R, OUTPUT );
pinMode( PWM_R, OUTPUT );
}
void loop() {
// 特に何もしない
}
// 通信イベント
void serialEvent() {
if ( Serial.available() > 0 ) {
int key = Serial.read();
// LまたはRの後に続く数値を取得
if (key=='L') { speed_L = readIntValue(); }
if (key=='R') { speed_R = readIntValue(); }
// 回転速度の設定
analogWrite( PWM_L, abs(speed_L) );
analogWrite( PWM_R, abs(speed_R) );
// モータの回転制御
if ( speed_L == 0 ) { motor_stop( FWD_L, REV_L ); }
else if ( speed_L > 0 ) { motor_forward( FWD_L, REV_L ); }
else if ( speed_L < 0 ) { motor_reverse( FWD_L, REV_L ); }
if ( speed_R == 0 ) { motor_stop( FWD_R, REV_R ); }
else if ( speed_R > 0 ) { motor_forward( FWD_R, REV_R ); }
else if ( speed_R < 0 ) { motor_reverse( FWD_R, REV_R ); }
}
}
// モータの正転
void motor_forward( int pin_fwd, int pin_rev ) {
digitalWrite( pin_fwd, HIGH );
digitalWrite( pin_rev, LOW );
}
// モータの逆転
void motor_reverse( int pin_fwd, int pin_rev ) {
digitalWrite( pin_fwd, LOW );
digitalWrite( pin_rev, HIGH );
}
// モータの停止
void motor_stop( int pin_fwd, int pin_rev ) {
digitalWrite( pin_fwd, HIGH );
digitalWrite( pin_rev, HIGH );
}
// 数値を読み込む関数
int readIntValue() {
int i = 0;
char string[10];
while ( i < sizeof(string) ) {
if ( Serial.available() ) {
char c = Serial.read();
if ( (c>='0' && c<='9') || c=='-' ) {
string[i] = c;
i++;
} else {
string[i] = '\0';
break;
}
}
}
return atoi(string);
}
このプログラムではシリアル通信によって各モータの回転方向と速度を指定できるようになっています。例えばL100 R-100という文字列を受信すると、左モータを速度100で正転、右モータを速度100で逆転させます。LとRがそれぞれ左右のモータを意味しており、後に続く数値が速度です。数値が負のときに逆転になります。
プログラムをLocomoに書きこんだら動作確認してみましょう。LocomoではXBeeモジュールを挿した状態でUSB経由でのシリアル通信が可能です。 無線通信では何かと接続上のトラブルがつきものですので、XBeeでやる前にUSB経由でテストするのがおすすめです。
Locomoの電源スイッチをONにしてArduino IDEのシリアルモニタを立ち上げたら、L100 R100とかL-100 R-100のように文字列を送ってみてください。モータが意図通り回転したらOKです。モータが想定とは逆方向に回転するようであれば、DCモータ端子に接続しているコードを入れ替えてみてください。
次はXBee Wi-Fiによる無線通信をやってみましょう。まず、XBee Wi-Fiの設定を行うためにLocomoをXBeeエクスプローラモードにします。いったんUSBケーブルを外し、電源スイッチをOFFにした状態でモード切り替えスイッチを3つとも下側にスライドしてください。
XBeeの設定にはXCTUというソフトを使います。リンク先で「Diagnostics, Utilities and MIBs」をクリックし、その中にある「Next Generation XCTU」をダウンロードし、インストールしてください。Windows版とMac版があります。
LocomoとPCをUSBケーブルでつなぎ、XCTUを起動をします。画面左上のアイコンをクリックすると「Add radio device」というウィンドウが出ますので、ポート一覧でLocomoのシリアルポートが選択されているのを確認し、「Finish」をクリックしてください。 XBeeモジュールが検出されると画面左に追加されます。
左側でモジュールを選択すると右側に設定項目が表示されます。 XBee Wi-Fiの場合は以下の項目を設定してください。
| 設定項目 | パラメータ |
| AH Network type | Infrastructure |
| ID SSID | アクセスポイントのSSIDを入力 |
| IP IP Protocol | TCP |
| MA IP Addressing Mode | アクセスポイントに合わせてDHCP(自動IP割り当て)かStatic(固定IP)を選択 |
| EE Encryption Enable | アクセスポイントの暗号化方式を選択 |
| PK Passphrase | アクセスポイントのパスワードを入力 |
| C0 Source Port | 2616 ポート番号は16進数で設定します。2616は10進数で9750(XBee Wi-Fiのデフォルトポート) |
パラメータを変更後、鉛筆アイコンをクリックすると設定がXBeeに書き込まれます。きちんと無線LANに接続できていれば、Locomoのボード上にあるASSOCのLEDがチカチカ点滅します。XBeeに割り当てられたIPアドレスは先ほどの設定一覧の中にある「MY Module IP Address」という項目で確認することができます。
XBee Wi-Fiの設定が終わったら、いったんUSBケーブルを外し、電源スイッチをOFFにした状態でモード切り替えスイッチを3つとも上側にスライドして通常モードに戻してください。
XBee Wi-Fiに割り当てられたIPアドレスを確認したらTelnetで接続できるかチェックしてみましょう。
定番ターミナルソフトのTeraTermを使います。TeraTermを起動したら「File」→「New Connection」を選択します。接続ダイアログが出たら「TCP/IP」にチェックを入れ、以下のように設定してください。「OK」を押すと接続されます。
「ターミナル」を起動し、以下のようにコマンドを入力するとXBee Wi-Fiに接続できます。
telnet XBee Wi-FiのIPアドレス 9750
接続できたら先ほどと同様に制御コマンド(例えばL100 R100)を入力してモータが動くか確認してください。
Wi-Fi接続が動作するのを確認できたら、今度はWi-Fi経由でLocomoをコントロールするホスト側プログラムを作ってみましょう。 ホスト側プログラムはTCPによるソケット通信ができる言語であれば、C++やJava、Processingなどなんでも良いです。 ここではProcessingでの作例を紹介します。
キーボード操作でLocomoを無線制御するProcessingのプログラムを以下に示します(接続先IPアドレスは自分の環境に合わせて変更してください)。キー入力を行うとモータを制御する文字列が送信されます。キーを押している間モータが回転し、キーを離すとモータが停止します。
import processing.net.*;
Client client;
int speed_L = 0;
int speed_R = 0;
void setup() {
// Locomoに接続
client = new Client(this, "192.168.100.102", 9750); // IPアドレスは自分の環境に合わせて変更してください。
}
void draw() {
// 特に何もしない
}
// キーが押された時の処理(モータ回転)
void keyPressed() {
if ( keyCode==UP ) {
speed_L = 255;
speed_R = 255;
}
if ( keyCode==DOWN ) {
speed_L = -255;
speed_R = -255;
}
if ( keyCode==LEFT ) {
speed_L = -255;
speed_R = 255;
}
if ( keyCode==RIGHT ) {
speed_L = 255;
speed_R = -255;
}
client.write("L" + speed_L + " R" + speed_R + "\r");
}
// キーが離された時の処理(モータ停止)
void keyReleased() {
speed_L = 0;
speed_R = 0;
client.write("L" + speed_L + " R" + speed_R + "\r");
}
説明は以上です。ここで紹介したものはPCから操作するものでしたが、スマートフォンのアプリを作る場合でも基本は同じです。 Processingであれば、上で紹介したプログラムをベースにAndroidで動作するものも作れます。 以下のページにProessing、Java、Pythonによる通信プログラムのサンプルを用意しました。こちらも参考にしてください。