LEDドライバ TM1640
16個の7セグメントLEDを駆動できるLEDドライバです。SMD部品しか見つからなかったので、DIP変換基板を合わせて使用します。
はんだフラックスを使えば意外と簡単にはんだ付けできます。
![]() ![]() |
![]() ![]() |
接続
![]() |
![]() |
Arduinoとカソードコモンの7セグメントLEDに接続する場合
VCC | +5V | |
GND | GND | |
DIN | ArduinoのD10 (他のピンでも可) | |
SCLK | ArduinoのD9 (他のピンでも可) | |
SEG1 | 7セグメントLEDの a | この部分の接続は、ソフトウエア側の解釈でどうにでもなるので厳格ではない。 むしろ、1~8を逆にした方がソフトウエア側での扱いは楽になるかも。 |
SEG2 | 7セグメントLEDの b | |
SEG3 | 7セグメントLEDの c | |
SEG4 | 7セグメントLEDの d | |
SEG5 | 7セグメントLEDの e | |
SEG6 | 7セグメントLEDの f | |
SEG7 | 7セグメントLEDの g | |
SEG8 | 7セグメントLEDの DP | |
DRID1~16 | 7セグメントLEDのコモンピン(カソードコモンの場合、GNDピン) |
TM1640のコマンド
TM1640の制御は DINとSCLKの2本の信号を使用したシリアル通信で行います。![](TM1640_04.jpg)
Start/End の手順に注意が必要です。
DIN - LOW / SCLK - LOW で開始。 SCLK - HIGH / DIN - HIGH で終了。
ArdunoUNOでは問題なく動きますが、Start後、End前に1μ秒のWaitを入れた方がよいかも。
コマンドは以下、実質3種しかない。
BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2 | BIT1 | BIT0 | 動作 | |
データ設定コマンド | 0 | 1 | - | - | 0 | 0 | - | - | アドレスAuto+1 |
0 | 1 | - | - | 0 | 1 | - | - | アドレスFixed | |
アドレス設定コマンド | 1 | 1 | - | - | 0 | 0 | 0 | 0 | 00H (GRID1) |
1 | 1 | - | - | 0 | 0 | 0 | 1 | 01H (GRID2) | |
1 | 1 | - | - | 0 | 0 | 1 | 0 | 02H (GRID3) | |
1 | 1 | - | - | 0 | 0 | 1 | 1 | 03F (GRID4) | |
1 | 1 | - | - | 0 | 1 | 0 | 0 | 04H (GRID5) | |
1 | 1 | - | - | 0 | 1 | 0 | 1 | 05H (GRID6) | |
1 | 1 | - | - | 0 | 1 | 1 | 0 | 06H (GRID7) | |
1 | 1 | - | - | 0 | 1 | 1 | 1 | 07H (GRID8) | |
1 | 1 | - | - | 1 | 0 | 0 | 0 | 08H (GRID9) | |
1 | 1 | - | - | 1 | 0 | 0 | 1 | 09H (GRID10) | |
1 | 1 | - | - | 1 | 0 | 1 | 0 | 0AH (GRID11) | |
1 | 1 | - | - | 1 | 0 | 1 | 1 | 0BH (GRID12) | |
1 | 1 | - | - | 1 | 1 | 0 | 0 | 0CH (GRID13) | |
1 | 1 | - | - | 1 | 1 | 0 | 1 | 0DH (GRID14) | |
1 | 1 | - | - | 1 | 1 | 1 | 0 | 0EH (GRID15) | |
1 | 1 | - | - | 1 | 1 | 1 | 1 | 0FH (GRID16) | |
表示制御 | 1 | 0 | - | - | 1 | 0 | 0 | 0 | デューティー比 1/16 |
1 | 0 | - | - | 1 | 0 | 0 | 1 | デューティー比 2/16 | |
1 | 0 | - | - | 1 | 0 | 1 | 0 | デューティー比 4/16 | |
1 | 0 | - | - | 1 | 0 | 1 | 1 | デューティー比 10/16 | |
1 | 0 | - | - | 1 | 1 | 0 | 0 | デューティー比 11/16 | |
1 | 0 | - | - | 1 | 1 | 0 | 1 | デューティー比 12/16 | |
1 | 0 | - | - | 1 | 1 | 1 | 0 | デューティー比 13/16 | |
1 | 0 | - | - | 1 | 1 | 1 | 1 | デューティー比 14/16 | |
1 | 0 | - | - | 0 | X | X | X | 表示OFF | |
1 | 0 | - | - | 1 | X | X | X | 表示ON |
コマンド送信手順
コマンドは以下の手順で送信します。データ設定で Fixedモードを設定した場合には、指定アドレスに対して1Byteのデータを送信。
![](TM1640_05.jpg)
データ設定で Auto+1モードを設定した場合には、指定アドレス以降 1Byteのデータを送信する毎に自動的にアドレスアが+1されます。
![](TM1640_06.jpg)
16セグメントLEDを使ってみる
16セグメントLEDを使ってみます。TM1640は8x16のLEDを操作出来るので、16セグメントLEDな8個を操作できる計算になります。
16セグメントLED A-2306SRは秋月電子で1個600円(2024年7月現在)ですが、4個セットで基板付きのキットが1980円で売っています。
※キットの配線には問題があるので、16セグメントLEDとして使用する場合には基板の改造が必要になるかも。
![]() ![]() |
![]() ![]() |
![](TM1640_10.jpg)
A-2306SRの配線はこうなっており、コモンピン(アノード)が1本しか出ていないので、一度に8セグメントしかドライブできないTM1640では普通に考えると操作できません。
TM1640は16グリッドを操作できるので、グリッドとセグメントを入れ替えて考えます。
TM1640のアドレスイメージとしてはこんな感じになります。
![](TM1640_12.jpg)
アノードをTM1640のSEGxピンに、カソード(LED A1~P)をTM1640のGRIDxピンに接続します。
普通(?)は GRID1をA1(17番ピン)、GRID2をA2(14番ピン)とグリッドとセグメントを対尾させた方が良いのですが、ブレッドボードで組む場合には物理的な並びに合わせた方が楽で綺麗に配線できるので
▼のように配線します。※DPはArduinoのGPIOピン(サンプルスケッチでは8番ピン)に接続します。1KΩ程度の電流制限抵抗を付けないと抵抗値の不均衡でDP以外が点灯しなくなります。
![](TM1640_11.jpg)
|
グリッド(アドレス)と16セグメントLEDのセグメントとの対応がぐちゃぐちゃなので、対応表を作成して使用します。 例えば '2' を表示するパターン' b1110111011000000 を表示する際にはMSB側から対応する変換テーブルのGRID番号のアドレスを操作すればよい事になります。 この例では アドレスC0Hから順位に 01h 01h 01h 00h 00h 01h 00h 00h 01h 01h 01h 00h 00h 01h 0h 00h を書き込めば良いことになります。 ※ SEG2に接続したLEDに対する設定は 02h 、SEG3は 04h 、 SEG4は 08h ・・・・ SEG8は 80h を書き込みます、複数同時の場合はORを取ります。 SEG2とSRG4なら 0Ah という具合です。 |
サンプルスケッチ
![](../../img/icon_16x_68.png)
以上の スケッチを公開しています。
![](../../img/github.png)
解説動画
![](../../youtube/a88R.jpg)
![](../../youtube/a87R.jpg)
![](../../youtube/a89R.jpg)
![](../../youtube/a90R.jpg)