実際のプログラミングの手順について説明します。ここでは作例として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による通信プログラムのサンプルを用意しました。こちらも参考にしてください。