概要
Arduino core for the ESP32を使った、LEDドライバ(TM1630)の実験です。ドットマトリクスLED(C-2570SR-A G/W)を点灯させてみました。
この実験ではESP-WROOM-32を利用しましたが、プログラムそのものは、Arduino Unoでも動作すると思います。
Arduino core for the ESP32のインストールのページはこちら。
実験
TM1630というLEDドライバをESP-WROOM-32で動かしてみました。光らせたLEDは、カソードコモンのドットマトリクスLEDです。
複数のLEDを点灯させるときは、ダイナミック点灯という技術を使うことが多いです。ダイナミック点灯は、4桁7セグメントLEDで始めるArduinoで試したように、Arduinoだけを使ったり、シフトレジスタと4桁7セグメントLEDで試したように、シフトレジスタを使ったりすることで実現することができます。ただし、これらの場合はいずれも、Arduinoで制御する必要があり、プログラムの手間が大きくなります。
LEDドライバを利用すると、ダイナミック点灯はLEDドライバが実現してくれ、Arduinoは、LEDドライバに対して命令を送るだけですみます。
LEDドライバ
TM1630というLEDドライバを利用しました。このICは、設定により、LEDドライバの機能と、接続したキー(スイッチ)の押下状態を取得する機能を切り替えて利用することができます。今回は、LEDドライバの機能だけを試しました。
このICをLEDドライバとして利用するときは、カソードコモンのLEDを最大35個制御することができます。この場合は、アノード7端子、カソード5端子です。また、設定によっては、アノード8端子、カソード4端子の制御も可能です。この場合は、32個のLEDを制御することができます。
このLEDドライバは18ピンのICで、データシートによると各ピンの意味は以下の通りです。
データシートは中国語で記述されていたので、Google翻訳のお世話になりました。
| 端子番号 | 端子記号 | 端子説明 |
|---|---|---|
| 1 | DIO | データ入出力 |
| 2 | CLK | クロック入力 |
| 3 | STB | チップ選択 |
| 4 | K2 | キースキャンデータ入力 |
| 5 | VDD | 電源 |
| 6 | SEG2/KS2 | セグメント出力/キースキャン出力 |
| 7 | SEG3/KS3 | セグメント出力/キースキャン出力 |
| 8 | SEG4/KS4 | セグメント出力/キースキャン出力 |
| 9 | SEG5/KS5 | セグメント出力/キースキャン出力 |
| 10 | SEG6/KS6 | セグメント出力/キースキャン出力 |
| 11 | SEG7/KS7 | セグメント出力/キースキャン出力 |
| 12 | SEG8/KS8 | セグメント出力/キースキャン出力 |
| 13 | SEG14/GRID5 | セグメント出力/ビット出力 |
| 14 | GRID4 | ビット出力 |
| 15 | GRID3 | ビット出力 |
| 16 | GND | GND |
| 17 | GRID2 | ビット出力 |
| 18 | GRID1 | ビット出力 |
また、定格は以下の通りです。
| 項目 | 記号 | 範囲 | 単位 | 備考 |
|---|---|---|---|---|
| 電源電圧 | VDD | -0.5~+7.0 | V | |
| ロジック電圧 | VI1 | -0.5~VDD+0.5 | V | HIGHは、0.7VDD~VDD、LOWは0~0.3VDD |
| LEDセグメント(アノード)出力電流 | I01 | -50 | mA | |
| LEDグリッド(カソード)出力電流 | I02 | +200 | mA |
制御方法
出力レジスタ
LEDドライバ内部のレジスタにデータを書き込むことで、LEDの制御を行います。レジスタは10バイトの大きさで、レジスタの各ビットが各LEDに対応します。レジスタと点灯させるLEDの対応は以下の表のとおりです。例えば、GRID1とSEG2に接続しているLEDを点灯させるには、アドレス0x00のレジスタの、B1ビットを1にします。
| - | S2 | S3 | S4 | S5 | S6 | S7 | S8 | - | - | - | - | - | S14 | - | - | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| B0 | B1 | B2 | B3 | B4 | B5 | B6 | B7 | B0 | B1 | B2 | B3 | B4 | B5 | B6 | B7 | |
| GRID1 | 0x00 | 0x01 | ||||||||||||||
| GRID2 | 0x02 | 0x03 | ||||||||||||||
| GRID3 | 0x04 | 0x05 | ||||||||||||||
| GRID4 | 0x06 | 0x07 | ||||||||||||||
| GRID5 | 0x08 | 0x09 | ||||||||||||||
制御命令
制御命令は1バイトで、DIOを利用してLEDドライバに命令を与えます。制御命令を以下に示します。
| 種類 | 説明 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | 備考 |
|---|---|---|---|---|---|---|---|---|---|---|
| 表示モード設定 | ||||||||||
| 表示モード設定 | 4x8 | 0 | 0 | 0を設定 | 0 | 0 | - | |||
| 5x7 | 0 | 0 | 0 | 1 | - | |||||
| データ設定 | ||||||||||
| データ読み書きモード | LEDデータ書き込み | 0 | 1 | 0を設定 | 0 | 0 | 1命令で3種類の設定をまとめて行う | |||
| キースキャンデータ読み込み | 0 | 1 | 0 | 1 | ||||||
| アドレス増加モード | オートインクリメント | 0 | 1 | 0 | ||||||
| 固定設定 | 0 | 1 | 1 | |||||||
| テストモード | ノーマルモード | 0 | 1 | 0 | ||||||
| テストモード | 0 | 1 | 1 | |||||||
| アドレス設定 | ||||||||||
| アドレス設定 | 00H | 1 | 1 | 0を設定 | 0 | 0 | 0 | 0 | - | |
| 01H | 1 | 1 | 0 | 0 | 0 | 1 | - | |||
| 02H | 1 | 1 | 0 | 0 | 1 | 0 | - | |||
| 03H | 1 | 1 | 0 | 0 | 1 | 1 | - | |||
| 04H | 1 | 1 | 0 | 1 | 0 | 0 | - | |||
| 05H | 1 | 1 | 0 | 1 | 0 | 1 | - | |||
| 06H | 1 | 1 | 0 | 1 | 1 | 0 | - | |||
| 07H | 1 | 1 | 0 | 1 | 1 | 1 | - | |||
| 08H | 1 | 1 | 1 | 0 | 0 | 0 | - | |||
| 09H | 1 | 1 | 1 | 0 | 0 | 1 | - | |||
| 表示設定 | ||||||||||
| 明度設定 | PWMパルス幅1/16 | 1 | 0 | 0を設定 | 0 | 0 | 0 | 1命令で2種類の設定をまとめて行う | ||
| PWMパルス幅2/16 | 1 | 0 | 0 | 0 | 1 | |||||
| PWMパルス幅4/16 | 1 | 0 | 0 | 1 | 0 | |||||
| PWMパルス幅10/16 | 1 | 0 | 0 | 1 | 1 | |||||
| PWMパルス幅11/16 | 1 | 0 | 1 | 0 | 0 | |||||
| PWMパルス幅12/16 | 1 | 0 | 1 | 0 | 1 | |||||
| PWMパルス幅13/16 | 1 | 0 | 1 | 1 | 0 | |||||
| PWMパルス幅14/16 | 1 | 0 | 1 | 1 | 1 | |||||
| 表示設定 | ディスプレイオフ | 1 | 0 | 0 | ||||||
| ディスプレイオン | 1 | 0 | 1 | |||||||
制御命令は、STBをLOWにした後、8ビットを、下位ビット(B0)から上位ビット(B8)の順にshiftOut命令で送信します。制御命令送信後、STBをHIGHにします。
ただし、アドレス設定は、制御命令送信後、STBをLOWにしたまま、続けて、アドレスに設定するデータ(8ビット)をshiftOut命令で送信します。データ送信後、STBをHIGHにします。アドレス増加モードがオートインクリメントの場合は、必要なデータ数分データを送信します。固定設定の場合は、1バイトのデータを送信します。
接続
Arduino(ESP-WROOM-32開発キット)とLEDドライバ、ドットマトリクスLED(C-2570SR-A G/W、1.8V/20mA)を用いました。このドットマトリクスLEDはアノード7本、カソード5本で構成されています。
LEDドライバとドットマトリクスLEDは、以下のように接続しました。ArduinoとLEDドライバの接続は、こうする必要はなくプログラム次第です。データ入出力(1番)、クロック入力(2番)、チップ選択(3番)は、プルアップします。LEDとの接続は、必要に応じて電流制限抵抗を入れてください。今回は、抵抗は使用しませんでしたが、自己責任でお願いします。このLEDドライバは、入力電圧よりも約2V低い電圧が出力されるようです。
| Arduino | LEDドライバ | ドットマトリクスLED | 備考 |
|---|---|---|---|
| 25 | 1(DIO) | プルアップ | |
| 26 | 2(CLK) | プルアップ | |
| 27 | 3(STB) | プルアップ | |
| 4(K2) | - | ||
| 5(VDD) | 3.3Vを供給 | ||
| 6(SEG2) | 12(ROW1) | ||
| 7(SEG3) | 11(ROW2) | ||
| 8(SEG4) | 2(ROW3) | ||
| 9(SEG5) | 9(ROW4) | ||
| 10(SEG6) | 4(ROW5) | ||
| 11(SEG7) | 5(ROW6) | ||
| 12(SEG8) | 6(ROW7) | ||
| 13(SEG14/GRID5) | 8(COL5) | ||
| 14(GRID4) | 7(COL4) | ||
| 15(GRID3) | 10(COL3) | ||
| 16GND | GND | ||
| 17(GRID2) | 3(COL2) | ||
| 18(GRID1) | 1(COL1) |
上記の表を見てわかるように、ArduinoとLEDドライバは、3本の制御線を接続するだけです。
スケッチ例
TM1630を制御する基本クラス(TM1630BaseClass)、TM1630上でドットマトリクスLEDを制御するクラス(TM1630DMClass)を作成しました。
LEDドライバの機能だけを実現しています。キースキャン機能は実現していません。
TM1630BaseClass
基本的には、上述の制御命令をそのまま実装しました。
このLEDドライバはカスケード接続をサポートしていません。しかし、DIOとCLKは共有し、STBだけを個別に接続(制御)することで、Arduino側のピンを節約して複数のLEDドライバを制御することができそうです。このための機能も実装してみました。
TM1630DMClass
現状、5x7のドットマトリクスを制御するためのクラスです。このLEDドライバは4x8についても対応できるはずですが、枠だけを作っただけで、実装は行っていません。
複数のLEDを接続できるようにしてみました。縦横の個数と、LEDを配置する方向(縦横)を指定します。LEDの配置方法とLEDの番号は、以下の通りです。左上が原点です。LEDを縦に置いたときと、横に置いたときとで、LEDの番号の進み方が異なっているのも、プログラムの簡略化のためです。LEDを接続する際には注意が必要です。プログラムを作成するうえでは、隠蔽されてしまうので意識する必要はありません。
プログラムの簡略化のため、7ビット分を1バイト(8ビット)にマッピングしています。このため、少しメモリに無駄が生じています。
複数のマトリクスLEDを接続すると、全体として大きな座標が出来上がります。指定した座標にデータを書き込む関数(writeDot())、指定した矩形領域のデータの書き換えを行う関数(writeRegion())を作成しました。座標の左上から右方向、下方向に、指定した値(配列)の、最初の数値の上位ビットから順に書き込んでいきます。
3x5ドットの数字2桁をランダムに表示するスケッチをサンプルとして作成しました。冒頭の写真が動作している様子です。
スケッチは、GitHubに置きました。
バージョン
| Hardware: | ESP-WROOM-32 |
| Software: | Arduino IDE 1.8.8/Arduino core for the ESP32 |
最終更新日
August 16, 2026