あらきけいすけのメモ帳

あらきけいすけの雑記帳2

pigpio ライブラリのサンプルコード PCA9685.py を用いて Raspberry Pi 3B から I2C 接続経由でサーボモータを動作させる

自分用の書きかけの覚書。pigpio の i2c 関連の関数のパラメータの与え方がよくわかっていない状態だが、〔Raspberry Pi 3B/3B+/Zero W + Python + pigpio ライブラリ + pigpio コード PCA9685.py*1〕と〔PCA9685 16channel 12bit pwm サーボドライバー*2〕を使ってサーボモータを動かすことができた。これでラズパイ側は(電源を除けば)[03:GPIO02(SDA1,I2C)] [05:GPIO03(SCL1,I2C)]の2個のGPIOピンを使うだけで最大16個までのサーボを動かせるようになった*3

  • ハードウェア側(Adafluit製)
    次のようにピン接続する。ピン接続がきちんとしていて、ラズパイに電源がつながっていたら(ラズパイのOSが起動していても、いなくても電力が供給されているので)ドライバー上の赤いLEDが点灯する。
    1. ドライバー[VCC][V+]⇔RPi[02:5V][04:5V]
    2. ドライバー[GND]⇔RPi[06:Ground]*4
    3. ドライバー[SCL]⇔RPi[05:GPIO03(SCL1,I2C)]
    4. ドライバー[SDA]⇔RPi[03:GPIO02(SDA1,I2C)]
    5. ドライバー[0E] not connected
  • プログラム側
    1. まず pigpio のサイトの Examples のページから PCA9685_py.zip をダウンロードする
    2. この zip ファイルを解凍して Python コード PCA9685.py を取り出す
    3. コマンド "sudo python PCA9685.py" で実行。*5ドライバーに接続されているすべてのサーボモータが一斉に同じ動作をする
  • Pythonプログラムの自作
    • 最小限のコード:0番ポートのサーボモータを(多分、約)90度のポジションに動かす。これを"runPCA9685.py"の名前で"PCA9685.py"と同じフォルダに保存する
# -*- coding: utf-8 -*-
if __name__ == "__main__":
   # ライブラリを読み込む部分
   import PCA9685
   import pigpio

   # ライブラリを使うためのインスタンスを立ち上げる部分
   pi = pigpio.pi()
   if not pi.connected:
      exit(0)
   pwm = PCA9685.PWM(pi) # defaults to bus 1, address 0x40

   # サーボモータを動作させるPWM信号の周波数を決める部分
   pwm.set_frequency(50) # suitable for servos

   # サーボモータを動作させる部分
   ch = 0
   pw = 1500
   pwm.set_pulse_width(ch, pw)

   # プログラムの終了処理の部分
   pwm.cancel()
   pi.stop()
    • コマンド "sudo python runPCA9685.py" で実行。

*1:"pigpio" i2c PCA9685 - Google 検索; pigpio library Examples

*2:pca9685 16channel 12bit pwm サーボドライバー - Google 検索 Adafluit製のものがあちこちで売られているようだ。

*3:ただし電力の供給をラズパイに頼ると、サーボモータの数が増えたときに、ラズパイが落ちるかもしれない。
I2C通信の使い方に記載の接続法を見ると、何台でもつなげそう。

*4:GroundのピンならどれでもOK

*5:この前に "sudo pigpiod" を実行しておく。