注意:すべてのOSOYOO ARDUINO用製品はサードパーティー製品であり、ARDUINOと完全に互換性があります

認可されたオンライン小売業者:

AMAZON
amzuk

内容

  1. 紹介
  2. 準備
  3. 4桁7セグメントLED表示について
  4. サンプル

紹介

 

セブンセグメントディスプレイ(SSD)またはセブンセグメントインジケーターは、より複雑な dot matrix displaysの代替となる、十進法命数法を表示するための電子ディスプレイ装置 です。セブンセグメントディスプレイは、デジタル時計、電子メーター、基本的な電卓、および数字情報を表示する他の電子機器で広く使用されています。

 

このレッスンでは、4桁の7セグメントディスプレイの動作と、OSOYOO Basicボードと4桁の7セグメントディスプレイを使用する方法について説明します。ここでは、共通カソードの4桁の7セグメントディスプレイを使用しています。

準備物

ハードウェア

ソフトウェア

4桁の7セグメントLEDディスプレイについて

コンパクトなモジュールには4つの7セグメントLEDディスプレイが含まれているか、それらを多重化することで4つの個別の7セグメントディスプレイを使用することができます。

特徴

今回は、OSOYOO Basicボードと4桁7セグメントディスプレイのインタフェース方法を見ていきます。この4桁ディスプレイを制御するために、異なる方法を使用します。まずは、この4桁7セグメントディスプレイのピンアウトを見てみましょう。

4桁7セグメントディスプレイのピンアウト

4桁7セグメントLEDディスプレイには12本のピンがあります。8本のピンは、AからGおよびDP(小数点)を含む各7セグメントディスプレイの8つのLED用です。残りの4本のピンは、D1からD4までの各桁を表します。

共通アノードまたは共通カソード

ディスプレイモジュールの各セグメントは、マルチプレクスされており、同じアノード接続点を共有しています。そして、モジュール内の4桁の各数字には、独自の共通カソード接続点があります。これにより、各桁を独立してオン/オフできます。また、このマルチプレクシング技術により、ディスプレイを制御するために必要なマイクロコントローラのピン数を32本から11本または12本に減らすことができます。

共通陽極

共通陰極

マルチプレクシング技術

では、4桁のディスプレイに「1234」という数字を表示するにはどうすればいいでしょうか?これには、多重化と呼ばれる方法を使います。多重化とは、ディスプレイユニットに1つの数字を表示して、ディスプレイユニット間を非常に高速に切り替えることです。視覚の持続性のため、人間の目はどのディスプレイがオン/オフであるかを区別できません。人間の目は、4つのディスプレイユニットが常にオンであると見なします。例えば、1234を表示する必要がある場合、まず「1」に関連するセグメントをオンにし、1番目のディスプレイユニットをオンにします。次に、信号を送って「2」を表示し、1番目のディスプレイユニットをオフにし、2番目のディスプレイユニットをオンにします。これを次の2つの数字に対して繰り返し、ディスプレイユニット間の切り替えは非常に高速に行う必要があります(約1秒以内の遅延)。目が1秒以内に繰り返し発生する変化をピックアップできないため、私たちはディスプレイに1234が同時に表示されているように見えます。

寸法

ストップウォッチ

この例では、4桁の7セグメントディスプレイを使用してストップウォッチを作成し、4桁の7セグメントディスプレイ上で1秒ごとに数値が増加するのを見ることができます。

接続

以下のように回路を構築します。

4桁の7セグメントディスプレイとOSOYOO Basicボードの配線は以下のようになります。

4桁の7セグメントディスプレイ

Osoyoo Basic board

a

2

b

3

c

4

d

5

e

6

f

7

g

8

p

9

D1

13

D2

12

D3

11

D4

10

コードプログラム

上記の手順が完了したら、USBケーブルを使ってボードをコンピューターに接続します。緑色の電源LED(PWRと表示されている)が点灯します。次に、Arduino IDEを開いて、プロジェクトに対応するボードタイプとポートタイプを選択し、以下のスケッチ をボードにロードします。

コードをボードにアップロードする前に、Arduinライブラリー「TimerOne.h.」がインストールされていることを確認してください。

#include <TimerOne.h>
//the pins of 4-digit 7-segment display attach to pin2-13 respectively 
int a = 7;
int b = 3;
int c = 4;
int d = 5;
int e = 6;
int f = 2;
int g = 8;
int p = 9;
int d4 = 10;
int d3 = 11;
int d2 = 12;
int d1 = 13;
long n = 0;// n represents the value displayed on the LED display. For example, when n=0, 0000 is displayed. The maximum value is 9999. 
int x = 100;
int del = 5;//Set del as 5; the value is the degree of fine tuning for the clock
int count = 0;//Set count=0. Here count is a count value that increases by 1 every 0.1 second, which means 1 second is counted when the value is 10
void setup()
{
  //set all the pins of the LED display as output
  pinMode(d1, OUTPUT);
  pinMode(d2, OUTPUT);
  pinMode(d3, OUTPUT);
  pinMode(d4, OUTPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(p, OUTPUT);

  Timer1.initialize(100000); // set a timer of length 100000 microseconds (or 0.1 sec - or 10Hz => the led will blink 5 times, 5 cycles of on-and-off, per second)
  Timer1.attachInterrupt( add ); // attach the service routine here
}
/***************************************/ 
void loop()
{
  clearLEDs();//clear the 7-segment display screen
  pickDigit(0);//Light up 7-segment display d1
  pickNumber((n/1000));// get the value of thousand
  delay(del);//delay 5ms

  clearLEDs();//clear the 7-segment display screen
  pickDigit(1);//Light up 7-segment display d2
  pickNumber((n%1000)/100);// get the value of hundred
  delay(del);//delay 5ms

  clearLEDs();//clear the 7-segment display screen
  pickDigit(2);//Light up 7-segment display d3
  pickNumber(n%100/10);//get the value of ten
  delay(del);//delay 5ms

  clearLEDs();//clear the 7-segment display screen
  pickDigit(3);//Light up 7-segment display d4
  pickNumber(n%10);//Get the value of single digit
  delay(del);//delay 5ms
}
/**************************************/ 
void pickDigit(int x) //light up a 7-segment display
{
  //The 7-segment LED display is a common-cathode one. So also use digitalWrite to  set d1 as high and the LED will go out
  digitalWrite(d1, HIGH);
  digitalWrite(d2, HIGH);
  digitalWrite(d3, HIGH);
  digitalWrite(d4, HIGH);

  switch(x)
  {
    case 0: 
    digitalWrite(d1, LOW);//Light d1 up 
    break;
    case 1: 
    digitalWrite(d2, LOW); //Light d2 up 
    break;
    case 2: 
    digitalWrite(d3, LOW); //Light d3 up 
    break;
    default: 
    digitalWrite(d4, LOW); //Light d4 up 
    break;
  }
}
//The function is to control the 7-segment LED display to display numbers. Here x is the number to be displayed. It is an integer from 0 to 9 
void pickNumber(int x)
{
  switch(x)
  {
    default: 
    zero(); 
    break;
    case 1: 
    one(); 
    break;
    case 2: 
    two(); 
    break;
    case 3: 
    three(); 
    break;
    case 4: 
    four(); 
    break;
    case 5: 
    five(); 
    break;
    case 6: 
    six(); 
    break;
    case 7: 
    seven(); 
    break;
    case 8: 
    eight(); 
    break;
    case 9: 
    nine(); 
    break;
  }
} 
void clearLEDs() //clear the 7-segment display screen
{
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(p, LOW);
}

void zero() //the 7-segment led display 0
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
}

void one() //the 7-segment led display 1
{
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}

void two() //the 7-segment led display 2
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
}
void three() //the 7-segment led display 3
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
}

void four() //the 7-segment led display 4
{
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void five() //the 7-segment led display 5
{
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void six() //the 7-segment led display 6
{
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void seven() //the 7-segment led display 7
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
}

void eight() //the 7-segment led display 8
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}

void nine() //the 7-segment led display 9
{
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
}
/*******************************************/
void add()
{
  // Toggle LED
  count ++;
  if(count == 10)
  {
    count = 0;
    n++;
    if(n == 10000)
    {
      n = 0;
    }
  }
}

実行結果

アップロードが完了する数秒後に、4桁の7セグメントディスプレイに1秒ごとに数字が1つ増えるのが見えます。以下のように表示されます。

74HC595シフトレジスタを使用した4桁7セグメントディスプレイのインターフェース

図に示すように、OSOYOO Basicボードと4桁7セグメントディスプレイに加えて、74HC595というICを使用しています。74HC595はシフトレジスタICであり、シリアルデータを並列データに変換します。このシフトレジスタICは、7セグメントディスプレイを制御するために必要なArduinoのデジタルI / Oピンの数を減らすために使用されます。回路図から明らかなように、4桁の7セグメントディスプレイの8セグメントラインを制御するために、Arduinoのデジタルピン(シフトレジスタICに接続された)は3つだけ必要です。

接続

以下のように回路を構築します。

7セグメントディスプレイのすべてのセグメントは、シフトレジスタの並列データ出力ピンに接続されています。シフトレジスタのクロック、ラッチ、シリアルデータピンは、デジタルピン6、5、および4にそれぞれ接続されます。各4つの共通陽極ピンは、電流を制限するための200Ωの抵抗器を介してユニークなピン(9、10、11、および12)に接続されています。

コードプログラム

上記の手順が完了したら、USBケーブルを使ってボードをコンピュータに接続してください。緑色の電源LED(PWRとラベルされています)が点灯するはずです。Arduin IDEを開き、プロジェクトに対応するボードタイプとポートタイプを選択してください。その後、次のコード をボードに読み込みます。

このコードをコンパイルする前に、タイマーライブラリをインストールする必要があります。ライブラリをダウンロードし、Arduinライブラリにインストールしてください。

 

#include "Timer.h" //include timer library
Timer t; // craete a timer object
long number = 0; //declear the variables
int first_digit = 0;
int second_digit = 0;
int third_digit = 0;
int fourth_digit = 0;
int timer_event = 0;
int CA_1 = 12;
int CA_2 = 11;
int CA_3 = 10;
int CA_4 = 9;
int clk = 6;
int latch = 5;
int data = 4;
int count = 0;
int digits[4] ;
int CAS[4] = {12, 11, 10, 9};
byte numbers[10] {B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110};
//byte combinations for each number 0-9
void setup() {
  Serial.begin(9600); //serial start and pin config
  pinMode(CA_1, OUTPUT);
  pinMode(CA_2, OUTPUT);
  pinMode(CA_3, OUTPUT);
  pinMode(CA_4, OUTPUT);
  pinMode(clk, OUTPUT);
  pinMode(latch, OUTPUT);
  pinMode(data, OUTPUT);
  digitalWrite(CA_1, HIGH);
  digitalWrite(CA_2, HIGH);
  digitalWrite(CA_3, HIGH);
  digitalWrite(CA_4, HIGH);
  Serial.println("please Enter a number from 0 to 9999");
}

void loop() {
  t.update(); //timer update
  if (Serial.available()) { // read from serial
    t.stop(timer_event); //stop timer if anythign to read
    cathode_high(); // blank the screen
    String s = Serial.readString(); //read the serail value
    number = (long)s.toInt(); //convert it to int
    if (number > 9999) { //check the number is 0-9999
      Serial.println("Please Enter Number Between 0 - 9999");
    } else {
      break_number(number);
      timer_event = t.every(1, display_number); // start timer again
    }
  }
}

void break_number(long num) { // seperate the input number into 4 single digits

  first_digit = num / 1000;
  digits[0] = first_digit;

  int first_left = num - (first_digit * 1000);
  second_digit = first_left / 100;
  digits[1] = second_digit;
  int second_left = first_left - (second_digit * 100);
  third_digit = second_left / 10;
  digits[2] = third_digit;
  fourth_digit = second_left - (third_digit * 10);
  digits[3] = fourth_digit;
}

void display_number() { //scanning

  cathode_high(); //black screen
  digitalWrite(latch, LOW); //put the shift register to read
  shiftOut(data, clk, LSBFIRST, numbers[digits[count]]); //send the data
  digitalWrite(CAS[count], LOW); //turn on the relevent digit
  digitalWrite(latch, HIGH); //put the shift register to write mode
  count++; //count up the digit
  if (count == 4) { // keep the count between 0-3
    count = 0;
  }
}

void cathode_high() { //turn off all 4 digits
  digitalWrite(CA_1, HIGH);
  digitalWrite(CA_2, HIGH);
  digitalWrite(CA_3, HIGH);
  digitalWrite(CA_4, HIGH);
}

コード内には、重要なコード行がコメントで示されています。このコードでは、シリアルモニター(上記の画像を参照)を介して0から9999までの任意の数値を送信できます。私たちは、アルディンタイマー割り込みを使用して数字を切り替えています。各数字のセグメントがオンになり、オフになるようにバイト配列に格納されています。ループ()では、シリアル値が読み取られ、intに変換され、次にlongデータ型に変換されます。その後、このlongデータは、break_number()メソッドによって単一の数字に分割されます。タイマークラスのevery()関数によってマルチプレクシングが実行され、display_number()メソッドが1ミリ秒ごとに呼び出されます。このメソッドでは、Arduin shiftOut()関数を使用してシフトレジスタに信号を送信します。データを送信する前にラッチピンがLOWになり、データを送信した後にHIGHになることに注意してください。cathode_high()と呼ばれる関数は、画面をオフにするために使用されます。

実行結果

アップロードが完了して数秒後、シリアルモニタを開くと、以下のように表示されます:

シリアルモニタに入力した数値が4桁の7セグメントディスプレイに表示されます。次の数値を順番に入力します:1、66、123、1234、9999。結果は以下の通りです。