wiki:PCA9622DR

LEDドライバ PCA9622DR の使い方

PCA9622DR I2C 16ch LEDドライバ の使い方説明とArduino用サンプルスケッチです。

メーカーからデータシート(pdf)が公開されています。

PCA9622はLEDを最大16個独立して光らせることができます。


内蔵機能

商品ページより一部抜粋したものを載せます。

  • 動作電圧 2.3V~5.5V
  • 16chの独立したLEDポート
  • LEDポートのアウトプットイネーブル機能を搭載
  • 各ポートはon/offおよび256段階(8bit)のPWM階調制御が可能
  • 各ポートの独立制御/グループ制御が可能
  • 基板上に、16つの赤色LEDを搭載
  • LED ポートは100mAの吸い込み能力
  • 基板には、外部ドライブ用信号ピンを搭載

使い方

本製品はI2Cで接続されます。下に実体配線図を示します。

配線修正

本製品にはI2C通信時のプルアップ用抵抗は実装されていません。
ピンヘッダと合わせて各自で実装してください。
プルアップ抵抗はR17とR18に1608サイズの10kΩ程度のチップ抵抗をはんだ付けしてください。
また、ArduinoのWireライブラリを使用する場合は内蔵プルアップが有効になりますので、プルアップ抵抗を省略してもかまいません。

通信方法

I2C通信のアドレスは、Arduino向けの7bit表記で0x70です。これは基板上のジャンパ(SJ7~SJ11)で変更できます。

下にデータシートより送信プロトコル図を引用します。

スレーブアドレスを送信した後にデータを書き込み始めるアドレスを送信します。

この際、内部の自動インクリメントに関する設定を同時に送信する必要があります。

送信するデータは上位3bitが設定用、下位5bitが書き込み先レジスタアドレスになります。

下に設定表を和訳したものを載せます。

AI2AI1AI0機能
000自動インクリメント機能無効
100全レジスタ領域に対して自動インクリメント機能有効
101輝度制御レジスタに対してのみ自動インクリメント機能有効(ロールオーバーも当該レジスタ内部のみ)
110点滅制御レジスタに対してのみ自動インクリメント機能有効(ロールオーバーも当該レジスタ内部のみ)
111輝度制御、点滅制御レジスタに対してのみ自動インクリメント機能有効(ロールオーバーも当該レジスタ内部のみ)

これ以外の設定状態は予約済みとなっているため使用しないでください。

例えば、初期化の際には(AI2,AI1,AI0)=(1,0,0)にして全領域に対してデータを書き込み、 運用時は(AI2,AI1,AI0)=(1,0,1)にして輝度以外の状態の不用意な変更を避けるなどといった運用があります。

I2C通信時に送信数レジスタアドレスと、各設定に対応したビットを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が割り当てられてています。

2bit目1bit目機能
00消灯
01点灯/調光と点滅は無効
10点灯/調光のみ有効
11点灯/調光と点滅が有効

その他

プログラム上でサブI2Cアドレスを変更することができます。 サブI2Cアドレスに応答するかどうかを設定することができます。

よって、同じICを大量に接続しても、プログラム次第で別個に点灯を制御することができます。

サンプルスケッチ

Arduino用のサンプルスケッチを載せます。(GitHub)

LED1~4は点灯のみされています。

LED5~12は調光されて点灯されています。

LED13~16は調光された上で周期2秒、デューティー比50%(=1秒ごとにON/OFF繰り返し)で点灯しています。

  /*******************************************************************************
  // SWITCHSCIENCE wiki -- http://trac.switch-science.com/
  // PCA9622DR Arduino Sample
  *******************************************************************************/
  #include <Wire.h>

  #define PCA9622DR_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(PCA9622DR_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(PCA9622DR_ADDR, PWM0 | AI_ALLEN,ledPWM,16);

    // 全体点滅の設定
    int grp_pwm = 0x80; // 5:5
    datasend(PCA9622DR_ADDR, GRPPWM,&grp_pwm,1);
    int grp_freq = 0x2F; // (0x2F+1)/24 秒周期 = 2秒周期
    datasend(PCA9622DR_ADDR, GRPFREQ,&grp_freq,1);


    // LED出力設定
    ledOut[0] = B01010101;  // LEDの個別調光や全体の点滅(PWM)は影響されない
    ledOut[1] = B10101010;  // LEDは個別調光に影響される
    ledOut[2] = B10101010;
    ledOut[3] = B11111111;  // LEDは個別調光と全体の点滅(PWM)に影響される
    datasend(PCA9622DR_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<datasize;i++)
    {
      Wire.write(data[i]);
    }
    Wire.endTransmission();
  }

  //受信用関数(デバイスアドレス,レジスタアドレス,&受信用データ,受信データ数)
  void dataread(int id,int reg,int *data,int datasize)
  {
    Wire.beginTransmission(id);
    Wire.write(reg);
    Wire.endTransmission(false);
    Wire.requestFrom(id, datasize, false);
    for(int i=0;i<datasize;i++)
    {
      data[i] = Wire.read();
    }
    Wire.endTransmission(true);
  }
Last modified 22 months ago Last modified on Mar 2, 2016 12:36:31 AM

Attachments (4)

Download all attachments as: .zip