フォト
2017年3月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

« ATtiny13Aの省電力化を試みる | トップページ | IchigoJamでaitendoのI2Cマトリックスキットを動かしてみました »

2016年1月20日 (水)

aitendo I2CマトリックスキットをArduino動かしてみました

aitendo のI2Cマトリックスキット(8x8) [K-8X8I2C1388]をArduinoで動かしてみました。



このキットはLEDのドライブにHT16K33-24Wを使っています。I2Cバス接続なので
少ない配線で8x8ドットのLEDを制御できます。

パーツ的にはこんな感じ

Dscn4705

なぜかドットが四角くないですが良しとします。

組み立てですが、困ったことに基板上の4ヶ所の穴(基板左下の4つ並ぶ穴)がちゃんと空いて無くて
端子が差し込めませんでした。ピンセットでぐりぐりと拡張して広げました。

それ以外は問題なく組み立て完了。
やはり、キットを使った組み立ては自作よりも楽ちんです。

Dscn4710

部品が少し余りましたが、これはいつものaitendoクオリティーなので問題なし。
基板の左上のピンでI2Cのアドレスの設定が出来るようです。
なのでこのキットを複数使えばドットマトリックスを増やせそうです。

Dscn4712

Arduinoに繋げて動かしてみます。

ライブラリやサンプルソースの入手はaitendoの商品ページに情報の掲載がありますが、
以前作成したソースを流用して簡単な動作確認を行いました。

Dscn4714

実際の動作の様子(デモはいつもの ”さいたま” です)


プログラムソース

#include <Wire.h>

// アドレス
#define HT_I2C_ADDRESS 0x70

// コマンド
#define HT_CMS_DATA       0x00
#define HT_CMD_SYSSET     0x20
#define HT_CMD_BLINK      0x80
#define HT_CMD_BRIGHTNESS 0xE0

// System Setup レジスタ設定値
#define HT_SYSSET_OSC_ON  1

// Display setup 設定値
#define HT_BLINK_DISPLAY_ON B00000001
#define HT_BLINK_OFF        B00000000
#define HT_BLINK_2HZ        B00000010
#define HT_BLINK_1HZ        B00000100
#define HT_BLINK_05HZ       B00000110

// 表示パターン用バッファ(R16xC8)
uint8_t buf[8];  

// テスト用パターン('さ','い','た','ま')
uint8_t msg_saitama[4][8] = {
  {0x08,0x08,0x7E,0x04,0x24,0x40,0x3C,0x00},  // さ
  {0x00,0x88,0x84,0x82,0x82,0x50,0x20,0x00},  // い
  {0x20,0xF0,0x2E,0x40,0x48,0x50,0x8E,0x00},  // た
  {0x08,0x7E,0x08,0x7E,0x08,0x7C,0x7A,0x00}   // ま
};

// HT16K33の初期化
void ht_init() {
  Wire.begin();
  ht_system_Seup(HT_I2C_ADDRESS, HT_SYSSET_OSC_ON);  // システムオシレータをONにする
  ht_display_setup(HT_I2C_ADDRESS,HT_BLINK_OFF) ;    // 点滅表示周期の設定
  ht_setBrightness(HT_I2C_ADDRESS,1);                // 明るさの設定
}

// SystemSetup Registerの設定
// (システムオシレータのモード設定)
void ht_system_Seup(uint8_t addr, uint8_t p) {
  Wire.beginTransmission(addr);
  Wire.write(HT_CMD_SYSSET | p);
  Wire.endTransmission(); 
} 

// 明るさの設定
void  ht_setBrightness(uint8_t addr, uint8_t p) {
  if (p > 15) p = 15;
  Wire.beginTransmission(addr);
  Wire.write(HT_CMD_BRIGHTNESS | p);
  Wire.endTransmission(); 
}

// Display setup(点滅周期の設定)
void ht_display_setup(uint8_t addr, uint8_t p) {
  if (p > 3) p = 0;
  Wire.beginTransmission(addr);  
  Wire.write(HT_CMD_BLINK | HT_BLINK_DISPLAY_ON | p); 
  Wire.endTransmission();
}

// 表示パターンの送信
void ht_update(void) {

  // HT16K33  にデータ転送
  Wire.beginTransmission(HT_I2C_ADDRESS);
  Wire.write(HT_CMS_DATA);

  for (uint8_t i = 0; i<8; i++) {
    Wire.write(buf[i]);    
    Wire.write(0);    
  }
  Wire.endTransmission();  
}

// バッファのクリア
void ht_clear_buffer() {
    for (uint8_t i = 0; i <8; i++) 
      buf[i] = 0;
}

// 表示のクリア
void ht_clear() {
  ht_clear_buffer();
  ht_update();
}

// バッファの指定座標のON/OFF
void ht_set_dot(int8_t x, int8_t y, uint8_t d) {
  if ( (x > 7) || (y > 7) || (x < 0) || (y < 0) ) 
     return;     
  if (d)
    buf[y] |= 0x80 >> x;
  else
    buf[y] &= ~(0x80 >>x);  
}

// バッファ上の指定座標に8x8パターンをセット(負座標指定可能)
void ht_write_at(uint8_t* p, int8_t x, int8_t y) {
    int8_t i; 
    if ((x > 7) || (y > 7) || (x < -7) || (y < -7) ) 
        return;
    for (i = 0; i <8; i++) {
        if ((i+y >= 0) && (i+y < 8) ) {
           if (x >= 0)
              buf[i+y] |= p[i]>>x;
           else
              buf[i+y] |= p[i]<<(-x);
        }
    }
}

// バッファ左スクロール
void scroll() {
   for (uint8_t i = 0; i < 8; i++) {
      buf[i]<<=1;  // 各行を左にシフトする
   }
}

// 1文字左スクロール挿入
void ht_scrollIn(uint8_t* p, int wt) {
    int8_t i,j;
    for (j = 0; j < 8; j++) {
        for (i = 0; i < 8; i++) {
            buf[i]<<=1;
        }
        ht_write_at(p, 7-j, 0);
        ht_update();
        delay(wt);
    }
}

void setup() {
   ht_init();
   ht_clear();
}

// デモ1 ドット表示チェック
void demo1() {
  ht_clear();
  for (int8_t d = 1; d >= 1; d--) {
    for (int8_t y = 0; y <8; y++) {
      for (int8_t x = 0; x <8;  x++) {
         ht_set_dot(x, y, d);
         ht_update();
         delay(75);
      }
    } 
    delay(500);
  }
  for (int8_t i = 0; i <8; i++) {
    scroll();
    ht_update();
    delay(100);    
  }
}  

// デモ2 パターンを指定座標の表示
void demo2() {
   ht_clear();
   for (uint8_t i = 0; i <4; i++) {
        ht_clear_buffer();
        ht_write_at(msg_saitama[i], 0, 0);
        ht_update();
        delay(1000);  
   }
}

// デモ3 パターンをスクロールイン表示
void demo3() {
   ht_clear();
   for (uint8_t i = 0; i <4; i++) {
        ht_scrollIn(msg_saitama[i], 150);  
   }
}
 
void loop() {  
   demo1();
   delay(1000); 
   demo2();
   delay(1000); 
   demo3();
   delay(1000); 
}

次に美咲フォントを利用してちょっとした日本語表示をやってみます。
aitendo I2CマトリックスキットをArduino動かしてみました (2)  に続きます。

« ATtiny13Aの省電力化を試みる | トップページ | IchigoJamでaitendoのI2Cマトリックスキットを動かしてみました »

arduino」カテゴリの記事

表示器制御関連」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/63095745

この記事へのトラックバック一覧です: aitendo I2CマトリックスキットをArduino動かしてみました:

« ATtiny13Aの省電力化を試みる | トップページ | IchigoJamでaitendoのI2Cマトリックスキットを動かしてみました »