Changes between Initial Version and Version 1 of PCA9622DR


Ignore:
Timestamp:
Feb 4, 2016 11:02:14 PM (6 years ago)
Author:
kishida
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • PCA9622DR

    v1 v1  
     1現在販売中の[https://www.switch-science.com/catalog/2388/ PCA9622DR I2C 16ch LEDドライバ ]の使い方説明とArduino用サンプルスケッチです。
     2
     3メーカーからデータシートが公開されています。
     4
     5PCA9622はLEDを最大16個独立して光らせることができます。
     6
     7----
     8
     9== 内臓機能 ==
     10
     11商品ページより一部抜粋したものを載せます。
     12
     13 * 動作電圧 2.3V~5.5V
     14 * 16chの独立したLEDポート
     15 * LEDポートのアウトプットイネーブル機能を搭載
     16 * 各ポートはon/offおよび256段階(8bit)のPWM階調制御が可能
     17 * 各ポートの独立制御/グループ制御が可能
     18 * 基板上に、16つの赤色LEDを搭載
     19 * LED ポートは100mAの吸い込み能力
     20 * 基板には、外部ドライブ用信号ピンを搭載
     21
     22== 使い方 ==
     23
     24 本製品はI<sup>2</sup>Cで接続されます。下に実体配線図を示します。
     25
     26 [[Image(line.png,400px)]]
     27
     28 本製品にはI<sup>2</sup>C通信時のプルアップ用抵抗は実装されていません。[[BR]]
     29 ピンヘッダと合わせて各自で実装してください。
     30
     31=== 通信方法 ===
     32
     33 I<sup>2</sup>C通信のアドレスは、Arduino向けの7bit表記で0x70です。これは基板上のジャンパなどで変更できます。
     34
     35 多くののI<sup>2</sup>C通信デバイスとは若干異なり、利用にあたって注意が必要です。
     36
     37 下にデータシートより送信プロトコル図を引用します。
     38
     39 [[Image(send.png,400px)]]
     40
     41 スレーブアドレスを送信した後にデータを書き込み始めるアドレスを送信します。
     42
     43 この際、内部の自動インクリメントに関する設定を同時に送信する必要があります。
     44
     45 送信するデータは上位3bitが設定用、下位5bitが書き込み先レジスタアドレスになります。
     46
     47 下に設定表を和訳したものを載せます。
     48
     49 ||AI2||AI1||AI0||機能||
     50 ||0||0||0||自動インクリメント機能無効||
     51 ||1||0||0||全レジスタ領域に対して自動インクリメント機能有効||
     52 ||1||0||1||輝度制御レジスタに対してのみ自動インクリメント機能有効(ロールオーバーも当該レジスタ内部のみ)||
     53 ||1||1||0||点滅制御レジスタに対してのみ自動インクリメント機能有効(ロールオーバーも当該レジスタ内部のみ)||
     54 ||1||1||1||輝度制御、点滅制御レジスタに対してのみ自動インクリメント機能有効(ロールオーバーも当該レジスタ内部のみ)||
     55
     56 これ以外の設定状態は予約済みとなっているため使用しないでください。
     57
     58 例えば、初期化の際には(AI2,AI1,AI0)=(1,0,0)にして全領域に対してデータを書き込み、
     59 運用時は(AI2,AI1,AI0)=(1,0,1)にして輝度以外の状態の不用意な変更を避けるなどといった運用があります。
     60
     61 I2C通信時に送信数レジスタアドレスと、各設定に対応したビットをORにかけるなどの実装が考えられます。
     62 例についてはページ下部のサンプルスケッチを御覧ください。
     63
     64 受信に関しても、同様にインクリメントに関する設定を行ってください。
     65
     66=== 設定内容 ===
     67
     68 内臓の調光機能などの説明をします。
     69
     70 また、MODE1レジスタ内部にSLEEP機能ビットが存在しています。
     71
     72 起動時では標準で機能ONとなっているので、
     73 初期化の際にOFFにする必要があります。
     74
     75==== 調光 ====
     76
     77 LED一つごとに調光用のレジスタが8bit分が用意されています。
     78 0~255の256段階で輝度を制御できます。
     79 輝度は (レジスタ内容)/256 となります。
     80
     81 詳しくはデータシートp12ページを参照してください。
     82
     83==== 点滅 ====
     84
     85 MODE2レジスタ内部のDMBLINKビットの状態で動作が変化します。
     86 全体での点滅を有効にする際はこのビットを1にセットしてください。
     87
     88  * 0にセットされている場合
     89
     90 点滅はしません。輝度は上記の調光の際の設定が適応されます。
     91 詳しくはデータシートp13を参照してください。
     92
     93  * 1にセットされている場合
     94
     95 点滅します。点滅のデューティー比と点滅の周期を個別に設定できます。
     96
     97 デューティー比は上記調光と同じように周期の256分割単位で調整できます。
     98 周期は41msから10.73sの間で調整できます。
     99 用意されている8bitの周期用レジスタに対して
     100 (レジスタ内容+1)/24 を周期とします。
     101
     102 例えば、2秒周期で光らせるには、設定用レジスタに対して0x2F(=47)を書き込みます。
     103 詳しくはデータシートp13を参照してください。
     104
     105==== 点灯 ====
     106
     107 16個のLEDに対して個別に点灯/調光/点滅の機能のON/OFFが設定できます。
     108 各LEDに対して2bitが割り当てられてています。
     109
     110 ||1bit目||2bit目||機能||
     111 ||0||0||消灯||
     112 ||0||1||点灯/調光と点滅は無効||
     113 ||1||0||点灯/調光のみ有効||
     114 ||1||1||点灯/調光と点滅が有効||
     115
     116=== その他 ====
     117
     118 プログラム上でサブI2Cアドレスを変更することができます。
     119 サブI<sup>2</sup>Cアドレスに応答するかどうかを設定することができます。
     120
     121 よって、同じICを大量に接続しても、プログラム次第で別個に点灯を制御することができます。
     122
     123== サンプルスケッチ ==
     124
     125 Arduino用のサンプルスケッチを載せます。
     126
     127 LED1~4は点灯のみされています。
     128
     129 LED5~12は調光されて点灯されています。
     130
     131 LED13~16は調光された上で周期2秒、デューティー比50%で点灯しています。
     132
     133 {{{
     134   /*******************************************************************************
     135   // SWITCHSCIENCE wiki -- http://trac.switch-science.com/
     136   // PCA9266DR Arduino Sample
     137   *******************************************************************************/
     138   #include <Wire.h>
     139
     140   #define PCA9266DR_ADDR 0x70 // in 7bit for Arduino
     141
     142   #define MODE1 0x00
     143   #define MODE2 0x01
     144   #define PWM0 0x02
     145   #define PWM1 0x03
     146   #define PWM2 0x04
     147   #define PWM3 0x05
     148   #define PWM4 0x06
     149   #define PWM5 0x07
     150   #define PWM6 0x08
     151   #define PWM7 0x09
     152   #define PWM8 0x0A
     153   #define PWM9 0x0B
     154   #define PWM10 0x0C
     155   #define PWM11 0x0D
     156   #define PWM12 0x0E
     157   #define PWM13 0x0F
     158   #define PWM14 0x10
     159   #define PWM15 0x11
     160   #define GRPPWM 0x12
     161   #define GRPFREQ 0x13
     162   #define LEDOUT0 0x14
     163   #define LEDOUT1 0x15
     164   #define LEDOUT2 0x16
     165   #define LEDOUT3 0x17
     166   #define SUBADR1 0x18
     167   #define SUBADR2 0x19
     168   #define SUBADR3 0x1A
     169   #define ALLCALLADR 0x1B
     170
     171   #define AI_ALLDIS B00000000
     172   #define AI_ALLEN  B10000000
     173   #define AI_BRI_EN B10100000
     174   #define AI_BLK_EN B11000000
     175   #define AI_BRI_BLK_EN B11100000
     176
     177
     178
     179   void datasend(int,int,int *,int);
     180   void dataread(int,int,int *,int);
     181
     182   int ledOut[4];
     183   int ledPWM[16];
     184   int initdata[2];
     185   void setup()
     186   {
     187     Serial.begin(9600);
     188     Wire.begin();
     189
     190     // 初期化
     191     initdata[0] = B10000001;// 4bit目のデフォルトはSLEEP=1
     192     initdata[1] = B00100101;// 5bit目のDMBLNK=1で全体点滅を有効
     193     datasend(PCA9266DR_ADDR, MODE1 | AI_ALLEN, initdata, 2); // 全領域インクリメント
     194
     195     // 調光用デューティー比の設定
     196     ledPWM[4] = 0x00;
     197     ledPWM[5] = 0x01;
     198     ledPWM[6] = 0x04;
     199     ledPWM[7] = 0x10;
     200
     201     ledPWM[8] = 0x10;
     202     ledPWM[9] = 0x30;
     203     ledPWM[10] = 0x80;
     204     ledPWM[11] = 0xD0;
     205
     206     ledPWM[12] = 0xFF;
     207     ledPWM[13] = 0x70;
     208     ledPWM[14] = 0x30;
     209     ledPWM[15] = 0x10;
     210     datasend(PCA9266DR_ADDR, PWM0 | AI_ALLEN,ledPWM,16);
     211
     212     // 全体点滅の設定
     213     int grp_pwm = 0x80; // 5:5
     214     datasend(PCA9266DR_ADDR, GRPPWM,&grp_pwm,1);
     215     int grp_freq = 0x2F; // (0x2F+1)/24 秒周期 = 2秒周期
     216     datasend(PCA9266DR_ADDR, GRPFREQ,&grp_freq,1);
     217
     218
     219     // LED出力設定
     220     ledOut[0] = B01010101;  // LEDの個別調光や全体の点滅(PWM)は影響されない
     221     ledOut[1] = B10101010;  // LEDは個別調光に影響される
     222     ledOut[2] = B10101010;
     223     ledOut[3] = B11111111;  // LEDは個別調光と全体の点滅(PWM)に影響される
     224     datasend(PCA9266DR_ADDR,LEDOUT0 | AI_ALLEN,ledOut,4);
     225
     226     Serial.println("LED turned ON, PWM, etc...");
     227   }
     228
     229   void loop()
     230   {
     231     // 点滅機能はPCA9622内臓機能なのでloop部分は何もせずとも点滅します
     232   }
     233
     234   //送信用関数(デバイスアドレス,レジスタアドレス,&送信用データ,送信データ数)
     235   void datasend(int id,int reg,int *data,int datasize)
     236   {
     237     Wire.beginTransmission(id);
     238     Wire.write(reg);
     239     for(int i=0;i<datasize;i++)
     240     {
     241       Wire.write(data[i]);
     242     }
     243     Wire.endTransmission();
     244   }
     245
     246   //受信用関数(デバイスアドレス,レジスタアドレス,&受信用データ,受信データ数)
     247   void dataread(int id,int reg,int *data,int datasize)
     248   {
     249     Wire.beginTransmission(id);
     250     Wire.write(reg);
     251     Wire.endTransmission(false);
     252     Wire.requestFrom(id, datasize, false);
     253     for(int i=0;i<datasize;i++)
     254     {
     255       data[i] = Wire.read();
     256     }
     257     Wire.endTransmission(true);
     258   }
     259 }}}