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にコーディングしてもらうと、旧式を使ってみたり、新式を使ってみたりと気まぐれなので注意が必要でした。