概要
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 |
最終更新日
July 14, 2024