実験室

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. 実験室

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

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

  2. 実験室

    3Dプリンターとステッピングモーターで、動画撮影用のターンテーブルをつくろう!

    動画をかっこよく撮影するための、撮影用ターンテーブルをつくります。3D…

  3. 実験室

    壮大な計画も小さな一歩から。MacOS CatalinaでM5StickCをLチカ。

    壮大な計画とは先日、IoTデバイスが埋め込まれていて、データ…

  4. 実験室

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

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

  5. 実験室

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

    M5StickCとサーボ(Geekservo)を使って、APIから取…

  6. 実験室

    さあ、M5StickCの6軸IMUで加速度を検知して、画面を光らせたりしてみよう。

    さて、昨日の記事でM5StickCのセットアップとArduino I…

コメント

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

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

最新の記事

スラニューについて

PAGE TOP