サイトアイコン KOKENSHAの技術ブログ

RaspberryPi+Python+PCA9685で複数のサーボを制御する!簡単!

電子工作で特にちょっとロボットを作りたい場合

複数のサーボを動かしたい場合がありますよね。

複数のサーボを動かすにはいくつかの方法があります。

[amazonjs asin=”B0773YVGSH” locale=”JP” title=”SparkFun Wireless Motor Driver Shield”]

まず一番目の方法をご紹介します!

RaspberryPi+Python+PCA9685で複数のサーボを制御する方法、とても簡単です!

目次

ハードウェア

①まずは、主役のPCA9685です!

こちら!

緑のソケットは、複数の大出力サーボを動かすときに電力を補強するときに使います。

PCA9685がPythonでRaspberryPiで簡単にサーボを動かせますが

留意点として、ACモーターと100% デジタルサーボは動作しないことです、気をつけてください。

②もちろんRaspberry Pi

蓋が閉めていない状態のRaspberryPi 3Bです!

電源を繋げた状態

今回は、便利な虹リボンケーブルもを一緒に使ってみます!笑

[amazonjs asin=”B074H1FNTJ” locale=”JP” title=”Kuman Raspberry Piに適用キット 400MB-102はんだなしブレッドボード+GPIO T型拡張ボード+2in1虹リボンケーブル+35*ジャンパケーブルワイヤ ラズベリーパイ Raspberry Pi 3 / Zero/ zero W/ 2 / B+ / A+ K80″]

③動かすサーボたち!

④ブレッドボード二枚

全体の構成はこんな感じです。

 

プログラム

まず、RaspberryPiにデフォルトでPython2.7が入っていると思います。それをそのまま使います。

次は、PCA9685を「動かす」プログラムですが

Adafruitsのサンプルプログラムを今回試してみたいと思います。

ソースコードはこちらです。

https://github.com/adafruit/Adafruit_Python_PCA9685

今回は、その中にあるsimpletest.pyを動かしてみます。

プログラムの中身はこちらです。

# Simple demo of of the PCA9685 PWM servo/LED controller library.
# This will move channel 0 from min to max position repeatedly.
# Author: Tony DiCola
# License: Public Domain
from __future__ import division
import time

# Import the PCA9685 module.
import Adafruit_PCA9685


# Uncomment to enable debug output.
#import logging
#logging.basicConfig(level=logging.DEBUG)

# Initialise the PCA9685 using the default address (0x40).
pwm = Adafruit_PCA9685.PCA9685()

# Alternatively specify a different address and/or bus:
#pwm = Adafruit_PCA9685.PCA9685(address=0x41, busnum=2)

# Configure min and max servo pulse lengths
servo_min = 150  # Min pulse length out of 4096
servo_max = 600  # Max pulse length out of 4096

# Helper function to make setting a servo pulse width simpler.
def set_servo_pulse(channel, pulse):
    pulse_length = 1000000    # 1,000,000 us per second
    pulse_length //= 60       # 60 Hz
    print('{0}us per period'.format(pulse_length))
    pulse_length //= 4096     # 12 bits of resolution
    print('{0}us per bit'.format(pulse_length))
    pulse *= 1000
    pulse //= pulse_length
    pwm.set_pwm(channel, 0, pulse)

# Set frequency to 60hz, good for servos.
pwm.set_pwm_freq(60)

print('Moving servo on channel 0, press Ctrl-C to quit...')
while True:
    # Move servo on channel O between extremes.
    # ここ少し改造しました。今回はサーボ8個を動かしてみます。
    for i in range(8):
        pwm.set_pwm(i, 0, servo_min)
        time.sleep(1)
        pwm.set_pwm(i, 0, servo_max)
        time.sleep(1)

必ず、こちらの手順を済ましてからsimple.pyを実行してください。

sudo apt-get install git build-essential python-dev
cd ~
git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git
cd Adafruit_Python_PCA9685
sudo python setup.py install

上のプログラムにも書いてありますが、少し改造したところがあります。

simpletest.pyそのままですと、サーボを一台しか動かすことしかしないです。

今回、8個サーボを接続しましたので、全部動かしてみたいですから

この部分を、こういうふうに書き直しました。

while True:
    # Move servo on channel O between extremes.
    # ここ少し改造しました。今回はサーボ8個を動かしてみます。
    for i in range(8):
        pwm.set_pwm(i, 0, servo_min)
        time.sleep(1)
        pwm.set_pwm(i, 0, servo_max)
        time.sleep(1)

 

接続

配線は下記の感じです!

今回は、同時に、3.3Vと5V 両方を使います。

3.3VはPCA9683の電源供給です。

5Vはサーボの駆動電源となります。絶対間違い内容に接続してください!

5VをPCA9685に接続すると、PCA9685ボードが壊れる恐れがあります!!

PCA9685 GND -> Raspberry Pi GND

PCA9685 VCC-> Raspberry Pi  3V3 (大事!)

PCA9685 V+ -> Raspberry Pi 5V サーボ駆動電源

PCA9685 SDA -> Raspberry Pi SDA

PCA9685 SCL -> Raspberry Pi SCL

今回は、サーボを8個を繋げてみました。

PCA9685は最大で16個サーボを繋げることができます。

さらに、PCA9685を芋づる式で繋げていけば、A0~A5のアドレスを設定することにより最大62ユニット(992チャンネル)を連結することが可能です。

見事に、動きました!

まとめ

いかがですか?

今回はRaspberryPiとPythonとPCA9685で複数のサーボを動かす方法をご紹介しましたが

もちろん、これで終わりではありません。

これから、機構を作ったり、サーボの協調練どうすれば、もっと「意味のある」動作が設計できますね。

ロボットにするのも良いですし、扉を開閉させるのもいいですし、何か遠隔操作もできますね。

Pythonのウェブアプリケーションフレームワークと組めば、ウェブ上で複数サーボを操作するものももちろん、作れます。

Pythonフレームワーク比較!2018版

さらに、色々実験してみたくなりますよね!笑。

では、またそのうち!

[amazonjs asin=”B01D1D0CX2″ locale=”JP” title=”HiLetgo PCA9685 16チャンネル 12-ビット PWM Servo モーター ドライバー IIC モジュール Arduinoに対応 ロボット”][amazonjs asin=”B010DNO4X2″ locale=”JP” title=”PCA9685搭載16チャネル PWM/サーボ ドライバー (I2C接続)”]

[amazonjs asin=”B01NAHBSUD” locale=”JP” title=”Raspberry Pi 3 Model B V1.2 (日本製) 国内正規代理店品”]

[amazonjs asin=”B00VUJYNWG” locale=”JP” title=”デジタル・マイクロサーボ SG90 (5個)”]

モバイルバージョンを終了