PCA9624PW I2C LEDモジュール

スイッチサイエンスさんから出ているLEDモジュールの使い方のメモです。

[PCA9624PW 8ch I2C 電圧スイッチ型LEDコントローラ ピッチ変換済みモジュール](https://www.switch-science.com/catalog/2389/)
[PCA9955BTW I2C 16ch 電流源型LEDドライバ基板](https://www.switch-science.com/catalog/2676/)
[PCA9956BTW I2C 24ch 電流源型LEDドライバ基板](https://www.switch-science.com/catalog/2677/)

上記のモジュールはそれぞれ　NXP社の以下のチップを使用しているようです。
[NXP社 PCA9624PW](http://www.nxp.com/jp/products/power-management/lighting-driver-and-controller-ics/i2c-led-display-control/8-bit-fm-plus-ic-bus-100-ma-40-v-led-driver:PCA9624PW)
[NXP社 PCA9955BTW](http://www.nxp.com/jp/products/power-management/lighting-driver-and-controller-ics/i2c-led-display-control/16-channel-fm-plus-ic-bus-57-ma-20-v-constant-current-led-driver:PCA9955BTW?fsrch=1&sr=1&pageNum=1&uc=true&lang_cd=ja)
[NXP社 PCA9956BTW](http://www.nxp.com/products/interfaces/ic-bus-portfolio/ic-led-display-control/24-channel-fm-plus-ic-bus-57-ma-20-v-constant-current-led-driver:PCA9956BTW?&lang_cd=ja)

各チップはPWMによって各チャンネル独立して明るさの変更や周波数を制御することができます。
今回は、PCA9624PWを使用してみます。

参考リンク
[PCA9624PW データシート](http://cache.nxp.com/documents/data_sheet/PCA9624.pdf?fpsp=1&WT_TYPE=Data%20Sheets&WT_VENDOR=FREESCALE&WT_FILE_FORMAT=pdf&WT_ASSET=Documentation&fileExt=.pdf)
スイッチサイエンスさんがArduino用のスケッチを提供してくれていますので動作確認の参考にします。
http://trac.switch-science.com/wiki/PCA9624PW
#PCA9624PW 使い方 基本事項

- デバイスIDの確認

> デフォルトは0xC0(1100 000X)です。このアドレスはソルダージャンパー [A0 to  A6]により変更可能です。

- 接続PINの確認

PCA9624PWのピン構成はシンプルに以下のようになっていますね。
アウトプット制御 [OE]がプルアップされているので、ここをGNDに接続する点は注意です。

> - 電源 [VDD]
- グランド [Vss]
- I2C 制御 [SCL/SDA]
- アウトプット制御 [OE]
- アドレス設定のピン[A0 to  A6]
- LED出力 [LED0 to LED7]
![LED8_1.png](https://qiita-image-store.s3.amazonaws.com/0/165672/093901a2-e164-3fa3-f9da-75c17e292d6f.png)


- PCA9624PWの制御

> 以下のコントロールレジスタによってレジスタを指定してデータを書きこみします。
![LED_2.png](https://qiita-image-store.s3.amazonaws.com/0/165672/91dd6027-0e4c-d96b-c480-34047f93eca2.png)
D0 to D4でレジスタを指定、その後にデータを入力します。
レジスタ一覧は以下
![LED_3.png](https://qiita-image-store.s3.amazonaws.com/0/165672/6c302caf-f080-5034-72f7-8f64ca503652.png)

以下、動作別にメモします。

#LEDのON/OFF 制御
まずは、単純にLED0 to LED7 のON/OFFする方法です。
コマンドは以下です。
1. モード設定
`0x0000`　
2. LEDの点灯
`0x0C55`
`0x0D55`
3. LEDの消灯
`0x0C00`
`0x0D00`

<コマンド解説>

- モード設定
MODE1のレジスタアドレスは 0x00
cmd[0] = MODE1; 
cmd[1] = 0x00;      

![LED_4.png](https://qiita-image-store.s3.amazonaws.com/0/165672/13a6b4b6-49e6-fe8d-549b-fa2849022930.png)


- LEDの点灯
以下のLED0(0x0C), LED1(0x0D)レジスタで制御します。

![LED_1.png](https://qiita-image-store.s3.amazonaws.com/0/165672/36c3edab-cd76-628d-8f55-8035266afec1.png)

以下の設定の00と01で制御します。
00 LEDドライバーOFF
01 最大点灯でON
10 PWMによる光量調整ON
11 PWMによる光量調整ONとgroup dimming/blinking コントロールON

全点灯するには
cmd[0] = LEDOUT0
cmd[1] = 0x55;            //LED 3, 2, 1, 0

cmd[0] = LEDOUT1
cmd[1] = 0x55;            //LED 7, 6, 5, 4

全消灯するには
cmd[0] = LEDOUT0
cmd[1] = 0x00;            //LED 3, 2, 1, 0

cmd[0] = LEDOUT1
cmd[1] = 0x00;            //LED 7, 6, 5, 4

#LEDのPWM 制御
ここではPWMで明るさを調整します。
ON/OFFとの違いは各LEDポートの設定をPWM制御ONとして、PWMのレジスタで明るさを制御するところです。
コマンドは以下
1. モード設定
`0x0000`　
2. LEDポートの設定
`0x0CAA`
`0x0DAA`
3. LEDのPWM制御
最大で全点灯
`0x82ffffffffffffffff`
中くらいで全点灯
`0x82f0f0f0f0f0f0f0f0`
全消灯
`0x820000000000000000`

<コマンド解説>

- LEDポートの設定
LEDOUT0、LEDOUT1を以下に設定します。
10 PWMによる光量調整ON

cmd[0] = LEDOUT0
cmd[1] = 0xAA;            //LED 3, 2, 1, 0

cmd[0] = LEDOUT1
cmd[1] = 0xAA;            //LED 7, 6, 5, 4

- LEDのPWM制御
PWM0(0x02)からPWM7(0x09)のレジスタに0から256のステップで値を指定します。
ここで、レジスタのPWM0からPWM7すべてを順番に指定するのは大変なので、コントロールレジスタのAutoIncrement Flagを使用します。これを指定するとレジスタの値を自動でインクリメントして次のデータを書き込みしてもらえます。

全点灯
cmd[0] = PWM0 | 0x80; 　　 //PWM0から連続書き込み(0x80の指定)
cmd[1] = 0xFF;            //LED 0
cmd[2] = 0xFF;            //LED 1
cmd[3] = 0xFF;            //LED 2
cmd[4] = 0xFF;            //LED 3
cmd[5] = 0xFF;            //LED 4
cmd[6] = 0xFF;            //LED 5
cmd[7] = 0xFF;            //LED 6
cmd[8] = 0xFF;            //LED 7

あとはPWM値を変えると明るさを制御できます。

#LEDのブリンク制御
LEDをブリンクさせます。
ON/OFFとの違いは各LEDポートの設定をPWM制御+ブリンクONとして、GRPPWM(0x0a)とGRPFREQ(0x0b)レジスタで点灯時の明るさ、ブリンク周期を制御するところです。
コマンドは以下

1. モード設定
> `0x0125`　

2. LEDポートの設定
> `0x8CFFFF`

3. LEDのブリンク制御
> デューティサイクルを指定
`0x0a10`
ブリンク周期を指定
`0x0b10`

<コマンド解説>

- LEDモードの設定
![CP2112A_ソフトウェア6.png](https://qiita-image-store.s3.amazonaws.com/0/165672/7edb581e-53d8-bc0b-fd4a-0b10b43d1b03.png)

- LEDポートの設定
LEDOUT0、LEDOUT1を以下に設定します。
11 PWMによる光量調整ONとgroup dimming/blinking コントロールON

cmd[0] = LEDOUT0| 0x80;
cmd[1] = 0xFF;            //LED 3, 2, 1, 0
cmd[2] = 0xFF;            //LED 7, 6, 5, 4

- デューティの設定
![CP2112A_ソフトウェア7.png](https://qiita-image-store.s3.amazonaws.com/0/165672/58a6a764-ae2f-aa72-b157-999704b16c36.png)
ここで指定した値が点灯時の明るさに影響します。
点灯時の明るさは、ここで指定した値とPWM制御で指定した値で決まります。
詳細はこのあたりです↓
![CP2112A_ソフトウェア9.png](https://qiita-image-store.s3.amazonaws.com/0/165672/876fb5fa-061f-1aa1-8b6e-5b8610f9e61e.png)


- 周期の設定
![CP2112A_ソフトウェア8.png](https://qiita-image-store.s3.amazonaws.com/0/165672/97ad2794-78cc-5f38-5c0e-a775f012de43.png)
数式を参考にして決定する。
例えば1秒周期にしたければ、23(0x17)を指定する。