EsploraでRapiroを動かしてみた。

投稿者:

RapiroArduino Esploraを使って動かしてみました。

RapiroRaspberry Piを搭載すればより高度な事ができますが、Raspberry Piを使わなくても簡単に動かすことができます。

s-IMGP1536

 

Rapiro内部に搭載されたサーボコントロール基板に簡単なシリアルコマンドを送信すると、あらかじめ登録されたモーションデータに沿ってアクションをおこします。使用できるモーションコマンドは次の通りです。

#M0 停止
#M1 前進
#M2 後退
#M3 左旋回
#M4 右旋回
#M5 両手を左右に振る
#M6 右手を振る
#M7 両手を縦に振る
#M8 左手を振る
#M9 右手でパンチ

それではArduino EsploraからRapiroに上記のコマンドを送信できるようにしてみます。まずはRapiroとEsploraを有線接続します。今回はEsploraのオレンジ色のコネクタ、OUT-A(デジタル3番)からソフトウェアシリアルを使ってRapiroに命令を送りました。ビット・レートは57600です。

s-ESPLORA1

Rapiro側には本来Raspberry Piとつなげるためのケーブルが出ているので、ここにArduino Esploraのケーブルを接続します。この時にピンの配列をよく確認して間違ったところにつなげないように気をつけましょう。

RAPIRO              Esplora
5V        ====      5V
NC
GND       ====     GND
RXD     ====     TXD
TXD
DTR

s-ESPLORA2

これで準備は終了です。EsploraにRapiro操作用のスケッチを書き込んで、Rapiroの電源を入れればEsploraのジョイスティックと4つのボタンで操作することができます。最後にEsploraに書き込んだスケッチを紹介します。

#include <Esplora.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(11,3);    //OUT-A D3をソフトウェアシリアルTXに

int actionNum = 0;                //直前に実行しているアクション番号

void setup()
{
    mySerial.begin(57600);    //ソフトウェアシリアル通信開始
    mySerial.print("#M0");    //停止コマンド送信
    actionNum = 0;            //アクション番号初期化(停止)
}

void loop()
{
    int xValue = Esplora.readJoystickX();                    //ジョイスティック左右方向の値  
    int yValue = Esplora.readJoystickY();                    //ジョイスティック上下方向の値
    int jButton = Esplora.readJoystickSwitch();              //ジョイスティックの押し込みボタン
    int uButton = Esplora.readButton(SWITCH_UP);        //上ボタンの値
    int dButton = Esplora.readButton(SWITCH_DOWN);      //下ボタンの値
    int rButton = Esplora.readButton(SWITCH_RIGHT);     //右ボタンの値
    int lButton = Esplora.readButton(SWITCH_LEFT);      //左ボタンの値
        
    if(xValue > 200 && yValue <= 200 && yValue >= -200){    //ジョイスティックが左に倒されていたら
        if(actionNum != 3){          //直前の動作が左旋回でなければ
            mySerial.println("#M3"); //左旋回命令
            actionNum = 3;
        }
    }
    else if(xValue < -200 && yValue <= 200 && yValue >= -200){  //ジョイスティックが右に倒されていたら
       if(actionNum != 4){           //直前の動作が右旋回でなければ
            mySerial.println("#M4"); //右旋回命令
            actionNum = 4;
        }
    }
    else if(yValue > 200 && xValue <= 200 && xValue >= -200){    //ジョイスティックが下に倒れていたら
        if(actionNum != 2){          //直前の動作が後退でなければ
            mySerial.println("#M2"); //後退命令
            actionNum = 2;
        }  
    }
    else if(yValue < -200 && xValue <= 200 && xValue >= -200){    //ジョイスティックが上に倒れていたら
        if(actionNum != 1){          //直前の動作が前進でなければ
            mySerial.println("#M1"); //前進命令
            actionNum = 1;
        }
    }
    else if(xValue <= 200 && xValue >= -200 && yValue <= 200 && yValue >= -200){  //ジョイスティックが中央なら
        if(actionNum != 0 && actionNum < 5){ //直前の動作が停止でなく、移動モーションのどれかであれば
            mySerial.println("#M0"); //停止命令
            actionNum = 0;
        }  
    }
    
    if(uButton == 0){            //上ボタンが押されたら
        if(actionNum != 5){          //直前の動作が5番でなければ
            mySerial.println("#M5"); //両手を左右に振る命令
            actionNum = 5;
        }  
    }
    if(dButton == 0){            //下ボタンが押されたら
        if(actionNum != 7){          //直前の動作が7番でなければ
            mySerial.println("#M7"); //両手を上下に振る命令
            actionNum = 7;
        }  
    }
    if(rButton == 0){            //右ボタンが押されたら
        if(actionNum != 6){          //直前の動作が6番でなければ
            mySerial.println("#M6"); //右手を振る命令
            actionNum = 6;
        }  
    }
    if(lButton == 0){            //左ボタンが押されたら
        if(actionNum != 8){          //直前の動作が8番でなければ
            mySerial.println("#M8"); //左手を振る命令
            actionNum = 8;
        }  
    }
    if(jButton == 0){            //ジョイスティックを押し込んだら
        if(actionNum != 0){          //直前の動作が停止でなければ
            mySerial.println("#M0"); //停止命令
            actionNum = 0;
        } 
    }
}