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); }