ゆるエンジニアはいろいろ遊びたい

FAエンジニアが週末にいろいろ遊ぶブログです

RaspberryPi zero 2wで16CHサーボドライバPCA9685を使うときの注意

ShellPiをいじっていたらラズパイの設定がおかしくなってしまい、再度OSからインストールしなおしたのですが、その際にサーボドライバのPCA9685がうまく動かずに苦戦しました。
サーボドライバのライブラリは以下の2つあるようです。

adafruit-circuitpython-pca9685
adafruit-pca9685

circuitpythonとつく方が現在のライブラリ名で、

pip install adafruit-circuitpython-pca9685

でインストールします。
サンプルコードは

import time
import board
import busio
from adafruit_pca9685 import PCA9685

# I2C 初期化
i2c = busio.I2C(board.SCL, board.SDA)

# PCA9685 初期化
pca = PCA9685(i2c)
pca.frequency = 50  # サーボは 50Hz

def set_servo_angle(channel, angle):
    # 角度 → パルス幅(ms)
    pulse_min = 1.0   # 0°
    pulse_max = 2.0   # 180°
    pulse = pulse_min + (pulse_max - pulse_min) * (angle / 180)

    # duty_cycle に変換
    duty = int((pulse / 20.0) * 65535)
    pca.channels[channel].duty_cycle = duty

# テスト
while True:
    set_servo_angle(0, 0)
    time.sleep(1)
    set_servo_angle(0, 90)
    time.sleep(1)
    set_servo_angle(0, 180)
    time.sleep(1)

circuitpythonが付かない方は旧ライブラリで、

pip install adafruit-pca9685

でインストールします。
サンプルコードはこちら

import Adafruit_PCA9685
import time

# PCA9685初期設定
pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(60)


def main():
    for i in range(1):
        print(f"{i}+番目のサーボモーター動作")
        pwm.set_pwm(i, 0, 450)
        time.sleep(0.5)
        pwm.set_pwm(i, 0, 250)
        time.sleep(0.5)
    pwm.close()
    
if __name__ == '__main__':
    main()

初期設定も制御方法も全然違います。
AIにコーディングしてもらうと、旧式を使ってみたり、新式を使ってみたりと気まぐれなので注意が必要でした。