Raspberry Pi Zero + PCA9685で複数サーボモーターを動かす

2 min read読了の目安(約2100字

Raspberry Pi Zero + PCA9685 で複数サーボモーターを動かすまでのメモです。

作るもの

この動画のように Raspberry Pi Zero で複数サーボモーターを動かします。

https://twitter.com/KawamataRyo/status/1388768862116618242

準備物

PCA9685 は 16 チャンネルの PWM 出力ドライバー搭載基板です。I2C でラズパイと接続し、複数のサーボモーターや LED を操作出来ます。

https://www.switch-science.com/catalog/961/

回路図

準備

I2Cの有効化

ラズパイでは I2C 通信がデフォルトで OFF となっているので、raspi-configで I2C を有効化します。

$ sudo raspi-config

Interfacing Options > P5 I2C > Enabled で OK です。

これで有効化されたので、回路図の通り配線して I2C の番号を確認します。

$ sudo i2cdetect -y 1

以下のような出力が出れば OK です。

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: 70 -- -- -- -- -- -- --

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

通信速度が早すぎるとエラーが出るのでその対策だそうです(あまり分かってない。.)

$ sudo vi /boot/config.txt
# 末尾に追加
dtparam=i2c_baudrate=10000

モジュールのダウンロード

pip で PCA9685 のライブラリを追加します。

$ sudo pip install adafruit-pca9685

コーディング

任意のディレクトリにservo.pyを作り以下を記述します。

servo.py
#!/usr/bin/python

import Adafruit_PCA9685
import time

def move(pwm, channel):
  time.sleep(1)
  pwm.set_pwm(channel, 0, 350)
  time.sleep(1)
  pwm.set_pwm(channel, 0, 600)

pwm = Adafruit_PCA9685.PCA9685()

pwm.set_pwm_freq(60)

move(pwm, 0)
move(pwm, 4)
move(pwm, 11)

実行します。

$ python servo.py

無事それぞれのサーボモーターが動けば完成です 🎉