●基準姿勢を調整する

ロボットを組み立て終わりましたらいよいよ電源を入れて立たせてみます。(4足なので何もしなくても立ちますが。)
"ms03"のプログラムを保存した方はもう一度開いて"ms05"として保存します。loop()の中を削除します。

#include <Servo.h>
 
Servo myservo1;  // 前足
Servo myservo2;  // 後ろ足
 
void setup() {
  myservo1.attach(9);  // attaches the servo on pin 9 to the servo object
  myservo2.attach(10);  // attaches the servo on pin 10 to the servo object
  myservo1.write(90);
  myservo2.write(90);
 Serial.begin(9600);
}
 
void loop() {
  
}

この状態でロボットに転送して実行します。左右の足をつなぐパーツがメイン基板と平行になっていれば問題ありません。もしそうではなく地面に置いた時にガタガタしてしまう場合にはソフト的にこれを修正します。下記のように修正用の変数"offset1,offset2"(名前はなんでも良い)を使います。

#include <Servo.h>
 
Servo myservo1;  // 前足
Servo myservo2;  // 後ろ足
int8_t offset1 = 0;  //<-追加
int8_t offset2 = 0;  //<-追加
 
void setup() {
  myservo1.attach(9);  // attaches the servo on pin 9 to the servo object
  myservo2.attach(10);  // attaches the servo on pin 10 to the servo object
  myservo1.write(90 + offset1);  //<-変更
  myservo2.write(90 + offset2);  //<-変更
 //Serial.begin(9600);  //<-使わないのでコメントアウト
}
 
void loop() {
  
}

サーボの角度指定のところに補正値を足して実際に出力される角度を修正しています。offset1とoffset2の値をいろいろ変えてロボットを立たせてみてほどよい値を見つけてください。サーボホーンをはめる時にサーボ90°でそこそこ平行に取り付けていれば、プラスマイナス30°ぐらいの範囲に収まると思います。

●歩行させる
調整が終わりましたら歩かせてみます。4足歩行をサーボ(関節)2個で実現しますので実際の動物の動きとは異なり、工夫が必要です。下に示しましたアルゴリズムは、前足を上下に動かして後ろ足を片足づつ浮かせ、着地している方の足で前方に推進するという方法です。

#include <Servo.h>
 
Servo myservo1;  // 前足
Servo myservo2;  // 後ろ足
int8_t offset1 = 0;  
int8_t offset2 = 0;  
 
void setup() {
  myservo1.attach(9);  // attaches the servo on pin 9 to the servo object
  myservo2.attach(10);  // attaches the servo on pin 10 to the servo object
  myservo1.write(90 + offset1);  
  myservo2.write(90 + offset2);  
 //Serial.begin(9600);  
}
 
void loop() {
  myservo1.write(80 + offset1);  //右前足を下げる。->右後ろ足が浮く。
  myservo2.write(100 + offset2);
  delay(100);
  myservo1.write(80 + offset1);
  myservo2.write(80 + offset2);  //左後ろ足を後方に。
  delay(200);
  myservo1.write(100 + offset1);  //左前足を下げる。->左後ろ足が浮く。
  myservo2.write(80 + offset2);
  delay(100);
  myservo1.write(100 + offset1);
  myservo2.write(100 + offset2);  //右後ろ足を後方に。
  delay(200);
}

いかがでしょうか。足がちゃんと動いているのに前に進まない等の問題は、地面との摩擦が少ない(滑ってしまう)のが原因である場合があります。紙を敷いてみるなどして確認してみてください。また、滑り止めシールを後ろ足先端に張り付けても効果があります。

●練習問題
後ろに歩かせてください。(恐竜はそういう歩き方はしないと思いますが。)

#include <Servo.h>
 
Servo myservo1;  // 前足
Servo myservo2;  // 後ろ足
int8_t offset1 = 0;  
int8_t offset2 = 0;  
 
void setup() {
  myservo1.attach(9);  // attaches the servo on pin 9 to the servo object
  myservo2.attach(10);  // attaches the servo on pin 10 to the servo object
  myservo1.write(90 + offset1);  
  myservo2.write(90 + offset2);  
 //Serial.begin(9600);  
}
 
void loop() {
  //順番を逆にしました。
  myservo1.write(100 + offset1);
  myservo2.write(100 + offset2);  //右後ろ足を後方に。
  delay(200);
  myservo1.write(100 + offset1);  //左前足を下げる。->左後ろ足が浮く。
  myservo2.write(80 + offset2);
  delay(100);
  myservo1.write(80 + offset1);
  myservo2.write(80 + offset2);  //左後ろ足を後方に。
  delay(200);
  myservo1.write(80 + offset1);  //右前足を下げる。->右後ろ足が浮く。
  myservo2.write(100 + offset2);
  delay(100);
}

●練習問題
左右旋回させてください。
ヒント:左右の後ろ足の動きを非対称にします。
・左旋回

#include <Servo.h>
 
Servo myservo1;  // 前足
Servo myservo2;  // 後ろ足
int8_t offset1 = 0;  
int8_t offset2 = 0;  
 
void setup() {
  myservo1.attach(9);  // attaches the servo on pin 9 to the servo object
  myservo2.attach(10);  // attaches the servo on pin 10 to the servo object
  myservo1.write(90 + offset1);  
  myservo2.write(90 + offset2);  
 //Serial.begin(9600);  
}
 
void loop() {
  myservo1.write(80 + offset1);  //右前足を下げる。->右後ろ足が浮く。
  myservo2.write(90 + offset2);
  delay(100);
  myservo1.write(80 + offset1);
  myservo2.write(90 + offset2);  //左後ろ足動かない。
  delay(200);
  myservo1.write(100 + offset1);  //左前足を下げる。->左後ろ足が浮く。
  myservo2.write(70 + offset2);
  delay(100);
  myservo1.write(100 + offset1);
  myservo2.write(110 + offset2);  //右後ろ足を後方に。
  delay(200);
}

・右旋回

#include <Servo.h>
 
Servo myservo1;  // 前足
Servo myservo2;  // 後ろ足
int8_t offset1 = 0;  
int8_t offset2 = 0;  
 
void setup() {
  myservo1.attach(9);  // attaches the servo on pin 9 to the servo object
  myservo2.attach(10);  // attaches the servo on pin 10 to the servo object
  myservo1.write(90 + offset1);  
  myservo2.write(90 + offset2);  
 //Serial.begin(9600);  
}
 
void loop() {
  myservo1.write(80 + offset1);  //右前足を下げる。->右後ろ足が浮く。
  myservo2.write(110 + offset2);
  delay(100);
  myservo1.write(80 + offset1);
  myservo2.write(70 + offset2);  //左後ろ足を後方に。
  delay(200);
  myservo1.write(100 + offset1);  //左前足を下げる。->左後ろ足が浮く。
  myservo2.write(90 + offset2);
  delay(100);
  myservo1.write(100 + offset1);
  myservo2.write(90 + offset2);  //右後ろ足動かない。
  delay(200);
}

<= マイクロサウルス チュートリアル(4)
チュートリアルベース
マイクロサウルス チュートリアル(6) =>