| 1 | [https://www.switch-science.com/catalog/2389/ PCA9624PW 8ch I2C 電圧スイッチ型LEDコントローラ ピッチ変換基板]用のArduino サンプルスケッチです。 |
| 2 | |
| 3 | 基板上の八つのLEDが同時に点灯し端から順番に消えていきます。 |
| 4 | |
| 5 | {{{ |
| 6 | #include <Wire.h> |
| 7 | |
| 8 | //コントロールレジスタ |
| 9 | #define MODE1 0x00 |
| 10 | #define MODE2 0x01 |
| 11 | #define PPWM0 0x02 |
| 12 | #define GRPPWM 0x0A |
| 13 | #define GRPFREQ 0x0B |
| 14 | #define LEDOUT0 0x0C |
| 15 | #define LEDOUT1 0x0D |
| 16 | #define SUBADR1 0x0E |
| 17 | #define SUBADR2 0x0F |
| 18 | #define SUBADR3 0x10 |
| 19 | #define ALLCALLADR 0x11 |
| 20 | |
| 21 | //スレーブアドレス |
| 22 | #define addr 0x60 |
| 23 | |
| 24 | //LEDの数 |
| 25 | #define MAX_LED 8 |
| 26 | |
| 27 | static unsigned char led_data[MAX_LED]; //LEDの明るさ設定用配列 |
| 28 | |
| 29 | //------ PCA9624PW 初期化 ------// |
| 30 | void initLEDdriver(){ |
| 31 | char cmd[3]; |
| 32 | |
| 33 | //MODE1レジスタ設定 |
| 34 | cmd[0] = MODE1; |
| 35 | cmd[1] = 0x00; //SLEEP = 0 |
| 36 | i2cWrite(addr,cmd,2); |
| 37 | |
| 38 | //ポートモード設定 |
| 39 | cmd[0] = LEDOUT0 | 0x80; //LEDOUT0から連続書き込み |
| 40 | cmd[1] = 0xAA; //LED 3, 2, 1, 0 : PWM(=10) |
| 41 | cmd[2] = 0xAA; //LED 7, 6, 5, 4 : PWM(=10) |
| 42 | i2cWrite(addr,cmd,3); |
| 43 | |
| 44 | clearLEDdata(); //LEDの明るさ用データ初期化 |
| 45 | writeLED(addr,led_data,0); //明るさデータをPCA9624に反映 |
| 46 | |
| 47 | } |
| 48 | |
| 49 | void i2cWrite(char slave_address,char *data, int num){ |
| 50 | Wire.beginTransmission(slave_address); |
| 51 | for(int i=0;i<num;i++){ |
| 52 | Wire.write(*(data+i)); |
| 53 | } |
| 54 | Wire.endTransmission(); |
| 55 | } |
| 56 | |
| 57 | void clearLEDdata(){ |
| 58 | for(int i=0;i<MAX_LED;i++){ |
| 59 | led_data[i] = 0; |
| 60 | } |
| 61 | } |
| 62 | |
| 63 | void writeLED(char slave_address, unsigned char *data, int offset){ |
| 64 | char cmd[9]; |
| 65 | int i; |
| 66 | cmd[0] = PPWM0 | 0x80; //PWM0レジスタから連続書き込み |
| 67 | for(i=0;i<8;i++){ |
| 68 | cmd[i+1] = data[offset+i]; |
| 69 | } |
| 70 | i2cWrite(slave_address, cmd, 9); |
| 71 | } |
| 72 | |
| 73 | void setup() { |
| 74 | Wire.begin(); |
| 75 | initLEDdriver(); |
| 76 | } |
| 77 | |
| 78 | void loop() { |
| 79 | int i; |
| 80 | |
| 81 | for(i=0;i<8;i++){ //LED0から7まで順番に明るくする |
| 82 | led_data[i] = 35 * i + 10; |
| 83 | } |
| 84 | writeLED(addr,led_data,0); //PCA9624に反映 |
| 85 | delay(2000); |
| 86 | |
| 87 | while(1){ //LED7が消えるまでループ |
| 88 | for(i=0;i<8;i++){ //全てのLEDの明るさを1減らす |
| 89 | if(led_data[i] > 0){ |
| 90 | led_data[i]--; |
| 91 | } |
| 92 | } |
| 93 | writeLED(addr,led_data,0); //PCA9624に反映 |
| 94 | delay(10); |
| 95 | if(led_data[7] == 0){ //LED7が消えたらループ終了 |
| 96 | break; |
| 97 | } |
| 98 | } |
| 99 | delay(1000); |
| 100 | } |
| 101 | }}} |