記事一覧

Raspberry Pi Zero WでPCA9685 16チャネルPWMサーボモータドライバを使ってみた(python)。

Raspberry Pi Zero WでPCA9685 16チャネルPWMサーボモータドライバを使ってみた(python)。



RoboTakaoです。ようこそ「極力ローコスト ロボット製作 ブログ」にお越しくださいました。

前回はArduinoでPCA9685 16チャンネルPWMサーボモータドライバを使ってみましたが、今回はRaspberry Pi Zero Wで使用してみたいともいます。
前回のArduinoについてはこちらを参照してください。

RasPCA9685_05.png

I2Cの設定
私の環境では既にI2Cを使えるようにしていますが、初めての場合は以下の設定が必要です。

pi@raspberrypi:~ $ sudo raspi-config

5 Interfacing Options → P5 I2C → 有効にします

RasPCA9685_02.png

RasPCA9685_03.png

結線
PCA9685
+5V バッテリのプラス
OE  未接続
SCL  Raspberry PiのSCL
SDA  Raspberry PiのA4
GND  Raspberry PiのGND およびバッテリーのマイナス
VCC  Raspberry Piの5V

RasPCA9685_05.png


I2Cの番号確認

pi@raspberrypi:~ $ sudo i2cdetect -y 1

RasPCA9685_04.png

pythonのライブラリーインストール
pi@raspberrypi:~ $ git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git
pi@raspberrypi:~ $ git clone https://github.com/adafruit/Adafruit_Python_GPIO.git
pi@raspberrypi:~ $ git clone https://github.com/adafruit/Adafruit_Python_PureIO.git


pi@raspberrypi:~ $ cd Adafruit_Python_PCA9685/
pi@raspberrypi:~/Adafruit_Python_PCA9685 $ sudo python3 setup.py install
pi@raspberrypi:~/Adafruit_Python_PCA9685 $ cd ../Adafruit_Python_GPIO/
pi@raspberrypi:~/Adafruit_Python_GPIO $ sudo python3 setup.py install
pi@raspberrypi:~/Adafruit_Python_GPIO $ cd ../Adafruit_Python_PureIO/
pi@raspberrypi:~/Adafruit_Python_PureIO $ sudo python3 setup.py install


動作テスト
Arduinoの時と同じように周波数50Hzで最小パルス幅150 最大パルス幅500で動かしてみます。

サーボは1番ピンつまり2番目のピンで動作するように設定。
一つのサーボを0〜180度で回転させる。

コマンド
 set_pwm_freq(周波数Hz)
 set_pwm(チャンネル番号, パルスのスタート, パルスの終了)

パルスの長さは周波数/4096 x パルス幅 = ms みたいです。
例えば
20ms/4096 x 150 = 732μs
20ms/4096 x 500 = 2441μs

python上で以下実行
>>> import Adafruit_PCA9685
>>> pwm = Adafruit_PCA9685.PCA9685()
>>> pwm.set_pwm_frep(50)
>>> pwm.set_pwm(1,0,500)
>>> pwm.set_pwm(1,0,150)


これで無事動くことを確認。

次は16個のサーボを動かすようにコードを書いてみます。
(サーボは手持ちが7個しかなかったので7個です。)


import Adafruit_PCA9685
import time

pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(50) #周波数50Hzに設定

while True:
for i in range(16):
pwm.set_pwm(i,0,150) #0度にする
time.sleep(1)
for i in range(16):
pwm.set_pwm(i,0,500) #180度にする
time.sleep(1)


無事動きました。



それでは今回はこの辺で失礼します。ありがとうございました。

コメント

コメントの投稿

非公開コメント

プロフィール

RoboTakao

Author:RoboTakao
みなさんご訪問ありがとうございます。ロボット作りたいけどお小遣いそんなにないし、簡単でローコストでロボットを作るための私のプロジェクトを紹介します。

ウェブサイトもありますのでそちらもよろしくお願いします。
http://robotakao.jp/