LED&KEY(TM1638)という、8セグLEDとボタンが一体になったモジュールを、ESP32ボードで動かすために必要なことをまとめた記事です。

LED&KEY(TM1638)とは
LED&KEYは7セグLEDをコントロールするためのモジュールであるTM1638が搭載された開発用ボードです。4桁の7セグLEDが2基と、8つのボタン、8つのLEDがクレジットカードサイズの基盤に搭載されています。
何というか、メカ感がやる気にさせる、かっこいいデザインだと思っているのは自分だけでしょうか。
TM1638ドライバーをインストール

Arduino IDEの、スケッチ – ライブラリをインクルード – ライブラリを管理から、上記の「TM1638plus」ライブラリをインストールします。今回はバージョン1.4.0を利用しました。
なお、このライブラリをESP32ボードで利用するためには、ちょっと修正が必要です。
TM1638plus.cppを修正
こちらの投稿を参考に、libraries – TM1638plus – src の中にあるTM1638plus.cppファイルを修正します。この修正を行わないと、ESP32で作動させた場合にボタンが押された情報を正しく読み取ることができません。
修正箇所は「uint8_t TM1638plus::readButtons()」というメソッドです。
uint8_t TM1638plus::readButtons()
{
uint8_t buttons = 0;
digitalWrite(_CLOCK_IO, LOW);
digitalWrite(_STROBE_IO, LOW);
delayMicroseconds(1);
shiftOut(_DATA_IO, _CLOCK_IO, LSBFIRST, BUTTONS_MODE);
pinMode(_DATA_IO, INPUT);
for (uint8_t i = 0; i < 4; i++)
{
uint8_t v = shiftInX(_DATA_IO, _CLOCK_IO, LSBFIRST) << i;
buttons |= v;
}
pinMode(_DATA_IO, OUTPUT);
digitalWrite(_STROBE_IO, HIGH);
return buttons;
}
上記のように「delayMicroseconds(1);」を追加します。これでボタンが押されたことを正しく認識できるようになります。
配線
今回利用したのはKeeYees ESP32モジュールです。

ESP32 | TM1638 |
IO 4 | CLK |
IO21 | STR |
IO23 | DIO |
5V | VCC |
GND | GND |
上記のように配線します。電源は5Vで供給します。
プログラムを書いて動作確認
#include <TM1638plus.h>
#define PIN_STROBE_TM 21
#define PIN_CLOCK_TM 4
#define PIN_DIO_TM 23
TM1638plus tm1638(PIN_STROBE_TM ,PIN_CLOCK_TM ,PIN_DIO_TM);
void setup() {
tm1638.displayBegin();
delay(500);
tm1638.brightness(4);
tm1638.displayText("ready");
}
void loop() {
uint8_t button_input = tm1638.readButtons();
if(button_input > 0) {
switch(button_input) {
case 1:
tm1638.reset();
doLEDs(1);
tm1638.displayText("1");
break;
case 2:
tm1638.reset();
doLEDs(2);
tm1638.displayText("2");
break;
case 4:
tm1638.reset();
doLEDs(4);
tm1638.displayText("3");
break;
case 8:
tm1638.reset();
doLEDs(8);
tm1638.displayText("4");
break;
case 16:
tm1638.reset();
doLEDs(16);
tm1638.displayText("5");
break;
case 32:
tm1638.reset();
doLEDs(32);
tm1638.displayText("6");
break;
case 64:
tm1638.reset();
doLEDs(64);
tm1638.displayText("7");
break;
case 128:
tm1638.reset();
doLEDs(128);
tm1638.displayText("8");
break;
}
}
}
上記は単純に、ボタンの番号をLEDに表示させ、その位置のLEDを光らせるというプログラムです。実際はボタンが押された場合の処理を加えれば、結構いろいろな表示ができて楽しいのではないかと思います。

なお、処理をしている最中にもボタンの入力は常に受け付けていないと切り替えがうまくいかないので、このへんは非同期っぽく実装する必要がありそうです。また別の記事でこのあたりを紹介したいと思います。
今回使ったもの
ケースは3Dプリンターで作りました

写真のケースは3Dプリンターで専用に作りました。同じものを作りたい方は、Thingiverseのこちらのページにデータをおいてありますのでお使いください!
この記事へのコメントはありません。