Help us understand the problem. What is going on with this article?

Raspberry Pi 3でPCA9685を使う

More than 3 years have 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

  • この記事は個人的なものです。私の雇用者とは全く関係はありません。(一応つけておきます)
ttyokoyama
GDG Okayama Organizer たまにGoogle関連の技術の事を投稿しています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away