LoginSignup
7
10

Arduinoで7セグLEDシリアルドライバモジュールを使う

Last updated at Posted at 2020-03-28

ae7seg1920.jpg

秋月電子の 7セグメントLEDシリアルドライバモジュール を使うと、簡単に 7セグLED を扱えるようになります。
この記事では Arduino Nano を使用しています。配線は異なりますが、回路とプログラムは Arduino Uno にも対応しています。

Arduino 自体の使い方については他の記事をご参照ください。

モジュールの特徴

7セグLED の点灯は各LEDごとの配線が煩雑になりがちです。さらに、複数桁を点灯させるために配線がさらに多くなり、場合によりダイナミック点灯の制御が必要になります。

これらの問題を一挙に解決するのがこのモジュールです。

  • 信号線は3本のみ : SDI, SCK, LATCH のみ
  • 桁数に制限なし : 電源が確保できればいくらでも増設可、しかも信号線は増えません
  • スタティック点灯 : 消費電流は大きいですが、原理的にちらつきがありません
  • 表示中の制御の必要なし : 表示以外にCPUリソースを割けます
  • 5V, 3.3V駆動可 : ただし表示色の制限があります(後述)

用意するもの

部品名 画像 はんだ付け 入手先 (参考)
Arduino Nano
(Arduino UNO でも可)
Arduino Nano 必要なし 秋月電子
千石電商 など
7セグLEDシリアルドライバモジュール
完成品
AE-7SEG-BOARD 必要なし 秋月電子: 赤色, 緑色, 青色
7セグLEDシリアルドライバモジュール
DIP化キット
AE-7SEG-BOARD 必要 秋月電子
7セグLEDシリアルドライバモジュール
基板のみ
AE-7SEG-BOARD 必要 秋月電子

7セグLEDモジュールは必要な桁数のみご用意ください。完成品、DIP化キット、基板のみの3種が存在します。

完成品 はやや割高ですが、はんだ付け不要ですぐに使え、赤、緑、青の3色がラインナップされています。
DIP化キット は部品のみのセットで、はんだ付けされていません。またキットは赤色のみです。
基板のみ は最安ですが、7セグLEDが同梱されていません。好みの7セグLEDを使えます。

どのセットでも表面実装部品はすでに実装済みです。

電源電圧

電源電圧の注意

7セグLEDの電源を Arduino Nano の 5V から供給すると、VF (LED の順方向電圧)が高い青色や緑色の7セグであっても問題なく点灯できます。
しかし、電源が 3.3V の場合は VF が足りず、青色や緑色は点灯しないことがあります。

7セグLEDモジュールの電源ピンと各ピンに入力する信号の H レベルは同一としてください。

モジュールに適合する7セグLED

適合する7セグLED

自前の 7セグLED を使用する際は カソードコモン 品を使用してください。7セグLEDモジュールに実装されている各セグメントの電流制限抵抗は 470Ω です。ピン配置、寸法は図を確認してください。また、モジュールの電源電圧が LEDの VF を十分上回っているか確認してください。

回路

回路図 # ピン名 説明
AE-7SEG-BOARD 1, 9 VDD 5V または 3.3V
2, 10 GND グランド
3 SCK クロック入力
4 SDI シリアル入力
5 SDO シリアル出力
6 MR# リセット
7 LATCH ラッチ入力
8 OE 出力有効化

モジュールには 10 本のピンがあります。2本ずつある VDD と GND はどちらか1本ずつ接続すれば十分です。

1桁だけ点灯する場合は、太字で示した SCK, SDI, LATCH の3本のみを通信用のピンとして使います。
2桁以上の場合はさらに、SDO ピンを使い、次の桁の SDI ピンと接続します。

MR#, OE ピンは未接続で構いません。

SPI接続の場合

回路図 Arduino側ピン モジュール側ピン 説明
SPI接続の場合 5V または 3V3 VDD
GND GND
SCK (D13) SCK クロック入力
MOSI (D12) SDI シリアル入力
D9 LATCH ラッチ入力 (どのピンでも可)

SPI の割り当てがあるピンへ SCK, SDI を接続します。LATCH は /SS (D10)以外のピンに接続してください。

GPIO接続の場合

回路図 Arduino側ピン モジュール側ピン 説明
GPIO接続の場合 5V または 3V3 VDD
GND GND
D4 SCK クロック入力 (どのピンでも可)
D5 SDI シリアル入力 (どのピンでも可)
D9 LATCH ラッチ入力 (どのピンでも可)

SCK, SDI, LATCH はお好きなGPIOピンに接続してください。

スケッチ

秋月電子のサイトで用意されているサンプルプログラムを参考に、専用のライブラリ ae7seg を作りました。ライブラリをインストール後、ヘッダファイル ae7seg.h をインクルードしてください。

#include "ae7seg.h"

SPI と GPIO とでは宣言の仕方が異なるだけで、以降の関数の呼び出しは全く同じです。

SPI接続の場合

AE7SEGSPI を使用してください。コンストラクタにはどのピンを LATCH として使うかを指定します。
SDI, SCK はそれぞれ、SPI の MOSI, SCK に対応します。MISO, /SS は使用しません。

#include "ae7seg.h"

#define PIN_LATCH 9

AE7SEGSPI ae7seg(PIN_LATCH);

GPIO接続の場合

AE7SEGGPIO を使用してください。コンストラクタにはどのピンを LATCH, SDI, SCK として使うかを指定します。

#include "ae7seg.h"

#define PIN_SDI 5
#define PIN_SCK 4
#define PIN_LATCH 9

AE7SEGGPIO ae7seg(PIN_LATCH, PIN_SDI, PIN_SCK);

以下、簡略化のために AE7SEGSPI を使い、LATCH ピンとして 9 を指定したプログラム例を示しますが、GPIO として使う場合は適宜読み替えてください。

例: カウンタのスケッチ

0 から 9 までの数字を表示します。
数字を表示するには、beginWrite()endWrite() の間に writeNumber(number) を呼びます。

counter.ino
#include "ae7seg.h"

#define PIN_LATCH 9
#define INTERVAL 1000

AE7SEGSPI ae7seg(PIN_LATCH);

void setup() {}

void loop() {
  static uint16_t count = 0;

  ae7seg.beginWrite();
  ae7seg.writeNumber(count % 10);
  ae7seg.endWrite();
  delay(INTERVAL);

  count++;
}

書き込みに成功すると、1秒ごとに数字がカウントアップしていきます。

counter

発展

16進表示

ライブラリは16進表示にも対応しています。
実は上述のカウンタスケッチの loop() 関数内を以下のように変更すると、

hex_counter.ino
void loop() {
  static uint16_t count = 0;

  ae7seg.beginWrite();
  ae7seg.writeNumber(count % 16);  // <- 0 から 15 が入るように修正
  ae7seg.endWrite();
  delay(INTERVAL);

  count++;
}

0 から F までカウントアップするようになります。

hexcounter

複数桁表示

複数桁の表示にも対応しています。物理的スペースや電源の確保ができれば桁数の制限はありません。
beginWrite()endWrite() の間に、必要な桁数分だけ writeNumber(number) を呼び出すだけです。
ただし、必ず上位桁から呼び出す点に注意してください。

multi_digit.ino
void loop() {
  ae7seg.beginWrite();
  ae7seg.writeNumber(4);  // 上位桁
  ae7seg.writeNumber(2);  // 下位桁
  ae7seg.endWrite();
}

42 と表示されます。

42

ドットセグメント表示

もちろんドットの表示にも対応しています。
writeNumber(number, true) を使ってください。第二引数を指定しない場合は暗黙的にドットが非表示となります。

dot_segment.ino
void loop() {
  ae7seg.beginWrite();
  ae7seg.writeNumber(4, true);  // 上位桁, ドット表示あり
  ae7seg.writeNumber(2);        // 下位桁, ドット表示なし
  ae7seg.endWrite();
}

4.2 と表示されます。

4.2

1/100秒タイマー

複数桁とドット表示を応用したタイマーを作ります。
モジュールを4つ使用した 1/100 秒(疑似)タイマーです。2桁目にドットを表示しています。

timer.ino
#define INTERVAL 10

void loop() {
  static uint16_t count = 0;

  ae7seg.beginWrite();
  {
    if (count >= 1000)
      ae7seg.writeNumber((count / 1000) % 10);
    else
      ae7seg.clear();

    ae7seg.writeNumber((count / 100) % 10, true);
    ae7seg.writeNumber((count / 10) % 10);
    ae7seg.writeNumber(count % 10);
  }
  ae7seg.endWrite();
  delay(INTERVAL);

  count++;

  if (count >= 10000)
    count = 0;
}

clear() は全セグメントを消灯する関数です。0〜10秒までの最上位桁の消灯に使っています。

timer

任意のセグメントの表示

writeDigit(digit) を使うと、数字以外のセグメントの表示が行なえます。引数の digit には8ビット整数を指定し、上位7ビットが7つのセグメントA〜G、残りの下位1ビットがドットセグメントDPに対応しています。各ビットにおいて、0 のとき消灯、1 のとき点灯します。

animation.ino
#define INTERVAL 100

const uint8_t FRAME[] PROGMEM = {
  0b10000000,
  0b01000000,
  0b00000010,
  0b00001000,
  0b00010000,
  0b00100000,
  0b00000010,
  0b00000100,
};

void loop() {
  for (uint8_t i = 0; i < sizeof(FRAME); i++) {
    ae7seg.beginWrite();
    ae7seg.writeDigit(pgm_read_byte_near(FRAME + i));
    ae7seg.endWrite();
    delay(INTERVAL);
  }
}

animation

参考

7
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
10