サーボ10個でバイバイ
ESP32とPCA9685の組み合わせ。
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// PCA9685のアドレス(デフォルトは0x40)
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
// サーボの最小値と最大値(パルス幅)
#define SERVOMIN 115 // 150 // 最小パルス幅
#define SERVOMAX 525 // 600 // 最大パルス幅
int angleToPulse(int angle) {
return map(angle, 0, 180, SERVOMIN, SERVOMAX);
}
void setup() {
Serial.begin(115200);
Serial.println("PCA9685テスト開始");
// I2C通信の初期化
pwm.begin();
// PWM周波数を50Hzに設定(サーボモーターに適した周波数)
pwm.setPWMFreq(50);
int pulselen = angleToPulse(0);
Serial.print("0度: ");
Serial.println(pulselen);
for (uint8_t i = 0; i < 10; i++) {
pwm.setPWM(0, 0, pulselen);
pwm.setPWM(1, 0, pulselen);
pwm.setPWM(2, 0, pulselen);
pwm.setPWM(3, 0, pulselen);
pwm.setPWM(4, 0, pulselen);
pwm.setPWM(5, 0, pulselen);
pwm.setPWM(6, 0, pulselen);
pwm.setPWM(7, 0, pulselen);
pwm.setPWM(8, 0, pulselen);
pwm.setPWM(9, 0, pulselen);
}
Serial.println("OK");
}
void loop() {
// サーボを0度から180度まで動かす
for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) {
pwm.setPWM(0, 0, pulselen);
pwm.setPWM(1, 0, pulselen);
pwm.setPWM(2, 0, pulselen);
pwm.setPWM(3, 0, pulselen);
pwm.setPWM(4, 0, pulselen);
pwm.setPWM(5, 0, pulselen);
pwm.setPWM(6, 0, pulselen);
pwm.setPWM(7, 0, pulselen);
pwm.setPWM(8, 0, pulselen);
pwm.setPWM(9, 0, pulselen);
delay(2);
}
// サーボを180度から0度まで戻す
for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) {
pwm.setPWM(0, 0, pulselen);
pwm.setPWM(1, 0, pulselen);
pwm.setPWM(2, 0, pulselen);
pwm.setPWM(3, 0, pulselen);
pwm.setPWM(4, 0, pulselen);
pwm.setPWM(5, 0, pulselen);
pwm.setPWM(6, 0, pulselen);
pwm.setPWM(7, 0, pulselen);
pwm.setPWM(8, 0, pulselen);
pwm.setPWM(9, 0, pulselen);
delay(2);
}
}