Tartalomjegyzék:

RGB LED mátrix: 5 lépés
RGB LED mátrix: 5 lépés

Videó: RGB LED mátrix: 5 lépés

Videó: RGB LED mátrix: 5 lépés
Videó: 💡Делаем RGB контроллер и крутой свет для видео 2024, Július
Anonim
Image
Image
Hardver tervezés
Hardver tervezés

Keresés Instructable, és sok LED mátrix projektet talál. Egyik sem volt az, amit szerettem volna, azaz a hardver és a szoftver tervezésének kölcsönhatásainak feltárása, hogy valamit előállítsanak, és a végterméket egy tiszta PCB-n állítsam elő egy illesztőprogrammal, amelyet hadd húzzak a "LED-képernyőhöz" magas szintű konstrukciókat (pl. vonalat húzni, szemben a meghatározott képpontok beállításával). Ez a rész fontos volt számomra, mivel a LED -mátrix -meghajtók nagy része csupasz csont, és nem sokat jelent a kép vagy az animáció programozási módjában. Ez nem jelenti azt, hogy nem hozhat létre képeket és animációkat a többi illesztőprogrammal, csak azt, hogy több ismétlődő munkát kell végeznie projektről projektre.

Ezért nekiláttam, hogy megvalósítsam elképzelésemet. Az első lépés a hardver megtervezése volt. Valószínűleg ez jelentette a legnagyobb kihívást számomra, mivel a hátterem inkább szoftver. Ismét sok előre elkészített kivitel volt, és minden bizonnyal inspirációként használtam őket, de szerettem volna megtanulni a cselekvés révén, ezért prototípusoztam egy 4x4-es mátrixot egy kenyértáblán. A folyamat során sokat tanultam, mivel az első néhány iteráció nem működött. De én olyan hardvertervezést végeztem, amely működött, ami lehetővé tette számomra, hogy elkezdjek egy illesztőprogramot fejleszteni.

Az Arduino -t választottam vezetői platformként, mert széles körben elérhető és rengeteg referenciát tartalmaz az interneten. Míg a szakmai tapasztalat lehetővé tette számomra, hogy a hardveres erőfeszítéseimnél simább módon elérjem az illesztőprogram működő verzióját, még mindig rengeteg iteráció történt, miközben optimalizáltam az ATMega mikrovezérlő illesztőprogram -teljesítményét, és kifejlesztettem egy tetszőleges programozási API -t.

Ez az utasítás tartalmazza a projekt tervezését és néhány fontos tanulságát. A projektről további információk találhatók a honlapomon itt, beleértve a teljes készleteket, amelyeket megvásárolhat saját RGB LED mátrixának létrehozásához.

1. lépés: Hardvertervezés

A hardvertervezésem elsődleges célja az volt, hogy létrehozzak egy sor RGB LED -et, amelyeket programozni tudok, de én sem akartam sok pénzt költeni. A megközelítés az volt, hogy 74HC595 váltóregisztereket használtam a LED -ek vezérlésére. A szükséges műszakregiszterek számának minimalizálása érdekében az RGB LED -eket mátrix elrendezésbe rendeztem, ahol a közös anódokat sorokba kötötték, a piros, zöld és kék katód vezetékeket pedig oszlopokba. A 4x4 -es mátrix esetében a kapcsolási rajz a mellékelt kapcsolási rajzhoz hasonlított.

Egy dolgot rögtön megjegyezni fog, hogy a mátrix áramkörre tekintettel vannak olyan LED -világítási konfigurációk, amelyeket nem lehet végrehajtani úgy, hogy az összes kívánt LED egyszerre világít. Például a mátrix nem tud egyszerre két, egymástól átlós LED -t világítani, mert a sorok és oszlopok áramellátása következtében a két ellentétes LED világít a kívánt LED -ekre merőleges átlón. Ennek kiküszöbölése érdekében multiplexelést használunk minden sor átvizsgálásához. Rengeteg erőforrás található a weben, amelyek lefedik a multiplexelés technikáját, itt nem próbálom megismételni őket.

Mivel gyakori anód LED -eket használok, ez azt jelenti, hogy a sorok pozitív energiát biztosítanak, és az oszlopok a földre süllyednek. A jó hír az, hogy a 74HC595 váltóregiszterek egyaránt képesek áramot szolgáltatni és elnyelni, de a rossz hír az, hogy korlátozzák, hogy mennyi energiát tudnak előállítani vagy elmeríteni. A 74HC595 egyes csapjainak maximális áramfelvétele 70 mA, de a legjobb, ha 20 mA alatt marad. Az RGB LED -ek egyedi színei körülbelül 20 mA -es feszültséggel rendelkeznek. Ez azt jelenti, hogy a 74HC595 nem képes közvetlenül táplálni egy teljes sor LED -et, ha be akarom kapcsolni őket.

Tehát a sor közvetlen táplálása helyett a 74HC595 tranzisztorokat hajt meg minden sorban, és a tranzisztor be- vagy kikapcsolja a sort tápláló áramot. Mivel a kialakítás közös anód LED -eket használ, a kapcsolótranzisztor PNP lesz. Ha közös katód LED -et használnánk, a kapcsolótranzisztor NPN lenne. Vegye figyelembe, hogy ha egy sor meghajtásához PNP tranzisztort használ, akkor a váltásregiszter bekapcsolási beállítása alacsony lesz, mivel a PNP tranzisztornak negatív feszültséget kell bekapcsolnia az emitter és az alap között, ami lehetővé teszi a pozitív áram beáramlását a sor.

Egy másik dolog, amit figyelembe kell venni, a váltóregiszterek kívánt bitelrendezése. Vagyis a shift regiszterek között, amelyek bitek vezérlik a mátrix mely sorait vagy oszlopait. Az általam küldött terv az, ahol az első bit vagy a "legjelentősebb bit", amelyet a láncos láncú váltóregiszterekhez küldtek, vezérli a LED -ek piros elem oszlopát, a második bit az első oszlop zöld elemét, a harmadik bit az első oszlopot kék elem, a negyedik bit vezérli a második oszlop piros elemét,… ez a minta megismétlődik az oszlopokban balról jobbra. Ezután a következő küldött bit vezérli az utolsó vagy alsó sort, a következő a másodiktól az utolsó sort,… ez ismétlődik, amíg az utolsó elküldött bit, vagy a "legkevésbé jelentős bit", vezérli a mátrix első vagy felső sorát.

Végül meg kellett határoznom, hogy milyen ellenállásokat használok az RGB LED -ek mindegyik LED -jéhez. Míg a szabványos képletet használhatja, amely egyesíti az előremenő feszültséget és a kívánt áramot a szükséges ellenállás kiszámításához, azt tapasztaltam, hogy az egyes LED-ek 20 milliamper értékre állítása törtfehér színt eredményezett, amikor az összes piros, zöld és kék LED világított. Szóval elkezdtem szemezgetni. A túl sok piros a fehérben azt jelentette, hogy növelni kell a piros LED ellenállásának ohmjait az áram csökkentése érdekében. Ismételtem a különböző ohmú ellenállások cseréjét, amíg meg nem találtam egy olyan kombinációt, amely fehér színt eredményezett, amit helyesnek éreztem. A végső kombináció 180 Ω volt a piros LED -nél, 220 Ω a zöld LED -nél és 100 Ω a kék LED -nél.

2. lépés: Hardvergyártás - Breadboard

Hardvergyártás - Breadboard
Hardvergyártás - Breadboard
Hardvergyártás - Breadboard
Hardvergyártás - Breadboard

A hardverkonstruktor első fázisa a kenyérszállás volt. Itt készítettem egy 4x4 -es mátrixot az RGB LED -ekkel. Ennek a mátrixnak 16 bitre lenne szüksége a vezérléshez, 12 -re az RGB oszlopokra és 4 -re minden sorra. Két 74HC595 műszakregiszter képes mindezt kezelni. Először kutakodtam és megterveztem egy áramkört, amelyről azt hittem, hogy működni fog, majd a kenyértáblára építettem.

Valószínűleg a legnagyobb kihívás a kenyértábla felépítésében az összes vezeték kezelése volt. Felvettem egy előre elkészített drótkészletet kenyérpántokhoz, de akkor kicsit nehézkes volt. Egy trükk, amelyet hasznosnak találtam, az volt, hogy létrehoztam egy "portot" az Arduino táblához való csatlakozáshoz. Vagyis ahelyett, hogy az Arduino csapjait közvetlenül a kenyértáblán lévő különböző IC -tűkhöz csatlakoztatná, szenteljen néhány sort a kenyértáblán az Arduino csatlakozási pontjának, majd csatlakoztassa a megfelelő azonosítótűket ezekhez a sorokhoz. Ehhez a projekthez mindössze öt kapcsolatra van szüksége az Arduino -hoz: +5 V, föld, adat, óra és retesz.

Miután elkészült a kenyértábla építése, tesztelnem kellett. Azonban anélkül, hogy valamiféle illesztőprogram küldte volna a megfelelő jeleket a műszakregisztereknek, nem tudtam tesztelni, hogy működik -e a hardver elrendezés.

3. lépés: Illesztőprogram -szoftver tervezése

Image
Image

Figyelembe véve a szoftverfejlesztéssel kapcsolatos saját szakmai tapasztalataimat, ez volt az a része a projektnek, amelyet valószínűleg a legegyértelműbben tudtam megtenni. Sok más Arduino-alapú LED-mátrix-illesztőprogramot felmértem. Bár biztosan vannak jó illesztőprogramok, egyik sem olyan, amilyenre vágytam. A sofőr tervezési céljaim a következők voltak:

  • Adjon meg egy magas szintű API-t, amely képes programozottan létrehozni képeket és animációkat. A legtöbb sofőr, akit láttam, inkább a keményen kódolt képekre koncentrált. Továbbá, mivel szakmámban C ++ programozó vagyok, jó objektumorientált tervezést akartam használni a LED mátrixra való rajzolás megvalósításához és kezeléséhez.
  • Dupla puffereléssel kezelje a képernyőn megjelenő képet. Az egyik puffer az, ami programszerűen behúzódik, míg a másik a mátrix képpontok állapotát jelzi. Ennek a megközelítésnek az az előnye, hogy a multiplexelés frissítési ciklusai között nem kell teljesen megjelenítenie a képernyő következő keretfrissítését.
  • A PWM használatával több mint hét primitív színt engedélyezhet, amelyeket az RGB a vörös, zöld és kék elemek egyszerű kombinációival képes megjeleníteni.
  • Írja meg az illesztőprogramot úgy, hogy "csak működjön" különböző méretű RGB LED mátrixokkal, amelyek az én általános mátrixtervezési megközelítésemet követték. Ne feledje, hogy míg a hardveres tervezésem 74HC595 váltóregisztereket használ, elvárnám, hogy a vezetőm bármilyen műszakregiszter -stílusú ki- és bekapcsolási mechanizmussal dolgozzon, amely a hardvertervezéshez hasonló bitelrendezéssel van kialakítva. Például azt várnám el a sofőrömtől, hogy olyan hardverrel dolgozzon, amely DM13A chipeket használ az oszlopok vezérléséhez, és egy 74HC595 chipet a sorok vezérléséhez.

Ha közvetlenül az illesztőprogram -kódot szeretné megtekinteni, akkor itt megtalálhatja a GitHub -on.

A sofőröm első iterációja egy kicsit tanulási görbe volt az Arduino platform képességeiről. A legnyilvánvalóbb korlátozás a RAM, amely 2K bájt az Arduino Uno és a Nano esetében. A C ++ objektumok használata ilyen esetben gyakran nem ajánlott az objektumok memóriaterhelése miatt. Viszont úgy éreztem, ha jól csinálják, a C ++ objektumok haszna meghaladja a költségeiket (RAM -ban).

A második nagy kihívás az volt, hogy kitaláljuk, hogyan valósítsuk meg az impulzusszélesség-modulációt a váltóregisztereken keresztül, így többet tudnék generálni, mint az RGB LED hét primitív színe. Miután sok éven át programoztam Linux platformokon, hozzászoktam, hogy olyan konstrukciókat használok, mint a szálak a folyamatok kezeléséhez, amelyek következetes időzítést igényelnek. A műszakregiszter -frissítési művelet időzítése végül nagyon kritikus lesz, amikor meghajtót készítünk egy multiplexelést használó LED -mátrixhoz. Ennek az az oka, hogy annak ellenére, hogy a multiplexelés olyan gyorsan történik, hogy a szeme nem látja, hogy az egyes LED -ek villognak ki -be, a szemei eltéréseket észlelhetnek a LED -ek bármelyikének teljes bekapcsolási idejében. Ha az egyik LED sor folyamatosan tartósan világít, mint a többi, akkor a multiplexelés során fényesebb lesz. Ez egyenetlen fényerőhöz vezethet a mátrixban, vagy a mátrix egészének időszakos átütéséhez (ez akkor fordul elő, ha az egyik frissítési ciklus hosszabb ideig tart, mint a többi).

Mivel következetes időzítési mechanizmusra volt szükségem ahhoz, hogy a műszakregiszter frissítései beleegyezésre jussanak, de az Arduino formálisan nem támogatja a szálat, létre kellett hoznom a saját szálhoz hasonló mechanizmust. Ennek első iterációja az volt, hogy egyszerűen létrehoztam egy ciklusidőzítőt, amely az Arduino loop () függvénytől függ, és elindít egy műveletet, amikor egy bizonyos idő eltelt az utolsó fellépés óta. Ez a "kooperatív multitasking" egyik formája. Jól hangzik, de a gyakorlatban ez következetlennek bizonyult, amikor a tüzelési sebességet mikroszekundumokban mérték. Ennek az az oka, hogy ha kettő ciklusidőzítőm indult, az egyik műveletük gyakran elég hosszú ideig tartott ahhoz, hogy a második művelet a kívántnál később aktiválódjon.

Azt tapasztaltam, hogy a megoldás erre a problémára az Arduino natív óra megszakítási mechanizmusának használata. Ez a mechanizmus lehetővé teszi egy kis kódfuttatást nagyon egyenletes időközönként. Így az illesztőprogram kódját a tervezési elem köré terveztem, egy óra megszakítás használatával, amely elindítja a kódot a mátrix műszakregisztereinek elküldéséhez a multiplex ciklus következő frissítésében. Ennek érdekében, hogy a képernyő képének frissítései ne zavarják a műszakregiszterek aktív lerakását (ezt nevezzük "versenyfeltételnek"), azt a módszert alkalmaztam, hogy iker pufferek vannak a váltóregiszter bitjeihez, egy írásra és egyet olvasásra. Amikor a felhasználó frissíti a mátrixképet, ezek a műveletek az írási pufferre vonatkoznak. Amikor ezek a műveletek befejeződtek, a megszakításokat ideiglenesen felfüggesztjük (ez azt jelenti, hogy az óra megszakítása nem indulhat el), és az írási puffert felcseréljük az előző olvasási pufferre, és ez nem az új olvasási puffer, akkor az értelmezések újra engedélyezve vannak. Ezután, amikor az óra megszakítása elindul, jelezve, hogy el kell küldeni a következő bitkonfigurációt a váltóregiszterekhez, az információ kiolvasásra kerül az aktuális olvasási pufferből. Ily módon soha nem történik írás olyan pufferbe, amelyből éppen az óra megszakítása során lehet kiolvasni, ami megrongálhatja a műszakregiszterekhez küldött információkat.

A többi vezető megtervezése az objektum -orientált tervezés viszonylag egyszerű esete volt. Például létrehoztam egy objektumot a shift regiszter bitképének kezelésére egy adott képernyőállapothoz. A bitképkezeléshez tartozó kód beágyazásával a fent említett ikerpufferek megközelítésének létrehozása önmagában is egyszerű feladat volt. De ezt az Instructable -t nem azért írtam, hogy magasztaljam az objektumorientált tervezés erényeit. További tervezési elemek közé tartozik a Glyph és az RGB Image koncepciója. A Glyph egy alapvető képszerkezet, amely nem tartalmaz veleszületett színinformációt. Fekete -fehér képnek tekintheti. Amikor a Glyph -t a LED -képernyőhöz húzza, a színinformációk megadják, hogy a "fehér" képpontokat hogyan kell színezni. Az RGB kép olyan kép, ahol minden pixel saját színinformációkkal rendelkezik.

Javaslom, hogy tekintse át az Arduino vázlatos példáit, és tekintse át az illesztőprogram fejlécének dokumentációját, hogy megismerkedjen az illesztőprogram használatával képek és animációk létrehozásával az RGB LED mátrixon.

4. lépés: LED szellemkép

LED szellemkép
LED szellemkép
LED szellemkép
LED szellemkép

A LED -mátrixban a "szellemkép" az a jelenség, amikor a mátrixban lévő LED akkor világít, amikor nem kívánatos, általában nagyon alacsony szinten. Az eredeti hardvertervezésem érzékeny volt a szellemképekre, különösen az utolsó sorban. Ennek két oka van: a tranzisztorok nem kapcsolnak ki azonnal, és az RGB LED -ek parazita kapacitása.

Miközben a sorokat pásztázzuk, annak a ténynek köszönhetően, hogy a tranzisztorok nem kapcsolnak ki azonnal, a szkennelési ciklus előző sora továbbra is részben működik, amikor a következő sor bekapcsol. Ha egy adott oszlop, amely az előző sorban ki volt kapcsolva, újból bekapcsol, amikor az új sor bekapcsol, az előző sor oszlopának LED -je rövid ideig világítani fog, miközben az előző sor kapcsolótranzisztorja még mindig forog ki. Ami miatt a tranzisztor észrevehetően sok időt vesz igénybe a kikapcsoláshoz, az a tranzisztor bázisának telítettsége. Ez azt eredményezi, hogy a tranzisztoros kollektor-emitter útvonal továbbra is vezet, amikor az áramot eltávolítják a bázisról, legalábbis addig, amíg a telítettség el nem szűnik. Tekintettel arra, hogy a multiplexelési frissítési ciklusunk miatt a sorok szándékosan be vannak kapcsolva mikroszekundumokban, az idő, amíg az előző sor telített tranzisztorja vezetőképes marad, ennek észrevehető töredéke lehet. Ennek eredményeképpen a szem érzékelheti azt a nagyon kis időt, amíg az előző sor LED -je bekapcsol.

A tranzisztor telítettségének megoldásához Schottky diódát lehet hozzáadni a tranzisztorhoz az alap és a kollektor között, ami egy kis visszaáramot okoz a bázisnak, amikor a tranzisztor be van kapcsolva, és megakadályozza a tranzisztor telítettségét. Ez viszont a tranzisztor gyorsabb kikapcsolását eredményezi, amikor az áramot eltávolítják a bázisról. A hatás részletes magyarázatát ebben a cikkben találja. Amint az ebben a részben található képen látható, a dióda nélkül a szellemkép észrevehető, de a dióda hozzáadása az áramkörhöz minden sorban jelentősen eltávolítja a szellemképet.

Az RGB LED -ek érzékenyek egy másik jelenségre, az úgynevezett parazita kapacitásra. Ennek oka az, hogy az RGB LED -egység három színű LED -jének mindegyike eltérő előremenő feszültséggel rendelkezik. Ez az előremenő feszültségek különbsége az egyes LED -színek közötti elektromos kapacitás hatását okozhatja. Mivel áramellátás közben a LED egységben elektromos töltés halmozódik fel, az áramellátás megszüntetésekor le kell üríteni a parazita kapacitást. Ha az adott LED oszlop egyébként be van kapcsolva egy másik sor tápellátására, akkor a parazita töltés kisül az oszlopok LED -jén, és rövid ideig világít. Ezt a hatást szépen elmagyarázza ebben a cikkben. A megoldás az, hogy ehhez a parazita töltéshez kisülési utat adunk, nem a LED -en keresztül, majd időt adunk a LED -nek a kisülésre, mielőtt az oszlop újra bekapcsol. A hardveres tervezésemben ez úgy valósul meg, hogy minden sor tápvezetékéhez ellenállást adnak, amely az erőt a földhöz köti. Ez több áramot von le a soros tápellátás esetén, de biztosít egy kisülési utat a parazita kapacitáshoz, ha a sor nincs áram alatt.

Érdemes azonban megjegyezni, hogy a gyakorlatban a parazitakapacitás hatását alig észrevehetőnek találom (ha rákeresel, megtalálod), és ezért ezt az extra ellenállást is opcionálisnak tartom. A telített tranzisztorok lassítási ideje sokkal erősebb és észrevehetőbb. Mindazonáltal, ha megvizsgálja az ebben a részben található három fényképet, láthatja, hogy az ellenállások teljesen eltávolítják a szellemképeket, amelyek a lassú tranzisztor kikapcsolási idején túl is előfordulnak.

5. lépés: A végső gyártás és a következő lépések

Image
Image

A projekt utolsó szakasza egy nyomtatott áramköri lap (PCB) létrehozása volt. A NYÁK tervezéséhez a nyílt forráskódú Fritzing programot használtam. Bár sok ismétlődő feladatot kellett elvégezni 100 LED elhelyezésére 10x10 -es táblán, valójában furcsán kielégítőnek találtam a projektnek ezt a szakaszát. Az, hogy kitaláljuk, hogyan fognak elrendezni az egyes elektromos útvonalak, olyan volt, mint egy rejtvény, és ennek a rejtvénynek a megoldása a teljesítmények érzését keltette. Mivel nem állok készen az áramköri lapok gyártására, a sok online erőforrás egyikét használtam, amelyek kis PCB -lemezt készítenek. Az alkatrészek összeforrasztása meglehetősen egyszerű volt, mivel a tervezésem minden lyukasztó részt használt.

Ennek az utasításnak az írásakor a következő terveim vannak az RGB LED mátrix projektjeimmel kapcsolatban:

  1. Folytassa az illesztőprogram fejlesztését az API rétegben, hogy több magas szintű funkcionalitást, különösen a szöveg görgetését tegye lehetővé a programozó számára.
  2. Hozzon létre nagyobb mátrixmintákat, például 16x16 vagy akár 16x32.
  3. Fedezze fel, hogyan használhat MOSFET -eket a BJT -k helyett a soros teljesítménykapcsoláshoz
  4. Fedezze fel a DM13A állandóáramú meghajtóit a 74HC595 helyett az oszlopváltáshoz
  5. Hozzon létre illesztőprogramokat más mikrovezérlő platformokhoz, például a Teensy, az ODROID C2 vagy a Raspberry Pi.

Ne feledje, hogy mind a hardver kialakítása, mind az illesztőprogram a GPL v3 nyílt forráskódú licenc alapján került kiadásra ezen a GitHub -lerakaton. Továbbá, bár annak ellenére, hogy a NYÁK -gyártók „kis sorozatokban” végzik a NYÁK -tervezésemet, még mindig sokkal többet kapok, mint amire személyesen szükségem van. Tehát teljes készleteket árulok a különböző RGB LED mátrix terveimhez (NYÁK és minden alkatrész) a honlapomról itt.

Ajánlott: