前回、Holtek社のLEDマトリックス制御ICであるHT16K33を、素直にLEDに接続せず、単体のままAnalog Discovery2のロジアナ機能で波形を観察しようなどと邪な考えをしたために、かえって抵抗と配線のゴチャゴチャの中に沈みました。今回は、素直にLEDを接続してHT16K33がその能力を発揮するところを見てみます。接続するLEDは、1588BSと呼ばれているもの。
※「部品屋根性」投稿順Indexはこちら
使用する8×8のLEDマトリックス「1588BS」の写真をアイキャッチ画像に掲げました。例によってお楽しみの中華部品キットKuman社K4キットに所蔵の品であります。このキットの付属DVDには、通例会社名が入っていないことが多いですが各部品のデータシートが記録されているのですが、このLEDマトリックスについてはデータシートがありません。唯一、8×8ドットマトリックス実験.pdfという「多少残念な日本語」の解説資料があり、これを見ることで端子配列を知ることができます。なお、Webを検索してみると
「1588BS」は結構人気の部品
で、あちこちで発見することができます。ただ、複数のソースから同じ型番で製品が出ているようで、この手元にある1588BSがどこの会社の製品かは杳として知れません。端子を間違うと点灯しないので、一応、ダイオードチェッカで端子配列を確認しました。手元のものは、
-
- 型番1588BSが印刷されている端面を手前に置いたとき
- 左下隅の端子が1番
- 左上隅のLEDがcommon端子A、row端子0番に対応
でした。流石に複数ソースあるといっても、端子配列などは同じだよね、多分。
端子の接続さえ間違えなければ「点灯するにきまっている」という想定にて、以下のように接続しました。
-
- 制御ソフトウエアは例のKuman社製Arduino Uno互換機に書き込む
- Aruduino互換機のI2CにHoltek HK16K33ボードを接続。制御、信号2本とGND1本
- HK16K33ボードはブレッドボードに刺し、別の5V電源を与える(LEDの個数が多いのでArduinoボードの5V端子から引き出すのは遠慮?した)
- HK16K33のブレッドボードからジャンパ線で1588BSに接続
HK16K33は、COMMON端子8端子、ROW端子16端子を持つので、COMMON端子0から7を1588BSのAからHまでに接続し、ROW端子0から7を、1588BSの0から7端子に接続しました(1588BSの端子名称については部品屋さん毎に違うかもしれないです。)
しかし、1588BSに対する結線については結構メンドイです。部品裏面はこんな感じ。
上下のピンの幅は、1行5列+5列の型式のブレッドボードの場合、横幅一杯を使います。1588BSから信号を取り出そうとすると、1588BSを刺す前に
部品の下面の隙間部分に単線のジャンパ線で結線しておく
しかありません。この方法でやるかとも思ったのですが、どうしても1588BSの両側にジャンパ線が8本ずつ分散して見ずらいと思いました。それで、また「魔がさして」1588BS結線用の治具など作ってみました。その顛末はまた後で。なお、K4キットにはそもそもブレッドボード表面を這わせるような単線は付属していないので、どうやって結線させようとしたのか不明です。前述の資料にも具体的な結線方法の指示は見当たらず。オス、メスの20芯デュポン線が付属しているので、これを2分割して空中配線すればキット内の部品だけでも出来るって言えば出来るか?
テスト点灯用のソフトはArdunioなので、とても簡単です。HT16K33のI2Cアドレスは端子で設定できるのですが、該当端子をフロートで放置すれば下3ビットは000となるので、そうしています。Arduino式のI2Cアドレス読み方だと0x70番地(普通と1ビットずれているので注意。)
I2Cの「下回り」はこんな感じ。
#include <Wire.h> #define HT16K33_ADR (0x70) void writeCommand(byte command) { Wire.beginTransmission(HT16K33_ADR); Wire.write(command); Wire.endTransmission(); delay(1); } void writeCommandData(byte command, byte data) { Wire.beginTransmission(HT16K33_ADR); Wire.write(command); Wire.write(data); Wire.endTransmission(); delay(1); }
上記の書き込みルーチンを使ったHT16K33の初期化と、点灯テストパターン(全COMMON、全ROW使って3角形に点灯)はこちら。
void initHT16K33() { writeCommand(0x21); // System clock enable writeCommand(0xA0); // set ROW driver(NO INT output) writeCommand(0xEF); // Dimming set } void testPattern() { writeCommandData(0x00, 0xFF); writeCommandData(0x02, 0xFE); writeCommandData(0x04, 0xFC); writeCommandData(0x06, 0xF8); writeCommandData(0x08, 0xF0); writeCommandData(0x0A, 0xE0); writeCommandData(0x0C, 0xC0); writeCommandData(0x0E, 0x80); writeCommand(0x81); // Blinking OFF, Display on } void setup() { Wire.begin(); initHT16K33(); testPattern(); }
これをArdunio(互換)ボードに書き込み、動作させたところがこちら。一応、意図通りに動作しておりますが、LEDのところに「指」が見えてます。あれは何という御指摘はさもありなん。
結線のヘルプのために作った左上の治具、かえって良くありませんでした。結線は(珍しく)間違わずにできたのですが、指で押していないと浮いてしまって上手く接触がとれない。トホホ。