環境
- VSCode
- PlatformIO
- ESP-WROOM-02(自作基盤)
- SG90(のAliexpressで買った互換品?)
- Windows11
事象
SG90をPlatformIOで入れたライブラリで0,90,180度で動かそうとしたところそれぞれ0,45,90度ぐらいしか動かなかった
ソースは以下
#include <Arduino.h>
#include <Servo.h>
#define SERVO_PIN 12
Servo servoMotor;
void setup() {
Serial.begin(115200);
delay(100);
digitalWrite(LED_PIN, HIGH);
servoMotor.attach(SERVO_PIN);
}
int count = 0;
int angle[] = {0,90,180};
void loop() {
servoMotor.write(angle[count%3]);
Serial.printf("%s - run %d %d \n",__func__,count,servoMotor.readMicroseconds());
count++;
delay(1000);
}
[env:esp_wroom_02]
platform = espressif8266
board = esp_wroom_02
framework = arduino
monitor_speed = 115200
upload_port = COM9
servoMotor.readMicroseconds()でみてみると本来500,1450,2400(ms)ぐらいであってほしい数値が1000,1500,2000ぐらいになっていた。
対応
サーボモーターの初期化をするときに以下のように明示的に0度と180度(データシート的には-90度と90度)の値を指定してやったら動いた。
servoMotor.attach(SERVO_PIN,500,2400);
原因
PlatformIOだとplatform を切り替えるとそれぞれのマイコンに応じたライブラリが読み込まれるみたい。そしてそこ(Servo.h)にあるデフォルト値が欲しい値じゃなかった
#define DEFAULT_MIN_PULSE_WIDTH 1000 // uncalibrated default, the shortest duty cycle sent to a servo
#define DEFAULT_MAX_PULSE_WIDTH 2000 // uncalibrated default, the longest duty cycle sent to a servo
#define DEFAULT_NEUTRAL_PULSE_WIDTH 1500 // default duty cycle when servo is attached
読み込まれているライブラリはPIOホーム -> Libraries -> Built-inから(必要なら検索で絞って)Servoを選んでRevealを押すと確認可能。