Turinys:

RGB LED matrica: 5 žingsniai
RGB LED matrica: 5 žingsniai

Video: RGB LED matrica: 5 žingsniai

Video: RGB LED matrica: 5 žingsniai
Video: Подключаем светодиодные матрицы к Arduino Mega и Raspberry Pi. Железки Амперки 2024, Liepa
Anonim
Image
Image
Techninės įrangos dizainas
Techninės įrangos dizainas

Ieškokite „Instructable“ir rasite daug LED matricos projektų. Nė vienas iš jų nebuvo toks, kokio norėjau, ty ištirti techninės ir programinės įrangos kūrimo sąveiką, kad būtų galima ką nors pagaminti, ir galutinį produktą pagaminti tvarkingoje PCB su tvarkykle, kurią norėčiau atkreipti į „LED ekraną“, naudojant aukšto lygio konstrukcijas (pvz., brėžti liniją, o ne nustatyti konkrečius pikselius). Ši dalis man buvo svarbi, nes daugelis LED matricos tvarkyklių yra pliki kaulai ir nesuteikia daug galimybių programiškai sukurti vaizdą ar animaciją. Tai nereiškia, kad negalite kurti vaizdų ir animacijų su kitais tvarkyklėmis, o tik tai, kad turėsite atlikti daugiau pasikartojančių darbų iš vieno projekto į kitą.

Taigi ėmiausi įgyvendinti savo viziją. Pirmasis žingsnis buvo suprojektuoti aparatūrą. Tai turbūt buvo pats sunkiausias dalykas man, nes mano fonas yra daugiau programinės įrangos. Vėlgi, buvo daug iš anksto iškeptų dizainų, ir aš tikrai juos panaudojau įkvėpimui, tačiau norėjau išmokti darydamas, todėl ant duonos lentos sukūriau 4x4 matricos prototipą. Per šį procesą daug išmokau, nes pirmosios mano kartojimai neveikė. Tačiau aš sukūriau aparatūros projektavimą, kuris veikė, o tai savo ruožtu leido man pradėti kurti tvarkyklę.

Aš pasirinkau „Arduino“kaip savo vairuotojo platformą, nes ji yra plačiai prieinama ir turi daug nuorodų internete. Nors karjeros patirtis leido man lengviau pasiekti darbinę vairuotojo versiją nei aparatinė įranga, vis tiek buvo daug pakartojimų, kol optimizavau „ATMega“mikrovaldiklio tvarkyklės našumą ir sukūriau patinkančią programavimo API.

Ši instrukcija dokumentuoja mano projekto dizainą ir kai kuriuos pagrindinius mokymus. Daugiau informacijos apie šį projektą rasite mano svetainėje čia, įskaitant visus komplektus, kuriuos galite įsigyti, kad sukurtumėte savo RGB LED matricą.

1 žingsnis: Aparatūros projektavimas

Pagrindinis mano aparatūros dizaino tikslas buvo sukurti daugybę RGB šviesos diodų, kuriuos galėčiau programuoti, tačiau taip pat nenorėjau išleisti daug pinigų. Aš nusprendžiau naudoti 74HC595 poslinkių registrus šviesos diodams valdyti. Kad būtų sumažintas reikalingas pamainų registrų skaičius, aš suskirstiau RGB šviesos diodus į matricos išdėstymą, kur bendrieji anodai buvo susieti eilėmis, o raudoni, žali ir mėlyni katodo laidai - stulpeliais. 4x4 matricos schema atrodė kaip pridedama schema.

Vienas dalykas, kurį iškart pastebėsite, yra tai, kad atsižvelgiant į matricos grandinę, yra keletas LED apšvietimo konfigūracijų, kurių negalima atlikti, kai visi norimi šviesos diodai yra įjungti vienu metu. Pavyzdžiui, matrica negali vienu metu apšviesti dviejų šviesos diodų, kurie yra įstrižai vienas nuo kito, nes maitinant tiek eilutes, tiek stulpelius, du priešingi šviesos diodai užsidegs statmenoje norimų šviesos diodų įstrižainei. Norėdami tai išspręsti, mes naudosime multipleksavimą, kad nuskaitytume kiekvieną eilutę. Žiniatinklyje yra daug išteklių, apimančių multipleksavimo techniką, nesistengsiu jų čia atkartoti.

Kadangi aš naudoju įprastus anodo šviesos diodus, tai reiškia, kad eilutės teikia teigiamą galią, o kolonos nusileidžia į žemę. Geros naujienos yra tai, kad 74HC595 poslinkių registrai gali tiek tiekti, tiek nuskandinti energiją, tačiau bloga žinia yra ta, kad jie turi ribą, kiek energijos jie gali gauti ar nuskandinti. Atskirų 74HC595 kaiščių maksimali srovė yra 70 mA, tačiau geriausia laikyti mažiau nei 20 mA. Kiekvienos mūsų RGB šviesos diodų spalvos turi apie 20 mA. Tai reiškia, kad 74HC595 negali tiesiogiai maitinti visos šviesos diodų eilės, jei noriu juos įjungti.

Taigi, užuot tiesiogiai maitindamas eilutę, „74HC595“kiekvienoje eilutėje valdys tranzistorių, o tranzistorius įjungs arba išjungs srovę, maitinančią eilutę. Kadangi konstrukcijoje naudojami bendri anodo šviesos diodai, perjungimo tranzistorius bus PNP. Jei naudotume įprastą katodo šviesos diodą, perjungimo tranzistorius būtų NPN. Atminkite, kad naudojant PNP tranzistorių eilės valdymui, poslinkio registro nustatymas jį įjungti dabar tampa žemas, nes PNP tranzistoriui reikia įjungti neigiamą įtampą tarp emiterio ir pagrindo, o tai leis teigiamai srovei tekėti į eilė.

Kitas dalykas, kurį reikia apsvarstyti, yra norimas pamainų registrų bitų išdėstymas. Tai yra, tarp pamainų registrų, kurie bitai valdo matricos eilutes ar stulpelius. Dizainas, kurį siunčiau, yra tas, kur pirmasis bitas arba „reikšmingiausias bitas“, išsiųstas į daisy grandinės poslinkių registrus, valdo raudonų šviesos diodų stulpelį, antrasis - pirmojo stulpelio žalią elementą, trečiasis - pirmojo stulpelio mėlynas elementas, ketvirtasis bitas valdo raudoną antrojo stulpelio elementą,… šis modelis kartojamas stulpeliuose iš kairės į dešinę. Tada kitas siunčiamas bitas valdo paskutinę arba apatinę eilutę, kita - nuo antros iki paskutinės eilutės,… tai kartojama, kol paskutinis išsiųstas bitas arba „mažiausiai reikšmingas bitas“valdo pirmąją arba viršutinę matricos eilutę.

Galiausiai turėjau nustatyti, kokius rezistorius naudosiu kiekvienam RGB šviesos diodo šviesos diodui. Nors jūs galite naudoti standartinę formulę, kuri sujungia priekinę įtampą ir norimą srovę, kad apskaičiuotumėte reikiamą rezistorių, aš pastebėjau, kad nustačius kiekvieno šviesos diodo srovę iki 20 miliamperų, buvo įgauta beveik balta spalva, kai buvo įjungti visi raudoni, žali ir mėlyni šviesos diodai. Taigi aš pradėjau domėtis. Per daug raudonos spalvos baltoje reiškė, kad padidėjo raudonojo šviesos diodo rezistoriaus omai, kad sumažėtų srovė. Kartojau skirtingų omų rezistorių keitimą, kol radau derinį, kuris išgavo baltą spalvą, kuri, mano manymu, buvo teisinga. Galutinis derinys buvo 180 Ω raudonam šviesos diodui, 220 Ω žaliam šviesos diodui ir 100 Ω mėlynam šviesos diodui.

2 žingsnis: Aparatūros kūrimas - „Breadboard“

Techninės įrangos konstrukcija - „Breadboard“
Techninės įrangos konstrukcija - „Breadboard“
Techninės įrangos konstrukcija - „Breadboard“
Techninės įrangos konstrukcija - „Breadboard“

Pirmasis aparatūros konstruktoriaus etapas buvo duonos įlaipinimas. Čia aš padariau 4x4 matricą su RGB šviesos diodais. Šiai matricai valdyti reikės 16 bitų, 12 - RGB stulpeliams ir 4 - kiekvienai eilutei. Visa tai gali tvarkyti du 74HC595 pamainų registrai. Iš pradžių ištyriau ir suprojektavau grandinę, kuri, mano manymu, veiks, tada pastatiau ją ant duonos lentos.

Tikriausiai didžiausias duonos lentos kūrimo iššūkis buvo valdyti visus laidus. Aš pasiėmiau iš anksto paruoštą laidų komplektą duonos lentoms, bet tada tai buvo šiek tiek sudėtinga. Triukas, kuris man pasirodė naudingas, buvo sukurti „prievadą“prisijungti prie „Arduino“plokštės. Tai yra, užuot prijungę „Arduino“smeigtukus tiesiai prie įvairių „IC“kaiščių ant duonos lentos, skirkite kelias eilutes ant lentos, kad tai būtų „Arduino“jungties taškas, tada prijunkite atitinkamas ID kaiščius prie tų eilučių. Šiam projektui jums reikia tik penkių jungčių prie „Arduino“: +5 V, žemės, duomenų, laikrodžio ir skląsčio.

Kai buvo padaryta duonos lentos konstrukcija, turėjau ją išbandyti. Tačiau neturėdamas tam tikro tvarkyklės, kuri siunčia teisingus signalus į pamainų registrus, negalėjau patikrinti, ar aparatūros išdėstymas veikia.

3 žingsnis: tvarkyklės programinės įrangos projektavimas

Image
Image

Atsižvelgiant į mano karjeros patirtį kuriant programinę įrangą, tai buvo ta projekto dalis, kurią turbūt aiškiausiai supratau. Aš apklausiau daugelį kitų „Arduino“pagrįstų LED matricos tvarkyklių. Nors tikrai yra gerų tvarkyklių, nė viena iš jų neturėjo tokio dizaino, kokio norėjau. Mano vairuotojo projektavimo tikslai buvo šie:

  • Pateikite aukšto lygio API, kad galėtumėte programiškai kurti vaizdus ir animaciją. Dauguma mano matytų vairuotojų buvo labiau orientuoti į sunkiai užkoduotus vaizdus. Be to, kadangi esu C ++ programuotojas pagal profesiją, norėjau panaudoti gerą į objektą orientuotą dizainą, kad įgyvendinčiau ir valdyčiau piešimo prie LED matricos veiklą.
  • Norėdami valdyti vaizdą ekrane, naudokite dvigubo buferio metodą. Vienas buferis yra programiškai įtraukiamas, o kitas - matricos pikselių būsena bet kuriuo momentu. Šio metodo pranašumas yra tas, kad tarp multipleksavimo atnaujinimo ciklų nereikia visiškai pateikti kito ekrano kadro atnaujinimo.
  • Naudokite PWM, kad leistumėte daugiau nei septynias primityvias spalvas, kurias RGB gali perteikti paprastais raudonos, žalios ir mėlynos spalvos elementų deriniais.
  • Parašykite tvarkyklę taip, kad ji „tiesiog veiktų“su skirtingo dydžio RGB LED matricomis, kurios atitinka mano bendrą matricos projektavimo metodą. Atminkite, kad nors mano aparatinės įrangos konstrukcijoje naudojami 74HC595 pamainų registrai, tikiuosi, kad mano vairuotojas dirbs su bet kokiu pamainos registro stiliaus įjungimo/išjungimo mechanizmu, kuris yra išdėstytas naudojant panašų bitų išdėstymą, kaip ir mano aparatūros dizainas. Pavyzdžiui, tikiuosi, kad mano vairuotojas dirbs su aparatinės įrangos dizainu, kuris stulpeliams valdyti naudojo DM13A lustus, o eilėms valdyti - 74HC595 lustą.

Jei norite iš karto pažvelgti į vairuotojo kodą, jį galite rasti „GitHub“čia.

Pirmoji mano vairuotojo iteracija buvo šiek tiek mokymosi kreivė apie „Arduino“platformos galimybes. Akivaizdžiausias apribojimas yra RAM, kuri yra 2K baitų „Arduino Uno“ir „Nano“. Dažnai nerekomenduojama naudoti C ++ objektų dėl atminties pridėtinių objektų. Tačiau aš jaučiau, kad jei viskas bus padaryta teisingai, C ++ objektų nauda viršijo jų kainą (RAM).

Antrasis pagrindinis iššūkis buvo išsiaiškinti, kaip įgyvendinti impulsų pločio moduliaciją per poslinkių registrus, kad galėčiau sukurti daugiau nei septynias primityvias RGB šviesos diodų spalvas. Daugelį metų programavęs „Linux“platformose, buvau įpratęs naudoti tokias konstrukcijas kaip siūlai, kad valdyčiau procesus, kuriems reikia nuoseklaus laiko. Pamainų registro atnaujinimo operacijos laikas yra gana svarbus, kai sukuriamas LED matricos, naudojančios multipleksavimą, tvarkyklė. Priežastis yra ta, kad nors multipleksavimas vyksta taip greitai, kad jūsų akys nemato, kaip atskiri šviesos diodai mirksi ir įjungiami, jūsų akys gali pastebėti viso bendro šviesos diodų įjungimo laiko skirtumus. Jei viena šviesos diodų eilutė nuolat dega ilgiau nei kitos, multipleksavimo metu ji atrodys šviesesnė. Tai gali lemti netolygų matricos ryškumą arba periodinį visos matricos švytėjimą (tai atsitinka, kai vienas atnaujinimo ciklas užtrunka ilgiau nei kiti).

Kadangi man reikėjo nuoseklaus laiko nustatymo mechanizmo, kad pakeitimų registro atnaujinimai būtų sutikimo, tačiau „Arduino“oficialiai nepalaiko gijos, turėjau sukurti savo į siūlus panašų mechanizmą. Pirmoji mano iteracija buvo tiesiog sukurti ciklo laikmatį, kuris priklausytų nuo „Arduino loop“() funkcijos ir suaktyvintų veiksmą, kai praėjus tam tikram laikui praėjo nuo paskutinio veiksmo. Tai yra „kooperatinio daugiafunkcinio darbo“forma. Skamba gerai, tačiau praktikoje tai pasirodė nenuoseklu, kai šaudymo greitis buvo matuojamas mikrosekundėmis. To priežastis yra ta, kad jei aš veikiau du iš šių ciklinių laikmačių, vienas jų veiksmas dažnai užtrukdavo pakankamai ilgai, kad antrasis veiksmas būtų suaktyvintas vėliau nei norėta.

Radau, kad šios problemos sprendimas yra naudoti „Arduino“laikrodžio pertraukimo mechanizmą. Šis mechanizmas leidžia paleisti nedidelį kodo bitą labai pastoviais intervalais. Taigi sukūriau tvarkyklės kodą aplink dizaino elementą, naudojant laikrodžio pertraukimą, kad būtų suaktyvintas kodas, skirtas matricos poslinkio registrams siųsti kitą multipleksinio ciklo atnaujinimą. Norėdami tai padaryti ir leisti atnaujinti ekrano vaizdą, kad netrukdytų aktyviam iškėlimui į pamainų registrus (tai, ką mes pavadintume „lenktynių sąlyga“), aš naudoju metodą, pagal kurį turėčiau du buferius pamainos registro bitams, vieną rašymui ir vienas skaitymui. Kai vartotojas atnaujina matricos vaizdą, šios operacijos atliekamos įrašymo buferyje. Kai šios operacijos bus baigtos, pertraukimai bus laikinai sustabdyti (tai reiškia, kad laikrodžio pertraukimas negali suveikti), o rašymo buferis pakeičiamas ankstesniu skaitymo buferiu ir tai nėra naujas skaitymo buferis, tada interpretacijos vėl įjungiamos. Tada, kai laikrodžio pertraukimas suaktyvina, nurodydamas, kad laikas siųsti kitą bitų konfigūraciją į pamainų registrus, ta informacija nuskaitoma iš dabartinio skaitymo buferio. Tokiu būdu į buferį, kuris šiuo metu gali būti nuskaitytas laikrodžio pertraukos metu, niekada neįvyksta rašymas, kuris gali sugadinti pamainų registrams siunčiamą informaciją.

Likusio vairuotojo projektavimas buvo gana paprastas objektinio dizaino atvejis. Pavyzdžiui, sukūriau objektą, skirtą valdyti bet kurios ekrano būsenos poslinkio registro bitų vaizdą. Apibendrinant kodą, susijusį su bitų vaizdo valdymu, minėto dvigubo buferio metodo sukūrimas pats savaime buvo paprastas. Bet aš ne parašiau šią instrukciją, kad išaukštinčiau į objektą orientuoto dizaino dorybes. Kitas dizaino elementas apima „Glyph“ir „RGB Image“koncepciją. Glifas yra pagrindinė vaizdo konstrukcija, neturinti įgimtos spalvos informacijos. Galite tai įsivaizduoti kaip nespalvotą vaizdą. Kai Glyph pritraukiamas prie LED ekrano, pateikiama spalvų informacija, nurodanti, kaip turėtų būti nuspalvinti „balti“pikseliai. RGB vaizdas yra vaizdas, kuriame kiekvienas pikselis turi savo spalvų informaciją.

Raginu jus peržiūrėti „Arduino“eskizų pavyzdžius ir peržiūrėti tvarkyklės antraštės dokumentus, kad sužinotumėte, kaip naudojant tvarkyklę kurti vaizdus ir animacijas RGB LED matricoje.

4 žingsnis: „LED Ghosting“

LED vaiduoklis
LED vaiduoklis
LED vaiduoklis
LED vaiduoklis

Šviesos diodų matricoje „vaiduoklis“yra reiškinys, kai matricos šviesos diodas šviečia, kai to nenorima, paprastai labai sumažėjusio lygio. Mano originalus aparatūros dizainas buvo jautrus vaizdams, ypač paskutinėje eilutėje. To priežastis yra du dalykai: tranzistoriai iš karto neišsijungia ir parazitinė talpa RGB šviesos dioduose.

Kai mes nuskaitome eilutes, dėl to, kad tranzistoriai ne iš karto išsijungia, ankstesnė nuskaitymo ciklo eilutė vis tiek yra iš dalies maitinama, kai įjungiama kita eilutė. Jei tam tikras stulpelis, kuris buvo išjungtas ankstesnėje eilutėje, vėl įsijungia, kai įjungiama nauja eilutė, to stulpelio šviesos diodas ankstesnėje eilutėje trumpam šviečia, kol ankstesnės eilutės perjungimo tranzistorius vis dar teka išjungtas. Dėl to tranzistoriui išjungti reikia daug laiko, tai yra prisotinimas tranzistoriaus bazėje. Dėl to tranzistoriaus kolektoriaus ir emiterio kelias toliau eina, kai srovė pašalinama iš pagrindo, bent jau tol, kol sotumas išsisklaido. Atsižvelgiant į tai, kad mūsų multipleksavimo atnaujinimo ciklas sukelia eilučių sąmoningą įjungimą tam tikrą laiką, matuojamą mikrosekundėmis, laikas, kurį ankstesnis eilutės prisotintas tranzistorius išlieka laidus, gali būti pastebima to dalis. Dėl to jūsų akis gali suvokti, kad labai mažai laiko įjungiamas ankstesnės eilės šviesos diodas.

Norėdami išspręsti tranzistoriaus prisotinimo problemą, prie tranzistoriaus tarp pagrindo ir kolektoriaus galima pridėti Schottky diodą, kad įjungus tranzistorių bazė sukeltų šiek tiek atgalinės srovės, kad tranzistorius nebūtų prisotintas. Dėl to tranzistorius greičiau išsijungs, kai srovė bus pašalinta iš pagrindo. Šiame straipsnyje rasite išsamų šio efekto paaiškinimą. Kaip matote iš šio skyriaus paveikslėlio, be diodo vaiduoklis yra gana pastebimas, tačiau diodo pridėjimas prie grandinės kiekvienoje eilutėje žymiai pašalina vaizdą.

RGB šviesos diodai yra jautrūs kitam reiškiniui, vadinamam parazitine talpa. Pagrindinė to priežastis yra tai, kad kiekvienas iš trijų RGB šviesos diodų bloko spalvų šviesos diodų turi skirtingą priekinę įtampą. Šis priekinės įtampos skirtumas gali sukelti elektros talpos poveikį tarp kiekvienos atskiros šviesos diodų spalvos. Kadangi maitinant LED įtaisą susidaro elektros krūvis, atjungus maitinimą, reikia iškrauti parazitinę talpą. Jei šis šviesos diodų stulpelis yra įjungtas kitai eilutei įjungti, parazitinis krūvis išsikrauna per tą stulpelių šviesos diodą ir trumpai švyti. Šis poveikis puikiai paaiškintas šiame straipsnyje. Sprendimas yra pridėti šio parazitinio krūvio iškrovimo kelią kitaip nei per patį šviesos diodą ir tada suteikti šviesos diodui laiko išsikrauti, kol kolonėlė vėl bus įjungta. Mano aparatūros konstrukcijoje tai pasiekiama pridedant rezistorių prie kiekvienos eilės elektros linijos, jungiančios stiprumą su žeme. Tai sukels daugiau srovės, kai eilutė bus maitinama, tačiau suteiks parazitinės talpos iškrovimo kelią, kai eilutė nebus maitinama.

Tačiau verta paminėti, kad praktiškai manau, kad parazitinės talpos poveikis yra vos pastebimas (jei jo ieškosite, galite jį rasti), todėl manau, kad šio papildomo rezistoriaus pridėjimas yra neprivalomas. Prisotintų tranzistorių sulėtėjimo laikas yra daug stipresnis ir pastebimas. Nepaisant to, jei apžiūrėsite tris šiame skyriuje pateiktas nuotraukas, pamatysite, kad rezistoriai visiškai pašalina bet kokius veidrodžius, kurie vis dar pasitaiko ilgiau nei lėto tranzistoriaus išjungimo laikas.

5 žingsnis: galutinė gamyba ir kiti veiksmai

Image
Image

Paskutinis šio projekto etapas buvo man sukurti spausdintinę plokštę (PCB). Savo PCB projektavimui naudojau atvirojo kodo programą „Fritzing“. Nors buvo atlikta daug pasikartojančių užduočių, kad būtų galima išdėstyti 100 šviesos diodų ant 10x10 plokštės, iš tikrųjų man pasirodė, kad šis projekto etapas keistai patenkintas. Išsiaiškinti, kaip bus išdėstytas kiekvienas elektros kelias, buvo tarsi galvosūkis, o šio galvosūkio sprendimas sukėlė pasiekimų jausmą. Kadangi nesu pasirengęs gaminti plokštes, aš naudojau vieną iš daugelio internetinių išteklių, kuriuose atliekami nedideli pasirinktiniai PCB. Lituoti dalis buvo gana paprasta, nes mano dizainas panaudojo visas skylių dalis.

Rašydamas šią instrukciją, turiu tokius savo RGB LED matricos projektų planus:

  1. Toliau tobulinkite tvarkyklę API sluoksnyje, kad programuotojui būtų suteikta daugiau aukšto lygio funkcijų, ypač teksto slinkimas.
  2. Sukurkite didesnius matricos dizainus, tokius kaip 16x16 ar net 16x32.
  3. Naršykite naudodami MOSFET, o ne BJT, norėdami perjungti maitinimą
  4. Stulpelių perjungimui naudokite DM13A kaip nuolatinės srovės tvarkykles, o ne 74HC595
  5. Sukurkite tvarkykles kitoms mikrovaldymo platformoms, pvz., „Teensy“, „ODROID C2“ar „Raspberry Pi“.

Atminkite, kad tiek „GitHub“saugykloje aparatinės įrangos dizainas, tiek tvarkyklė buvo išleisti pagal GPL v3 atvirojo kodo licenciją. Be to, nors PCB gaminami „nedideli“mano PCB dizaino variantai, aš vis tiek gaunu kur kas daugiau, nei man asmeniškai reikia. Taigi aš parduodu pilnus rinkinius savo įvairiems RGB LED matricos dizainams (PCB ir visos dalys) iš savo svetainės čia.

Rekomenduojamas: