現在販売中の[https://www.switch-science.com/catalog/2388/ PCA9622DR I2C 16ch LEDドライバ ]の使い方説明とArduino用サンプルスケッチです。 メーカーからデータシートが公開されています。 PCA9622はLEDを最大16個独立して光らせることができます。 ---- == 内臓機能 == 商品ページより一部抜粋したものを載せます。 * 動作電圧 2.3V~5.5V * 16chの独立したLEDポート * LEDポートのアウトプットイネーブル機能を搭載 * 各ポートはon/offおよび256段階(8bit)のPWM階調制御が可能 * 各ポートの独立制御/グループ制御が可能 * 基板上に、16つの赤色LEDを搭載 * LED ポートは100mAの吸い込み能力 * 基板には、外部ドライブ用信号ピンを搭載 == 使い方 == 本製品はI^2^Cで接続されます。下に実体配線図を示します。 [[Image(pca9622_line.png,300px)]] 本製品にはI^2^C通信時のプルアップ用抵抗は実装されていません。[[BR]] ピンヘッダと合わせて各自で実装してください。 === 通信方法 === I^2^C通信のアドレスは、Arduino向けの7bit表記で0x70です。これは基板上のジャンパで変更できます。 多くのI^2^C通信デバイスとは若干異なり、利用にあたって注意が必要です。 下にデータシートより送信プロトコル図を引用します。 [[Image(pca9622_1.png,500px)]] スレーブアドレスを送信した後にデータを書き込み始めるアドレスを送信します。 この際、内部の自動インクリメントに関する設定を同時に送信する必要があります。 送信するデータは上位3bitが設定用、下位5bitが書き込み先レジスタアドレスになります。 下に設定表を和訳したものを載せます。 ||AI2||AI1||AI0||機能|| ||0||0||0||自動インクリメント機能無効|| ||1||0||0||全レジスタ領域に対して自動インクリメント機能有効|| ||1||0||1||輝度制御レジスタに対してのみ自動インクリメント機能有効(ロールオーバーも当該レジスタ内部のみ)|| ||1||1||0||点滅制御レジスタに対してのみ自動インクリメント機能有効(ロールオーバーも当該レジスタ内部のみ)|| ||1||1||1||輝度制御、点滅制御レジスタに対してのみ自動インクリメント機能有効(ロールオーバーも当該レジスタ内部のみ)|| これ以外の設定状態は予約済みとなっているため使用しないでください。 例えば、初期化の際には(AI2,AI1,AI0)=(1,0,0)にして全領域に対してデータを書き込み、 運用時は(AI2,AI1,AI0)=(1,0,1)にして輝度以外の状態の不用意な変更を避けるなどといった運用があります。 I^2^C通信時に送信数レジスタアドレスと、各設定に対応したビットをORにかけるなどの実装が考えられます。 例についてはページ下部のサンプルスケッチを御覧ください。 受信に関しても、同様にインクリメントに関する設定を行ってください。 === 設定内容 === 内臓の調光機能などの説明をします。 また、MODE1レジスタ内部にSLEEP機能ビットが存在しています。 起動時では標準で機能ONとなっているので、 初期化の際にOFFにする必要があります。 ==== 調光 ==== LED一つごとに調光用のレジスタが8bit分が用意されています。 0~255の256段階で輝度を制御できます。 輝度は (レジスタ内容)/256 となります。 詳しくはデータシートp12ページを参照してください。 ==== 点滅 ==== MODE2レジスタ内部のDMBLINKビットの状態で動作が変化します。 全体での点滅を有効にする際はこのビットを1にセットしてください。 * 0にセットされている場合 点滅はしません。輝度は上記の調光の際の設定が適応されます。 詳しくはデータシートp13を参照してください。 * 1にセットされている場合 点滅します。点滅のデューティー比と点滅の周期を個別に設定できます。 デューティー比は上記調光と同じように周期の256分割単位で調整できます。 周期は41msから10.73sの間で調整できます。 用意されている8bitの周期用レジスタに対して (レジスタ内容+1)/24 を周期とします。 例えば、2秒周期で光らせるには、設定用レジスタに対して0x2F(=47)を書き込みます。 詳しくはデータシートp13を参照してください。 ==== 点灯 ==== 16個のLEDに対して個別に点灯/調光/点滅の機能のON/OFFが設定できます。 各LEDに対して2bitが割り当てられてています。 ||1bit目||2bit目||機能|| ||0||0||消灯|| ||0||1||点灯/調光と点滅は無効|| ||1||0||点灯/調光のみ有効|| ||1||1||点灯/調光と点滅が有効|| === その他 ==== プログラム上でサブI^2^Cアドレスを変更することができます。 サブI^2^Cアドレスに応答するかどうかを設定することができます。 よって、同じICを大量に接続しても、プログラム次第で別個に点灯を制御することができます。 == サンプルスケッチ == Arduino用のサンプルスケッチを載せます。 LED1~4は点灯のみされています。 LED5~12は調光されて点灯されています。 LED13~16は調光された上で周期2秒、デューティー比50%(=1秒ごとにON/OFF繰り返し)で点灯しています。 {{{ /******************************************************************************* // SWITCHSCIENCE wiki -- http://trac.switch-science.com/ // PCA9266DR Arduino Sample *******************************************************************************/ #include #define PCA9266DR_ADDR 0x70 // in 7bit for Arduino #define MODE1 0x00 #define MODE2 0x01 #define PWM0 0x02 #define PWM1 0x03 #define PWM2 0x04 #define PWM3 0x05 #define PWM4 0x06 #define PWM5 0x07 #define PWM6 0x08 #define PWM7 0x09 #define PWM8 0x0A #define PWM9 0x0B #define PWM10 0x0C #define PWM11 0x0D #define PWM12 0x0E #define PWM13 0x0F #define PWM14 0x10 #define PWM15 0x11 #define GRPPWM 0x12 #define GRPFREQ 0x13 #define LEDOUT0 0x14 #define LEDOUT1 0x15 #define LEDOUT2 0x16 #define LEDOUT3 0x17 #define SUBADR1 0x18 #define SUBADR2 0x19 #define SUBADR3 0x1A #define ALLCALLADR 0x1B #define AI_ALLDIS B00000000 #define AI_ALLEN B10000000 #define AI_BRI_EN B10100000 #define AI_BLK_EN B11000000 #define AI_BRI_BLK_EN B11100000 void datasend(int,int,int *,int); void dataread(int,int,int *,int); int ledOut[4]; int ledPWM[16]; int initdata[2]; void setup() { Serial.begin(9600); Wire.begin(); // 初期化 initdata[0] = B10000001;// 4bit目のデフォルトはSLEEP=1 initdata[1] = B00100101;// 5bit目のDMBLNK=1で全体点滅を有効 datasend(PCA9266DR_ADDR, MODE1 | AI_ALLEN, initdata, 2); // 全領域インクリメント // 調光用デューティー比の設定 ledPWM[4] = 0x00; ledPWM[5] = 0x01; ledPWM[6] = 0x04; ledPWM[7] = 0x10; ledPWM[8] = 0x10; ledPWM[9] = 0x30; ledPWM[10] = 0x80; ledPWM[11] = 0xD0; ledPWM[12] = 0xFF; ledPWM[13] = 0x70; ledPWM[14] = 0x30; ledPWM[15] = 0x10; datasend(PCA9266DR_ADDR, PWM0 | AI_ALLEN,ledPWM,16); // 全体点滅の設定 int grp_pwm = 0x80; // 5:5 datasend(PCA9266DR_ADDR, GRPPWM,&grp_pwm,1); int grp_freq = 0x2F; // (0x2F+1)/24 秒周期 = 2秒周期 datasend(PCA9266DR_ADDR, GRPFREQ,&grp_freq,1); // LED出力設定 ledOut[0] = B01010101; // LEDの個別調光や全体の点滅(PWM)は影響されない ledOut[1] = B10101010; // LEDは個別調光に影響される ledOut[2] = B10101010; ledOut[3] = B11111111; // LEDは個別調光と全体の点滅(PWM)に影響される datasend(PCA9266DR_ADDR,LEDOUT0 | AI_ALLEN,ledOut,4); Serial.println("LED turned ON, PWM, etc..."); } void loop() { // 点滅機能はPCA9622内臓機能なのでloop部分は何もせずとも点滅します } //送信用関数(デバイスアドレス,レジスタアドレス,&送信用データ,送信データ数) void datasend(int id,int reg,int *data,int datasize) { Wire.beginTransmission(id); Wire.write(reg); for(int i=0;i