実験室

LED&KEY(TM1638)をESP32で動かすために、ちょっとだけ苦戦しました。


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を修正

こちらの投稿を参考に、librariesTM1638plussrc の中にある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モジュールです。

ESP32TM1638
IO 4CLK
IO21STR
IO23DIO
5VVCC
GNDGND

上記のように配線します。電源は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のこちらのページにデータをおいてありますのでお使いください!

関連記事

     
  1. 実験室

    壮大な計画もちっちゃい一歩から。MacOS CatalinaでM5StickCをLチカ。

    えー、これはIoTになんの興味もない人には、大変につまらない記事です…

  2. 実験室

    M5StickCとサーボでつくる、API連動のかっこいいアナログメーター

    この実験は、M5StickCとサーボ(Geekservo)を使って、…

  3. 実験室

    AlexaでM5StickCを操作しちゃおう!

    今日のレシピは「Amazon Echo(アレクサ)で、M5S…

  4. 実験室

    M5StickCからFirebase Realtime Databaseに値を書き込んじゃうよ。

    えー、IoT実験室です。もう5回もやってるので連載っぽくなっ…

  5. 実験室

    M5StickC+GPSモジュールで、LCDにロケーションを表示してみようぜ。

    さて、こないだの実験ではM5StickCの加速度センサーを使ってみま…

  6. 実験室

    [IoT実験室] M5StickCで、7セグメントLED(TM1637)に何か表示してみよう!

    M5StickCで、7セグメントLED(TM1637)に何か表示してみ…

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

最新の記事

スラニューについて

PAGE TOP