TM1637 を利用して4桁7セグメントLEDを利用する

TM1637 とは

TM1637 は、4桁7セグメントのLEDを簡単に表示するためのモジュールです。

7セグメントLEDはその名の通り、1文字 (または数字) 毎に7セグメントあるので、本来は制御するためにたくさんの入出力が必要になります。 TM1637 モジュールを利用することで、電源の他はデジタルピン2本だけで、4桁7セグメントのLEDを制御できます。

TM1637

VCC (5V) と GND の他は、CLK と DIO の2本のピンだけです。これを任意のデジタルピンに接続して使います。(プログラムでピンを指定します)

TM1637

Arduino UNO で TM1637 を利用する

早速、Arduino から TM1637 を制御して、好きな数字や文字を表示してみましょう。

今回は次のライブラリを利用しました。

  • Grove_4Digital_Display
    https://github.com/Seeed-Studio/Grove_4Digital_Display

このライブラリは、Arduino IDE の Manage Library メニューからも探せます。

TM1637

しかし、このライブラリを Arduino IDE からインストールすると、どういうわけか古いライブラリがインストールされるようです。

古いライブラリでも後述の display() 関数だけを使うなら、問題は無いように思いますが、ライブラリのフル機能を使うには GitHub から直接ダウンロードした方が良いと思います。

GitHub からのライブラリのインストール

GitHub はオープンソース・ソフトウェアのコミュニティです。Git というバージョンコントロールシステムのコマンドに対応しており、 ソースコードをダウンロードしたり、コミュニティに公開したりすることが簡単にできる仕組みになっています。

上記の URL のプロジェクトのホームページに行くと、 Code ボタンがあります。

ここから最新のソースコードが ZIP 形式でダウンロードできます。

TM1637

ダウンロードした ZIP ファイルは、Arduino IDE の Sketch > Include Library > Add .ZIP Library... から追加できます。

ZIP を追加する方法の他、GitHub からライブラリを取り込むには、リポジトリをクローンする方法もあります。

GitHub からはソースコードのプロジェクト毎 (これを「リポジトリ」といいます)、ダウンロードすることができます。この作業を「リポジトリをクローンする」といいます。

GitHub からリポジトリをクローンするには、次のようにします。

まず、リポジトリをクローンする場所 (ディレクトリ) を調べます。

Arduino IDE の Preferences メニューの Schetchbook location から確認できますが、デフォルトでは次の場所です。

  • Windows: C:\Users\<Username>\Documents\Arduino
  • Mac: /Users/<Username>/Documents/Arduino

コマンドラインから、上記で調べたす Schetchbook ロケーションに移動し、そこでリポジトリの URL を指定して git clone コマンドを実行すれば、リポジトリがクローンされます。

Mac の環境では次のようになります。

cd ~/Documents/Arduino
git clone https://github.com/Seeed-Studio/Grove_4Digital_Display.git

Git コマンドを利用するには、Git をあらかじめインストールしておく必要があります。

ライブラリがインストールできたら、数字や文字を表示するコードを書いてみましょう。

Arduino で TM1637 を用いて数字を表示する

Grove_4Digital_Display ライブラリをインストールすると、次のコードがコンパイルできるようになります。

#include "TM1637.h"

#define PIN_CLK (5) // CLK は D5
#define PIN_DIO (6) // DIO は D6

TM1637 tm( PIN_CLK, PIN_DIO );

void setup() {
  tm.init();
  tm.set( BRIGHT_TYPICAL ); 
  tm.clearDisplay();
}

void loop() {
  tm.display(0, 1);
  tm.display(1, 3);
  tm.display(2, 5);
  tm.display(3, 7);

  while(1) {}
}

ここでは CLK ピンを Arduino の D5 に、DIO ピンを D6 に接続しています。

15行目から18行目で、 display() 関数を使って数字を表示しています。 display() 関数の第一引数が数字を表示する場所です。左から順に 0 , 1, 2, 3 となります。第二引数が表示する数字です。

TM1637

実際は数字だけでなく、アルファベットも表示できます。

Arduino で TM1637 を用いて数字を表示する (displayNum の利用)

上のコードでは数字 1357 を表示するために、四つの場所にそれぞれ 1357 と表示するように指定していました。

この方法は柔軟性があって良いのですが、計測値を表示するなど、任意の数字を表示するのに不便ですね。

このライブラリには displayNum() という関数も実装されていて、指定した数字を右寄せで表示できます。

次のコードの 15 行目で displayNum() 関数を呼び出しています。

#include "TM1637.h"

#define PIN_CLK (5)
#define PIN_DIO (6)

TM1637 tm( PIN_CLK, PIN_DIO );

void setup() {
  tm.init();
  tm.set( BRIGHT_TYPICAL ); 
  tm.clearDisplay();
}

void loop() {
  tm.displayNum( 1234 );

  while(1) {} // Done
}

このコードを Arduino UNO にアップロードすると、次のように数字 1234 が表示されます。

TM1637

コンパイルできない?

もし、"displayNum" というメソッドが存在しない、というエラーが発生したら、古いバージョンのライブラリがインストールされています。一旦、ライブラリを削除して、上記の方法でライブラリをインストールし直してみてください。

ちなみに、このライブラリの displayNum 関数はとても便利なのですが、数値 0 のときに 0 と表示するのではなく、全く非表示になります。

私は 0 のときは 0 と表示したかったので、 クローンしたリポジトリ内の TM1637.cpp に5行だけ足して、0 を表示するようにしました。

void TM1637::displayNum(float num, int decimal, bool show_minus) {
    // Displays number with decimal places (no decimal point implementation)
    // Colon is used instead of decimal point if decimal == 2
    // Be aware of int size limitations (up to +-2^15 = +-32767)
    
    // Show zero num
    if ( num == 0.f ) {
        for (int i = 0; i < 4; i ++) {
            display( i, i == 3 ? 0 : 0x7f );
        }
        return;
    }

Arduino と TM1637 でスクロールして長い文字列を表示する

このライブラリには displayStr() という便利な関数が実装されていて、 長い文字を右から左に流れるように表示してくれます。

TM1637

コードは次のようになります。15行目で displayStr() 関数を呼び出しています。他の部分はこれまでと一緒です。

#include "TM1637.h"

#define PIN_CLK (5)
#define PIN_DIO (6)

TM1637 tm( PIN_CLK, PIN_DIO );

void setup() {
  tm.init();
  tm.set( BRIGHT_TYPICAL );
  tm.clearDisplay();
}

void loop() {
  tm.displayStr( "Hello world" );

  while(1) {} // Done
}

Arduino と TM1637 で任意のパターンを表示する

7セグメントLEDは、その名の通り、7つのLEDでひとつの文字を構成します。

8の字のそれぞれの辺に1から7番の番号を降り、1が最下位ビットとして7が最上位のビットとします。点灯するLEDを1、消灯するLEDを0にするようにビットを並べることで、任意のパターンに点灯できます。

次の例では数字の5を表すパターンの作り方を示しています。

TM1637

点灯するのは 1, 3, 4, 6, 7 番のLEDです。2 と 5 は消灯です。そのため、ビットパターンは 0b1101101 となります。

こうして作ったビット列をそのまま表示する関数は次のようになります。

#include "TM1637.h"

#define PIN_CLK (5)
#define PIN_DIO (6)

TM1637 tm( PIN_CLK, PIN_DIO );

void setup() {
  tm.init();
  tm.set( BRIGHT_TYPICAL );
  tm.clearDisplay();
}

void loop() {
  custom_display( 0, 0b1101101 ); // 5

  custom_display( 1, 0b0111001 );
  custom_display( 2, 0b0001001 ); 
  custom_display( 3, 0b0001111 );
  
  while(1) {}
}

void custom_display(uint8_t bit_addr, uint8_t seg_data) {
  tm.start();
  tm.writeByte( 0x44 );
  tm.stop();
  tm.start();
  tm.writeByte(bit_addr | 0xc0);
  tm.writeByte(seg_data);
  tm.stop();
  tm.start();
  tm.writeByte(tm.cmd_disp_ctrl);
  tm.stop();
}

この結果、次のように表示されます。

TM1637

以上、ここでは Arduino UNO と TM1637 LED ドライバモジュールを使って、4桁7セグメントのLEDの制御方法について説明しました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 基礎からの IoT 入門