製品の概要
安価で制御の簡単なサーボモータ。3.3Vの信号で制御出来るので自作に便利なサーボモータです。
基本性能
マニュアルが秋月さんのHPに有りました=> SG90
SG90 SPEC
| Weight | 9 g |
|---|---|
| Dimension | 22.2 x 11.8 x 31 mm |
| Operating speed | 0.12 s/60 degree |
| Operating voltage | 3.3 V (~6V) |
| Dead band width | 1 µs |
| Temperature range | 0 ºC - 55 ºC |
制御方法
- 茶色: GND / 赤色: VCC / 橙色: 制御信号
- PWM制御。20ms周期パルスのHigh時間の長さで角度を制御。
角度とパルス幅
角度 パルス幅 (ms) パルス幅 (μs) 0° (左端) 0.5ms 500μs 90° (中央) 1.45 ~ 1.5ms 1450 ~ 1500μs 180° (右端) 2.4ms 2400μs - 1度あたりのパルス幅 P = (2.4 - 0.5)/ 180 = 0.01055 ms。希望回転角がX度の場合パルス幅は P = X * 10.55 + 500 us。
- 希望角度を受け取ったモータは内部の「ポテンショメータ」の値(現在の回転角) がその角度になる様にモータを制御する。
動作確認
esp32
ESP32のGPIO33を信号ラインとして下記の様に配線しました。
専用のライブラリー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です。