秋月電子の16×8LEDマトリクスドライバーモジュールを用いた工作で少しハマったのでメモ。
モジュールはHOLTEKのHT16K33というI2C接続のチップが使われている。デフォルトでは I2C アドレスは 0x70 (LSBはR/W制御用なので、実際は1bit左シフトされて0xe0)。複数使用したい場合は、モジュール上のA0~A2ジャンパをブリッジさせてアドレスを 0x71~0x76 にする。
下図のように、モジュールの基板上にはA0~A2がシルク印刷されている。
基板上でA0~A2のアドレス指定が指定できる
(秋月電子の商品ページより転載)
で、問題は、シルク印刷されているA0~A2はアドレスラインのA0~A2ではない、というところ。シルク印刷されているA0はアドレスラインのA2であって、アドレスラインのA0ではない。同様に、シルク印刷のA2はアドレスラインのA0であって、アドレスラインのA2ではない。
なぜ、こんなややこしいことになっているかというと、HT16K33のI2Cアドレス指定のラインがLEDのアノードのラインと共用になっていて、アノードの0番目 (A0)が、アドレス指定のA2と共用だから。個人的には、スルーホール側のシルク印刷はROW0~でもよかったんじゃないかぁ、と思う。
ちなみに互換を謳っているAdafruit製HT16K33 Breakoutは、ジャンパのシルク印刷はアドレスラインになっている。こちらはこちらでスルーホールのA0~A2とは違う意味なんだけれども。あと、複数使いたい場合、I2Cのプルアップ抵抗を簡単に切り離せないのが不便。
Adafruit製HT16K33 Breakoutはジャンパのシルク印刷はアドレスライン
(秋月電子の商品ページより転載)
結論としては、秋月電子もわざわざ「I2Cスレーブアドレス指定方法」というページを用意しているのだから、それをちゃんと読め、ということ。
ちなみに、今作っている工作物。↓
何を作っているかは改めて