なぜ併用したいか
以前の記事で サーボモータをゆっくり動かすために必要となるVarSpeedServo.h の使い方と,多数のサーボモータを動かすために必要となるPCA9685 の使い方 を見てきました。
VarSpeedServo.h でサポートされるサーボモータは8個までです。
多脚ロボットを作るうえで多数のサーボモータ(1脚あたり3個のサーボとして6脚だと18個)をゆっくり動かすことを実現したいため両者の併用が必要と考えました。
やってみたこと
まずは深く考えずに1つのスケッチ内で両者を使ってみました。どちらも Timer を使っているようなので,Timer が競合して動かないだろうなと思っていたのですが,うまく動きました。
動画内の一番下のサーボを 7pin で Arduino に直接接続し,その他のサーボはPCA9685に接続しています。
#include <Wire.h>
#include <PCA9685.h> //PCA9685用ヘッダーファイル(秋月電子通商作成)
#include <VarSpeedServo.h>
PCA9685 pwm = PCA9685(0x40); //PCA9685のアドレス指定(アドレスジャンパ未接続時)
VarSpeedServo myservo1;
#define SERVOMIN 102 //最小パルス幅
#define SERVOMAX 492 //最大パルス幅
void setup() {
pwm.begin(); //初期設定 (アドレス0x40用)
pwm.setPWMFreq(50); //frequency of PWM for SG90 (アドレス0x40用)
myservo1.attach(7); // 5,6,7pinどれでも可
}
int n=0;
void loop() {
n=0;
while (n<=180) {
for(int i=0; i<16; i++){
servo_write(i,n);
delay(20);
}
n=n+60 ;
}
//State:1
myservo1.write(120,40,false);
delay(1000);
//State:2
myservo1.write(45,40,false);
delay(1000);
}
void servo_write(int ch, int ang){ //動かすサーボチャンネルと角度を指定
ang = map(ang, 0, 180, SERVOMIN, SERVOMAX); //角度(0~180)をPWMのパルス幅(102~492)に変換
pwm.setPWM(ch, 0, ang);
//delay(1);
}結論;併用は可能だが,やりたいことはまだできていない
結論としては,両者の併用は可能でした。本当にやりたいのは,PCA9685に接続したサーボをゆっくり動かすことなので,これはまだできていません。
PCA9685のライブラリを書き換える必要がありそうです。この需要もありそうなものですが(たとえばココで質問されている),解決できている事例は残念ながら見つかりませんでした(ココが惜しいところまで行っているように見える)。
あるいは,下図の右の構成にする必要がありそうです。スマートではないですが。。

今回の記事はここまでです。



コメント