Changes between Initial Version and Version 1 of PCA9626B


Ignore:
Timestamp:
Feb 12, 2016 6:38:30 PM (6 years ago)
Author:
kishida
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • PCA9626B

    v1 v1  
     1= LEDスティックボード PCA9626B の使い方=
     2
     3[https://www.switch-science.com/catalog/2540/ PCA9626B LEDスティックボード]の使い方説明とArduino用サンプルスケッチです。
     4
     5メーカーから[http://www.nxp.com/documents/data_sheet/PCA9626.pdf データシート(pdf)]が公開されています。
     6
     7PCA9626BはLEDを最大24個独立して光らせることができます。
     816個のLEDを制御できる類似IC([https://www.switch-science.com/catalog/2388/ PCA9622DR I2C 16ch LEDドライバ基板])もあります。
     9
     10本製品ではフルカラーLEDに3chずつ接続し8個のフルカラーLEDを自由に制御できます。
     11
     12
     13----
     14
     15== 内蔵機能 ==
     16
     17商品ページより一部抜粋したものを載せます。
     18
     19 * 動作電圧 3.3V~5.5V
     20 * 24ch の独立したLEDポート
     21 * LEDポートのアウトプットイネーブル機能を搭載
     22 * 各ポートはon/offおよび256段階(8bit)のPWM階調制御が可能
     23 * 各ポートの独立制御/グループ制御が可能
     24 * 基板上に、8つのフルカラーLED を搭載
     25
     26== 使い方 ==
     27
     28 本製品はI^2^Cで接続されます。下に実体配線図を示します。
     29
     30 [[Image(pca9626_line.png,300px)]]
     31
     32 本製品にはI^2^C通信時のプルアップ用抵抗は実装されていません。[[BR]]
     33 ピンヘッダと合わせて各自で実装してください。[[BR]]
     34 プルアップ抵抗はR17とR18に1608サイズの10kΩ程度のチップ抵抗をはんだ付けしてください。[[BR]]
     35 また、ArduinoのWireライブラリを使用する場合は内蔵プルアップが有効になりますので、プルアップ抵抗を省略してもかまいません。
     36
     37=== 通信方法 ===
     38
     39 I^2^C通信のアドレスは、Arduino向けの7bit表記で0x40です。これは基板上のジャンパ(SJ7~SJ11)で変更できます。
     40
     41 [[Image(image-1447125138171.jpg,300)]]
     42
     43 下にデータシートより送信プロトコル図を引用します。
     44
     45 [[Image(pca9626_1.png,500px)]]
     46
     47 スレーブアドレスを送信した後にデータを書き込み始めるアドレスを送信します。
     48
     49 この際、内部の自動インクリメントに関する設定を同時に送信する必要があります。
     50
     51 送信するデータは上位1bit(AIF)が設定用、下位6bitが書き込み先レジスタアドレスになります。
     52
     53 下に設定表を和訳したものを載せます。
     54
     55 ||AIF||AI1||AI0||機能||
     56 ||0||0||0||自動インクリメント機能無効||
     57 ||1||0||0||全レジスタ領域に対して自動インクリメント機能有効||
     58 ||1||0||1||輝度制御レジスタに対してのみ自動インクリメント機能有効(ロールオーバーも当該レジスタ内部のみ)||
     59 ||1||1||0||CHASEレジスタに対してのみ自動インクリメント機能有効(ロールオーバーも当該レジスタ内部のみ)||
     60 ||1||1||1||輝度制御、点滅制御レジスタに対してのみ自動インクリメント機能有効(ロールオーバーも当該レジスタ内部のみ)||
     61
     62 この際、AI1およびAI0はMODE1レジスタの内容が適応されます。
     63
     64 これ以外の設定状態は予約済みとなっているため使用しないでください。
     65
     66 例えば、初期化の際には(AIF,AI1,AI0)=(1,0,0)にして全領域に対してデータを書き込み、
     67 運用時はMODE1レジスタ内部の(AI1,AI0)を(0,1)にして輝度以外の状態の不用意な変更を避けるなどといった運用があります。
     68
     69 I^2^C通信時に送信数レジスタアドレスと、各設定に対応したビットをORにかけるなどの実装が考えられます。
     70 例についてはページ下部のサンプルスケッチを御覧ください。
     71
     72 受信に関しても、同様にインクリメントに関する設定を行ってください。
     73
     74=== 設定内容 ===
     75
     76 内蔵の調光機能などの説明をします。
     77
     78 また、MODE1レジスタ内部にSLEEP機能ビットが存在しています。
     79
     80 起動時では標準で機能ONとなっているので、
     81 初期化の際にOFFにする必要があります。
     82
     83==== 調光 ====
     84
     85 LED一つごとに調光用のレジスタが8bit分が用意されています。
     86 0~255の256段階で輝度を制御できます。
     87 輝度は (レジスタ内容)/256 となります。
     88
     89 詳しくはデータシートp13ページを参照してください。
     90
     91==== 点滅 ====
     92
     93 MODE2レジスタ内部のDMBLINKビットの状態で動作が変化します。
     94 全体での点滅を有効にする際はこのビットを1にセットしてください。
     95
     96  * 0にセットされている場合
     97
     98 点滅はしません。輝度は上記の調光の際の設定が適応されます。
     99 詳しくはデータシートp14を参照してください。
     100
     101  * 1にセットされている場合
     102
     103 点滅します。点滅のデューティー比と点滅の周期を個別に設定できます。
     104
     105 デューティー比は上記調光と同じように周期の256分割単位で調整できます。
     106 周期は41msから10.73sの間で調整できます。
     107 用意されている8bitの周期用レジスタに対して
     108 (レジスタ内容+1)/24 を周期とします。
     109
     110 例えば、2秒周期で光らせるには、設定用レジスタに対して0x2F(=47)を書き込みます。
     111 詳しくはデータシートp14を参照してください。
     112
     113==== CHASE ====
     114 
     115 LEDの点灯を一括で制御できる機能です。
     116 例えば右端から順番に点灯させたり、両端から中心に向かって順番に光らせたりなどといった事が可能です。
     117
     118 ただし本製品ではフルカラーLEDに接続されているので、色をつけたまま順番に光らせるには工夫が必要となります。
     119
     120 詳しくはデータシートp15~21を参照してください。
     121
     122==== 点灯 ====
     123
     124 24個のLEDに対して個別に点灯/調光/点滅の機能のON/OFFが設定できます。
     125 各LEDに対して2bitが割り当てられてています。
     126
     127 この機能はCHASE機能と独立して働きます。
     128 
     129
     130 ||2bit目||1bit目||機能||
     131 ||0||0||消灯||
     132 ||0||1||点灯/調光と点滅は無効||
     133 ||1||0||点灯/調光のみ有効||
     134 ||1||1||点灯/調光と点滅が有効||
     135
     136==== その他 ====
     137
     138 プログラム上でサブI^2^Cアドレスを変更することができます。
     139 サブI^2^Cアドレスに応答するかどうかを設定することができます。
     140
     141 よって、同じICを大量に接続しても、プログラム次第で別個に点灯を制御することができます。
     142
     143== サンプルスケッチ ==
     144
     145 Arduino用のサンプルスケッチを載せます。
     146 
     147 10秒間、8つのフルカラーLEDが2秒周期で点滅します。
     148
     149 その後、内蔵のCHASEモードを利用したデモに入ります。
     150
     151 以上の動作を繰り返します。
     152 {{{
     153/*******************************************************************************
     154// SWITCHSCIENCE wiki -- http://trac.switch-science.com/
     155// PCA9626B Arduino Sample
     156*******************************************************************************/
     157#include <Wire.h>
     158
     159#define PCA9626B_ADDR 0x40 // in 7bit for Arduino
     160
     161
     162#define MODE1 0x00
     163#define MODE2 0x01
     164#define PWM0 0x02
     165#define PWM1 0x03
     166#define PWM2 0x04
     167#define PWM3 0x05
     168#define PWM4 0x06
     169#define PWM5 0x07
     170#define PWM6 0x08
     171#define PWM7 0x09
     172#define PWM8 0x0A
     173#define PWM9 0x0B
     174#define PWM10 0x0C
     175#define PWM11 0x0D
     176#define PWM12 0x0E
     177#define PWM13 0x0F
     178#define PWM14 0x10
     179#define PWM15 0x11
     180#define PWM16 0x12
     181#define PWM17 0x13
     182#define PWM18 0x14
     183#define PWM19 0x15
     184#define PWM20 0x16
     185#define PWM21 0x17
     186#define PWM22 0x18
     187#define PWM23 0x19
     188#define GRPPWM 0x1A
     189#define GRPFREQ 0x1B
     190#define CHASE 0x1C
     191#define LEDOUT0 0x1D
     192#define LEDOUT1 0x1E
     193#define LEDOUT2 0x1F
     194#define LEDOUT3 0x20
     195#define LEDOUT4 0x21
     196#define LEDOUT5 0x22
     197#define SUBADR1 0x23
     198#define SUBADR2 0x24
     199#define SUBADR3 0x25
     200#define ALLCALLADR 0x26
     201
     202#define AI_ALLEN  B10000000
     203
     204#define AI_BRI_EN B00100000
     205#define AI_CHASE_EN B01000000
     206
     207int chase  =0x00;
     208int chaseMode;
     209
     210int dmblink_off = B00000101;
     211int dmblink_on = B00100101;
     212
     213
     214void datasend(int,int,int *,int);
     215void dataread(int,int,int *,int);
     216
     217int ledOut[6];
     218int ledPWM[24];
     219int initdata[2];
     220void setup()
     221{
     222  Serial.begin(9600);
     223  Wire.begin();
     224
     225  // 初期化
     226  initdata[0] = B10000001;// 4bit目のデフォルトはSLEEP=1
     227  initdata[1] = B00000101;// 5bit目のDMBLNK=1で全体点滅を有効/インクリメント機能ONの時は全レジスタ領域が対象
     228  datasend(PCA9626B_ADDR, MODE1 | AI_ALLEN, initdata, 2); // 全領域インクリメント
     229
     230  // 調光用デューティー比の設定
     231  ledPWM[0]  = 0xFF; // Blue
     232  ledPWM[1]  = 0xFF; // Green
     233  ledPWM[2]  = 0xFF; // Red
     234
     235  ledPWM[3] = 0x00; // Blue
     236  ledPWM[4] = 0xFF; // Green
     237  ledPWM[5] = 0x00; // Red
     238
     239  ledPWM[6] = 0xFF; // Blue
     240  ledPWM[7] = 0x00; // Green
     241  ledPWM[8] = 0x00; // Red
     242
     243  ledPWM[9] = 0x00; // Blue
     244  ledPWM[10] = 0x00; // Green
     245  ledPWM[11] = 0xFF; // Red
     246
     247  ledPWM[12] = 0xFF; // Blue
     248  ledPWM[13] = 0xFF; // Green
     249  ledPWM[14] = 0x00; // Red
     250
     251  ledPWM[15] = 0x00; // Blue
     252  ledPWM[16] = 0xFF; // Green
     253  ledPWM[17] = 0xFF; // Red
     254
     255  ledPWM[18] = 0xFF; // Blue
     256  ledPWM[19] = 0x00; // Green
     257  ledPWM[20] = 0xFF; // Red
     258
     259  ledPWM[21] = 0xFF; // Blue
     260  ledPWM[22] = 0xFF; // Green
     261  ledPWM[23] = 0xFF; // Red
     262
     263  datasend(PCA9626B_ADDR, PWM0 | AI_ALLEN,ledPWM,24);
     264
     265  // 全体点滅の設定
     266  int grp_pwm = 0x80; // 5:5
     267  datasend(PCA9626B_ADDR, GRPPWM,&grp_pwm,1);
     268  int grp_freq = 0x2F; // (0x2F+1)/24 秒周期 = 2秒周期
     269  datasend(PCA9626B_ADDR, GRPFREQ,&grp_freq,1);
     270
     271  // CHASEモード初期化
     272  int chase_init = 0x00;
     273  datasend(PCA9626B_ADDR, CHASE,&chase_init,1);
     274
     275  // LED出力設定
     276  //ledOut[0]= B01010101;  // LEDは個別調光に影響されない、つまり全色点灯し白色に見える
     277  ledOut[0]= B11111111;  // LEDは個別調光と全体の点滅(PWM)に影響される
     278  ledOut[1] = B11111111; // よって色の制御ができる
     279  ledOut[2] = B11111111;
     280  ledOut[3] = B11111111;
     281  ledOut[4] = B11111111;
     282  ledOut[5] = B11111111;
     283  datasend(PCA9626B_ADDR,LEDOUT0 | AI_ALLEN,ledOut,6);
     284
     285  Serial.println("LED turned ON, PWM, etc...");
     286}
     287
     288void loop()
     289{
     290  switch(chaseMode)
     291  {
     292    case 1: // CHASE機能有効
     293        // 全体点滅機能とCHASE機能は同時になされます
     294        // 見やすくするためにDMBLNKをOFFにしておきます
     295        datasend(PCA9626B_ADDR,MODE2, &dmblink_off,1);
     296
     297        // 調光機能も有効になっているので見やすくするために全LEDを強制点灯させます
     298        ledOut[0] = B01010101;
     299        ledOut[1] = B01010101;
     300        ledOut[2] = B01010101;
     301        ledOut[3] = B01010101;
     302        ledOut[4] = B01010101;
     303        ledOut[5] = B01010101;
     304        datasend(PCA9626B_ADDR,LEDOUT0 | AI_ALLEN,ledOut,6);
     305
     306        // CHSEモードの点灯の種類をすべて表示します
     307        for(chase=0;chase<0x90;chase++)
     308        {
     309          datasend(PCA9626B_ADDR,CHAS,&chase,1);
     310          delay(500);
     311        }
     312        // CHASEモード無効化
     313        chaseMode = 0;
     314        break;
     315
     316    case 0: // CHASE機能無効
     317        // LEDの調光機能、全体点灯をONにし、色の制御を有効にします
     318        datasend(PCA9626B_ADDR,MODE2, &dmblink_on,1);
     319        ledOut[0] = B11111111;
     320        ledOut[1] = B11111111;
     321        ledOut[2] = B11111111;
     322        ledOut[3] = B11111111;
     323        ledOut[4] = B11111111;
     324        ledOut[5] = B11111111;
     325        datasend(PCA9626B_ADDR,LEDOUT0 | AI_ALLEN,ledOut,6);
     326        // 点滅機能はPCA9626内蔵機能なのでloop部分は何もせずとも点滅します
     327        delay(10000);
     328        // CHASEモード有効化
     329        chaseMode = 1;
     330        break;
     331
     332    default:
     333        break;
     334  }
     335}
     336
     337
     338
     339void datasend(int id,int reg,int *data,int datasize)
     340{
     341  Wire.beginTransmission(id);
     342  Wire.write(reg);
     343  for(int i=0;i<datasize;i++)
     344  {
     345    Wire.write(data[i]);
     346  }
     347  Wire.endTransmission();
     348}
     349
     350void dataread(int id,int reg,int *data,int datasize)
     351{
     352  Wire.beginTransmission(id);
     353  Wire.write(reg);
     354  Wire.endTransmission(false);
     355  Wire.requestFrom(id, datasize, false);
     356  for(int i=0;i<datasize;i++)
     357  {
     358    data[i] = Wire.read();
     359  }
     360  Wire.endTransmission(true);
     361}
     362 }}}