Jak działa wyświetlacz siedmiosegmentowy i jego interfejs z Arduino
Ile razy widziałeś film, w którym ktoś musi dezaktywować bombę? Bohater patrzy na wyświetlacz, gdy czas mija, a każda sekunda jest cenniejsza od poprzedniej. Cóż, jeśli zauważyliście, wszystkie te bomby w filmach mają siedmiosegmentowe wyświetlacze. To musi być to! W przeciwnym razie, skąd bohater mógłby wiedzieć, ile czasu mu zostało?
Może siedmiosegmentowe wyświetlacze nie wyglądają dla ciebie wystarczająco nowocześnie, ale są najbardziej praktycznym sposobem wyświetlania liczb. Są łatwe w użyciu, efektywne kosztowo i bardzo czytelne, zarówno w ograniczonych warunkach oświetleniowych, jak i w silnym świetle słonecznym.
Przykładem z prawdziwego świata, który wykorzystuje wyświetlacz siedmiosegmentowy, jest słynny zegar odliczający na Przylądku Canaveral na Florydzie, który NASA wykorzystała do lądowania Apollo.
Przegląd sprzętu
Przed podłączeniem go do Arduino omówmy pokrótce cechy i funkcjonalność wyświetlacza 7-segmentowego.
Wyświetlacze 7-segmentowe to tak naprawdę po prostu siedem diod LED ułożonych w określony wzór. W tym przypadku jest to znany nam wszystkim kształt cyfry '8′. Każda z siedmiu diod LED jest nazywana segmentem, ponieważ kiedy świeci, segment tworzy część cyfry (zarówno dziesiętnej jak i szesnastkowej), która ma być wyświetlana. Dodatkowa ósma dioda LED jest czasami używana do wskazywania kropki dziesiętnej.
Każda z siedmiu diod LED w wyświetlaczu ma przypisany segment pozycyjny, a jeden z jego pinów połączeniowych jest wyprowadzony prosto z prostokątnej plastikowej obudowy. Te indywidualne piny LED są oznaczone od a do g, reprezentując każdą pojedynczą diodę LED. Pozostałe piny LED są połączone razem i połączone w jeden wspólny pin.
Aby włączyć lub wyłączyć daną część wyświetlacza, ustawiamy odpowiedni pin na HIGH lub LOW, tak jak w przypadku zwykłej diody LED. Dzięki temu jedne segmenty będą świecić, a inne będą ciemne, co pozwoli na wygenerowanie na wyświetlaczu pożądanego wzoru znaku liczby. To pozwala nam na wyświetlenie każdej z dziesięciu cyfr dziesiętnych od 0 do 9 na tym samym wyświetlaczu 7-segmentowym.
Wygląd pinów wyświetlacza 7-segmentowego
Przejrzyjmy teraz konfigurację segmentów, abyśmy wiedzieli które piny podświetlają które segmenty. Rozkład pinów dla wyświetlacza 7-segmentowego jest następujący.
a-g & DP Z 10, 8 pinów tj.a, b, c, d, e, f, g oraz segment DP (kropka dziesiętna) są podłączone do pinów cyfrowych Arduino. Poprzez sterowanie każdą diodą LED na podłączonym segmencie można wyświetlać liczby.
COM Piny 3 i 8 są wewnętrznie połączone tworząc pin wspólny. Ten pin powinien być podłączony do GND (wspólna katoda) lub 5V (wspólna anoda) w zależności od typu wyświetlacza.
Common Cathode(CC) Vs Common Anode(CA)
Wyświetlacze siedmiosegmentowe są dwóch typów: Common Cathode (CC) i Common Anode (CA).Struktura wewnętrzna obu typów jest prawie taka sama. Różnica polega na polaryzacji diod LED i wspólnego terminala. Jak sama nazwa wskazuje, wspólna katoda posiada wszystkie katody diod LED w 7-segmencie połączone razem, a wspólna anoda posiada wszystkie anody diod LED w 7-segmencie połączone razem.
W wyświetlaczu ze wspólną katodą, wszystkie połączenia katodowe segmentów LED są połączone razem do 'logicznego 0′ / GND. Poszczególne segmenty są następnie podświetlane przez podanie sygnału HIGH / 'logic 1′ do poszczególnych zacisków anodowych (a-g).
Wspólny wyświetlacz anodowy, wszystkie połączenia anodowe segmentów LED są połączone w logiczną „1”. Poszczególne segmenty są podświetlane poprzez podanie sygnału masy, logicznego „0” lub „LOW” na katodę danego segmentu (a-g).
Ogólnie, wyświetlacze ze wspólną anodą (takie jak te, których użyliśmy w poniższych eksperymentach) są bardziej popularne, ponieważ wiele układów logicznych może zatapiać więcej prądu niż jest w stanie wydzielić.
Należy również pamiętać, że wyświetlacz ze wspólną katodą nie jest bezpośrednim zamiennikiem w obwodzie dla wyświetlacza ze wspólną anodą i odwrotnie, ponieważ jest to równoznaczne z odwrotnym podłączeniem diod LED, a co za tym idzie emisja światła nie będzie miała miejsca.
Jak działa wyświetlacz 7-segmentowy?
W zależności od wyświetlanej cyfry dziesiętnej, dany zestaw diod LED jest podświetlany. Na przykład, aby wyświetlić cyfrę 4, musimy zapalić cztery segmenty LED odpowiadające b, c, f i g. Tak więc różne cyfry od „0 do 9” i znaki od „A do F” mogą być wyświetlane przy użyciu wyświetlacza 7-segmentowego, jak pokazano na rysunku.
Poniższa tabela prawdy pokazuje poszczególne segmenty, które muszą być podświetlone, aby wyświetlić cyfry i znaki. Należy pamiętać, że tabela prawdy dla 7-segmentowego wyświetlacza ze wspólną anodą jest dokładnie odwrotna niż dla 7-segmentowego wyświetlacza ze wspólną katodą.
Okablowanie – Podłączenie wyświetlacza 7-segmentowego do Arduino UNO
Teraz, gdy zrozumieliśmy jak działa wyświetlacz 7-segmentowy wyświetlacz, możemy zacząć podłączać go do Arduino!
Zacznij od umieszczenia wyświetlacza 7-segmentowego na płytce drukowanej, upewniając się, że każda strona wyświetlacza znajduje się na osobnej stronie płytki. Z kropką dziesiętną skierowaną w dół, piny to 1-5 na dolnej stronie od lewej do prawej i 10-6 na górnej stronie od lewej do prawej, jak widać na poniższej ilustracji.
Na początek podłączmy jeden ze wspólnych pinów 3 lub 8 do pinu 5V na Arduino (jeśli używasz wyświetlacza 7-segmentowego ze wspólną anodą) lub do pinu GND na Arduino (jeśli używasz wyświetlacza 7-segmentowego ze wspólną katodą). Pozostałe 4 piny na górnej pozycji są podłączone do pinów cyfrowych od 2 do 5. Pozostałe 4 piny na dolnej pozycji z kropką dziesiętną są podłączone do pinów cyfrowych od 6 do 9.
Pomimo, że wyświetlacz może działać bez rezystorów ograniczających prąd, zawsze dobrze jest mieć je w swoim układzie, aby uniknąć spalenia wyświetlacza.
Typowo dla standardowego czerwonego wyświetlacza 7-segmentowego, każdy segment LED może pobierać około 15 mA aby prawidłowo świecić, więc na 5 woltowym cyfrowym obwodzie logicznym, wartość rezystora ograniczającego prąd wynosiłaby około 200Ω (5v – 2v)/15mA, lub 220Ω do najbliższej wyższej preferowanej wartości.
Gdy skończysz powinieneś mieć coś, co wygląda podobnie do ilustracji pokazanej poniżej.
KodArduino
Teraz, nadszedł czas, aby podświetlić wyświetlacz za pomocą jakiegoś kodu.
Zanim zaczniesz pisać kod do sterowania wyświetlaczami 7-segmentowymi, musisz najpierw pobrać bibliotekę SevSeg Arduino. Można to zrobić, odwiedzając repo na GitHubie i ręcznie pobierając bibliotekę lub po prostu klikając ten przycisk, aby pobrać plik zip:
Aby ją zainstalować, otwórz Arduino IDE, przejdź do Sketch > Include Library > Add .ZIP Library, a następnie wybierz plik ZIP SevSeg, który właśnie pobrałeś. Jeśli potrzebujesz więcej szczegółów na temat instalacji biblioteki, odwiedź ten tutorial Installing an Arduino Library.
Gdy masz już zainstalowaną bibliotekę, możesz skopiować ten szkic do Arduino IDE. Poniższy szkic testowy będzie odliczał od 0 do 9. Wypróbuj szkic, a następnie wyjaśnimy go szczegółowo.
#include "SevSeg.h"SevSeg sevseg;void setup(){//Set to 1 for single digit displaybyte numDigits = 1;//defines common pins while using multi-digit display. Left empty as we have a single digit displaybyte digitPins = {};//Defines arduino pin connections in order: A, B, C, D, E, F, G, DPbyte segmentPins = {3, 2, 8, 7, 6, 4, 5, 9};bool resistorsOnSegments = true;//Initialize sevseg object. Uncomment second line if you use common cathode 7 segmentsevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments);//sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins, resistorsOnSegments);sevseg.setBrightness(90);}void loop(){ //Display numbers one by one with 2 seconds delay for(int i = 0; i < 10; i++) { sevseg.setNumber(i); sevseg.refreshDisplay(); delay(2000); }}
Objaśnienie kodu:
Szkic rozpoczyna się od włączenia biblioteki SevSeg, która upraszcza sterowanie i sygnały do 7-segmentowego układu. Następnie musimy utworzyć obiekt SevSeg, którego będziemy mogli używać w całym szkicu.
#include "SevSeg.h"SevSeg myDisplay;
Następnie musimy określić ile cyfr ma wyświetlacz. Ponieważ używamy wyświetlacza jednocyfrowego, ustawiamy go na 1. W przypadku, gdy używasz wyświetlacza czterocyfrowego, ustaw go na 4.
//Set to 1 for single digit displaybyte numDigits = 1;
Tablica digitPins po prostu definiuje „wspólne piny”, gdy używasz wyświetlacza wielocyfrowego. Pozostaw ją pustą, jeśli masz wyświetlacz jednocyfrowy. W przeciwnym razie podaj numery pinów arduino, do których podłączone są „wspólne piny” poszczególnych cyfr. Uporządkuj je od lewej do prawej.
//defines common pins while using multi-digit display//Left empty as we have a single digit displaybyte digitPins = {};
Drugą tablicą, którą widzimy podczas inicjalizacji jest tablica segmentPins. Jest to tablica wszystkich numerów pinów Arduino, które są podłączone do pinów na wyświetlaczu LED, które kontrolują segmenty; tak więc w tym przypadku są to te, które podłączyliśmy bezpośrednio z breadboardu do Arduino. Należy je również umieścić w odpowiedniej kolejności, ponieważ biblioteka zakłada, że piny są w następującej kolejności: A, B, C, D, E, F, G, DP.
//Defines arduino pin connections in order: A, B, C, D, E, F, G, DPbyte segmentPins = {3, 2, 8, 7, 6, 4, 5, 9};
Po utworzeniu tych zmiennych, przekazujemy je następnie do konstruktora SevSeg za pomocą funkcji begin()
.
//Initialize sevseg objectsevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments);
W sekcji 'loop': Program zaczyna liczyć w górę od 0 do 9 używając pętli 'for' oraz zmiennej 'i'. Za każdym razem używa funkcji biblioteki SevSeg setNumber()
wraz z refreshDisplay ()
do ustawienia liczby na wyświetlaczu.
Potem następuje sekundowe opóźnienie zanim 'i' zostanie zwiększone i wyświetlona następna liczba.
for(int i = 0; i < 10; i++){ sevseg.setNumber(i); sevseg.refreshDisplay(); delay(1000);}
Projekt Arduino
Rolling Dice
Jako uzupełnienie, oto inny projekt, który pozwala ludziom, którzy potrzebują technologii dostępności, „rzucać” kostką. Możesz użyć go do gier takich jak Yahtzee, ludo itp. Wykorzystuje on ten sam układ Arduino, z wyjątkiem tego, że używamy dotykowego przełącznika do szybkiego toczenia.
Całym celem kostki do gry jest zapewnienie sposobu na losowe wymyślenie liczby od 1 do 6. A najlepszym sposobem na uzyskanie losowej liczby jest użycie wbudowanej funkcji random(min,max). Pobiera ona dwa parametry, pierwszy z nich określa dolną granicę wartości losowej (włączając tę liczbę), a drugi parametr określa górną granicę wartości losowej (wyłączając tę liczbę). Oznacza to, że liczba losowa zostanie wygenerowana pomiędzy min a max-.1
#include "SevSeg.h"SevSeg sevseg; const int buttonPin = 10; // the number of the pushbutton pin// variables will change:int buttonState = 0; // variable for reading the pushbutton statusvoid setup(){ byte numDigits = 1; byte digitPins = {}; byte segmentPins = {3, 2, 8, 7, 6, 4, 5, 9}; bool resistorsOnSegments = true; sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments); sevseg.setBrightness(90);// initialize the pushbutton pin as an input:pinMode(buttonPin, INPUT);}void loop(){// read the state of the pushbutton value:buttonState = digitalRead(buttonPin); if (buttonState == HIGH) {sevseg.setNumber(random(1,7));sevseg.refreshDisplay(); }}