目次
概要
Raspberry Pi4、Ubuntu22.04LTS、PCA9685、Python、ROS2 Humbleで、
サーボモーター(SG90)を0~180度回したい。
※ChatGPTで、「優秀なロボティクス講師」としてロールプレイして頂いた記録。
SG90とは
一般的に広く使用されている小型サーボモーターで、主にホビー用途やロボット工学のプロジェクトで使われる。
「ギア付きモーター」として動作し、一定の角度範囲で正確に回転することができる。
※マイクロサーボになるらしい。
SG90サーボモーターの特徴
- 回転範囲:
通常、SG90の回転範囲は約180度。
モーターは、制御信号に基づいて0度から180度の間で特定の位置に回転する。 - パルス幅による制御:
PWM(パルス幅変調)によって制御され、指定されたパルス幅に対応して特定の角度に回転する。
通常、パルス幅が約1msの場合は0度、2msの場合は180度の位置に設定される。 - トルク:
小型ながら、約1.8kg/cm程度のトルクを持ち、軽量な物体の動作に適してる。 - サイズ:
非常にコンパクトで、軽量なデザインのため、ロボットやリモートコントロールのプロジェクトに
理想的。
高トルクのSG92R、メタルギヤ版のSG90S、サイズが大きく、高トルク、メタルギヤのMG996R等がある。
コード
0~180度、180~0度を無限ループするPythonコード。
import time
import board
import busio
from adafruit_pca9685 import PCA9685
from adafruit_motor import servo
# I2Cバスの初期化
i2c = busio.I2C(board.SCL, board.SDA)
# PCA9685の初期化
pca = PCA9685(i2c)
pca.frequency = 50 # サーボモーター用に50Hzに設定
# サーボモーターの設定(パルス幅をさらに広めに設定)
servo_motor = servo.Servo(pca.channels[0], actuation_range=180)
servo_motor.set_pulse_width_range(400, 2600) # パルス幅を0.4ms〜2.6msに設定
# サーボモーターを繰り返し動かす
try:
while True:
# 0度から180度まで動かす
for angle in range(0, 181, 5):
servo_motor.angle = angle
time.sleep(0.05)
# 180度に到達後、1秒間待機
time.sleep(1)
# 180度から0度まで戻す
for angle in range(180, -1, -5):
servo_motor.angle = angle
time.sleep(0.05)
# 0度に戻った後、1秒間待機
time.sleep(1)
except KeyboardInterrupt:
# プログラム終了時にPCA9685を無効化
pca.deinit()
- actuation_range=180:サーボモーターの可動範囲を180度に設定する。
- set_pulse_width_range(1000, 2000):
パルス幅を0.4ms(0度)から2.6ms(180度)に設定。
これにより、サーボモーターがフルレンジで回転するようになる。
※パルス幅は、1000, 2000、500, 2500等も試したが、今回の個体では、400, 2600が良さそう。
まだPython3で実行しているので、次はROS2でパブスクのトピック通信で同じ事をしたい。
コメント