ESP8266 (ESP-WROOM-02) で7セグメントLEDを制御する


概要

ESP8266(ESP-WROOM-02 以下 WROOM02) を使って、7セグメント 4ディジット のLEDを制御する。

はじめに

WROOM02 は Wi-Fi 通信機能が内蔵された Arduino (として使える IC) です。

※センサーを使うには、以下参照。
http://qiita.com/exabugs/items/9ca4093813db71278b39

今回は、7セグメント 4ディジット (5461AS カソード・コモン) の LED を制御します。

回路図

Eagle プロジェクト全体はこちらの Github にアップしています。
https://github.com/exabugs/eagle7seg4digits

実際の回路図は以下。

1 LED あたり 20mA 程度なので、アノード側はソースドライバを使わなくてもいけると思います。
なので、カソード側だけ、シンクドライバ(TD62083APG)を使っています。

[注意]
- WROOM02 は 3.3V 駆動です。電源回路は別途足してください。
- USB-シリアル変換 のインタフェースは、回路図から外していますので、TXD/RXD, GND に適切に接続してください。

スケッチ

スケッチは以下になります。
- 10000 からカウントダウンします。
- 1ディジットを 4msec でダイナミック点灯しています。これより長いとちらつきました。

#include "Ticker.h"

Ticker ticker;
Ticker ticker2;

#define SCK 14                // CLK       クロック信号出力ピン
#define RCK 12                // LOAD      ラッチ動作出力ピン
#define SI  13                // MOSI - DI データ信号出力ピン
#define CLR 15                // クリア

const int segments[] = {
//  HGFEDCBA
  0b00111111, // 0
  0b00000110, // 1
  0b01011011, // 2
  0b01001111, // 3
  0b01100110, // 4
  0b01101101, // 5
  0b01111101, // 6
  0b00100111, // 7
  0b01111111, // 8
  0b01101111, // 9
};

const int digits[] = {
//  HGFEDCBA
  0b00000001, // 0
  0b00000010, // 1
  0b00000100, // 2
  0b00001000, // 3
};

void out1(int x, int d) {
  digitalWrite(CLR, LOW) ; // Clear
  digitalWrite(CLR, HIGH) ;

  digitalWrite(RCK, LOW) ;
  shiftOut(SI, SCK, MSBFIRST, digits[d]);
  shiftOut(SI, SCK, MSBFIRST, segments[x]);
  digitalWrite(RCK, HIGH) ;        // ラッチ信号を出す
}

void out4(int val) {
  static int p = 0;
  p = ++p % 4;
  int x[4];
  for (int i = 0; i < 4; i++) {
    x[i] = val % 10;
    val = val / 10;
  }
  out1(x[p], p);
}

void setup() {
  Serial.begin(115200);
  Serial.print("\n");

  pinMode(SCK, OUTPUT) ;
  pinMode(RCK, OUTPUT) ;
  pinMode(SI,  OUTPUT) ;
  pinMode(CLR, OUTPUT) ;

  delay(3000) ;            // 3S後開始

  Serial.print("Start\n");

  ticker.attach_ms(1000, timer);
  ticker2.attach_ms(4, loop2);
}

int cnt = 10000;

void loop() {
}

void loop2() {
  out4(cnt);
}

void timer() {
  cnt--;
  Serial.print(cnt);
  Serial.print("\n");
}

Arduino スケッチ 全体はこちらの Github から。
https://github.com/exabugs/sketch7seg4digits

制作

実際に作ってみると、こんな感じです。

まとめ

ESP8266(ESP-WROOM-02 以下 WROOM02) を使って、7セグメント 4ディジット のLEDを制御しました。
ダイナミック点灯の周期を、ちらつかせずに長くするには、何か手法がありますかね?