ドットマトリックスLEDを使ってみたい

スポンサーリンク
スポンサーリンク

ドットマトリックスLED

LEDが縦横にいっぱい並んでるやつ。

スポンサーリンク

お買い物

赤色ドットマトリクスLED 8×8ドット OSL641501−ARA: LED(発光ダイオード) 秋月電子通商-電子部品・ネット通販
電子部品,通販,販売,半導体,IC,マイコン,電子工作赤色ドットマトリクスLED 8×8ドット OSL641501−ARA秋月電子通商 電子部品通信販売
16×8LEDマトリクスドライバーモジュール(HT16K33): 組立キット 秋月電子通商-電子部品・ネット通販
電子部品,通販,販売,半導体,IC,マイコン,電子工作16×8LEDマトリクスドライバーモジュール(HT16K33)秋月電子通商 電子部品通信販売

GPIO足りんのでドライバも買った。

スポンサーリンク

GPIOのみで点けてみる

アノードに5Vつけて、カソードにGND、間に抵抗入れてる。

できた。アノードピンとカソードピンが交差したところのLEDが点く。

スポンサーリンク

HT16K33を使う

スケッチ例を動かす

接続しまして。自前でデータシートとにらめっこしながらプログラム書いていくのはつらみがあるのでライブラリを使う。

lpaseen/ht16k33
arduino library for ht16k33 led/keyboard driver chip - lpaseen/ht16k33

zip形式でダウンロードして読み込む。スケッチ例のlighttestをやってみる。

16×8をそのまま使ってるので、後ろ8個分が間隔空いてるけどできた。

8×8のLEDを2個使う

すっごい汚い。カソード側は共用できるっぽいので2本まとめてHT16K33につないだ。もんでもっかいlighttestする。

いい感じです。

配列で操作できる感じにしたい

ライブラリのメソッドを見ると

 void    begin(uint8_t address);
  void    end();
  void    clearAll(); // clear all LEDs
  uint8_t sleep();  // stop oscillator to put the chip to sleep
  uint8_t normal(); // wake up chip and start ocillator
  uint8_t clearLed(uint8_t ledno); // 16x8 = 128 LEDs to turn on, 0-127
  uint8_t setLed(uint8_t ledno); // 16x8 = 128 LEDs to turn on, 0-127
  void    define7segFont(uint8_t *ptr); // Pass a pointer to a font table for 7seg
  void    define16segFont(uint16_t *ptr); // Pass a pointer to a font table for 16seg
  uint8_t set7Seg(uint8_t dig, uint8_t cha, boolean dp); // position 0-15, 0-15 (0-F Hexadecimal), decimal point
  uint8_t set16Seg(uint8_t dig, uint8_t cha); // position 0-7, see asciifont.h
  boolean getLed(uint8_t ledno,boolean Fresh=false); // check if a specific led is on(true) or off(false)
  uint8_t setDisplayRaw(uint8_t pos, uint8_t val); // load byte "pos" with value "val"
  uint8_t sendLed(); // send whatever led patter you set
  uint8_t set7SegNow(uint8_t dig, uint8_t cha, boolean dp); // position 0-15, 0-15 (0-F Hexadecimal), decimal point and send led in one function
  uint8_t set7SegRaw(uint8_t dig, uint8_t val); // load byte "pos" with value "val"
  uint8_t set16SegNow(uint8_t dig, uint8_t cha); // position 0-17, see asciifont.h and send led in one function
  uint8_t setLedNow(uint8_t ledno); //Set a single led and send led in one function
  uint8_t clearLedNow(uint8_t ledno); //Clear a single led and send led in one function
  uint8_t setBrightness(uint8_t level); // level 0-16, 0 means display off
  uint8_t keyINTflag(); // INTerrupt flag value, set when a key is pressed
  uint8_t keysPressed(); // report how many keys that are pressed, clear means report as if new
  int8_t  readKey(boolean clear=false);  // read what key was pressed, Fresh=false to go from cache
  void    readKeyRaw(KEYDATA keydata,boolean Fresh=true); //read the raw key info, bitmapped info of all key(s) pressed
  uint8_t setBlinkRate(uint8_t rate); // HT16K33_DSP_{NOBLINK,BLINK2HZ,BLINK1HZ,BLINK05HZ}
  void    displayOn();
  void    displayOff();
  // Some helper functions that can be useful in other parts of the code that use this library
  uint8_t i2c_write(uint8_t val);
  uint8_t i2c_write(uint8_t cmd,uint8_t *data,uint8_t size,boolean LSB=false);
  uint8_t i2c_read(uint8_t addr);
  uint8_t i2c_read(uint8_t addr,uint8_t *data,uint8_t size);

0-127の指定で点灯させる感じ。配置は

0123456789101112131415
16171819202122232425262728293031
32333435363738394041424344454647
48495051525354555657585960616263
64656667686970717273747576777879
80818283848586878889909192939495
96979899100101102103104105106107108109110111
112113114115116117118119120121122123124125126127

こう。これを配列でアクセスするっぽくしたい。悩んだ結果

#include 

HT16K33 HT;

uint8_t disptable[8][16][2] = {
  {{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}, {6, 0}, {7, 0}, {8, 0}, {9, 0}, {10, 0}, {11, 0}, {12, 0}, {13, 0}, {14, 0}, {15, 0}},
  {{16, 0}, {17, 0}, {18, 0}, {19, 0}, {20, 0}, {21, 0}, {22, 0}, {23, 0}, {24, 0}, {25, 0}, {26, 0}, {27, 0}, {28, 0}, {29, 0}, {30, 0}, {31, 0}},
  {{32, 0}, {33, 0}, {34, 0}, {35, 0}, {36, 0}, {37, 0}, {38, 0}, {39, 0}, {40, 0}, {41, 0}, {42, 0}, {43, 0}, {44, 0}, {45, 0}, {46, 0}, {47, 0}},
  {{48, 0}, {49, 0}, {50, 0}, {51, 0}, {52, 0}, {53, 0}, {54, 0}, {55, 0}, {56, 0}, {57, 0}, {58, 0}, {59, 0}, {60, 0}, {61, 0}, {62, 0}, {63, 0}},
  {{64, 0}, {65, 0}, {66, 0}, {67, 0}, {68, 0}, {69, 0}, {70, 0}, {71, 0}, {72, 0}, {73, 0}, {74, 0}, {75, 0}, {76, 0}, {77, 0}, {78, 0}, {79, 0}},
  {{80, 0}, {81, 0}, {82, 0}, {83, 0}, {84, 0}, {85, 0}, {86, 0}, {87, 0}, {88, 0}, {89, 0}, {90, 0}, {91, 0}, {92, 0}, {93, 0}, {94, 0}, {95, 0}},
  {{96, 0}, {97, 0}, {98, 0}, {99, 0}, {100, 0}, {101, 0}, {102, 0}, {103, 0}, {104, 0}, {105, 0}, {106, 0}, {107, 0}, {108, 0}, {109, 0}, {110, 0}, {111, 0}},
  {{112, 0}, {113, 0}, {114, 0}, {115, 0}, {116, 0}, {117, 0}, {118, 0}, {119, 0}, {120, 0}, {121, 0}, {122, 0}, {123, 0}, {124, 0}, {125, 0}, {126, 0}, {127, 0}}
};

void test() {
  for (int i = 0 ; i < 8; i++) {
    for (int j = 0; j < 16; j++) {
      if (disptable[i][j][1] == 1) {
        disptable[i][j][1] = 0;
      } else {
        disptable[i][j][1] = 1;
      }
    }
  }
}

void dispset() {
  for (int i = 0 ; i < 8; i++) {
    for (int j = 0; j < 16; j++) {
      if (disptable[i][j][1] == 1) {
        HT.setLed(disptable[i][j][0]);
      } else {
        HT.clearLed(disptable[i][j][0]);
      }
    }
  }
}

void setup() {
  HT.begin(0x00);
}

void loop() {
  test();
  dispset();

  HT.sendLed();
  delay(1000);

}

3次元配列を使ってみることにした。これがいいのか悪いのかはわかんない。動かしてみると

動いた。とりあえずここまで。

スポンサーリンク
したい
スポンサーリンク
スポンサーリンク
スポンサーリンク
dalomo

コメント

タイトルとURLをコピーしました