Obsah:

RGB LED matica: 5 krokov
RGB LED matica: 5 krokov

Video: RGB LED matica: 5 krokov

Video: RGB LED matica: 5 krokov
Video: Подключаем светодиодные матрицы к Arduino Mega и Raspberry Pi. Железки Амперки 2024, November
Anonim
Image
Image
Hardvérový dizajn
Hardvérový dizajn

Hľadajte podľa pokynov a nájdete mnoho projektov LED matíc. Žiadny z nich nebol taký, ako by som chcel. Cieľom bolo preskúmať interakcie hardvérového a softvérového dizajnu na výrobu niečoho a vyrobiť konečný produkt v úhľadnom PCB s ovládačom, ktorý ma nakreslí na „LED obrazovku“pomocou vysokej úrovne. konštrukcie (napr. kreslenie čiary na rozdiel od nastavenia konkrétnych pixelov). Táto časť bola pre mňa dôležitá, pretože mnohé z ovládačov matice LED sú holé kosti a nezabezpečujú veľa v programovom vytváraní obrázka alebo animácie. To neznamená, že nemôžete vytvárať obrázky a animácie s inými ovládačmi, ale že budete musieť viac opakovať prácu od projektu k projektu.

Preto som sa rozhodol splniť svoju víziu. Prvým krokom bol návrh hardvéru. To bolo pre mňa asi najnáročnejšie, pretože moje pozadie je viac softvérové. Opäť bolo veľa predpečených návrhov a určite som ich použil na inšpiráciu, ale chcel som sa to naučiť, a tak som prototypoval maticu 4x4 na doske. Vďaka tomuto procesu som sa veľa naučil, pretože moje prvé iterácie nefungovali. Ale urobil som hardvérový dizajn, ktorý fungoval, čo mi umožnilo začať s vývojom ovládača.

Ako platformu ovládačov som si vybral Arduino, pretože je široko dostupný a má veľa referencií online. Aj keď mi kariérne skúsenosti umožnili dostať sa k pracovnej verzii ovládača hladšie ako moje hardvérové úsilie, stále bolo veľa iterácií, pričom som optimalizoval výkon ovládača pre mikrokontrolér ATMega a vyvinul programovacie API, ktoré sa mi páčilo.

Tento dokument s pokynmi dokumentuje návrh a niektoré kľúčové poznatky z môjho projektu. Viac informácií o tomto projekte nájdete na mojej webovej stránke tu vrátane kompletných súprav, ktoré si môžete kúpiť na vybudovanie vlastnej RGB LED matice.

Krok 1: Návrh hardvéru

Primárnym cieľom môjho návrhu hardvéru bolo vytvoriť rad RGB LED diód, ktoré by som mohol naprogramovať, ale tiež som nechcel minúť veľa peňazí. Prístup, pre ktorý som sa rozhodol, bol použiť posuvné registre 74HC595 na ovládanie LED diód. Aby sa minimalizoval počet potrebných posuvných registrov, usporiadal som LED diódy RGB do maticového rozloženia, kde boli spoločné anódy zviazané dohromady v radoch a červené, zelené a modré katódové zvody boli zviazané dohromady v stĺpcoch. V prípade matice 4x4 vyzerala schéma zapojenia ako priložená schéma zapojenia.

Jedna vec, ktorú si hneď všimnete, je, že vzhľadom na maticový obvod existujú niektoré konfigurácie osvetlenia LED, ktoré nie je možné vykonať, ak sú súčasne zapnuté všetky požadované diódy LED. Napríklad matica nemôže súčasne rozsvietiť dve LED diódy, ktoré sú navzájom diagonálne, pretože napájanie riadkov aj stĺpcov spôsobí, že sa dve protiľahlé LED diódy rozsvietia na kolmú uhlopriečku k požadovaným diódam LED. Aby sme to vyriešili, použijeme na skenovanie v každom riadku multiplexovanie. Na webe je dostatok zdrojov, ktoré pokrývajú techniku multiplexovania, nejdem sa ich tu pokúšať replikovať.

Pretože používam LED diódy so spoločnou anódou, znamená to, že rady poskytujú kladný výkon a stĺpce klesajú k zemi. Dobrou správou je, že posuvné registre 74HC595 môžu napájať aj znižovať výkon, ale zlou správou je, že majú limit na to, koľko energie môžu zdroja alebo potopiť. Jednotlivé kolíky 74HC595 majú maximálny odber 70 mA, ale je najlepšie ponechať menej ako 20 mA. Jednotlivé farby v našich LED diódach RGB majú približne 20 mA. To znamená, že 74HC595 nemôže priamo napájať celý rad diód LED, ak ich chcem všetky zapnúť.

Namiesto priameho napájania radu bude 74HC595 namiesto toho poháňať tranzistor pre každý rad a tranzistor zapne alebo vypne prúd napájajúci riadok. Pretože konštrukcia používa bežné anódy LED, spínací tranzistor bude PNP. Ak by sme používali bežnú katódovú LED, spínací tranzistor by bol NPN. Všimnite si toho, že s použitím tranzistora PNP na zapnutie radu sa nastavenie posuvného registra na jeho zapnutie teraz zníži, pretože tranzistor PNP potrebuje na zapnutie záporné napätie medzi emitorom a základňou, čo umožní toku kladného prúdu do riadok.

Jedna ďalšia vec, ktorú je potrebné zvážiť, je požadované bitové rozloženie posuvných registrov. To znamená, že medzi posuvnými registrami, ktoré bity riadia, ktoré riadky alebo stĺpce v matici. Dizajn, s ktorým som poslal, je taký, že prvý bit alebo „najdôležitejší bit“odoslaný do reťazových posuvných registrov za sebou riadi stĺpec červených prvkov LED, druhý bit ovládal zelený prvok prvého stĺpca a tretí bit ovládal prvý stĺpec. modrý prvok, štvrtý bit ovláda červený prvok druhého stĺpca … tento vzor sa opakuje v stĺpcoch zľava doprava. Potom nasledujúci odoslaný bit riadi posledný alebo dolný riadok, nasledujúci druhý až posledný riadok … toto sa opakovalo, kým posledný odoslaný bit alebo „najmenej významný bit“riadi prvý alebo horný riadok v matici.

Nakoniec som potreboval určiť, aké odpory použijem pre každú z LED v RGB LED. Aj keď na výpočet požadovaného odporu môžete použiť štandardný vzorec, ktorý kombinuje napätie vpred a požadovaný prúd, zistil som, že nastavenie prúdu každej LED na 20 miliampérov viedlo k sivobielej farbe, keď boli zapnuté všetky červené, zelené a modré diódy LED.. Tak som to začal zvažovať. Príliš veľa červenej v bielej znamenalo zvýšenie ohmov červenej LED na zníženie prúdu. Opakoval som striedanie odporov rôznych ohmov, kým som nenašiel kombináciu, ktorá vytvorila bielu farbu, ktorú som považoval za správnu. Konečná kombinácia bola 180 Ω pre červenú LED, 220 Ω pre zelenú LED a 100 Ω pre modrú LED.

Krok 2: Konštrukcia hardvéru - Breadboard

Hardvérová konštrukcia - Breadboard
Hardvérová konštrukcia - Breadboard
Hardvérová konštrukcia - Breadboard
Hardvérová konštrukcia - Breadboard

Prvou fázou konštrukcie hardvéru bolo stravovanie chleba. Tu som vyrobil maticu 4x4 s LED diódami RGB. Táto matica by vyžadovala 16 bitov na ovládanie, 12 pre stĺpce RGB a 4 pre každý riadok. Dva posuvné registre 74HC595 to všetko zvládnu. Najprv som preskúmal a navrhol obvod, o ktorom som si myslel, že bude fungovať, a potom som ho postavil na dosku.

Pravdepodobne najväčšou výzvou zostavy breadboard bolo zvládnuť všetky drôty. Zobral som si predtvarovanú súpravu drôtov na doštičky, ale potom to bolo trochu nepraktické. Trik, ktorý sa mi zdal užitočný, bol vytvoriť „port“na pripojenie k doske Arduino. To znamená, že namiesto spájania pinov na Arduine priamo s rôznymi pinmi IC na doske, venujte niekoľko riadkov na doske tomu, aby boli spojovacím bodom pre Arduino, a potom k týmto riadkom pripojte príslušné kolíky ID. Na tento projekt potrebujete iba päť pripojení k Arduinu: +5 V, uzemnenie, dáta, hodiny a západku.

Akonáhle bola doska na pečenie hotová, potreboval som ju otestovať. Bez nejakého ovládača, ktorý by odosielal správne signály do posuvných registrov, som však nemohol otestovať, či hardvérové rozloženie fungovalo.

Krok 3: Návrh softvéru ovládača

Image
Image

Vzhľadom na moje vlastné kariérne skúsenosti s vývojom softvéru to bola časť projektu, v ktorej som mal asi najjasnejšie predstavu o ceste, ktorou sa mám vydať. Preskúmal som mnoho ďalších ovládačov matice LED LED založených na Arduine. Aj keď sú určite k dispozícii dobré ovládače, žiadny z nich nemal taký dizajn, aký by som chcel. Moje konštrukčné ciele vodiča boli:

  • Poskytnite API na vysokej úrovni, aby ste mohli programovo vytvárať obrázky a animácie. Väčšina vodičov, ktorých som videl, sa viac zameriavala na pevne zakódované obrázky. Pretože som profesiou programátor C ++, chcel som použiť dobrý objektovo orientovaný dizajn na implementáciu a správu aktivít kreslenia do matice LED.
  • Na správu obrazu na obrazovke použite prístup s dvojitou vyrovnávacou pamäťou. Jedna vyrovnávacia pamäť je programovo vtiahnutá, zatiaľ čo druhá predstavuje stav pixelov matice v každom danom okamihu. Výhodou tohto prístupu je, že nie ste povinní úplne vykresliť ďalšiu aktualizáciu rámca pre obrazovku medzi cyklami aktualizácie multiplexovania.
  • Pomocou PWM umožníte viac ako sedem primitívnych farieb, ktoré môže RGB vykresľovať prostredníctvom jednoduchých kombinácií červeného, zeleného a modrého prvku.
  • Napíšte ovládač tak, aby „fungoval“s maticami RGB LED rôznych veľkostí, ktoré nasledovali môj všeobecný prístup k návrhu matice. Všimnite si toho, že aj keď môj hardvér používa posuvné registre 74HC595, očakával by som, že môj ovládač bude pracovať s akýmkoľvek mechanizmom zapínania a vypínania štýlu posuvného registra, ktorý je usporiadaný pomocou podobného rozloženia bitov ako môj hardvér. Očakával by som napríklad, že môj ovládač bude pracovať s hardvérovým dizajnom, ktorý používa čipy DM13A na ovládanie stĺpcov a čip 74HC595 na ovládanie riadkov.

Ak sa chcete rovno pozrieť na kód vodiča, nájdete ho na GitHub tu.

Prvá iterácia môjho ovládača bola trochu krivkou učenia sa o schopnostiach platformy Arduino. Najviditeľnejším obmedzením je pamäť RAM, ktorá je pre Arduino Uno a Nano 2 kB. Použitie objektov C ++ v takom prípade sa často neodporúča z dôvodu nadmernej pamäte objektov. Cítil som však, že ak to urobím správne, prínos objektov v C ++ preváži ich náklady (v RAM).

Druhou hlavnou výzvou bolo zistiť, ako implementovať moduláciu šírky impulzu pomocou posuvných registrov, aby som mohol generovať viac ako sedem primitívnych farieb RGB LED. Keďže som mnoho rokov programoval na platformách Linux, bol som zvyknutý používať konštrukcie ako vlákna na správu procesov, ktoré vyžadujú konzistentné načasovanie. Načasovanie operácie aktualizácie posuvného registra je pri vytváraní ovládača pre maticu LED, ktoré používa multiplexovanie, veľmi dôležité. Dôvodom je, že aj keď multiplexovanie prebieha tak rýchlo, že vaše oči nevidia, ako jednotlivé LED diódy blikajú zapínajú a vypínajú, vaše oči môžu zachytiť rozdiely v celkovom súhrnnom čase, počas ktorého je ktorákoľvek z diód LED zapnutá. Ak je jeden rad diód LED trvalo rozsvietený dlhší čas ako ostatné, bude pri multiplexovaní vyzerať jasnejšie. To môže viesť k nerovnomernému jasu v matici alebo k pravidelnému strobovaniu matice ako celku (k tomu dochádza vtedy, keď jeden aktualizačný cyklus trvá dlhšie ako ostatné).

Pretože som potreboval konzistentný mechanizmus časovania, aby aktualizácie posuvných registrov boli súhlasné, ale Arduino vlákno formálne nepodporuje, musel som si vytvoriť vlastný mechanizmus podobný vláknu. Mojou prvou iteráciou bolo jednoducho vytvoriť časovač slučky, ktorý závisel od funkcie loop () Arduino a ktorý spustí akciu, keď od posledného spustenia akcie uplynie určitý čas. Ide o formu „kooperatívneho multitaskingu“. Znie to dobre, ale v praxi sa to ukázalo ako nekonzistentné, keď bola rýchlosť streľby meraná v mikrosekundách. Dôvodom je to, že ak som nechal bežať dva z týchto časovačov slučky, jedna z ich akcií často trvala dostatočne dlho, aby sa druhá akcia spustila neskôr, ako bolo požadované.

Zistil som, že riešením tohto problému je použiť natívny mechanizmus prerušovania hodín Arduina. Tento mechanizmus vám umožňuje spustiť malý kúsok kódu vo veľmi konzistentných intervaloch. Tak som navrhol kód ovládača okolo konštrukčného prvku tak, že pomocou hodinového prerušenia sa spustí kód na odoslanie posuvných registrov matice pri ďalšej aktualizácii v multiplexovom cykle. Aby som to urobil a umožnil, aby aktualizácie obrazu prebehli tak, aby nezasahovali do aktívneho výpisu do posuvných registrov (niečo, čo by sme nazvali „závodnou podmienkou“), použil som prístup, ktorý má dvojité vyrovnávacie pamäte pre bity posuvného registra, jeden na písanie a jeden na čítanie. Keď používateľ aktualizuje obraz matice, tieto operácie sa vykonajú vo vyrovnávacej pamäti pre zápis. Keď sú tieto operácie dokončené, prerušenia sú dočasne pozastavené (to znamená, že prerušenie hodín sa nemôže spustiť) a vyrovnávacia pamäť pre zápis sa prehodí s predchádzajúcou vyrovnávacou pamäťou pre čítanie a nie je to nová vyrovnávacia pamäť pre čítanie, potom sa znova povolia interprety. Potom, keď sa spustí prerušenie hodín, čo naznačuje, že je čas poslať ďalšiu bitovú konfiguráciu do posuvných registrov, tieto informácie sa načítajú z aktuálnej vyrovnávacej pamäte pre čítanie. Týmto spôsobom sa do vyrovnávacej pamäte, z ktorej sa práve môže čítať počas prerušenia hodín, nevyskytne žiadne zápis, čo by mohlo poškodiť informácie odoslané do posuvných registrov.

Navrhovanie zvyšku ovládača bolo relatívne jednoduchým prípadom objektovo orientovaného dizajnu. Napríklad som vytvoril objekt na správu bitového obrazu posuvného registra pre akýkoľvek daný stav obrazovky. Zapuzdrením kódu, ktorý sa týka správy bitov, bolo vytvorenie vyššie uvedeného prístupu s dvojitými vyrovnávacími pamäťami samo osebe priamočiare. Ale nepísal som tento návod na oslavu predností objektovo orientovaného dizajnu. Ďalší dizajnový prvok zahŕňa koncept glyfu a obrázku RGB. Glyf je základný obrazový konštrukt, ktorý nemá žiadne vrodené informácie o farbe. Môžete si to predstaviť ako čiernobiely obrázok. Keď sa glyf pritiahne na obrazovku LED, zobrazia sa informácie o farbe, ktoré určujú, ako by mali byť zafarbené „biele“pixely. RGB obrázok je obrázok, kde každý pixel má svoje vlastné informácie o farbe.

Odporúčame vám, aby ste si prečítali príklady skíc Arduino a prezreli si dokumentáciu k hlavičke ovládača, aby ste sa oboznámili s tým, ako pomocou ovládača vytvárať obrázky a animácie na matici RGB LED.

Krok 4: LED duch

LED duch
LED duch
LED duch
LED duch

V LED matici je „ghosting“jav, keď LED v matici svieti, keď to nie je žiaduce, zvyčajne veľmi znížená úroveň. Môj pôvodný hardvér bol citlivý na ghosting, najmä v poslednom rade. Príčinou sú dve veci: tranzistory sa okamžite nevypnú a parazitná kapacita v LED diódach RGB.

Keď skenujeme riadky, vzhľadom na skutočnosť, že tranzistory sa okamžite nevypnú, predchádzajúci riadok cyklu skenovania je stále čiastočne napájaný, keď sa zapne ďalší riadok. Ak sa daný stĺpec, ktorý bol vypnutý v predchádzajúcom riadku, znova zapne, keď sa napája nový riadok, dióda LED tohto stĺpca v predchádzajúcom riadku bude na chvíľu svietiť, zatiaľ čo spínací tranzistor predchádzajúceho radu je stále v procese otáčania vypnuté. Čo spôsobuje, že vypnutie tranzistora trvá znateľne dlho, je sýtosť v základni tranzistora. To spôsobuje, že dráha tranzistora a kolektora-emitora pokračuje vo vedení, keď je prúd odstránený zo základne, aspoň kým sa saturácia nerozpustí. Vzhľadom na to, že náš aktualizačný cyklus multiplexovania spôsobuje, že riadky sú účelovo zapínané po dobu meranú v mikrosekundách, množstvo času, počas ktorého zostáva nasýtený tranzistor predchádzajúceho radu vodivý, môže byť jeho znateľnou súčasťou. Výsledkom je, že vaše oko vníma veľmi malý čas zapnutia diódy LED predchádzajúceho radu.

Na vyriešenie problému so saturáciou tranzistora je možné k tranzistoru medzi základňou a kolektorom pridať Schottkyho diódu, ktorá spôsobí malý spätný prúd do základne, keď je tranzistor zapnutý, čím sa zabráni saturácii tranzistora. To zase spôsobí rýchlejšie vypnutie tranzistora, keď je prúd odstránený zo základne. V tomto článku nájdete podrobné vysvetlenie tohto efektu. Ako vidíte na obrázku v tejto časti, bez diódy je výskyt duchov celkom zreteľný, ale pridanie diódy do obvodu pre každý riadok výrazne eliminuje výskyt duchov.

RGB LED diódy sú náchylné na ďalší jav nazývaný parazitická kapacita. Hlavnou príčinou je skutočnosť, že každá z troch farebných diód LED v jednotke RGB LED má každé odlišné dopredné napätie. Tento rozdiel v dopredných napätiach môže spôsobiť účinok elektrickej kapacity medzi každou z jednotlivých farieb LED. Pretože v jednotke LED je pri napájaní vybudovaný elektrický náboj, pri odpojení napájania je potrebné parazitickú kapacitu vybiť. Ak je tento stĺpec LED inak zapnutý pre napájanie iného radu, parazitický náboj sa vybije prostredníctvom diódy LED stĺpcov a spôsobí jeho krátke svietenie. Tento efekt je v tomto článku pekne vysvetlený. Riešením je pridať vybíjaciu dráhu pre tento parazitický náboj inak ako cez samotnú LED diódu a potom nechať LED dióde čas na vybitie, než bude stĺp opäť napájaný. V mojom hardvérovom dizajne sa to dosahuje pridaním odporu do elektrického vedenia každého radu, ktorý spája silu so zemou. To spôsobí, že bude odoberaný väčší prúd, keď je riadok napájaný, ale poskytne vybíjaciu dráhu pre parazitnú kapacitu, keď riadok nie je napájaný.

Stojí však za zmienku, že v praxi považujem vplyv parazitnej kapacity za takmer nepostrehnuteľný (ak ho hľadáte, môžete ho nájsť), a preto považujem pridanie tohto dodatočného odporu za voliteľné. Účinok času spomalenia pre nasýtené tranzistory je oveľa silnejší a citeľnejší. Napriek tomu, ak sa pozriete na tri fotografie uvedené v tejto časti, môžete vidieť, že odpory úplne odstránia akékoľvek duchovanie, ktoré sa stále vyskytuje nad rámec vypnutia pomalého tranzistora.

Krok 5: Finálna výroba a ďalšie kroky

Image
Image

Poslednou fázou tohto projektu bolo pre mňa vytvorenie dosky plošných spojov (PCB). Na návrh svojej DPS som použil open source program Fritzing. Aj keď bolo potrebné vykonať veľa opakujúcich sa úloh pri rozložení 100 LED diód na doske 10x10, v skutočnosti som zistil, že táto fáza projektu je podivne uspokojivá. Zistiť, ako bude rozložená každá elektrická dráha, bolo ako puzzle a vyriešenie tejto hádanky vytvorilo pocit úspechu. Pretože nie som nastavený na výrobu obvodových dosiek, použil som jeden z mnohých online zdrojov, ktoré robia malé série vlastných PCB. Spájkovanie dielov dohromady bolo celkom jednoduché, pretože môj návrh využil všetky diely priechodných otvorov.

V čase písania tohto Návodu mám pre svoje projekty RGB LED Matrix nasledujúce plány:

  1. Pokračujte v zdokonaľovaní ovládača vo vrstve API, aby ste programátorovi poskytli viac funkcií na vysokej úrovni, predovšetkým posúvanie textu.
  2. Vytvárajte väčšie vzory matíc, napríklad 16 x 16 alebo dokonca 16 x 32.
  3. Preskúmajte používanie MOSFETov namiesto BJT na prepínanie výkonu v riadkoch
  4. Na prepínanie stĺpcov skúmajte radšej ovládače konštantného prúdu DM13A než 74HC595s
  5. Vytvorte ovládače pre ďalšie platformy mikroovládania, ako napríklad Teensy, ODROID C2 alebo Raspberry Pi.

Upozorňujeme, že dizajn hardvéru a ovládač boli vydané pod licenciou open source GPL v3 v tomto úložisku GitHub. Ďalej, pretože aj keď výrobcovia DPS robia „malé série“môjho návrhu DPS, stále dostávam oveľa viac, ako osobne potrebujem. Preto predávam úplné súpravy pre svoje rôzne návrhy matíc RGB LED (PCB a všetky diely vrátane) z mojej webovej stránky tu.

Odporúča: