お習字ロボットアームのArduinoスケッチ

精度アップ
【ソース】
http://licheng.sakura.ne.jp/roboarm/RoboArm_Arduino.zip


お習字ロボットアーム、サーボの制御を Servo::write(角度[deg]) から Servo::writeMicroseconds(パルス幅[us])に変更して精度がアップ。まだ、角度補正のチューニングが必要だけど、いったんソースをうpして簡単に解説する。


ArduinoAndroidの接続はmicrobridgeを用いる。microbridgeは、ADB(Android Debug Bridge)を利用して、AndroidをUSBデバイスとしてArduinoのUSBホストシールドに接続するものであり、TCP over USBにより、Android側は単なるソケット通信となる。下記URLから MicroBridge-Arduino.zip をダウンロードして、解凍したフォルダをAdbとして、Arduino/Librariesフォルダに置く。お習字ロボのスケッチはmicrobridgeのサンプルのDemoをベースに作った。このサンプルは、File>Examples>Adb>Demo で開くことができる。ちなみにUSBホストシールドは、電源系が明らかに設計ミスなので3端子レギュレータは外して5Vを直結すべきだ。
midrobridge: http://code.google.com/p/microbridge/
USBホストシールド: http://www.switch-science.com/products/detail.php?product_id=438


ソースのほうだが、冒頭で4個のサーボを制御するためにServoクラスの配列を定義する。


// ラジコンサーボ 4自由度
// [0]肩ヨー軸 [1]肩ピッチ軸 [2]肘ピッチ軸 [3]手首ピッチ軸
Servo servos[4];


初期化では、まず各サーボの制御パルスのピンを設定し、初期位置の角度を指令する。

// サーボのピン設定
// HiTEC HSR-8498HBは、0deg:600us 90deg:1500us 180deg:2400us
servos[0].attach(6,600,2400); // Digital6:肩ヨー軸
servos[1].attach(5,600,2400); // Digital5:肩ピッチ軸
servos[2].attach(4,600,2400); // Digital4:肘ピッチ軸
servos[3].attach(3,600,2400); // Digital3:手首ピッチ軸
// サーボの角度初期値
servos[0].write(SERVO_CORRECT0(90));
servos[1].write(SERVO_CORRECT1(90));
servos[2].write(SERVO_CORRECT2(90));
servos[3].write(SERVO_CORRECT3(90));
Servo::writeメソッドは引数を度単位で指定(0〜180)、いっぽうServo::writeMicrosecondsメソッドは引数をマイクロ秒単位で指定する。今回使用するHSR-8498HBというサーボの場合は、600usで0度、1500usで90度、2400usで180度である。
【参考】 Arduino日本語リファレンス: http://www.musashinodenpa.com/arduino/ref/


続いて、Androidとの接続を設定。

// ADBの初期化
ADB::init();
// ADB接続を開く
// TCPのポート4567、自動再接続有効、イベントハンドラの登録
connection = ADB::addConnection("tcp:4567", true, adbEventHandler);


メインループではADBをポーリングするのみ。

// ADBのポーリング
ADB::poll();


Androidからメッセージの受信があったときは、adbEventHandler関数がコールバックされ、ここでメッセージを処理する。1バイトめが0x5Aのときは、Servo::writeメソッドを使用するコマンドで、下記のフォーマットとした。

1バイトめ:0x5A
2バイトめ:肩ヨー軸サーボの角度(0〜180度)
3バイトめ:肩ピッチ軸サーボの角度(0〜180度)
4バイトめ:肘ピッチ軸サーボの角度(0〜180度)
5バイトめ:手首ピッチ軸サーボの角度(0〜180度)

また1バイトめが0x55のときは、Servo::writeMicrosecondsメソッドを使用するコマンドで、下記のフォーマットとした。

1バイトめ:0x5A
2-3バイトめ:肩ヨー軸サーボのパルス幅(600〜2400us)
4-5バイトめ:肩ピッチ軸サーボのパルス幅(600〜2400us)
6-7バイトめ:肘ピッチ軸サーボのパルス幅(600〜2400us)
8-9バイトめ:手首ピッチ軸サーボのパルス幅(600〜2400us)



Android側のアプリはまた後日解説する。