以前にPCA9685を使って複数のサーボを制御する方法について扱いました。このようにPCA9685は、一般的にサーボドライバーとして利用することが多いのですが、実は複数のLEDをコントロールする際にも大変重宝します。

というわけで今回は複数のLEDをコントロールする方法を簡単なサンプルプログラムを交えてご紹介します。

スポンサーリンク




目次

  1. PCA9685の入手について
  2. PCA9685を使うための準備
  3. 動作テスト用のサンプルコード
  4. まとめ

1. PCA9685の入手について

まずは、PCA9685を入手しましょう。amazonでは互換品となりますが格安で入手可能です。自分が購入したのは下記の製品です。なんと2つで1,399円という破格の安さ。実は以前より若干値上がりしてしまったのですが、それでも一つあたり700円という破格さです。amazonの評価には不安になるものもありますが、自分が購入したものは2つとも動作的に問題ありませんでした!

国内では在庫が切れていることの多いRaspberry Pi Zero Wですが、amazonに在庫があることもあるようです。

※上記のリンクは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までいっぺんにコントロールできてしまうので、ラズパイで電子工作する場合に大変重宝します。ロボットやラジコンなど、何にでも使えますよ!