はじめに
PCA9685は、RGBA(Red/Green/Blue/Amber)カラーバックライト・アプリケーション用に最適化された16チャネルI2Cバス制御LEDコントローラです。各LED出力は、固定周波数で個別の12ビット分解能(4096ステップ)PWMコントローラを備えています。このコントローラーは、一般的な24 Hzから1526 Hzまでプログラム可能な周波数で動作し、デューティ・サイクルは0%から100%まで調整できるため、LEDは特定の輝度を出力するように設定できます。すべての出力は同じPWM周波数に設定されます。
PCA9685をマスターチップとする16チャンネル12ビットPWMサーボドライバは、16個のサーボを制御するのに必要なピンが2本だけなので、占有I/Oを大幅に削減できます。さらに、最大62枚のドライバボードをカスケード接続でき、合計992個のサーボを制御できます。

特徴
1. クロック内蔵のI2C制御PWMドライバを搭載。TLC5940ファミリーと異なり、マイコンに信号を送り続ける必要がなく、完全にフリーラン!
2. 2.5Vに準拠しているため、3.3Vマイコンから制御しても6V出力まで安全に駆動することができ、3.4V以上の順方向電圧で白色LEDや青色LEDを制御したい場合に便利です。
3. たった2本のピンで16個のフリーランニングPWM出力を制御可能 – 最大992個のPWM出力を制御するために62個のブレークアウトをチェーン接続することもできます。
4. 3ピンコネクタを4グループに分け、一度に16個のサーボを接続可能(サーボプラグの幅は0.1″よりわずかに広いため、0.1″穴のメスヘッダーには隣接する4個しかスタックできない。
5. 各出力の分解能は12ビットで、サーボの場合、更新レート60Hzで約4usの分解能になる。
6. サイズ:62 x 26 mm

原理
上記の紹介から、このモジュールはPCA9685チップをコントローラーとして応用していることがわかります。16チャンネルPWM値の出力を制御できます。PWM周波数とデューティサイクルを管理し、コントローラをプログラミングすることで、サーボを正確に制御することができます。
各LEDドライバ出力のターンオン時間とPWMのデューティサイクルは、LEDn_ONとLEDn_OFFレジスタを使って独立に制御できる。
LED_ON時間を409に、LED_OFF時間を1228に設定すると、PWMのデューティ・サイクルは次のようになる:
(1228-409/4096) x 100%= 20%

サーボはこのように動作する: 受信チャンネルで取り込まれたPWM信号は信号復調回路に送られ、DCオフセット電圧が生成される。次に、この電圧とポテンショメーターの電圧を比較し、その間の電圧降下をモーター駆動用集積回路に入力して、モーターを時計回りまたは反時計回りに回転させる。回転速度がある値に達すると、ポテンショメーターR0を駆動し、カスケード減速機によって回転させる。サーボはPWM信号で制御され、デューティサイクルの変化で回転先を決定する。

サーボの仕組みはこうだ: 受信チャンネルで取り込まれたPWM信号は信号復調回路に送られ、DCオフセット電圧が生成される。次に、この電圧とポテンショメーターの電圧を比較し、その間の電圧降下をモーター駆動用集積回路に入力して、モーターを時計回りまたは反時計回りに回転させる。回転速度がある値に達すると、ポテンショメーターR0を駆動し、カスケード減速機によって回転させる。サーボはPWM信号で制御され、デューティサイクルの変化で回転先を決定する。

ボードのアドレス指定

チェーンの各ボードには、固有のアドレスを割り当てる必要があります。これは、ボードの右上端にあるアドレス用はんだパッドで行います。各ボードのI2Cベースアドレスは0x40である。アドレス・ハンダ・パッドでプログラムしたバイナリ・アドレスは、I2Cベース・アドレスに追加されます。アドレス・オフセットをプログラムするには、アドレスの各2進数「1」に対応するアドレス・ジャンパを、はんだを一滴垂らしてブリッジします。

 



Board 0: Address = 0x40 Offset = binary 00000 (ジャンパー不要)
Board 1: Address = 0x41 Offset = binary 00001(上の写真のように A0 をブリッジ)
Board 2: Address = 0x42 Offset = binary 00010 (bridge A1)
Board 3: Address = 0x43 Offset = binary 00011 (bridge A0 & A1)
Board 4: Address = 0x44 Offset = binary 00100 (bridge A2)

オブジェクトの状態
アドレスを割り当てた後、各ボードに対して独立したオブジェクトをコードに記述する必要があります。以下のコードを参照してください:

/***********************************************************/
#include 
#include 

Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver(0x41);
 
void setup() {
  Serial.begin(9600);
  Serial.println("16 channel PWM test!");
 
  pwm1.begin();
  pwm1.setPWMFreq(1600);  // This is the maximum PWM frequency
 
  pwm2.begin();
  pwm2.setPWMFreq(1600);  // This is the maximum PWM frequency
}
/*************************************************************/

オブジェクトを記述したら、あとはプログラミングで好きなようにサーボを制御してください!


Raspberry PiでSG90サーボを動かす

リソース

PCA9685回路図

PCA9685_データシート

PWMサーボドライバライブラリ

Python_PCA9685マスター