はじめに
先週SG90サーボモータに換装し復旧した ArduiroidOne 二号機ですが、モーションを作るのにソフトウェアを少し改良しました。
絶対値指定と相対値指定
各サーボモータの指定方法は絶対値指定(0~180°)でしたが、ポジション配列は相対値(中心のオフセットと回転の方向を揃えた-90~90°のもの)で格納しているので、Aコマンドでポジションを確認した後に、手動で相対値に変換する必要がありました。これが結構面倒なので、相対値で指定できるように修正します。
Aコマンドとaコマンド
Aコマンドは大文字の'A'でも小文字の’a'でも同じ動きでしたが、大文字の'A'今まで通りの絶対値として、小文字の’a'では相対値として指示できるようにしました。
絶対値指定
A,90,90,90,90,90,90,90,90相対値指定
a,0,0,0,0,0,0,0,0
ソースコード
// SERVO All command
if ( command == 'A' ) // 'A' is Servo All Command "A,Angle0, Angle1...Angle7"
{
Serial.print(command);
// read Angle from Serial
for (int i = 0; i < MAX_SERVO_NUM; i++)
{
angle[i] = Serial.parseInt();
Serial.print(',');
Serial.print(angle[i]);
}
Serial.println();
// servo Move
set8Angle( angle[0], angle[1], angle[2], angle[3], angle[4], angle[5], angle[6], angle[7] );
// Wait Servo Move
delay(SERVO_DELAY);
} // SERVO All End
// SERVO all command relative angle
if ( command == 'a' ) // 'a' is Servo All Command for relative "a,Angle0, Angle1...Angle7"
{
Serial.print(command);
// read Angle from Serial
for (int i = 0; i < MAX_SERVO_NUM; i++)
{
angle[i] = Serial.parseInt();
Serial.print(',');
angle[i] = servoCenter[i] + (angle[i]* servoDir[i]);
Serial.print(angle[i]);
}
Serial.println();
// servo Move
set8Angle( angle[0], angle[1], angle[2], angle[3], angle[4], angle[5], angle[6], angle[7] );
// Wait Servo Move
delay(SERVO_DELAY);
} // SERVO all End
ちょこっと解説
もとのAコマンドを二つに分けて片方を相対値指定に変更しています。
意味的に違うのは
angle[i] = servoCenter[i] + (angle[i]* servoDir[i]);
の一行だけで、読み込んだ角度をオフセットと回転方向を加味して、絶対値に変換しています。
(でもよく考えたらAコマンドは相対値指定でも良かった気もします。)
おわりに
これでAコマンドで確認したポジションをそのまま basicPosition {} 配列に転記することができるので、モーション作成が楽になると思います。
(と書きながら歩かせるのは意外と苦労していて、やはりLアングルモデルよりも3Dプリンタモデルは機体が重く後ろに倒れやすいので、足のモデル形状は少し(5mmくらい関節の位置を前に出す)変えたくなってしまいます。)
おしまい
購入品情報
おおーやっと純正SG90がAmazonで購入可能になっています。早速ぽちりました。
5個セットで2200円
次のロボットはMS18で作っているのですが、やっぱりSG90でないと遅いんですね。こっちもSG90に変えようと思います。
一個でも買えますね。