日別アーカイブ: 2023年6月3日

サーボモーターSG90が半分の角度しか回らないので調査

環境

  • 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を押すと確認可能。