製品の概要

Outline of SG90 Servo motor

安価で制御の簡単なサーボモータ。3.3Vの信号で制御出来るので自作に便利なサーボモータです。

基本性能

マニュアルが秋月さんのHPに有りました=> SG90

 SG90 SPEC

Weight9 g
Dimension22.2 x 11.8 x 31 mm
Operating speed0.12 s/60 degree
Operating voltage3.3 V (~6V)
Dead band width1 µs
Temperature range 0 ºC - 55 ºC

制御方法

TFT 3.5inch
  1. 茶色: GND / 赤色: VCC / 橙色: 制御信号
  2. PWM制御。20ms周期パルスのHigh時間の長さで角度を制御。

      角度とパルス幅

      角度パルス幅 (ms)パルス幅 (μs)
      0° (左端)0.5ms500μs
      90° (中央)1.45 ~ 1.5ms1450 ~ 1500μs
      180° (右端)2.4ms2400μs
  3. 1度あたりのパルス幅 P = (2.4 - 0.5)/ 180 = 0.01055 ms。希望回転角がX度の場合パルス幅は P = X * 10.55 + 500 us。
  4. 希望角度を受け取ったモータは内部の「ポテンショメータ」の値(現在の回転角) がその角度になる様にモータを制御する。

動作確認

 esp32

ESP32のGPIO33を信号ラインとして下記の様に配線しました。

ESP32

専用のライブラリーESP32Servoを使えば簡単に制御出来ます。 主な関数は以下の通り。

  • int attach(pin): 制御信号用GPIOピンの割当。
  • void write (): 回転角度指定(0から180度を指定)
  • void writeMicroseconds(): 回転角度指定(引数としてパルス幅を指定)
  • int read(): 指定した角度を0から180度の角度で返す。
  • int readMicroseconds(): 指定した角度をパルス幅で返す。
  • bool attached(): ピン指定されていれば真。
  • void detach(): 制御用に使用しているピンを開放する。

サンプルプログラム。

sg90.ino Arduino
#include "Arduino.h" #include <ESP32Servo.h> // Pin definition for Servo Motor #define sg90_pin 33 void setup() { Servo sg90; int a; Serial.begin(115200); sg90.attach(sg90_pin); Serial.print("Attached PIN: "); if(sg90.attached()) Serial.println("GPIO33"); else Serial.println("None"); for(a = 90; a > -1; a -= 10){ sg90.write(a); Serial.println(String(a) + " / " + String(sg90.read())); delay(1000); } for(a = 90; a < 181; a += 10){ sg90.write(a); Serial.println(String(a) + " / " + String(sg90.readMicroseconds())); delay(1000); } sg90.detach(); Serial.println("Detach GPIO32"); } void loop() { delay(500); }

 Raspberry PI

Pythonコードです。PiGPIOFactoryを使用するのでpigpiod デーモンが必要です。 ターミナルで以下のコマンドを実行しておいてください。
sudo systemctl enable pigpiod
sudo systemctl start pigpiod
信号ラインにはGPIO21を使用しています。

サンプルプログラム。

sg90.py Python
from time import sleep from gpiozero import AngularServo from gpiozero.pins.pigpio import PiGPIOFactory factory = PiGPIOFactory() servo = AngularServo(21, min_angle=-90, max_angle=90, min_pulse_width=0.0005, max_pulse_width=0.0024, pin_factory=factory, initial_angle=0) time.sleep(1) try: while True: print("0度へ") servo.angle = -90 sleep(1) print("90度へ") servo.angle = 0 sleep(1) print("180度へ") servo.angle = 90 sleep(1) except KeyboardInterrupt: print("終了します") servo.detach()

最後に

使って見ての感想。

  • 動作範囲が製品によって違いフルレンジ(0から180度)動くとは限らない
    • 動作範囲の端に行くとジージと音がして指定角度にならない事が有る。
    • 個々に合わせて動作範囲を調整する必要がある。
  • 位置決め精度は荒い。
  • 移動時の速度は調整出来ない。かなり速い。
  • 音がちょっとうるさい。

が有りますが、値段を考慮するとかなりお得な便利Goodsです。

SINCE 2026