【ROS2】サーボモーター(SG90)を回したい

目次

概要

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でパブスクのトピック通信で同じ事をしたい。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次