ライブラリの使い方
使い方(基本)
簡易版Social Pods は全部で8つのサーボモータを搭載しています。
Social Podsはそれぞれのサーボモータに対して「角度」を指定して動かすことができます。
角度は爪(CLAW)の場合は本体から上方向、肩(SHOULDER)は正面方向が正です。
どのサーボを動かすかは、サーボモータの位置を「前(FRONT)/後(REAR)」「左(LEFT)/右(RIGHT)」「肩(SHOULDER)/爪(CLAW」と指定することで決めることができます。
code:例1
servoMove(FRONT, RIGHT, SHOULDER, 30);
上の例では FRONT の RIGHT の SHOULDER を30度前に動かすという意味になります。
サーボモータを動かす命令には servoMove と servoMoveTo の2種類があります。
code:例2
servoMoveTo(REAR, LEFT, CLAW, 30); // servoAngle : 30
servoMoveTo(REAR, LEFT, CLAW, -15); // servoAngle : -15
servoMoveTo(REAR, LEFT, CLAW, 0); // servoAngle : 0
code:例3
servoMove(REAR, LEFT, CLAW, 30); // servoAngle : 30
servoMove(REAR, LEFT, CLAW, -45); // servoAngle : -15
servoMove(REAR, LEFT, CLAW, 15); // servoAngle : 0
上の例2, 3はどちらも同じ動作を記述したものです。
まず、servoMoveTo は初期位置を基準に、どの角度まで移動させるかを指定します。
一方、servoMove は現在位置を基準に、どれだけの角度を移動させるかを指定します。
Social Pods のような4足のロボットでは、足を動かす際に「地面から離して」動かすことがよくあります。
Social Pods でも armMove と armMoveTo という二つの命令を用意しています。
code:例4
armMoveTo(REAR, LEFT, 40);
例4では、REAR の LEFT の足を一旦上げてから、40度の地点まで移動させて足を下げるという一連の動作を命令しています。
この命令では肩か爪かという指定は必要ありません。
初期状態に戻す時には initializePoze を使うことができます。
code:例5
initializePoze(); //初期状態に戻る!
この命令を使用すると全てのサーボモータの角度が0になります。
また、readServoAngle を使えば現在のサーボの角度を知ることもできます。
code:例6
servoMoveTo(REAR, RIGHT, SHOULDER 40);
readServoAngle(REAR, RIGHT, SHOULDER); // 40
上の例では readServoAngle を使った時点では REAR の RIGHT の SHOULDER は40度の角度になっているので40の値が返ります。
最後に、サーボモータの基準位置の調整方法を説明します。
自作のロボットでは、どうしてもサーボモータをつける時に角度がずれてしまったり、そもそもサーボモータ自体に個体差があることがあります。その結果、サーボモータの初期位置がずれてしまって、思った通りの動きをしてくれないことがあるのです。
そこで Social Pods では calibrateTo という命令を使って初期位置を調整することができます。
code:例7
calibrateTo(REAR, RIGHT, CLAW, -10);
例7では、REAR の RIGHT の爪の高さの基準値を元々の状態から10下げた状態にする、という意味になります。
これは Arduino のコードの setup の中で記述することを推奨します。
使い方(応用)
サーボモータを指定する際に、FRONT などいちいち全部書くのは面倒なので、略記することができます。
code:略記
FRONT -> F
REAR -> R
LEFT -> L
RIGHT -> R
SHOULDER -> S
CLAW -> C
servoMove と servoMoveTo には動かすための情報の他に、いくつかの指定を追加することができます。
一つ目は命令の同時実行です。
code:例8
servoMoveTo(FRONT, RIGHT, SHOULDER, 30, false); // すぐに次の命令を実行する
servoMoveTo(FRONT, LEFT, SHOULDER, -30, true); // 命令が終わってから次に移る
servoMoveTo(REAR, LEFT, CLAW, 30); // 命令が終わってから次に移る
例8はサーボの位置と角度の指定の他に false という指定を足した場合、その命令を終了を待たずに次の命令も実行します。
一方、true を指定した場合には元々の動作同様に、その命令が終わってから次の命令に移ります。
したがって、この例では前方右肩と、前方左肩は同時に動き始め、それが終わった後に後方左足が動き始めます。
二つ目はサーボモータの動作速度です。
code:例9
servoMoveTo(FRONT, RIGHT, SHOULDER, 30, 50); // サーボモータのデフォルトの速度
servoMoveTo(FRONT, LEFT, SHOULDER, -30, 255); // サーボモータの推奨トップスピード
servoMoveTo(REAR, LEFT, CLAW, 30, 0); // サーボモータの限界速度
例8はサーボの位置と角度の指定の他に0~255の数字を指定することができます。
サーボの速度はデフォルトでは50となっていて、1が最小、255が最大となっています。
ただし、特別に0を指定した場合は、サーボの限界速度に近い速度で動作します。
命令の同時実行と、サーボモータの速度の両方を指定することもできます。
code:例10
servoMoveTo(FRONT, RIGHT, SHOULDER, 30, false, 150);
servoMoveTo(FRONT, LEFT, SHOULDER, 30, true, 150);
例9では両前足を同時に150のスピードで前方に動かしています。
armMove, armMoveTo ではスピードの指定のみ可能です。
code:例11
armMoveTo(FRONT, RIGHT, 30, 150);
例11では、足の移動を150で実行します。
これらの命令を使った動きの例として forward と turnRight がライブラリ上にあります。
code:forward
void forward(int speed = 50, int loop = 1){
if(readServoAngle(F,R,S) != -30) armMoveTo(F,R,-30);
if(readServoAngle(R,R,S) != 30) armMoveTo(R,R, 30);
if(readServoAngle(F,L,S) != -15) armMoveTo(F,L,-15);
if(readServoAngle(R,L,S) != 15) armMoveTo(R,L, 15);
int count = 0;
while(count < loop){
armMove(F,R,30,speed);
servoMove(F,R,S,-15, false, speed);
servoMove(F,L,S,-15, false, speed);
servoMove(R,L,S,-15, false, speed);
servoMove(R,R,S,-15, true, speed);
armMove(R,L,30,speed);
armMove(F,L,30,speed);
servoMove(F,R,S,-15, false, speed);
servoMove(F,L,S,-15, false, speed);
servoMove(R,L,S,-15, false, speed);
servoMove(R,R,S,-15, true, speed);
armMove(R,R,30,speed);
count++;
}
}
code:turnRight
void turnRight(int speed = 50, int loop = 3){
int count = 0;
while( count < loop){
armMove(F,R,-30);
armMove(F,L,30);
armMove(R,L,30);
armMove(R,R,-30);
initializePose();
count++;
}
}
サンプルコードを見ながら、どんな動きになるか確かめてみましょう!