Arduino で作る 7 セグメント LED タイマー
(2017/01/24 00:31:46)
作品の簡単な説明
Arduino の入門として、4 桁の 7 セグメント LED でカウントアップタイマーを作ってみます。PIN の電流制限を考慮してトランジスタを使用する必要があったり、桁数が多いためダイナミック点灯制御を用いなければならなかったりと、単なる LED 点灯制御と比較して考えなければならない事項は多めです。
作り方 1ページ目 (全 1 ページ)

必要なパーツ

ブレッドボード配線を除くと、実験に必要なパーツは以下のとおりです。Arduino の電源は USB 経由で PC から供給します。

回路図

Uploaded Image

http://schematics.com/project/7seg-led-timer-47476/

トランジスタアレイによるスイッチング

OSL40562-LR のピンは 12 本あります。6,8,9,12 の 4 本はどの桁を点灯させるかを制御するために利用します。1,2,3,4,5,7,10,11 の 8 本は各桁内で点灯するセグメント LED に対応しており、組み合わせで数字等を描画します。例えば 1,2,3,4,5,7,10,11 のすべてを 180Ω 抵抗を介して 5V 電源に接続した状態で 6 だけを GND に接続すると、左側の 1 桁が小数点を含めて全点灯し、右側の 3 桁は消灯したままになります。

このとき、OSL40562-LR はカソードコモン (-) ですから、赤色 LED における電圧降下が約 1.9V だとすると、アノードピン (+) の 1,2,3,4,5,7,10,11 にはそれぞれ (5V - 1.9V) / 180Ω = 17.2mA の電流が流れ込み、カソードピン (-) の 6 から 17.2mA * 8 = 138mA の電流が流れ出ることになります。ところが、Arduino UNO のデジタル入出力ピン 2-13 はそれぞれ 20mA を越える電流を流せません。そこで、トランジスタを 8 個内蔵したトランジスタアレイ TD62083APG を利用して、カソードから流れ出る電流は GND に直接流れるようにします。Arduino の 6,8,9,12 ピンは OSL40562-LR のカソードピンから電流を流すかどうかをスイッチング制御する目的で利用します。

ダイナミック点灯制御

OSL40562-LR は構造上、各桁で異なるパターンの LED を点灯させることができません。そのため、一桁だけを点灯させた状態を各桁について順々に繰り返すダイナミック点灯で制御します。人間の目の残像効果があるため、高速に制御することで、全桁が異なるパターンで同時に点灯しているように見えます。

制御プラグラム

Arduino のスケッチです。setup 関数内でデジタル入出力用の PIN 2-13 を初期化します。loop 関数が実行される度に起動してから経過した時間を取得し、4 桁の LED をそれぞれ delay で 2msec だけ点灯させます。

// 点灯パターン
bool patterns[][8] = {
  //  2
  // 1 0
  //  3
  // 7 4
  //  65
  {1,1,1,0,1,0,1,1}, // '0'
  {1,0,0,0,1,0,0,0}, // '1'
  {1,0,1,1,0,0,1,1}, // '2'
  {1,0,1,1,1,0,1,0}, // '3'
  {1,1,0,1,1,0,0,0}, // '4'
  {0,1,1,1,1,0,1,0}, // '5'
  {0,1,1,1,1,0,1,1}, // '6'
  {1,1,1,0,1,0,0,0}, // '7'
  {1,1,1,1,1,0,1,1}, // '8'
  {1,1,1,1,1,0,0,0}  // '9'
};

void setDigitAs(int digit, int num) {
  // 一つ前の LED を消灯
  if(digit == 0) {
    digitalWrite(5, LOW);
  }
  else {
    digitalWrite(digit + 2 - 1, LOW);
  }

  // num のパターンを設定
  for(int i = 0; i < 8; ++i) {
    digitalWrite(i + 6, patterns[num][i]);
  }

  // LED を点灯
  digitalWrite(digit + 2, HIGH);
}

void setup() {
  // デジタル入出力用の PIN 2-13 を初期化
  for(int i = 2; i < 14; ++i) {
    pinMode(i, OUTPUT);
    digitalWrite(i, LOW);
  }
}

void loop(){
  // 起動してから経過した秒数
  // https://www.arduino.cc/en/Reference/Millis
  unsigned long uptime = millis() / 1000;

  for(int i = 0; i < 4; ++i) {
    // i+1 桁 LED セグメントの数値を設定
    int n = uptime % 10;
    uptime /= 10;
    // i+1 桁目を n に設定して少し待つことで点灯時間の割合を増やします。
    setDigitAs(i, n);
    delay(2);
  }
}