認可されたオンライン小売業者:
セブンセグメントディスプレイ(SSD)またはセブンセグメントインジケーターは、より複雑な dot matrix displaysの代替となる、十進法の命数法を表示するための電子ディスプレイ装置 です。セブンセグメントディスプレイは、デジタル時計、電子メーター、基本的な電卓、および数字情報を表示する他の電子機器で広く使用されています。
このレッスンでは、4桁の7セグメントディスプレイの動作と、OSOYOO Basicボードと4桁の7セグメントディスプレイを使用する方法について説明します。ここでは、共通カソードの4桁の7セグメントディスプレイを使用しています。
コンパクトなモジュールには4つの7セグメントLEDディスプレイが含まれているか、それらを多重化することで4つの個別の7セグメントディスプレイを使用することができます。
今回は、OSOYOO Basicボードと4桁7セグメントディスプレイのインタフェース方法を見ていきます。この4桁ディスプレイを制御するために、異なる方法を使用します。まずは、この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つ増えるのが見えます。以下のように表示されます。
図に示すように、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。結果は以下の通りです。
DownLoad Url osoyoo.com
You must be logged in to post a comment.
Hi
I need to display time in seconds and milliseconds. Example 13.52 sec
Maximum time 99 seconds.
What changes to be made in the code?