LED sedmisegmentové indikátory. Arduino a čtyřmístný sedmisegmentový indikátor Sedmisegmentový indikátor 4místný pinout

Nové články

● Projekt 7: 4místná matice 7segmentových indikátorů. Vytvoření dynamického zobrazení

V tomto experimentu se podíváme na fungování Arduina se 4bitovou sedmisegmentovou maticí. Pojďme si udělat představu o dynamickém zobrazení, které vám umožní používat stejné piny Arduino při zobrazování informací na několika sedmisegmentových indikátorech.

Požadované komponenty:

4místná matice sedmisegmentových ukazatelů se skládá ze čtyř sedmisegmentových ukazatelů a je určena k současnému zobrazení 4 číslic na matici, je možné zobrazit i desetinnou čárku. Obvod 4bitové matice na 7segmentových indikátorech je na Obr. 7.1.

Rýže. 7.1. Schéma 4bitové matice na 7segmentových indikátorech

Pro výstup čísla musíte rozsvítit potřebné LED na kolících A-G a DP a vybrat požadovanou matici použitím LOW na kolíky 6, 8, 9 nebo 12.
Pojďme připojit maticové kontakty k desce Arduino a výstupní čísla na různé bity matice. Pro připojení potřebujeme 12 Arduino pinů. Schéma zapojení pro připojení 4bitové matice k desce Arduino je na Obr. 7.2. Při spojování kontaktů se používají omezovací odpory 510 Ohm.

Rýže. 7.2. Schéma připojení pro 4bitovou matici k Arduinu

Napišme náčrt sekvenčního výstupu čísel (0-9) do libovolného registru matice. Pro výběr náhodné hodnoty z rozsahu použijeme funkci random(). Pole čísel ukládá hodnoty odpovídající datům pro zobrazení číslic 0-9 (nejvýznamnější bit bajtu odpovídá označení segmentu A indikátoru a nižší segment segmentu G), pole pinů obsahuje kontaktní hodnoty pro segmenty A-G a DP, pole pindigits obsahuje kontaktní hodnoty pro výběr číslice matice. Obsah náčrtu je uveden ve výpisu 7.1.

// proměnná pro uložení hodnoty aktuální číslice int cislo=0 ; // sedmisegmentový indikátor int číslice=0; void setup()(pro (int i=0 ;i<8 ;i++) pinMode(pins[i],OUTPUT); for (int i=0 ;i<4 ;i++) {pinMode(pindigits[i],OUTPUT); digitalWrite(pindigits[i],HIGH); } } void loop()( číslo=(číslo+1 )%10 ; showNumber(číslo); // DS pro (int i=0 ;i<4 ;i++) digitalWrite(pindigits[i],HIGH); digit=random(0 ,4 ); digitalWrite(pindigits,LOW); delay(3000 ); } void showNumber( int num)(pro (int i=0 ;i<7 ;i++) { if (bitRead(numbers,7 -i)==HIGH) // rozsvítí segment // zhasnutí segmentu digitalWrite(pins[i],LOW); ))
Pořadí připojení:

1. Připojte sedmisegmentový indikátor podle schématu na Obr. 7.3.
2. Načtěte skicu z výpisu 7.2 na desku Arduino.

// seznam pinů Arduina pro připojení k bitům a-g // sedmisegmentový indikátor int piny=(9 ,13 ,4 ,6 ,7 ,10 ,3 ,5 ); // hodnoty pro zobrazení čísel 0-9čísla bajtů = ( B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11111110, B101 // proměnná pro uložení a zpracování aktuální hodnoty int cislo=0 ; int cislo1=0 ; int cislo2=0 ; // sedmisegmentový indikátor int pindigits=(2 ,8 ,11 ,12 ); // proměnná pro uložení aktuální číslice int číslice=0; // pro měření 100 ms unsigned long millis1=0 ; // režim 1 - stopky běží režim=0; const int TLAČÍTKO=14 ; // Pin 14(A0) pro připojení tlačítka int tekButton = NÍZKÁ; // Proměnná pro uložení aktuálního stavu tlačítka int prevButton = NÍZKÁ; // Proměnná pro uložení předchozího stavu// k tlačítkům boolean ledOn = false ; // Aktuální stav LED (zapnuto/vypnuto) void setup(){ // Nakonfigurujte pin tlačítka jako vstup pinMode(BUTTON, INPUT); // Nakonfigurujte piny jako výstupy pro (int i=0 ;i<8 ;i++) pinMode(pins[i],OUTPUT); for (int i=0 ;i<4 ;i++) {pinMode(pindigits[i],OUTPUT); digitalWrite(pindigits[i],HIGH); } } void loop()( tekButton = debounce(prevButton); if (prevButton == LOW && tekButton == HIGH) // pokud je stisknuto... ( mode=1 -mode; // změna režimu if (rezim==1 ) cislo=0 ; ) if (millis()-millis1>=100 && režim==1 ) (millis1=millis1+100 ; číslo=číslo+1 ; if (číslo==10000 ) číslo=0; ) číslo1=číslo; pro (int i=0 ;i<4 ;i++) { number2=number1%10 ; number1=number1/10 ; showNumber(number2,i); for (int j=0 ;j<4 ;j++) digitalWrite(pindigits[j],HIGH); digitalWrite(pindigits[i],LOW); delay(1 ); } } // funkce pro zobrazení čísel na sedmisegmentovém indikátoru void showNumber( int num,int dig)(pro (int i=0 ;i<8 ;i++) { if (bitRead(numbers,7 -i)==HIGH) // rozsvítí segment digitalWrite(pins[i],HIGH); jiný // zhasnutí segmentu digitalWrite(pins[i],LOW); ) if (dig==1 ) // desetinná čárka pro druhou číslici digitalWrite(pins,HIGH); ) // Funkce vyhlazení odrazu. Přijímá jako // argument předchozího stavu tlačítka a vrátí aktuální. booleovský debounce ( booleovský poslední)( booleovský proud = digitalRead(BUTTON); // Přečtěte si stav tlačítka, if (poslední != aktuální) // pokud se to změnilo...(d zpoždění ( 5 ) ; // dejme tomu 5 m s proud = digitalRead(BUTTON); // přečtení stavu tlačítka zpětný proud; // vrátí stav tlačítka } }

3. Stisknutím tlačítka spustíme nebo zastavíme stopky.

V dnešním článku si povíme o 7segmentových indikátorech a o tom, jak se „spřátelit“ s Arduinem. Možností je několik. Nejjednodušší je samozřejmě jít a koupit si hotový indikátor s integrovaným štítem (tak se jmenuje odpovídající karta), ale nehledáme jednoduché cesty, takže půjdeme trochu obtížnější cestou. Začátečníci – nelekejte se, tento článek, stejně jako moje předchozí články ( A ) jen pro tebe. Nechte guruy psát pro stejné zkušené guruy a já jsem začátečník – píšu pro začátečníky.

Proč 7segmentový indikátor? Koneckonců, existuje tolik různých obrazovek s velkým množstvím znaků, řádků, různých úhlopříček a rozlišení, černobílých a barevných, z nichž nejdostupnější stojí pár dolarů... A tady: „starý“ jeden, neuvěřitelně jednoduchý, ale vyžadující obrovské množství pinů 7segmentový indikátor, ale přesto má tento „starý muž“ také výhodu. Faktem je, že pomocí zde uvedených náčrtů můžete oživit nejen indikátor s výškou číslic 14 mm, ale také vážnější (i když domácí) projekty a číslice metrů jsou v tomto případě daleko od limitu. Pro obyvatele hlavních měst to nemusí být tak zajímavé, ale obyvatelé Novokatsapetovky nebo Nizhnyaya Kedrovky budou velmi rádi, když se v klubu nebo vesnické radě objeví hodiny, které mohou také zobrazovat datum a teplotu, a budou mluvit o tvůrci těchto hodin po velmi dlouhou dobu. Ale takové hodinky jsou tématem samostatného článku: návštěvníci budou chtít - Napíšu. Vše výše napsané lze považovat za úvod. Stejně jako můj minulý článek, i tento se bude skládat z částí, tentokrát ze dvou. V první části indikátor jednoduše „spravujeme“ a ve druhé se jej pokusíme přizpůsobit něčemu alespoň trochu užitečnému. Pokračujme tedy:

První část. Experimentálně - vzdělávací

Základem pro tento projekt je ARDUINO UNO, které je nám již dobře známé z předchozích článků. Dovolte mi, abych vám připomněl, že nejjednodušší způsob nákupu je zde: nebo zde: , navíc budete potřebovat 4místný, 7segmentový indikátor. Mám konkrétně GNQ-5641BG-11. Proč zrovna tenhle? Ano, jednoduše proto, že jsem ho před 5 lety omylem koupil, byl jsem líný ho jít vyměnit, takže celou tu dobu ležel a čekal v křídlech. Myslím, že to zvládne každý, kdo má společnou anodu (a se společnou katodou je to možné, ale budete muset invertovat data pole a další hodnoty portů - tedy změnit je na opačné), pokud není příliš výkonný, aby nespálil Arduino. K tomu širšímu se dají „utrhnout“ 4 proudově omezující odpory každý cca 100 Ohmů a kus kabelu (stačilo mi 10 cm) na 12 pinů (jader), což jsem udělal. Nebo je můžete dokonce připájet samostatnými dráty, nebudou žádné problémy. Budete také potřebovat kolíky na desku (11 kusů), i když pokud budete opatrní, můžete se bez nich obejít. Náčrt indikátoru je vidět na obrázku 1 a jeho schéma na obrázku 2. Také poznamenám, že je lepší dodávat ne více než 2,1 V do každého segmentu tohoto indikátoru (omezeno odpory 100 ohmů) a v tomto případě nebude spotřebovávat více než 20 mA. Pokud se rozsvítí číslice “8”, nepřekročí odběr 7x20=140 mA, což je pro Arduino výstupy celkem přijatelné. Zvídavý čtenář si položí otázku: "Ale 4 výboje po 140 mA už jsou 4x140 = 560 mA, a to už je moc!" Odpovím - zbyde 140. Jak? Číst dál! Umístění pinů na indikátoru je vidět na obrázku 3. A zapojení provedeme podle tabulky 1.


Rýže. 1 - Náčrt indikátoru


Rýže. 2 - Obvod indikátoru


Rýže. 3 - Umístění kolíku

stůl 1

Pin Arduino Uno

Indikační kolík

Poznámka

Segment G

Segment F

Segment E

Segment D

Segment C

Segment B

Segment A

Společnou anodu segmentu č. 1 připojte přes odpor 100 Ohm.

Společnou anodu segmentu č. 2 připojte přes odpor 100 Ohm.

Společnou anodu segmentu č. 3 připojte přes odpor 100 Ohm.

Společnou anodu segmentu č. 6 připojte přes odpor 100 Ohm.



Vyplníme jednoduchý náčrt, což je jednoduchá „počítací tabulka“ od 0 do 9:


Nyní trochu upřesnění. DDRD je registr portu D (DDRB - resp. port B) za "děsivým" slovem "registr" je pouze "skrytá" funkce, která indikuje, zda port bude něco číst pomocí svého pinu (přijímat informace), nebo naopak naopak tam bude možné něco udělat a pak napsat (poskytnout informace). V tomto případě řádek DDRD=B11111111; označuje, že všechny piny portu D jsou na výstupu, tzn. vyjdou z nich informace. Písmeno „B“ znamená, že do registru je zapsáno binární číslo. Netrpělivý čtenář se okamžitě zeptá: „Je možné desetinné číslo?!? Spěchám vás ujistit, že je to možné, ale o tom trochu později. Pokud bychom chtěli použít polovinu portu pro vstup a polovinu pro výstup, mohli bychom to zadat takto: DDRD=B11110000; jedničky ukazují ty piny, které budou vydávat informace, a nuly ty, které tyto informace obdrží. Hlavní vymoženost registru spočívá také v tom, že není potřeba registrovat všechny piny 8x, tzn. v programu ušetříme 7 řádků. Nyní se podívejme na následující řádek:

PORTB=B001000; // nastaví pin 11 portu B na vysokou

PORTB je datový registr portu B, tzn. Zapsáním čísla do něj naznačíme, který pin portu bude mít jedničku a který nulu. Ještě ke komentáři řeknu, že když vezmete Arduino Uno tak, že vidíte ovladač a digitální piny jsou nahoře, bude zápis do registru čistý, tzn. která „nula“ (nebo „jedna“) odpovídá kterému kolíku, tzn. nula úplně vpravo na portu B je zodpovědná za 8. kolík a úplně levá je za 13. (který má vestavěnou LED). Pro port D je pravý pro pin 0, levý pro pin 7.
Doufám, že po takových podrobných vysvětleních je vše jasné, ale protože je to jasné, navrhuji vrátit se k systému desetinných čísel, který je nám známý a milovaný od dětství. A ještě něco - náčrt 25 řádků se může zdát málo, ale pro začátečníka je stále poněkud těžkopádný. Snížíme to.

Vyplňte ještě jednodušší náčrt, stejnou „počítací tabulku“:


Video 1.
Pouze 11 řádků! Toto je naše cesta, „nová cesta“! Pozor, místo binárních čísel se do registrů zapisují čísla desetinná. Pro desetinná čísla samozřejmě nejsou potřeba žádná písmena na začátku. Myslím, že by nebylo na škodu dát všechna čísla do tabulek.

Tabulka 2. Korespondence zobrazeného znaku s daty portu

Společná anoda

Společná katoda

Binární systém

Desetinná soustava

Binární systém

Desetinná soustava

Tabulka 3. Korespondence zobrazené číslice s daty portu

Společná anoda

Společná katoda

Binární systém

Desetinná soustava

Binární systém

Desetinná soustava



Pozornost! Údaje v tabulkách 2 a 3 jsou platné pouze při zapojení podle tabulky 1.
Nyní nahrajte náčrt s „počítací tabulkou“ od 0 do 9999:




Rýže. 4 - Počítací tabulka

Skicu v akci můžete vidět naVideo 2.

V tomto náčrtu je více komentářů než samotného kódu. Neměly by být žádné otázky... Kromě jedné věci, co je to za „cyklus blikání“, co tam vlastně bliká a proč? A také k tomu existuje nějaká proměnná...
A celá podstata spočívá v tom, že stejnojmenné segmenty všech čtyř kategorií jsou spojeny v jednom bodě. AI, A2, A3 a A4 mají společnou katodu; Společná anoda A1, B1,…..G1. Současným použitím „1234“ na 4místný indikátor tedy dostaneme „8888“ a budeme velmi překvapeni. Abyste tomu zabránili, musíte nejprve rozsvítit „1“ ve vaší kategorii, poté ji vypnout, rozsvítit „2“ ve vaší atd. Pokud to uděláte velmi rychle, blikání čísel se spojí jako snímky na filmu a oko si toho prakticky nevšimne. A maximální hodnota proměnné blikání v tomto případě řídí rychlost změny čísel na indikátoru. Mimochodem, právě díky tomuto „blikání“ je maximální odběr proudu pouze 140 mA místo 560. Nyní navrhuji přejít k něčemu užitečnějšímu.

Část dvě. Alespoň trochu užitečné

V této části vyvedeme znaky z osobního počítače do 7segmentového indikátoru pomocí ARDUINO MEGA. Proč najednou vznikla myšlenka „přehodit koně na přechodu“? Existují dva důvody: za prvé, nikdy předtím jsem ve svých článcích neuvažoval o ARDUINO MEGA; a za druhé, v ARDUINO UNO jsem stále nepřišel na to, jak mohu dynamicky prohodit COM port a port D. Ale jsem nováček - lze mi to odpustit. Tento ovladač můžete samozřejmě zakoupit zde: . K realizaci plánu jsem musel vzít páječku a znovu připájet kabel ze strany Arduina a také napsat nový náčrt. Jak je kabel připájen, můžete vidět na obrázku 5. Jde o to, že ARDUINO MEGA a ARDUINO UNO mají různé piny portů a Mega má mnohem více portů. Shoda použitých kolíků je patrná z tabulky 4.



Rýže. 5 - Nové kabelové rozvody

Tabulka 4

Port Mega


Pozornost! Tato tabulka platí pouze pro tento projekt!

Měli byste také poznamenat, že port C Arduino Mega „začíná“ od kolíku 37 a poté v sestupném pořadí a port A začíná od kolíku 22 a poté ve vzestupném pořadí.



Rýže. 6 - Celkový pohled



Malé implementační funkce: vypíšeme 4 znaky. Znaky musí být čísla. Pokud jste zadali „1234“ a my uvidíme „1234“, pokud jste zadali „123456“, stále uvidíme „1234“, pokud jste zadali „ytsuk“, „fyva1234“, „otiog485909oapom“ - neuvidíme nic. Pokud jste zadali „pp2345mm“, uvidíme „23“, tj. malá, vestavěná „ochrana proti chybám“.

Samotný náčrt:



Jak tento program funguje, můžete vidět naVideo 3.



Recenze připravil Pavel Sergeev

Sedmisegmentové LED indikátory jsou velmi oblíbené mezi digitálními zobrazovacími zařízeními a používají se na předních panelech mikrovlnných trub, praček, digitálních hodin, počítadel, časovačů atd. Ve srovnání s LCD indikátory segmenty LED indikátorů jasně svítí a jsou viditelné přes na velké vzdálenosti a v širokém pozorovacím úhlu. Pro připojení sedmisegmentového 4bitového indikátoru k mikrokontroléru bude zapotřebí alespoň 12 I/O linek. Proto je téměř nemožné použít tyto indikátory s mikrokontroléry s malým počtem pinů, například série od firmy. Samozřejmě můžete použít různé metody multiplexování (jejichž popis najdete na webu v sekci „Schéma“), ale i v tomto případě existují pro každou metodu určitá omezení a často používají složité softwarové algoritmy.

Podíváme se na způsob připojení indikátoru přes rozhraní SPI, který bude vyžadovat pouze 3 I/O linky mikrokontroléru. Současně zůstane ovládání všech segmentů indikátoru.

Pro připojení 4bitového indikátoru k mikrokontroléru přes sběrnici SPI se používá specializovaný čip ovladače vyrobený společností. Mikroobvod je schopen řídit osm sedmisegmentových indikátorů se společnou katodou a obsahuje BCD dekodér, segmentové budiče, multiplexní obvod a statickou RAM pro ukládání číselných hodnot.

Proud procházející segmenty indikátoru se nastavuje pouze pomocí jednoho externího rezistoru. Čip navíc podporuje ovládání jasu indikátoru (16 úrovní jasu) pomocí vestavěného PWM.

Obvod diskutovaný v článku je obvod zobrazovacího modulu s rozhraním SPI, který lze použít v amatérských rádiových návrzích. A nás více nezajímá samotný obvod, ale práce s mikroobvodem přes rozhraní SPI. Napájení modulu +5 V je přivedeno na pin Vcc, signálové linky MOSI, CLK a CS jsou určeny pro komunikaci mezi nadřízeným zařízením (mikrokontrolérem) a podřízeným (čip MAX7219).

Mikroobvod se používá ve standardním zapojení, externími součástmi jsou pouze odpor, který nastavuje proud segmenty, ochranná dioda pro napájení a filtrační kondenzátor pro napájení.

Data jsou na čip přenášena v 16bitových paketech (dva byty), které jsou umístěny ve vestavěném 16bitovém posuvném registru na každé náběžné hraně signálu CLK. 16bitový paket označujeme jako D0-D15, kde bity D0-D7 obsahují data, D8-D11 obsahují adresu registru, bity D12-D15 nemají žádný význam. Bit D15 je nejvýznamnější bit a je prvním přijatým bitem. Přestože je čip schopen ovládat osm indikátorů, budeme uvažovat o práci pouze se čtyřmi. Jsou řízeny výstupy DIG0 - DIG3, umístěnými za sebou zprava doleva, 4bitové adresy (D8-D11), které jim odpovídají, jsou 0x01, 0x02, 0x03 a 0x04 (hexadecimální formát). Registr číslic je implementován pomocí on-chip RAM s organizací 8x8 a je přímo adresovatelný, takže každou jednotlivou číslici na displeji lze kdykoli aktualizovat. Následující tabulka ukazuje adresovatelné číslice a řídicí registry čipu MAX7219.

Registrovat

Adresa

HEX hodnota

Žádná operace

Režim dekódování

Počet ukazatelů

Vypnout

Test indikátoru

Řídící registry

Čip MAX1792 má 5 řídicích registrů: režim dekódování (Decode-Mode), ovládání jasu indikátoru (Intensity), registr počtu připojených indikátorů (Scan Limit), ovládání zapnutí/vypnutí (Shutdown), testovací režim (Display Test).

Zapínání a vypínání čipu

Po připojení napájení k čipu se všechny registry resetují a čip přejde do režimu vypnutí. V tomto režimu je displej vypnutý. Pro přepnutí do normálního provozního režimu musí být nastaven bit D0 registru Shutdown (adresa 0Сh). Tento bit lze kdykoli vymazat, aby se ovladač vypnul a obsah všech registrů zůstal nezměněn. Tento režim lze použít pro úsporu energie nebo v režimu alarmu blikáním indikátoru (postupná aktivace a deaktivace režimu vypnutí).

Mikroobvod se přepne do režimu vypnutí postupným vysíláním adresy (0Сh) a dat (00h) a přenosem 0Ch (adresa) a poté 01h (data) se vrátí do normálního provozu.

Režim dekódování

Pomocí registru volby režimu dekódování (adresa 09h) můžete použít dekódování BCD kódu B (zobrazení znaků 0-9, E, H, L, P, -) nebo bez dekódování pro každou číslici. Každý bit v registru odpovídá jedné číslici, nastavení logické jedničky odpovídá zapnutí dekodéru pro tento bit, nastavení 0 znamená, že dekodér je deaktivován. Pokud je použit BCD dekodér, pak se bere v úvahu pouze nejnižší kousíček dat v číslicových registrech (D3-D0), bity D4-D6 jsou ignorovány, bit D7 nezávisí na BCD dekodéru a je zodpovědný za zapnutí desetinná čárka na indikátoru, pokud D7 = 1. Když jsou například bajty 02h a 05h odesílány v sekvenci, indikátor DIG1 (druhá číslice zprava) zobrazí číslo 5. Podobně při odesílání 01h a 89h indikátor DIG0 zobrazí číslo 9 včetně desetinné čárky. . Níže uvedená tabulka poskytuje úplný seznam znaků zobrazených při použití dekodéru BCD IC.

Symbol

Údaje v registrech

Povolené segmenty = 1

Prázdný

*Desetinná tečka se nastavuje bitem D7=1

Když je BCD dekodér vyřazen z provozu, datové bity D7-D0 odpovídají segmentovým liniím (A-G a DP) indikátoru.

Ovládání jasu indikátoru

Čip umožňuje programově ovládat jas indikátorů pomocí vestavěného PWM. Výstup PWM je řízen nibble nízkého řádu (D3-D0) registru Intensity (adresa 0Ah), který umožňuje nastavit jednu ze 16 úrovní jasu. Když jsou všechny bity kousnutí nastaveny na 1, je zvolen maximální jas indikátoru.

Počet připojených indikátorů

Registr Scan-Limit (adresa 0Bh) nastavuje hodnotu počtu bitů obsluhovaných mikroobvodem (1 ... 8). U naší 4bitové verze by se do registru měla zapsat hodnota 03h.

Test indikátoru

Registr zodpovědný za tento režim se nachází na adrese 0Fh. Nastavením bitu D0 v registru uživatel zapne všechny segmenty indikátoru, přičemž obsah řídicího a datového registru se nemění. Chcete-li deaktivovat režim Display-Test, bit D0 musí být 0.

Rozhraní s mikrokontrolérem

Modul indikátoru lze připojit k libovolnému mikrokontroléru, který má tři volné I/O linky. Pokud má mikrokontrolér vestavěný hardwarový modul SPI, pak lze modul indikátoru připojit jako podřízené zařízení na sběrnici. V tomto případě mohou být signálové linky SPI SDO (sériový výstup dat), SCLK (sériové hodiny) a SS (volba podřízeného) mikrokontroléru přímo připojeny k pinům MOSI, CLK a CS čipu (modulu) MAX7219, CS signál je aktivní nízko.

Pokud mikrokontrolér nemá hardwarové SPI, může být rozhraní organizováno softwarově. Komunikace s MAX7219 začíná vytažením a přidržením CS linky na nízké úrovni, poté odesláním 16 bitů dat sekvenčně (MSB nejprve) na lince MOSI na vzestupné hraně signálu CLK. Po dokončení přenosu se linie CS opět zvýší.

V sekci ke stažení si uživatelé mohou stáhnout zdrojový text testovacího programu a HEX soubor firmwaru, který implementuje klasický 4bitový čítač se zobrazením hodnot na indikátorovém modulu s rozhraním SPI. Použitým mikrokontrolérem je softwarově implementované rozhraní, signálové linky CS, MOSI a CLK modulu indikátoru jsou připojeny k portům GP0, GP1 a GP2. Je použit kompilátor mikroC pro mikrokontroléry PIC (), ale kód lze upravit pro jiné kompilátory vyšší úrovně. Mikrokontrolér pracuje na hodinové frekvenci 4 MHz z vestavěného RC oscilátoru, výstup MCLR je deaktivován.

Tento modul lze také připojit k platformě Arduino. Pro práci s ním budete potřebovat knihovnu LedControl, která je ke stažení na webu Arduino.

Stahování

Zdrojový kód testovacího programu a HEX soubor pro flashování firmwaru mikrokontroléru -

  • TO NENÍ FÉR!!! Správnější by bylo pojmenovat téma „propojení matice LED s inteligentním ovladačem přes nízkovodičové rozhraní“. Takové městečko si můžete postavit sami - dejte na indikátor něco z PIC12-PIC16 s příslušným protokolem (microLAN, SPI, I2C, rs232 nebo něco jiného domácího - pouze synchronní režim USART). Nyní existuje dostatečný počet různých rodin MK - je čas přejít k práci s obvody složenými z několika MK, z nichž každý plní svůj vlastní úkol, a nesnažit se načíst vše „na jednu hlavu“.
  • Tohle je článek pro zatracenou buržoazii! Chipsy od Maxim jsou příliš drahé. Existuje mnohem jednodušší řešení – sérioparalelní posuvné registry. Je pravda, že budete potřebovat více vodičů - přepněte společné svorky indikátorů. Nebo, jak správně poznamenal kolega, použijte dva MK. Pořád je to levnější než chipsy Max... Z.Y. Je však možné vytvořit univerzální obvod pomocí dvou registrů. Pak si vystačíte se čtyřmi vodiči: hodiny, data, záznam a označení/místo. Počet známých bude omezen pouze bitovou kapacitou registrů.
  • Sám jsem začínal s posuvnými registry. Pak ale odmítl. Důvod je prostý. Displej vyžaduje značný čas CPU. Vhodné pro jednoduché programy. Se zvyšující se hlasitostí softwaru se jas snižuje. Proud indikátoru také nelze zvýšit na hodnoty přesahující konstantní proud segmentu. Program může přestat reagovat. Samostatný procesor také nepřipadá v úvahu.Rezistory procesoru a rozměry desky a zapojení budou stát 2/3 ceny MAX7219 na desce. Myslím 8místný displej. Opakovaně jsem odcházel od Terraelectronics s hromadou něčeho svíraného v ruce. A proč jsi dal 6000-10000 dřevěných za? A když pak zařízení předáváte zákazníkovi, vzpomenete si a pomyslíte si, kolika problémů mě to zachránilo a ty stojí za to. Postupem času změníte svůj úhel pohledu.
  • Dovolím si nesouhlasit;) Minimální nastavení pro indikátor jsou 4 pozice * 8 segmentů: pic16f628a nebo attiny2313 (žere mnohem více) v režimu skenování „rastr“, jas opravdu není příliš vysoký, ale je zde minimum detailů. Ve většině řešení s poměrně významným segmentovým proudem a zvýšeným (+11 - +27 V nestabilizované DC) napětím způsobují problém pouze „horní“ spínače (bez ohledu na to, co napájíme +U - segment nebo anoda indikátoru matice). Standardní sada: pic16f628a/attiny2313/, pic16f676 uln2803 tpic6b595 (hc595hc595 + uln2803) a sada tranzistorů npn (podle obvodu spínače emitoru) jako „horní“ standardní řešení (horní standardní řešení na aktivních zdrojích proudu TLM37 -TL37) Při známé a stabilní úrovni napětí napájejícího anody je výpočet základních rezistorů horních kláves celkem jednoduchý. Nějaké problémy nastávají při napájení zvýšeným, nestabilizovaným konstantním napětím...:mad: Řešení je možné pomocí specializovaných mikroobvodů - ty jsou ale dost drahé, takže se vymyslela „finta“, jejíž rychlost je zcela dostačující , a detaily jsou velmi populární - sada několika rezistorů, 4N33 a výkonného tranzistoru n-p-n (viz schéma na http://radiokot.ru/forum/download/file.php?id=93485):)
  • V některých případech jsou posuvné registry oprávněné. No, neberu na levné návrhy. Když třeba vyrobím elektronický teodolit za 80. To je čtyřřádkový LCD za 1 tisíc rublů. potřeba koupit. Jen je škoda ztrácet čas vystavením. Připájejte klíče, plýtvejte časem procesoru – to je nejdražší. A zákazník je většinou vybíravý. Jas by měl být normální. Ano, zapomněli jste si spočítat náklady na sadu dílů a nezapomeňte započítat rozdíl v ceně plošného spoje (bude vyšší) a době instalace. A ještě jedna věc. To je specifikum práce. Například PIC visel. Důvod je možné pochopit. Můžete vidět nejnovější data před selháním. Zde je nedávný příklad velmi vzácné a nepochopitelné závady v programu po dobu 3 měsíců. Nevěděl jsem, kde hledat. Zde byly také rozdrceny prsty dělníka. A když jsem viděl poslední data před selháním, pochopil jsem důvod.
  • Rozdíl mezi profesionálním vybavením a amatérskými domácími produkty vždy byl, je a bude - vyvinutý obvod byl „v pohodě“ předán Číňanům a ti ho obecně postaví na „kapkové“ bázi :) LED primitiv není konkurent monobloku na LCD (i když až na vzácné výjimky). Ale pro příklad typické aplikace MK ve vyjímatelných indikátorech není třeba hledat daleko - měli byste věnovat pozornost řešení od tzv. fiskálních registrátorů (zobrazení klienta) - tam může jedno zařízení využít jakoukoli možnost (luminiscenční / LCD / LED) - pokud byl komunikační protokol podporován a klientovi se líbil (jsem připraven za něj dát peníze)... Co třeba začátek vývoje na principu „platit může klient víc“... takže ten, kdo má hodně peněz, si koupí něco hotového od firem a obrátí se na podomácku vyrobeného dělníka buď „z bídy“, nebo úplné rudochy, kteří si umějí najít jakoukoli záminku pro následné podvody ...:mad: Pro mě osobně postačí cokoliv, co je aktuálně dostupné (a ne vždy to nejčerstvější - hodinky Ramtron jsem už 12 let neviděl v prodeji :) ). Kromě všeho ostatního je prakticky většina „specializovaných“ LSI vytvořena na základě stejných MK s maskovacím programem. ;)

Pojďme si k desce Arduino připojit sedmisegmentový LED indikátor a naučit se jej ovládat pomocí knihovny Led4Digits.h.

V předchozí lekci byly podrobně popsány mikrokontroléry. Pojďme si takový indikátor připojit k desce Arduino.

Schéma připojení indikátoru k desce Arduino vypadá takto.

Sestavil jsem to na desce plošných spojů.

Pro správu indikátorů jsem napsal knihovnu Led4Digits.h:

A platit.

Knihovna umožňuje spravovat sedmisegmentové indikátory:

  • velikost až čtyř číslic;
  • s libovolnými variantami polarit řídicích impulsů (všechny);
  • pracuje v paralelním procesu;
  • umožňuje zobrazit na indikátoru:
    • segmenty každé kategorie;
    • číslice každé číslice;
    • celé číslo 0 ... 9999;
  • pro výstup celého čísla lze zadat počet číslic;
  • Existuje režim pro potlačení nevýznamných číslic.

Knihovnu Led4Digits.h si můžete stáhnout z tohoto odkazu:

A platit. Pouze 25 rublů. za měsíc pro přístup ke všem zdrojům webu!

Jak nainstalovat je napsáno v .

Zdrojové texty neposkytnu. Můžete si je vyhledat v souborech knihovny. Jako vždy je tam spousta komentářů. Popíšu podrobně s příklady, jak knihovnu používat.

Knihovna ovládání LED pro Arduino Led4Digits.

Zde je popis třídy. Poskytl jsem pouze veřejné metody a vlastnosti.

třída Led4Digits (
veřejnost:
bajtová číslice; // řídicí kódy bitových segmentů
void regen(); // regeneraci, je třeba metodu volat pravidelně
void tetradToSegCod(byte dig, byte tetrad); // převod tetrád na segmentové kódy
boolean print(unsigned int value, byte digitNum, byte blank); // celočíselný výstup



} ;

Konstruktér.

Led4Digits (typ bajtuLed, bajt digitPin0, bajt digitPin1, bajt digitPin2, byte digitPin3,
byte segPinA, byte segPinB, byte segPinC, byte segPinD,
byte segPinE, byte segPinF, byte segPinG, byte segPinH);

typLed Nastavuje polaritu řídicího impulsu pro signály výběru bitů a segmentů. Podporuje všechna schémata připojení ().

typLed Výběr kategorie Výběr segmentu Typ obvodu
0 -_- -_- Společná anoda s tlačítky pro výběr výboje
1 _-_ -_- Společná anoda
2 -_- _-_ Společná katoda
3 _-_ _-_ Společná katoda s tlačítky pro výběr výboje

digitPin0...digitPin3– výstupy pro volbu číslic. Je-li digitPin = 255, pak je číslice zakázána. To vám umožní připojit indikátory s méně číslicemi. digitPin0 – nízká (pravá) číslice.

segPinA...segPinH– výstupy pro řízení segmentů.

Například,

znamená: typ indikátoru 1; vybíjecí výstupy 5,4,3,2; výkony segmentů 6,7,8,9,10,11,12,13.

metoda void regen().

Metoda musí být volána pravidelně v paralelním procesu. Regeneruje obraz na indikátorech. Doba cyklu regenerace se rovná periodě volání metody vynásobené počtem bitů.

Například,

// obsluha přerušení 2 ms
void timerInterrupt() (
disp.regen(); // regenerace indikátoru
}

Pole číslic bajtů

Obsahuje stav segmentů. číslice je nejméně významný bit, nejméně významný bit číslice je segment „A“ nejméně významného bitu. Stav bitu 1 znamená, že segment svítí.

Například,

číslice = B0000101;

znamená, že na druhé číslici svítí segmenty „A“ a „C“.

Příklad programu, který postupně rozsvítí všechny segmenty každé číslice.

// běžící segmenty
#zahrnout
#zahrnout

//
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() (
přerušení časovače 2 ms
MsTimer2::start(); // povolení přerušení
}

void loop() (
for (int i = 0; i< 32; i++) {
if (i == 0) disp.digit= 1;
else if (i == 8) disp.digit= 1;
else if (i == 16) disp.digit= 1;
else if (i == 24) disp.digit= 1;
jiný(
disp.digit = disp.digit<< 1;
disp.digit = disp.digit<< 1;
disp.digit = disp.digit<< 1;
disp.digit = disp.digit<< 1;
}
zpoždění(250);
}
}

//obsluha přerušení 2 ms
void timerInterrupt() (
disp.regen(); // regenerace indikátoru
}

V poli číslic je posunuta 1 a indikátory to zobrazují.

Metoda void tetradToSegCod(byte dig, byte tetrad)

Metoda umožňuje zobrazit čísla a písmena hexadecimálního kódu v jednotlivých číslicích. Má argumenty:

  • dig – číslice číslo 0 ... 3;
  • tetrad – kód desetinného znaku. Kód 0 zobrazí číslo „0“, kód 1 – číslo „1“, kód 14 – písmeno „E“.

Například,

tetrad(2,7);

zobrazí číslo „7“ jako třetí číslici.

Příklad programu, který postupně mění znaky v každé číslici.

// čísla jedno po druhém
#zahrnout
#zahrnout

// typ indikátoru 1; vybíjecí výstupy 5,4,3,2; segmentové výstupy 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() (
MsTimer2::set(2, timerInterrupt); // přerušení časovače 2 ms
MsTimer2::start(); // povolení přerušení
}

void loop() (
for (int i = 0; i< 64; i++) {
disp.tetradToSegCod(i>>4, i);
zpoždění(250);
}
}

// obsluha přerušení 2 ms
void timerInterrupt() (
disp.regen(); // regenerace indikátoru
}

Metoda booleovský tisk (hodnota int bez znaménka, bajt digitNum, bajt prázdný)

Metoda zobrazuje na indikátorech celé číslo. Převádí binární číslo na BCD pro každou číslici. Má argumenty:

  • hodnota – číslo, které se zobrazuje na indikátoru.
  • digitNum – počet číslic čísla. To by nemělo být zaměňováno s počtem číslic indikátoru. Možná budete chtít zobrazit číslo na 2 číslicích a znaky na zbývajících dvou pomocí číslic.
  • prázdné – znak potlačení nevýznamných číslic. blank=0 znamená, že číslo by mělo být zobrazeno se všemi nulami. Číslo "7" bude vypadat jako "0007". Pokud je prázdné místo jiné než 0, nevýznamné nuly budou potlačeny.

Pokud hodnota čísla překročí povolený počet pro zvolený počet číslic (digitNum), funkce zobrazí na indikátoru „---“ a vrátí hodnotu false.

Příklad programu pro výstup čísel.

// číslo výstupu
#zahrnout
#zahrnout

// typ indikátoru 1; vybíjecí výstupy 5,4,3,2; segmentové výstupy 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() (
MsTimer2::set(2, timerInterrupt); // přerušení časovače 2 ms
MsTimer2::start(); // povolení přerušení
}

void loop() (
for (int i = 0; i< 12000; i++) {
disp.print(i, 4, 1);
zpoždění(50);
}
}

// obsluha přerušení 2 ms
void timerInterrupt() (
disp.regen(); // regenerace indikátoru
}

Poslední dvě metody nemění stav segmentu „H“ – desetinnou čárku. Chcete-li změnit stav bodu, můžete použít příkazy:

číslice |= 0x80; // rozsviťte desetinnou čárku
číslice &= 0x7f; // zhasnout desetinnou čárku

Výstup do indikátorů záporných čísel (int).

Záporná čísla lze vytisknout následovně:

  • Zkontrolujte znaménko čísla.
  • Pokud je číslo záporné, vytiskněte znaménko mínus na nejvýznamnější číslici a změňte znaménko čísla na kladné ve funkci print().
  • Pokud je číslo kladné, vypněte bit znaménka a vytiskněte číslo pomocí funkce print().

Zde je program, který tuto metodu demonstruje. Vypisuje čísla od -999 do 999.

// výstup záporných čísel
#zahrnout
#zahrnout

// typ indikátoru 1; vybíjecí výstupy 5,4,3,2; segmentové výstupy 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() (
MsTimer2::set(2, timerInterrupt); // přerušení časovače 2 ms
MsTimer2::start(); // povolení přerušení
}

void loop() (

for (int i = -999; i< 1000; i++) {

kdybych< 0) {
// číslo je záporné
disp.digit= B01000000; // podepsat -
disp.print(i * -1, 3, 1);
}
jiný(
disp.digit= B00000000; // vymazat znaménko
disp.print(i, 3, 1);
}

zpoždění(50);
}
}

// obsluha přerušení 2 ms
void timerInterrupt() (
disp.regen(); // regenerace indikátoru
}

Výstup do indikátorů zlomkových čísel, plovoucí formát.

Existuje mnoho způsobů, jak zobrazit čísla s plovoucí desetinnou čárkou (floaty) na indikátorech pomocí standardních funkcí jazyka C. To je především funkce sprint(). Funguje to velmi pomalu, vyžaduje další převody znakových kódů na binární desítkové kódy, je třeba extrahovat bod z řetězce. Stejné problémy s ostatními funkcemi.

Používám jiný způsob zobrazení hodnot float proměnných na indikátorech. Metoda je jednoduchá, spolehlivá, rychlá. Redukuje na následující operace:

  • Číslo s plovoucí desetinnou čárkou se násobí 10 na mocninu odpovídající požadovanému počtu desetinných míst. Pokud potřebujete na indikátorech zobrazit 1 desetinné místo, vynásobte 10, pokud 2, pak násobte 100, 3 desetinná místa 1000.
  • Dále je číslo s pohyblivou řádovou čárkou explicitně převedeno na celé číslo (int) a zobrazeno na indikátorech pomocí funkce print().
  • Na požadovanou číslici se umístí tečka.

Například následující řádky zobrazí proměnnou float se dvěma desetinnými místy k sedmisegmentovým LED diodám.

plovoucí x = 2,12345;

disp.digit |= 0x80; //

Číslo vynásobíme 100 a umístěním tečky do třetí číslice výsledek vydělíme 100.

Zde je program, který na indikátorech zobrazuje čísla s pohyblivou řádovou čárkou od 0,00 do 99,99.

// výstup s plovoucí desetinnou čárkou
#zahrnout
#zahrnout

// typ indikátoru 1; vybíjecí výstupy 5,4,3,2; segmentové výstupy 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() (
MsTimer2::set(2, timerInterrupt); // přerušení časovače 2 ms
MsTimer2::start(); // povolení přerušení
}

void loop() (
float x = 0;

for (int i = 0; i< 10000; i++) {
x + = 0,01;

disp.print((int)(x * 100.), 4, 1);
disp.digit |= 0x80; // rozsviťte bod třetí úrovně

zpoždění(50);
}
}

//obsluha přerušení 2 ms
void timerInterrupt() (
disp.regen(); // regenerace indikátoru
}

Jak můžete vidět, knihovna Led4Digits.h značně zjednodušuje práci se sedmisegmentovými indikátory LED (light-emitting diode) připojenými k desce Arduino. Nenašel jsem obdobu takové knihovny.

K dispozici jsou knihovny pro práci s LED displeji přes posuvný registr. Někdo mi psal, že našli knihovnu, která pracuje s LED displejem přímo připojeným k desce Arduino. Ale při jeho použití svítí číslice indikátoru nerovnoměrně a blikají.

Na rozdíl od svých analogů knihovna Led4Digits.h:

  • Běží jako paralelní proces. V hlavní smyčce program načte data do určitých proměnných, které se automaticky zobrazí na displeji. Výstup informací a regenerace indikátoru probíhá v přerušení časovačem, které je pro hlavní program neviditelné.
  • Čísla na displeji svítí rovnoměrně, bez blikání. Tato vlastnost je zajištěna tím, že regenerace probíhá v cyklu striktně definovaném přerušením časovače.
  • Knihovna má kompaktní kód, spouští se rychle a minimálně zatěžuje kontrolér.

V další lekci připojíme k desce Arduino současně LED indikátor a matici tlačítek. Pojďme napsat knihovnu pro takový design.

Kategorie: . Můžete si to uložit do záložek.

Tento článek navazuje na sérii mých publikací o organizaci dynamické indikace na mikrokontrolérech PIC a LED indikátorech. Zde jsou odkazy na předchozí příspěvky:

Tabulka činnosti navrženého algoritmu (používá se indikátor se společnou katodou, v prvním sloupci jsou výstupy registru kombinované s číslicemi indikátoru) podle níže uvedeného schématu zapojení.

V každém z přerušení s intervalem 2 ms (v tomto případě z časovače TMR0) je připraven jeden stupeň dynamické indikace (DI) podle algoritmu, který se skládá z pěti fází řízení registru a indikátoru.

2. fáze: Kladná hrana na pinu 12 registru (ST_CP) zapisuje nulový stav registru do výstupního latch. Zde a dále, před začátkem indikace, je indikátor zhasnut nulovým potenciálem na segmentech.

3. fáze: ovládáním registrových pinů 14 (DS - data) a 11 (SH_CP - clock) se do něj zapisuje kód pro ovládání segmentů.

4. fáze: s kladným poklesem na kolíku 12 registru se data z registru zapisují do výstupního latch a v důsledku kladných úrovní na bitech zůstává indikátor vypnutý.

5. fáze: zde je požadovaný kód přiveden na výstupy číslic indikátoru a poté dojde ke skutečné indikaci.

Pokud obvod používá jeden 4místný indikátor, pak pro správnou funkci musí být nastaven na OK. Pokud potřebujete ovládat 8 bitů, pak se používá 8 portů MK, zatímco zbývající 4 porty jednoduše řídí bity (ve fázi 4 by měly mít vysokou úroveň). Stojí za zmínku, že v tomto případě je možné použít indikátory s OK i OA, spojující segmenty nebo číslice s registrem (z důvodů uvedených níže je v prvním případě vhodnější organizovat DI segment po segmentu a ve druhém - bit po bitu).

Pomocí této metody můžete k MCU PIC16F676 připojit dva čtyřbitové indikátory pomocí jednoho posuvného registru a ponechat až čtyři volné porty pro použití. Například pro takové zapojení lidé použili kombinaci funkcí DI a analogových vstupů v některých MK portech (podle mého názoru krajně pochybné rozhodnutí), což vedlo k výrazné komplikaci obvodu a k některým omezením, která autoři varovat před. Pomocí mého schématu zapojení by se vše vyřešilo jednoduše a krásně - samostatné vstupy, samostatné indikace, plus dva další porty (včetně MCLR) pro tlačítka.

Pro otestování tohoto způsobu ovládání je na MCU PIC12F629 a indikátoru FYQ3641A navržen následující jednoduchý obvod, který na indikátoru střídavě zobrazuje slovo „test“ a číslo 1234.

Zde bylo rozhodnuto použít DI segment po segmentu (v každém okamžiku je zapnut jeden segment a na bitových pinech je kód, kde v každém bitu: 0 - pokud má tento segment v daném bitu svítit a 1 - jinak), ve kterém jsou špičkové proudy přenášeny do registru . Proč? Důvody jsou dva: prvním je maximální zatížitelnost výstupů 74HC595 35 mA oproti 25 mA pro regulátory PIC; druhá a hlavní věc je, že proud blízký limitu výstupním portem MK může teoreticky zvednout jeho výstupní potenciál na úroveň spínání vstupů registru, což by vedlo k chybám v provozu. A tak do MK portů tečou proudy 6-7 mA a potenciály na výstupech rozhodně nepřesahují úrovně TTL.

Jak již bylo zmíněno výše, interval přerušení je 2 ms, což odpovídá obnovovací frekvenci indikátoru 64 Hz a jeho svit je pro oko celkem příjemný.

Tato metoda DI mimo jiné umožnila snížit na polovinu počet odporů omezujících proud (R2-R5).

Zařízení je sestaveno na tzv. „bezpájecí“ prkénko.

Indikátor lze nahradit kterýmkoli z řady 3641A.

Obvod je napájen stabilizovaným zdrojem 5 V. Použil jsem speciální stabilizační desku určenou pro použití s ​​výše zmíněným breadboardem.

Ovládací program MK je napsán v jazyce C a přeložen v prostředí.

Kód v MikroC, projekt, HEX soubor v aplikaci.

Chcete-li použít tento způsob připojení v komerčním vývoji, kontaktujte mě.

Seznam radioprvků

Označení Typ Označení Množství PoznámkaProdejnaMůj poznámkový blok
DD1 MK PIC 8bitový

PIC12F629

1 Do poznámkového bloku
DD2 Registrovat74HC5951 Do poznámkového bloku
H.L. IndikátorFYQ36411 Do poznámkového bloku
R1 Rezistor

30 kOhm

1 Do poznámkového bloku
R2 Rezistor

430 ohmů

1 Do poznámkového bloku
R3 Rezistor

430 ohmů

1
Pokud najdete chybu, vyberte část textu a stiskněte Ctrl+Enter.