Locomo

Robot Prototyping Board


LocomoはArduino互換のロボットプロトタイピングボードです。 モータ制御、センシング、無線通信を行う回路を手軽に作れます。

Buy Now

hero

プログラミング・チュートリアル



実際のプログラミングの手順について説明します。ここでは作例として2輪駆動のロボットを想定し、2個のDCモータをPCからWi-Fi経由で制御するしくみを作ります。


準備するもの


1. パーツをLocomoにつなぐ

Locomoに電池スナップとモータのコードをつなぎます。ターミナルブロックのオレンジ色のつまみを押しこんだ状態でコードを挿しこむと固定されます。 電池スナップは赤の線を+に、黒の線を-につないでください。XBee Wi-FiはXBee端子にとりつけます。モジュールの向きに注意し、XBeeのすべてのピンが端子にはまるように挿してください。


2. PCとUSB接続する

PCとの接続はUSBケーブルで行います。LocomoとPCに繋ぐとUSBシリアルポートとして認識されます。WindowsはVista以降であれば、PCに接続したタイミングでドライバが自動的にインストールされます。 Macの場合やドライバが自動的にインストールされない場合は、FTDIのドライバダウンロードページからVCP(Virtual COM port)ドライバをダウンロードして手動インストールしてください。


3. プログラミングの準備

LocomoではArduino IDEを使ってプログラミングを行います。プログラミングをはじめる前に以下の設定を行ってください。



4. モータを制御するプログラムを書きこむ

以下はシリアル通信で左右輪のモータを制御する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がそれぞれ左右のモータを意味しており、後に続く数値が速度です。数値が負のときに逆転になります。


5. USB接続した状態で動作確認する

プログラムをLocomoに書きこんだら動作確認してみましょう。LocomoではXBeeモジュールを挿した状態でUSB経由でのシリアル通信が可能です。 無線通信では何かと接続上のトラブルがつきものですので、XBeeでやる前にUSB経由でテストするのがおすすめです。

Locomoの電源スイッチをONにしてArduino IDEのシリアルモニタを立ち上げたら、L100 R100とかL-100 R-100のように文字列を送ってみてください。モータが意図通り回転したらOKです。モータが想定とは逆方向に回転するようであれば、DCモータ端子に接続しているコードを入れ替えてみてください。


6. XBee Wi-Fiの通信設定をする

次は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 typeInfrastructure
ID SSIDアクセスポイントのSSIDを入力
IP IP ProtocolTCP
MA IP Addressing Modeアクセスポイントに合わせてDHCP(自動IP割り当て)かStatic(固定IP)を選択
EE Encryption Enableアクセスポイントの暗号化方式を選択
PK Passphraseアクセスポイントのパスワードを入力
C0 Source Port2616
ポート番号は16進数で設定します。2616は10進数で9750(XBee Wi-Fiのデフォルトポート)


パラメータを変更後、鉛筆アイコンをクリックすると設定がXBeeに書き込まれます。きちんと無線LANに接続できていれば、Locomoのボード上にあるASSOCのLEDがチカチカ点滅します。XBeeに割り当てられたIPアドレスは先ほどの設定一覧の中にある「MY Module IP Address」という項目で確認することができます。

XBee Wi-Fiの設定が終わったら、いったんUSBケーブルを外し、電源スイッチをOFFにした状態でモード切り替えスイッチを3つとも上側にスライドして通常モードに戻してください。



7. Wi-Fiの通信テストをする

XBee Wi-Fiに割り当てられたIPアドレスを確認したらTelnetで接続できるかチェックしてみましょう。


Windowsの場合

定番ターミナルソフトのTeraTermを使います。TeraTermを起動したら「File」→「New Connection」を選択します。接続ダイアログが出たら「TCP/IP」にチェックを入れ、以下のように設定してください。「OK」を押すと接続されます。


Macの場合

「ターミナル」を起動し、以下のようにコマンドを入力するとXBee Wi-Fiに接続できます。
telnet XBee Wi-FiのIPアドレス 9750


接続できたら先ほどと同様に制御コマンド(例えばL100 R100)を入力してモータが動くか確認してください。


8. PCで動作するホスト側プログラムを作る

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による通信プログラムのサンプルを用意しました。こちらも参考にしてください。