Satura rādītājs:

RGB LED matrica: 5 soļi
RGB LED matrica: 5 soļi

Video: RGB LED matrica: 5 soļi

Video: RGB LED matrica: 5 soļi
Video: Подключаем светодиодные матрицы к Arduino Mega и Raspberry Pi. Железки Амперки 2024, Jūlijs
Anonim
Image
Image
Aparatūras dizains
Aparatūras dizains

Meklējiet Instructable, un jūs varat atrast daudzus LED matricas projektus. Neviens no tiem nebija gluži tas, ko es gribēju, proti, izpētīt aparatūras un programmatūras dizaina mijiedarbību, lai kaut ko ražotu, un galaproduktu izgatavot glītā PCB ar draiveri, kas ļauj pievērsties "LED ekrānam", izmantojot augsta līmeņa konstrukcijas (piemēram, līnijas novilkšana, nevis noteiktu pikseļu iestatīšana). Šī daļa man bija svarīga, jo daudzi no LED matricas draiveriem ir kaili un nesniedz daudz iespēju, kā programmatiski izveidot attēlu vai animāciju. Tas nenozīmē, ka jūs nevarat izveidot attēlus un animācijas kopā ar citiem draiveriem, bet tikai tas, ka jums būs jāveic vairāk atkārtojošs darbs no projekta uz projektu.

Tāpēc es nolēmu īstenot savu redzējumu. Pirmais solis bija aparatūras projektēšana. Tas, iespējams, man bija vissarežģītākais, jo mana pieredze ir vairāk programmatūra. Atkal bija daudz iepriekš ceptu dizainu, un es tos noteikti izmantoju iedvesmai, taču es gribēju mācīties, darot, tāpēc es izveidoju 4x4 matricas prototipu uz maizes dēļa. Šajā procesā es daudz iemācījos, jo manas pirmās atkārtojumi nedarbojās. Bet es veicu aparatūras dizainu, kas darbojās, un tas man ļāva sākt izstrādāt draiveri.

Es izvēlējos Arduino kā savu draivera platformu, jo tā ir plaši pieejama un tajā ir daudz atsauču tiešsaistē. Lai gan karjeras pieredze ļāva man vieglāk piekļūt draivera darba versijai nekā aparatūras centieni, joprojām bija daudz atkārtojumu, kamēr es optimizēju draivera veiktspēju ATMega mikrokontrolleram un izstrādāju programmēšanas API, kas man patika.

Šī instrukcija dokumentē mana projekta dizainu un dažas galvenās mācības. Plašāku informāciju par šo projektu var atrast manā vietnē šeit, ieskaitot pilnus komplektus, kurus varat iegādāties, lai izveidotu savu RGB LED matricu.

1. darbība. Aparatūras projektēšana

Manas aparatūras dizaina galvenais mērķis bija izveidot RGB gaismas diodes, ko es varētu programmēt, bet es arī negribēju tērēt daudz naudas. Pieejamā pieeja bija izmantot 74HC595 maiņu reģistrus, lai kontrolētu gaismas diodes. Lai samazinātu nepieciešamo maiņu reģistru skaitu, es sakārtoju RGB gaismas diodes matricas izkārtojumā, kur kopējie anodi tika sasieti rindās, bet sarkanie, zaļie un zilie katoda vadi - kolonnās. 4x4 matricai shēmas shēma izskatījās kā pievienotā shēma.

Viena lieta, ko jūs uzreiz atzīmēsit, ir tāda, ka, ņemot vērā matricas ķēdi, ir dažas LED apgaismojuma konfigurācijas, kuras nevar izdarīt, vienlaikus ieslēdzot visas vēlamās gaismas diodes. Piemēram, matrica nevar vienlaicīgi iedegt divas gaismas diodes, kas ir viena no otras pa diagonāli, jo, barojot gan rindas, gan kolonnas, abas pretējās gaismas diodes iedegsies perpendikulārajā diagonālē vēlamajām gaismas diodēm. Lai to novērstu, mēs izmantosim multipleksēšanu, lai skenētu katru rindu. Tīmeklī ir daudz resursu, kas aptver multipleksēšanas tehniku, es nemēģināšu tos šeit atkārtot.

Tā kā es izmantoju parastās anoda gaismas diodes, tas nozīmē, ka rindas nodrošina pozitīvu jaudu un kolonnas nogrimst zemē. Labā ziņa ir tā, ka 74HC595 maiņu reģistri var gan avotu, gan nogremdēt jaudu, bet sliktā ziņa ir tā, ka tiem ir ierobežots enerģijas daudzums, ko tie var iegūt vai nogremdēt. Atsevišķām 74HC595 tapām maksimālā strāva ir 70 mA, bet vislabāk ir saglabāt mazāk par 20 mA. Katrai mūsu RGB gaismas diodes krāsai ir aptuveni 20 mA. Tas nozīmē, ka 74HC595 nevar tieši barot visu gaismas diožu rindu, ja es vēlos tos visus ieslēgt.

Tā vietā, lai barotu rindu tieši, 74HC595 tā vietā vadīs tranzistoru katrai rindai, un tranzistors ieslēgs vai izslēgs strāvu, kas baro rindu. Tā kā dizainā tiek izmantotas kopējas anoda gaismas diodes, komutācijas tranzistors būs PNP. Ja mēs izmantotu parasto katoda gaismas diodi, pārslēgšanas tranzistors būtu NPN. Ņemiet vērā, ka, izmantojot rindas vadīšanai PNP tranzistoru, maiņas reģistra iestatījums to ieslēgt kļūst zems, jo PNP tranzistoram ir jāieslēdz negatīvs spriegums starp emitētāju un pamatni, kas ļaus pozitīvai strāvai ieplūst rinda.

Vēl viena lieta, kas jāņem vērā, ir vēlamais maiņu reģistru bitu izkārtojums. Tas ir, starp maiņu reģistriem, kuri biti kontrolē, kuras rindas vai kolonnas matricā. Dizains, ar kuru es sūtīju, ir tas, kur pirmais bits jeb "visnozīmīgākais bits", kas nosūtīts uz ķēdes maiņas reģistriem, kontrolē gaismas diodes sarkano elementu kolonnu, otrais bits kontrolēja pirmās kolonnas zaļo elementu, trešais bits kontrolē pirmās kolonnas zilais elements, ceturtais bits kontrolē otrās kolonnas sarkano elementu,… šis modelis tiek atkārtots kolonnās no kreisās uz labo. Tad nākamais nosūtītais bits kontrolē pēdējo vai apakšējo rindu, nākamais - no otrās līdz pēdējai rindai,… tas atkārtojas, līdz pēdējais nosūtītais bits jeb "vismazāk nozīmīgais bits" kontrolē matricas pirmo vai augšējo rindu.

Visbeidzot, man bija jānosaka, kādus rezistorus es izmantotu katrai RGB gaismas diodes gaismas diodei. Lai gan jūs varētu izmantot standarta formulu, kas apvieno priekšējo spriegumu un vēlamo strāvu, lai aprēķinātu vajadzīgo rezistoru, es atklāju, ka, iestatot katras gaismas diodes strāvu uz 20 miliamperiem, tika iegūta gandrīz balta krāsa, kad visas sarkanās, zaļās un zilās gaismas diodes bija ieslēgtas. Tāpēc es sāku to aplūkot. Pārāk daudz sarkanā krāsā baltā krāsā nozīmēja palielināt sarkano LED rezistoru omi, lai samazinātu strāvu. Es atkārtoju dažādu omu rezistoru nomaiņu, līdz atradu kombināciju, kas radīja baltu krāsu, kas, manuprāt, bija pareiza. Galīgā kombinācija bija 180 Ω sarkanajai gaismas diodei, 220 Ω zaļajai gaismas diodei un 100 Ω zilajai gaismas diodei.

2. solis: aparatūras uzbūve - maizes dēlis

Aparatūras uzbūve - maizes dēlis
Aparatūras uzbūve - maizes dēlis
Aparatūras uzbūve - maizes dēlis
Aparatūras uzbūve - maizes dēlis

Aparatūras konstruktora pirmais posms bija maizes iekāpšana. Šeit es izveidoju 4x4 matricu ar RGB gaismas diodēm. Šīs matricas vadīšanai būtu nepieciešami 16 biti, 12 - RGB kolonnām un 4 - katrai rindai. To visu var apstrādāt divi 74HC595 maiņu reģistri. Vispirms izpētīju un izstrādāju shēmu, kas, manuprāt, darbosies, pēc tam uzbūvēju to uz maizes dēļa.

Iespējams, lielākais maizes dēļa uzbūves izaicinājums bija visu vadu pārvaldīšana. Es paņēmu iepriekš sagatavotu stiepļu komplektu maizes dēļiem, taču notikums toreiz bija nedaudz smags. Triks, kas man šķita noderīgs, bija izveidot "portu" savienošanai ar Arduino plati. Tas ir, tā vietā, lai savienotu Arduino tapas tieši ar dažādām maizes dēļa IC tapām, veltiet dažas maizes dēļa rindas kā Arduino savienojuma punktu un pēc tam pievienojiet attiecīgajām ID tapām šīm rindām. Šim projektam jums ir nepieciešami tikai pieci savienojumi ar Arduino: +5 V, zeme, dati, pulkstenis un aizbīdnis.

Kad maizes dēļa izveide bija pabeigta, man tas bija jāpārbauda. Tomēr bez kāda veida draivera, kas nosūtītu pareizos signālus uz maiņu reģistriem, es nevarēju pārbaudīt, vai aparatūras izkārtojums darbojas.

3. darbība: draivera programmatūras projektēšana

Image
Image

Ņemot vērā manu karjeras pieredzi programmatūras izstrādē, šī bija tā projekta daļa, kuru es, iespējams, visvairāk skaidri zināju. Es aptaujāju daudzus citus Arduino bāzes LED matricas draiverus. Lai gan noteikti ir pieejami labi draiveri, nevienam nebija tāds dizains, kādu es gribēju. Mani vadītāja mērķi bija šādi:

  • Nodrošiniet augsta līmeņa API, lai varētu programmatiski izveidot attēlus un animācijas. Lielākā daļa autovadītāju, kurus redzēju, vairāk koncentrējās uz grūti kodētiem attēliem. Turklāt, tā kā pēc profesijas esmu C ++ programmētājs, es vēlējos izmantot labu uz objektu orientētu dizainu, lai īstenotu un pārvaldītu LED matricas zīmēšanas darbības.
  • Izmantojiet dubultā buferizētu pieeju, lai pārvaldītu attēlu ekrānā. Viens buferis ir tas, kas tiek programmiski ievilkts, bet otrs attēlo matricas pikseļu stāvokli jebkurā brīdī. Šīs pieejas priekšrocība ir tāda, ka starp multipleksēšanas atjaunināšanas cikliem jums nav pilnībā jāatveido ekrāna nākamais kadra atjauninājums.
  • Izmantojiet PWM, lai atļautu vairāk nekā septiņas primitīvas krāsas, kuras RGB var atveidot, izmantojot vienkāršas sarkano, zaļo un zilo elementu kombinācijas.
  • Uzrakstiet draiveri tā, lai tas "vienkārši darbotos" ar dažāda lieluma RGB LED matricām, kas sekoja manai vispārējai matricas dizaina pieejai. Ņemiet vērā, ka, lai gan manā aparatūras dizainā tiek izmantoti 74HC595 maiņu reģistri, es gaidītu, ka mans draiveris strādās ar jebkuru maiņu reģistra stila ieslēgšanas/izslēgšanas mehānismu, kas ir izklāstīts, izmantojot līdzīgu bitu izkārtojumu kā mans aparatūras dizains. Piemēram, es gaidītu, ka mans draiveris strādās ar aparatūras dizainu, kas izmantoja DM13A mikroshēmas, lai kontrolētu kolonnas, un 74HC595 mikroshēmu, lai kontrolētu rindas.

Ja vēlaties uzreiz apskatīt vadītāja kodu, to varat atrast vietnē GitHub.

Mana vadītāja pirmā iterācija bija mazliet mācīšanās līkne par Arduino platformas iespējām. Acīmredzamākais ierobežojums ir RAM, kas ir 2K baiti Arduino Uno un Nano. C ++ objektu izmantošana šādā scenārijā bieži nav ieteicama objektu atmiņas dēļ. Tomēr es jutu, ka, ja tas tiek darīts pareizi, ieguvumi no objektiem C ++ atsver to izmaksas (RAM).

Otrs galvenais izaicinājums bija izdomāt, kā īstenot impulsa platuma modulāciju, izmantojot maiņu reģistrus, lai es varētu radīt vairāk nekā septiņas primitīvās RGB gaismas diodes krāsas. Daudzus gadus programmējis Linux platformās, es biju pieradis izmantot konstrukcijas, piemēram, pavedienus, lai pārvaldītu procesus, kuriem nepieciešams konsekvents laiks. Izmaiņu reģistra atjaunināšanas darbības laiks ir diezgan kritisks, veidojot draiveri LED matricai, kas izmanto multipleksēšanu. Iemesls tam ir tas, ka, lai gan multipleksēšana notiek tik ātri, ka jūsu acis neredz atsevišķas gaismas diodes, kas mirgo un ieslēdzas, jūsu acis var uztvert atšķirības kopējā laikā, kurā jebkura no gaismas diodēm ir ieslēgta. Ja viena LED rinda pastāvīgi ir ieslēgta ilgāku laiku nekā pārējās, multipleksēšanas laikā tā izskatīsies gaišāka. Tas var izraisīt nevienmērīgu spilgtumu matricā vai periodisku visas matricas štancēšanu (tas notiek, ja viens atjaunināšanas cikls aizņem ilgāku laiku nekā citi).

Tā kā man bija vajadzīgs konsekvents laika noteikšanas mehānisms, lai maiņu reģistra atjauninājumi būtu piekrišana, bet Arduino formāli neatbalsta pavedienu, man bija jāizveido savs pavedieniem līdzīgs mehānisms. Mana pirmā iterācija bija vienkārši izveidot cilpas taimeri, kas bija atkarīgs no funkcijas Arduino loop () un aktivizētu darbību, kad ir pagājis noteikts laiks kopš pēdējās darbības. Tas ir "sadarbības daudzuzdevumu" veids. Izklausās labi, bet praksē tas izrādījās pretrunīgi, kad šaušanas ātrums tika mērīts mikrosekundēs. Iemesls tam ir tas, ka, ja man bija divi no šiem cilpas taimeriem, viena no viņu darbībām bieži vien aizņēma pietiekami ilgu laiku, lai otrā darbība tiktu aktivizēta vēlāk, nekā vēlams.

Es atklāju, ka šīs problēmas risinājums ir izmantot Arduino vietējo pulksteņa pārtraukšanas mehānismu. Šis mehānisms ļauj palaist nelielu koda bitu ļoti konsekventos intervālos. Tāpēc es izstrādāju draivera kodu ap dizaina elementu, izmantojot pulksteņa pārtraukumu, lai aktivizētu kodu matricas maiņu reģistru nosūtīšanai nākamajam multipleksā cikla atjauninājumam. Lai to paveiktu un ļautu ekrāna attēla atjauninājumiem netraucēt aktīvai maiņu reģistru izmešanai (ko mēs sauktu par "sacensību nosacījumu"), es izmantoju pieeju, ka maiņu reģistra bitiem ir divi buferi, viens rakstīšanai un vienu lasīšanai. Kad lietotājs atjaunina matricas attēlu, šīs darbības notiek rakstīšanas buferī. Kad šīs darbības ir pabeigtas, pārtraukumi tiek īslaicīgi apturēti (tas nozīmē, ka pulksteņa pārtraukumu nevar aktivizēt) un rakstīšanas buferis tiek aizstāts ar iepriekšējo lasīšanas buferi, un tas nav jaunais lasīšanas buferis, tad tulki tiek atkārtoti iespējoti. Pēc tam, kad pulksteņa pārtraukums tiek aktivizēts, norādot, ka ir pienācis laiks nosūtīt nākamo bitu konfigurāciju uz maiņu reģistriem, šī informācija tiek nolasīta no pašreizējā lasīšanas bufera. Tādā veidā buferī, kas varētu tikt nolasīts pulksteņa pārtraukšanas laikā, nekad netiek rakstīts, kas varētu sabojāt maiņu reģistriem nosūtīto informāciju.

Pārējā vadītāja projektēšana bija samērā vienkāršs objektorientēta dizaina gadījums. Piemēram, es izveidoju objektu, lai pārvaldītu nobīdes reģistra bitu attēlu jebkurā ekrāna stāvoklī. Iekapsulējot kodu, kas attiecas uz bitu attēlu pārvaldību, iepriekšminētās dvīņu buferu pieejas izveidošana pati par sevi bija vienkāršs uzdevums. Bet es nerakstīju šo pamācību, lai paaugstinātu objektorientētā dizaina tikumus. Citi dizaina elementi ietver glifa un RGB attēla jēdzienu. Glifs ir pamata attēla konstrukcija, kurai nav iedzimtas krāsu informācijas. To var uzskatīt par melnbaltu attēlu. Kad Glifs tiek piesaistīts LED ekrānam, tiek sniegta informācija par krāsām, lai norādītu, kā vajadzētu iekrāsot "baltos" pikseļus. RGB attēls ir attēls, kurā katram pikselim ir sava krāsu informācija.

Es iesaku jums pārskatīt Arduino skices piemērus un draivera galvenes dokumentāciju, lai iepazītos ar to, kā izmantot draiveri, lai izveidotu attēlus un animācijas RGB LED matricā.

4. solis: LED dubultattēls

LED spoku veidošana
LED spoku veidošana
LED spoku veidošana
LED spoku veidošana

LED matricā "dubultošanās" ir LED matricas parādība, kas kvēlo, kad tas nav vēlams, parasti tas ir ļoti samazināts līmenis. Mans sākotnējais aparatūras dizains bija jutīgs pret dubultošanos, īpaši pēdējā rindā. Iemesls tam ir divas lietas: tranzistori nekavējoties neizslēdzas un parazītu kapacitāte RGB gaismas diodēs.

Skenējot rindas, tāpēc, ka tranzistori neizslēdzas uzreiz, skenēšanas cikla iepriekšējā rinda joprojām ir daļēji barota, kad tiek ieslēgta nākamā rinda. Ja konkrētā kolonna, kas bija izslēgta iepriekšējā rindā, tiek atkal ieslēgta, kad tiek ieslēgta jaunā rinda, šīs kolonnas gaismas diode iepriekšējā rindā uz brīdi iedegsies, kamēr iepriekšējās rindas pārslēgšanas tranzistors vēl nav pagriezts izslēgts. Tas, kas izraisa tranzistora ievērojamu laiku, lai izslēgtu, ir piesātinājums tranzistora pamatnē. Tas izraisa tranzistora kolektora-emitera ceļa turpināšanu, kad strāva tiek noņemta no pamatnes, vismaz līdz piesātinājuma izkliedēšanai. Ņemot vērā, ka mūsu multipleksēšanas atjaunināšanas cikla dēļ rindas tiek mērķtiecīgi ieslēgtas uz laiku, ko mēra mikrosekundēs, laiks, ko iepriekšējās rindas piesātinātais tranzistors saglabā vadītspēju, var būt ievērojama daļa no tā. Tā rezultātā jūsu acs var uztvert ļoti maz laika, kad tiek ieslēgta iepriekšējās rindas gaismas diode.

Lai atrisinātu tranzistora piesātinājuma problēmu, starp pamatni un kolektoru tranzistoram var pievienot Schottky diode, lai radītu nelielu pretestību pamatnei, kad tranzistors ir ieslēgts, neļaujot tranzistoram piesātināties. Tas savukārt izraisīs tranzistora ātrāku izslēgšanos, kad no pamatnes tiek noņemta strāva. Detalizētu šī efekta skaidrojumu skatiet šajā rakstā. Kā redzat šajā sadaļā redzamajā attēlā, bez diodes dubultošanās ir diezgan pamanāma, taču diodes pievienošana ķēdei katrai rindai ievērojami noņem dubultošanos.

RGB gaismas diodes ir jutīgas pret citu parādību, ko sauc par parazītu kapacitāti. Galvenais iemesls tam ir fakts, ka katrai no trim krāsu gaismas diodēm RGB LED blokā ir atšķirīgs spriegums uz priekšu. Šī sprieguma atšķirība uz priekšu var izraisīt elektriskās kapacitātes ietekmi starp katru atsevišķo LED krāsu. Tā kā LED blokā, kad tas tiek darbināts, tiek uzkrāts elektriskais lādiņš, tad, atvienojot strāvu, ir jāizlādē parazitārā kapacitāte. Ja šī LED kolonna citādi ir ieslēgta citas rindas barošanai, parazītu lādiņš izlādējas caur šo kolonnu LED un izraisīs īsu mirdzumu. Šis efekts ir labi izskaidrots šajā rakstā. Risinājums ir pievienot izlādes ceļu šim parazītiskajam lādiņam, nevis caur pašu gaismas diodi, un pēc tam dot gaismas diodei laiku izlādēties, pirms kolonna atkal tiek darbināta. Manā aparatūras dizainā tas tiek panākts, katras rindas elektropārvades līnijai pievienojot rezistoru, kas savieno spēku ar zemi. Tas radīs vairāk strāvas, kad rinda tiek darbināta, bet nodrošina parazītu kapacitātes izlādes ceļu, ja rinda nav barota.

Tomēr ir vērts atzīmēt, ka praksē es uzskatu, ka parazītu kapacitātes ietekme ir tikko pamanāma (ja jūs to meklējat, jūs to varat atrast), un tāpēc es uzskatu, ka šī papildu rezistora pievienošana nav obligāta. Piesātināto tranzistoru palēninājuma laika ietekme ir daudz spēcīgāka un pamanāmāka. Tomēr, pārbaudot trīs šajā sadaļā sniegtos fotoattēlus, jūs varat redzēt, ka rezistori pilnībā novērš jebkādu dubultošanos, kas joprojām notiek pēc lēnā tranzistora izslēgšanas laika.

5. darbība: galīgā ražošana un nākamās darbības

Image
Image

Šī projekta pēdējais posms bija man izveidot iespiedshēmas plati (PCB). Lai izveidotu savu PCB, es izmantoju atvērtā pirmkoda programmu Fritzing. Lai gan bija daudz atkārtojamu uzdevumu, kas jāizpilda, lai izkārtotu 100 gaismas diodes uz 10x10 plates, es patiesībā atklāju, ka šī projekta fāze ir dīvaini apmierinoša. Katra elektriskā ceļa izkārtojuma izdomāšana bija kā mīkla, un šīs mīklas atrisināšana radīja sasnieguma sajūtu. Tā kā es neesmu gatavs shēmas plates ražošanai, es izmantoju vienu no daudzajiem tiešsaistes resursiem, kas veic nelielas pielāgotas PCB darbības. Detaļu lodēšana kopā bija diezgan vienkārša, jo mans dizains izmantoja visas caurumu detaļas.

Rakstot šo pamācību, man ir šādi plāni saviem RGB LED matricas projektiem:

  1. Turpiniet uzlabot draiveri API slānī, lai programmētājam nodrošinātu augstāka līmeņa funkcionalitāti, jo īpaši teksta ritināšanu.
  2. Izveidojiet lielākus matricas dizainus, piemēram, 16x16 vai pat 16x32.
  3. Izpētiet, kā rindas jaudas pārslēgšanai izmantot MOSFET, nevis BJT
  4. Izpētiet, izmantojot kolonnu pārslēgšanai DM13A kā pastāvīgas strāvas draiverus, nevis 74HC595
  5. Izveidojiet draiverus citām mikro vadības platformām, piemēram, Teensy, ODROID C2 vai Raspberry Pi.

Ņemiet vērā, ka gan aparatūras dizains, gan draiveris ir atbrīvots saskaņā ar GPL v3 atvērtā pirmkoda licenci šajā GitHub krātuvē. Turklāt, lai gan PCB ražotāji manu PCB dizainu veic “nelielos daudzumos”, es tomēr saņemu daudz vairāk, nekā man personīgi nepieciešams. Tāpēc es savā vietnē šeit pārdodu pilnus komplektus dažādiem RGB LED matricu dizainiem (PCB un visas detaļas).

Ieteicams: