以前にPCA9685を使って複数のサーボを制御する方法について扱いました。このようにPCA9685は、一般的にサーボドライバーとして利用することが多いのですが、実は複数のLEDをコントロールする際にも大変重宝します。
というわけで今回は複数のLEDをコントロールする方法を簡単なサンプルプログラムを交えてご紹介します。
目次
- PCA9685の入手について
- PCA9685を使うための準備
- 動作テスト用のサンプルコード
- まとめ
1. PCA9685の入手について
まずは、PCA9685を入手しましょう。amazonでは互換品となりますが格安で入手可能です。自分が購入したのは下記の製品です。なんと2つで1,399円という破格の安さ。実は以前より若干値上がりしてしまったのですが、それでも一つあたり700円という破格さです。amazonの評価には不安になるものもありますが、自分が購入したものは2つとも動作的に問題ありませんでした!
VKLSVAN 2個 PCA9685 16チャンネル 12-ビット PWM Servo モーター ドライバー IIC モジュール Arduinoと互換
国内では在庫が切れていることの多いRaspberry Pi Zero Wですが、amazonに在庫があることもあるようです。
Raspberry Pi Zero W – ヘッダー ハンダ付け済み – ラズベリー・パイ ゼロ W ワイヤレス
※上記のリンクはamazonへのリンクとなっています。
また今回紹介するサンプル回路を動かすには複数のLEDが必要になりますが、3V(15mA)で使用可能な、一般的なLEDを使用します。
2. PCA9685を使うための準備
I2Cの有効化とAdafruitライブラリの入手について
PCA9685を入手できたら、今度はRaspberry Pi側の準備です。PCA9685はラズパイとシリアル通信(I2C)で接続する必要があるので、ラズパイ側の設定でI2Cが有効になっていなければなりません。ちなみに「I2C」は「アイ・スクエアド・シー」または「アイ・アイ・シー」と読みます。
加えて、PCA9685を使うには本家AdafruitのPythonライブラリが必要となります。amazonで入手できる互換品もこのライブラリに完全互換していますので、そのまま使えます。
ラズパイのI2Cの有効化とライブラリの導入方法についてはこちらの『サーボドライバー「PCA9685」を使って、複数の小型サーボ(SG90等)をRaspberry Piで動かす方法』という記事で解説していますので参照してみてください。
テスト用回路について
さて、ラズパイのI2Cの有効化とライブラリの入手が完了したら、早速回路を組んでみましょう。

今回はあくまでテスト的な回路として組んでみたので、LEDは2つしか繋げてませんが、PCA9685は0〜15番まで16のPWM出力ポートがありますので、最大16個のLEDを繋げてのコントロールが可能です。もちろんサーボモーターとの混在も可能ですので、様々な工作に使えますよ。
ちなみに、サーボモーターを混在させる場合は、サーボ用電源(V+)に電池やバッテリーなどの電源を接続します。サーボモーターを繋げる方法については前述の『サーボドライバー「PCA9685」を使って、複数の小型サーボ(SG90等)をRaspberry Piで動かす方法』という記事を参照してみてください。
また「LEDに抵抗は繋げなくていいの?」と思われた方もおられるかもしれませんが、PCA9685のPWM出力ポートには220Ωの抵抗がついています。この回路ではラズパイ側の3.3V出力を電源(VCC)としていますが、220Ωの抵抗を通せば15mA(= 3.3 / 220 * 1,000)ということになるので、一般的なLEDであれば、概ね抵抗なしの直結で問題ないです。
3. 動作テスト用のサンプルコード
回路が組めたら、今度はサンプルコードを用意しましょう。こんな感じで準備してみました。
# -*- coding: utf-8 -*-
import Adafruit_PCA9685
import time
# 設定周波数(Hz)
SET_FREQ = 50
# LED接続ポート設定
LED_0 = 0
LED_1 = 1
# 点滅設定
WINKER_INTERVAL = 1.0
winker_status = 'on'
# Adafruit_PCA9685初期化
PCA9685 = Adafruit_PCA9685.PCA9685()
PCA9685.set_pwm_freq(SET_FREQ)
try:
PCA9685.set_pwm(LED_0, 0, 4095)
while True:
if winker_status == 'on':
PCA9685.set_pwm(LED_1, 0, 4095)
time.sleep(WINKER_INTERVAL)
winker_status = 'off'
elif winker_status == 'off':
PCA9685.set_pwm(LED_1, 0, 0)
time.sleep(WINKER_INTERVAL)
winker_status = 'on'
except KeyboardInterrupt:
PCA9685.set_pwm(LED_0, 0, 0)
PCA9685.set_pwm(LED_1, 0, 0)
print("KeyboardInterrupt")
pass
このサンプルコードを実行すると0番ポートのLEDは点灯、1番ポートのLEDは1秒ごとに点滅を繰り返します。プログラムを終了させたい場合は「Ctrl + C」を使用します。
このコードの複数箇所で使用している「set_pwm」という関数には、3つの引数、チャンネル番号、PWM信号の開始値、PWM信号の終了値を渡します。第二引数は開始値ですから、通常は「0」を指定しますが、第三引数には0〜4095までのいずれかの値を渡してやります。なぜ、0〜4095の4096段階で渡すかというと、PCA9685の出力が12bit(2の12乗)だからです。ひとまず難しく考えず100%の明るさで点灯させたいなら「4095」、50%なら「2047」、25%なら「1023」のように覚えておけばよいと思います。
参考:
Adafruit 16 Channel Servo Driver with Raspberry Pi Library Reference
コードが準備できたら、早速実行してみましょう。動作したでしょうか?

3. まとめ
さて今回は一般的にはサーボドライバーとして使用するPCA9685を使って複数のLEDをコントロールする方法について扱ってみました。PCA9685は16個のPWM出力ポートがあるので、複数のサーボモーター、また今回のように複数のLEDまでいっぺんにコントロールできてしまうので、ラズパイで電子工作する場合に大変重宝します。ロボットやラジコンなど、何にでも使えますよ!