Arduinoで遊ぶページ
Arduinoで遊んだ結果を残すページです
LEDドライバ(TM1630)
ESP32

概要

Arduino core for the ESP32を使った、LEDドライバ(TM1630)の実験です。ドットマトリクスLED(C-2570SR-A G/W)を点灯させてみました。

この実験ではESP-WROOM-32を利用しましたが、プログラムそのものは、Arduino Unoでも動作すると思います。

LEDは使い方によっては簡単に壊れてしまうので、定格内で利用してください。ESP-WROOM-32もそんなに大電流は取り出せないので注意してください。

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にします。

-S2S3S4 S5S6S7S8- ----S14--
B0B1B2B3B4 B5B6B7B0B1B2 B3B4B5B6B7
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 1.8.8/Arduino core for the ESP32

最終更新日

June 20, 2020

inserted by FC2 system