実験室

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の情報を取得して表示してみよう(HTTPS通信)

    さて、前回まではM5StickCで加速度センサーを使ったり、…

  3. 実験室

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

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

  4. 実験室

    ESP32とステッピングモーターでメーター的なものを作ってみよう(28BYJ-48・ULN2003)…

    今夜のスラニュー実験室では、ステッピングモーターを使ってアナログメー…

  5. 実験室

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

    もう5回もやってるので連載っぽくなってきました。今日…

  6. 実験室

    こんなに簡単にできちゃうの?っていうWordPressレコメンドプラグイン「Kindred Post…

    時代はパーソナライズですよ、機械学習ですよ。でも、先日TensorF…

コメント

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

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

最新の記事

スラニューについて

PAGE TOP