wiiリモコンとmbedをBluetoothで接続し、ツインモーターを制御

GIGAZINEさんの記事にあった「Wiiリモコンで操作する壁ロボット「うおーるぼっとNeo」に触発されてやってみた。


mbed自体はブラウザでコードが書けるマイコンの認識しかなかったので、「Bluetooth繋がるんだ。へぇ〜」は結構衝撃的。

導入から実際に動かすところまでをまとめます。(備忘録を兼ねて)

11/08 mbedと☆Board Orandgeを注文。(11/08〜11/12は前のブログ参考)
11/09 mbed到着。早速Hellow worldをして使い方覚える。
11/11 ☆Orange Board到着。LANからIP取得して、LCDディスプレイにIP表示
11/12 WiiリモコンとBluetoothとの接続ログ確認

11/13 昼から日本橋にモータードライバー、ツインモーターを買いにいく。
   建築発明工作ゼミ2008を参考にTA7291Pの正転逆転テストを行った
11/16 Amazonさんからパーツが届いたので組上げる
11/17 はんだづけ片面完了
   ☆Board Orangeへの接続は、以下を参考にした。
   StarBoard Orange 専用拡張基板:RC サーボインターフェース基板
   RCサーボインターフェース基板:別名「くまちゃんサーボキット」
11/18 はんだづけ完了、☆BoardOrangeのピン配列を変更し、動作テストプログラム実行

Motordriverのライブラリを利用。下記はページに記載のコードを一部修正した内容。動作は上記動画参考

#include "motordriver.h"
Motor m(p25, p27, p28, 1); // pwm, fwd, rev, can brake
Motor m2(p26, p29, p30, 1);

int main(){
    for(float s= -1.0; s < 1.0; s += 0.01){
        m.speed(s);
        m2.speed(s);
        wait(0.02);
    }
    m.stop();
    m2.stop();
    wait(1);
    m.coast();
    m2.coast();
}

11/19 Bluetoothでの操作テスト

11/20 操作周りの改修を行った。

実際にはBlueUSBのTestShell.cppのコードを一部改修しただけ。
以下に変更したコードを記載。
TestShell.cppの34行目に追加

#include "motordriver.h"
Motor A(p25, p27, p28, 1); // pwm, fwd, rev, can brake
Motor B(p26, p29, p30, 1);
float a_speed = 0;
float b_speed = 0;
int rooll = 1;

同じくTestShell.cppの 134行目の「printf("WII %04X %d %d %d\n",pad,x,y,z);」の下に追加
操作方法は、十字キーで操作し「A」で停止

                    // http://www.nintendo.co.jp/wii/q_and_a/093.html
                    int button_up    = (pad & 8);
                    int button_down  = (pad & 4);
                    int button_right = (pad & 1);
                    int button_left  = (pad & 2);
                   
                    //int button_plus  = (pad & 16);
                    //int button_2     = (pad & 256);
                    //int button_1     = (pad & 512);
                    //int button_B     = (pad & 1024);
                    int button_A     = (pad & 2048);
                    //int button_minus = (pad & 4096);
                    
                    if (button_down && button_left){
                        a_speed = 0.5;
                        b_speed = 0.1;
                        rooll = 1;
                    } else if (button_down && button_right){
                        a_speed = 0.1;
                        b_speed = 0.5;
                        rooll = 1;
                    } else if (button_up && button_left){
                        a_speed = -0.5;
                        b_speed = -0.1;
                        rooll = 2;
                    } else if (button_up && button_right){
                        a_speed = -0.1;
                        b_speed = -0.5;
                        rooll = 2;
                    } else if(button_down){
                        a_speed = 0.5;
                        b_speed = 0.5;
                        rooll = 1;
                    } else if (button_up){
                        a_speed = -0.5;
                        b_speed = -0.5;
                        rooll = 2;
                    } else if (button_left){
                        if (rooll == 1){
                            b_speed = -0.5;
                            a_speed = 0.5;
                        } else {
                            b_speed = 0.5;
                            a_speed = -0.5;
                        }
                    } else if (button_right){
                        if (rooll == 1){
                            a_speed = -0.5;
                            b_speed = 0.5;
                        } else {
                            a_speed = 0.5;
                            b_speed = -0.5;
                        }
                    }
                    if (button_A){
                        A.speed(0);
                        B.speed(0);
                    }
                    if (button_up || button_down || button_right || button_left){
                        A.speed(a_speed);
                        B.speed(b_speed);
                    }

動画はXperia(Android 2.1)で撮影。結構綺麗にとれるんですね。