定番ライブラリ<Servo.h>の問題点
以前の記事 で多脚ロボットの生き物っぽい動きを見ました。生き物っぽく見せるためにはサーボモータをゆっくり滑らかに動かしたいです。しかし,Arduinoのサーボモータライブラリ<Servo.h>ですと目標の角度しかインプットできず,目標値まで最大速度で移動するだけです。
これだと動きがぎこちなく見えてしまいますので,ゆっくりサーボモータを動かすことを試みました。
ゆっくりサーボモータを動かすためには,VarSpeedServo.hというライブラリが使えそうだったので,今回の記事ではこちらのライブラリを使って脚を動かしてみた結果をご紹介します。
ゆっくりサーボモータを動かすための<VarSpeedServo.h>の導入
まずは こちらのgit hub から以下の図のように,必要なzipファイルをダウンロードします。

次に Arduino IDE を開き “スケッチ” → “ライブラリをインクルード” → “.ZIP形式のライブラリをインストール” の順でダウンロードしたzip を読み込みます。

以上で <VarSpeedServo.h> の導入が完了しました。
それっぽく動かしてみる
その1 脚のサーボモータ3つをそれぞれ別の速度で動かしてみる
土台についているサーボモータ(付け根のサーボモータ)を少しゆっくり,真ん中と先端のサーボモータを少し早く動かしてみました。まだ動きのぎこちなさは残りますね。
コードは以下。
#include <VarSpeedServo.h>
VarSpeedServo myservo1;
VarSpeedServo myservo2;
VarSpeedServo myservo3;
void setup(){
myservo1.attach(5); //付け根のサーボモータ(Joint1) range(deg):45~120
myservo2.attach(6); //真ん中のサーボモータ(Joint2) range(deg):30~150
myservo3.attach(7); //先端のサーボモータ(Joint3) range(deg):0~170
}
void loop(){
//State:1
myservo1.write(120,60,false);
myservo2.write(100,90,false);
myservo3.write(140,90,false);
delay(1000);
//State:2
myservo1.write(120,60,false);
myservo2.write(60,90,false);
myservo3.write(90,90,false);
delay(1000);
//State:3
myservo1.write(45,60,false);
myservo2.write(60,90,false);
myservo3.write(90,90,false);
delay(1000);
//State:4
myservo1.write(45,60,false);
myservo2.write(100,90,false);
myservo3.write(140,90,false);
delay(1000);
}その2 サーボモータの速度を 遅く→早く と変える
さらに改良を加えました。目標の角度から遠いときは早く動くよう,近いときは遅く動くようにしました。ぎこちなさはだいぶ解消されたように思います。
コードは以下です。今4つに分けているStateをさらに細かく分ければより良くなりそうです。
#include <VarSpeedServo.h>
VarSpeedServo myservo1;
VarSpeedServo myservo2;
VarSpeedServo myservo3;
void setup(){
myservo1.attach(5); //付け根のサーボモータ(Joint1) range(deg):45~120
myservo2.attach(6); //真ん中のサーボモータ(Joint2) range(deg):30~150
myservo3.attach(7); //先端のサーボモータ(Joint3) range(deg):0~170
}
void loop(){
//State:1
myservo1.write(120,40,false);
myservo2.write(100,40,false);
myservo3.write(140,40,false);
delay(500);
//State:2
myservo1.write(120,20,true);
myservo2.write(60,60,false);
myservo3.write(90,40,false);
delay(500);
//State:3
myservo1.write(45,40,false);
myservo2.write(60,40,false);
myservo3.write(90,40,false);
delay(500);
//State:4
myservo1.write(45,20,false);
myservo2.write(100,60,false);
myservo3.write(140,40,false);
delay(500);
}以上で今回の確認は終わりです。



コメント