RaspberryPi

Raspberry Pi 3でPCA9685を使う

More than 1 year has passed since last update.

最近、プログラミングができていないのですが、仕事で必要になったので、メモしておきます。

きっかけ

仕事でRaspberryPi 3を使って、サーボモータをたくさん動かさないといけなくなったのですが、標準だとPWMが出せるピンが1本しかないために仕方なく、サーボモータドライバのPCA9685を使うことにしました。

本当はGoでやりたいところですが、GPIOを使った部分のところがPythonが信頼度が高そうなので、ひとまず、Python教に入信しようと思いますw

i2cのセットアップ

Raspberry Pi標準だとi2cが無効になっているため、Raspi-Configで有効にします。

Raspi-Config

コマンド
$ sudo raspi-config

Interfacing Optionsを選択する。(jessieより前だと、Advanced Optionsにあったみたい?)
raspiconfig1.png

I2Cを選択する。
raspiconfig2.png

はいを選択する。(いいえを選択すると無効になる…)
raspiconfig3.png

/boot/config.txtに通信速度の設定を追加

コマンド
$ sudo vi /boot/config.txt

初期値は100000ですが、通信速度が早すぎてエラーメッセージが出力されるので、最下行か、i2c関連の設定付近に以下を追記する。

dtparam=i2c_baudrate=10000

モータドライバのライブラリのセットアップ

Adafruitの公式リポジトリからソースコードをダウンロード

コマンド
$ git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git

$ git clone https://github.com/adafruit/Adafruit_Python_GPIO.git

$ git clone https://github.com/adafruit/Adafruit_Python_PureIO.git

PCA9685のライブラリだけをダウンロードすれば使えるのかと思っていましたが、ファイルがないというエラーメッセージが出ました。

インストール

それぞれのライブラリで以下のコマンドを実行する。

コマンド
$ cd Adafruit_Python_PCA9685
$ sudo python setup.py install
$ cd ../Adafruit_Python_GPIO
$ sudo python setup.py install
$ cd ../Adafruit_Python_PureIO
$ sudo python setup.py install

動作確認

コマンドで動作確認

まだ、意味はわかっていないのですが、i2cのポートの動作確認ができるようです。

コマンド
$ sudo i2cdetect -y 1

Pythonで動作確認

できれば、Python3が使いたかった…。

ポート1とポート2にサーボモータ(SG92R)を挿して動作確認しました。ブレッドボードにボタンを2個付けて、それぞれを押すと動作しました。

sample.py
#!/usr/bin/python

import RPi.GPIO as GPIO
import time
import Adafruit_PCA9685

GPIO.setmode(GPIO.BOARD)

GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(60)

try:
    while True:
        sw1 = GPIO.input(16)
        sw2 = GPIO.input(18)

        if sw1 == 1:
            pwm.set_pwm(1, 0, 600)
        else:
            pwm.set_pwm(1, 0, 375)

        if sw2 == 1:
            pwm.set_pwm(2, 0, 600)
        else:
            pwm.set_pwm(2, 0, 375)


except KeyboardInterrupt:
    pass

参考サイト

Disclaimer

  • この記事は個人的なものです。私の雇用者とは全く関係はありません。(一応つけておきます)