Sisällysluettelo:

RGB -LED -matriisi: 5 vaihetta
RGB -LED -matriisi: 5 vaihetta

Video: RGB -LED -matriisi: 5 vaihetta

Video: RGB -LED -matriisi: 5 vaihetta
Video: САМОЕ НЕУДАЧНОЕ АСМР 😅 MOST UNSUCCESSFUL ASMR 2024, Heinäkuu
Anonim
Image
Image
Laitteiston suunnittelu
Laitteiston suunnittelu

Etsi Instructable, ja löydät monia LED -matriisiprojekteja. Yksikään niistä ei ollut aivan sitä, mitä halusin, eli tutkia laitteisto- ja ohjelmistosuunnittelun vuorovaikutusta, jotta saataisiin aikaan jotain, ja valmistaa lopputuote siistissä piirilevyssä ohjaimella, jonka haluan vetää "LED-näyttöön" korkean tason avulla rakenteet (esim. viivan piirtäminen tiettyjen pikselien asettamisen sijaan). Tämä osa oli minulle tärkeä, koska monet LED -matriisiohjaimet ovat paljaita luita eivätkä tarjoa paljon kuvan tai animaation ohjelmallista luomista. Tämä ei tarkoita sitä, ettet voi luoda kuvia ja animaatioita muiden ohjaimien kanssa, vaan sinun pitäisi tehdä enemmän toistuvaa työtä projektista toiseen.

Lähdin siis toteuttamaan visiotani. Ensimmäinen askel oli laitteiston suunnittelu. Tämä oli luultavasti haastavin minulle, koska taustani on enemmän ohjelmistoja. Jälleen oli monia esipaistettuja malleja, ja käytin niitä varmasti inspiraationa, mutta halusin oppia tekemällä, joten prototyyppasin 4x4-matriisin leipälevylle. Opin paljon tämän prosessin kautta, koska ensimmäiset toistoni eivät toimineet. Mutta tein laitteistosuunnittelun, joka toimi, mikä puolestaan antoi minulle mahdollisuuden kehittää ohjainta.

Valitsin Arduinon ajurialustaksi, koska se on laajalti saatavilla ja sisältää runsaasti viitteitä verkossa. Vaikka urakokemus antoi minulle mahdollisuuden päästä kuljettajan toimivaan versioon laitteistotyötäni oivaltavammin, oli silti paljon toistoja, kun optimoin ohjaimen suorituskyvyn ATMega -mikro -ohjaimelle ja kehitin ohjelmointirajapinnan, josta pidin.

Tämä ohjekirja dokumentoi projektini suunnittelun ja joitakin tärkeimpiä oppeja. Lisätietoja tästä projektista löytyy verkkosivustoltani täältä, mukaan lukien täydelliset sarjat, joita voit ostaa oman RGB -LED -matriisin rakentamiseksi.

Vaihe 1: Laitteiston suunnittelu

Laitteistossuunnitteluni ensisijainen tavoite oli luoda joukko RGB -LED -valoja, joita voisin ohjelmoida, mutta en myöskään halunnut käyttää paljon rahaa. Lähestymistapani oli käyttää 74HC595 -siirtorekisteriä LEDien ohjaamiseen. Tarvittavien siirtorekisterien määrän minimoimiseksi järjestin RGB -LEDit matriisiasetteluksi, jossa yhteiset anodit sidottiin riviin ja punaiset, vihreät ja siniset katodijohdot sidottiin sarakkeisiin. 4x4 -matriisin kytkentäkaavio näytti liitteenä olevasta piirikaaviosta.

Yksi asia, jonka huomaat heti, on se, että matriisipiirin vuoksi on olemassa joitain LED -valaistuskokoonpanoja, joita ei voida tehdä kaikkien haluttujen LED -valojen ollessa päällä samanaikaisesti. Esimerkiksi matriisi ei voi sytyttää samanaikaisesti kahta diagonaalista LEDiä toisistaan, koska sekä rivien että sarakkeiden käyttö saa kaksi vastakkaista LEDiä syttymään kohtisuoraan haluttuihin LEDeihin nähden. Tämän kiertämiseksi käytämme multipleksointia jokaisen rivin läpi. Verkossa on paljon resursseja, jotka kattavat multipleksointitekniikan, en aio yrittää kopioida niitä täällä.

Koska käytän tavallisia anodivaloja, rivit antavat positiivista voimaa ja pylväät vajoavat maahan. Hyvä uutinen on, että 74HC595 -siirtorekisterit voivat sekä syöttää että upottaa virtaa, mutta huono uutinen on, että niillä on raja, kuinka paljon tehoa ne voivat saada tai upottaa. 74HC595: n yksittäisten nastojen maksimivirta on 70 mA, mutta on parempi pitää alle 20 mA. RGB -LED -valojemme yksittäiset värit kuluttavat noin 20 mA. Tämä tarkoittaa sitä, että 74HC595 ei voi suoraan virrata koko LED -riviä, jos haluan kytkeä ne kaikki päälle.

Joten sen sijaan, että virtalähde toimisi suoraan, 74HC595 ajaa sen sijaan transistoria kullekin riville, ja transistori kytkee päälle tai pois päältä rivin virran. Koska suunnittelussa käytetään yleisiä anodivaloja, kytkentätransistori on PNP. Jos käyttäisimme yhteistä katodi -LEDiä, kytkentätransistori olisi NPN. Huomaa, että kun käytät PNP -transistoria rivin ajamiseen, siirtorekisterin asetus sen kytkemiseksi päälle tulee nyt alhaiseksi, koska PNP -transistori tarvitsee negatiivisen jännitteen lähettimen ja tukiaseman välillä, mikä mahdollistaa positiivisen virran virtaamisen rivi.

Toinen huomioitava asia on siirtorekisterien haluttu bittiasettelu. Toisin sanoen siirtorekisterien joukossa bitit ohjaavat matriisin rivejä tai sarakkeita. Lähettämäni malli on se, missä ensimmäinen bitti tai "merkittävin bitti", lähetetty ketjutettuun siirtorekisteriin, ohjaa LED -pylvästä punaista elementtiä, toinen bitti ohjaa ensimmäisen sarakkeen vihreää elementtiä, kolmas bitti ohjaa ensimmäisen sarakkeen sininen elementti, neljäs bitti ohjaa toisen sarakkeen punaista elementtiä,… tämä kuvio toistetaan sarakkeissa vasemmalta oikealle. Sitten seuraava lähetetty bitti ohjaa viimeistä tai alinta riviä, seuraava toinen sekunnista viimeiseen riviin,… tämä toistuu, kunnes viimeinen lähetetty bitti eli "vähiten merkitsevä bitti" ohjaa matriisin ensimmäistä tai ylintä riviä.

Lopuksi minun oli määritettävä, mitä vastuksia käytän kullekin RGB -LEDin LEDille. Vaikka tarvittavan vastuksen laskemiseen voit käyttää standardikaavaa, joka yhdistää eteenpäin jännitteen ja halutun virran, huomasin, että kunkin LEDin virran asettaminen 20 milliampeeriin johti luonnonvalkoiseen väriin, kun kaikki punaiset, vihreät ja siniset LEDit olivat päällä. Niinpä aloin silmällä sitä. Liian paljon punaista valkoisessa tarkoitti punaisen LED -vastuksen ohmin lisäämistä virran vähentämiseksi. Vaihdoin toistuvasti eri ohmien vastuksia, kunnes löysin yhdistelmän, joka tuotti valkoisen värin, joka tuntui oikealta. Lopullinen yhdistelmä oli 180 Ω punaisella LEDillä, 220 Ω vihreällä LEDillä ja 100 Ω sinisellä LEDillä.

Vaihe 2: Laitteiston rakentaminen - Breadboard

Laitteiston rakentaminen - Breadboard
Laitteiston rakentaminen - Breadboard
Laitteiston rakentaminen - Breadboard
Laitteiston rakentaminen - Breadboard

Laitteistorakentajan ensimmäinen vaihe oli leipälautailu. Tässä tein 4x4 -matriisin RGB -LEDeillä. Tämä matriisi vaatisi 16 bittiä hallittavaksi, 12 RGB -sarakkeisiin ja 4 kullekin riville. Kaksi 74HC595 -siirtorekisteriä pystyy käsittelemään kaiken. Tutkin ja suunnittelin ensin piirin, jonka luulin toimivan, ja rakensin sen sitten leipälevylle.

Luultavasti suurin leipälautan rakentamisen haaste oli kaikkien johtojen hallinta. Otin esivalmistetun langasarjan leipälevyille, mutta tapahtuma silloin oli hieman hankala. Temppu, jonka pidin hyödyllisenä, oli luoda "portti" Arduino -levylle yhdistämistä varten. Toisin sanoen sen sijaan, että liität Arduinon tapit suoraan leipälevyn eri IC -nastoihin, omista muutama rivi leipälaudalla Arduinon liitäntäpisteeksi ja liitä sitten asiaankuuluvat ID -nastat näihin riveihin. Tätä projektia varten tarvitset vain viisi yhteyttä Arduinoon: +5 V, maa, data, kello ja salpa.

Kun leipälevyn rakentaminen oli tehty, minun piti testata sitä. Ilman jonkinlaista ohjainta, joka lähetti oikeat signaalit vuororekisteriin, en kuitenkaan pystynyt testaamaan, toimiiko laitteiston asettelu.

Vaihe 3: Ohjainohjelmiston suunnittelu

Image
Image

Ottaen huomioon oman urakokemukseni ohjelmistokehityksestä, tämä oli osa projektia, josta olin luultavasti selkein tie. Tutkin monia muita Arduino-pohjaisia LED-matriisiohjaimia. Vaikka varmasti on saatavana hyviä ohjaimia, kenelläkään ei ollut sellaista mallia kuin halusin. Kuljettajan suunnittelutavoitteeni olivat:

  • Tarjoa korkean tason sovellusliittymä, jotta voit luoda ohjelmallisesti kuvia ja animaatioita. Useimmat näkemäni kuljettajat keskittyivät enemmän kovakoodattuihin kuviin. Lisäksi koska olen ammatiltani C ++ -ohjelmoija, halusin käyttää hyvää olio -suunnittelua LED -matriisiin piirtämisen toteuttamiseen ja hallintaan.
  • Käytä kaksoispuskuroitua lähestymistapaa hallitaksesi kuvaa näytöllä. Toinen puskuri vedetään ohjelmallisesti, kun taas toinen edustaa matriisipikselien tilaa tiettynä hetkenä. Tämän lähestymistavan etuna on, että sinun ei tarvitse tehdä näyttöä seuraavaan kehyspäivitykseen kokonaan multipleksoinnin päivitysjaksojen välillä.
  • PWM: n avulla voit sallia enemmän kuin seitsemän primitiivistä väriä, joita RGB pystyy tuottamaan punaisen, vihreän ja sinisen elementin yksinkertaisilla yhdistelmillä.
  • Kirjoita ohjain niin, että se "vain toimisi" erikokoisilla RGB -LED -matriiseilla, jotka seurasivat yleistä matriisisuunnittelua. Huomaa, että vaikka laitteistosuunnitteluni käyttää 74HC595 -siirtorekistereitä, odottaisin kuljettajani työskentelevän minkä tahansa vuororekisterityylisen päälle/pois -mekanismin kanssa, joka on järjestetty käyttämällä samanlaista bittiasettelua kuin laitteistosuunnitteluni. Odotin esimerkiksi, että kuljettajani työskentelee laitteistomallilla, joka käytti DM13A -siruja sarakkeiden ohjaamiseen ja 74HC595 -sirua rivien hallintaan.

Jos haluat siirtyä suoraan kuljettajakoodin katseluun, saatat löytää sen GitHubista täältä.

Kuljettajan ensimmäinen iterointi oli hieman oppimiskäyrä Arduino -alustan ominaisuuksista. Ilmeisin rajoitus on RAM, joka on 2K tavua Arduino Unolle ja Nanolle. C ++ -objektien käyttöä tällaisessa tilanteessa ei usein suositella objektien muistin aiheuttamien yleiskustannusten vuoksi. Kuitenkin minusta tuntui, että jos se tehtiin oikein, C ++ -objektien hyöty ylitti niiden kustannukset (RAM -muistissa).

Toinen suuri haaste oli selvittää, kuinka toteuttaa pulssileveysmodulaatio siirtorekisterien kautta, jotta voisin luoda enemmän kuin seitsemän primitiivistä RGB-LEDin väriä. Ohjelmoidessani monta vuotta Linux -alustoilla olin tottunut käyttämään rakenteita, kuten säikeitä, hallitsemaan prosesseja, jotka vaativat tasaista ajoitusta. Vuororekisterin päivitystoiminnan ajoitus on melko kriittinen, kun tehdään ohjain LED -matriisille, joka käyttää multipleksointia. Syynä on se, että vaikka multipleksointi tapahtuu niin nopeasti, että silmäsi eivät näe yksittäisiä LED -valoja vilkkuvan päälle ja pois päältä, silmäsi voivat havaita eroja minkä tahansa LED -valon syttymisajasta. Jos yksi LED -rivi palaa jatkuvasti pidempään kuin muut, se näyttää kirkkaammalta multipleksoinnin aikana. Tämä voi johtaa epätasaiseen kirkkauteen matriisissa tai koko matriisin jaksoittaiseen vilkkumiseen (tämä tapahtuu, kun yksi päivitysjakso kestää kauemmin kuin muut).

Koska tarvitsin johdonmukaista ajoitusmekanismia, jotta muutosrekisterin päivitykset olisivat suostumuksia, mutta Arduino ei muodollisesti tue säiettä, minun täytyi luoda oma langankiertomekanismi. Ensimmäinen iterointini oli yksinkertaisesti luoda silmukka -ajastin, joka riippui Arduino -silmukan () -toiminnosta ja käynnistää toiminnon, kun tietty aika on kulunut toiminnon viimeisestä käynnistä. Tämä on "yhteistoiminnallisen moniajon" muoto. Kuulostaa hyvältä, mutta käytännössä tämä osoittautui epäjohdonmukaiseksi, kun ampumisnopeus mitattiin mikrosekunneissa. Syynä tähän on se, että jos minulla oli kaksi näistä silmukka -ajastimista käynnissä, yksi heidän toiminnoistaan kesti usein riittävän kauan, jotta toinen toiminto laukaisi myöhemmin kuin haluttiin.

Huomasin, että ratkaisu tähän ongelmaan on käyttää Arduinon alkuperäistä kellon keskeytysmekanismia. Tämän mekanismin avulla voit ajaa pienen osan koodista erittäin tasaisin väliajoin. Suunnittelin siis ohjainkoodin suunnitteluelementin ympärille käyttämällä kellon keskeytystä koodin lähettämiseksi matriisin siirtorekisterien lähettämiseksi multipleksisyklin seuraavan päivityksen. Voit tehdä tämän ja sallia päivitykset näytön kuvaan, jotta ne eivät häiritse aktiivista siirtoa vuororekistereihin (jota kutsuttaisimme "kilpailuolosuhteiksi"), käytin lähestymistapaa, jossa minulla oli kaksi puskuria siirtorekisteribiteille, yksi kirjoittamiseen ja yksi lukemiseen. Kun käyttäjä päivittää matriisikuvaa, nämä toiminnot tapahtuvat kirjoituspuskuriin. Kun nämä toiminnot on suoritettu, keskeytykset keskeytetään väliaikaisesti (tämä tarkoittaa, että kellon keskeytys ei voi laukaista) ja kirjoituspuskuri vaihdetaan edelliseen lukupuskuriin eikä se ole uusi lukupuskuri, jolloin tulkit otetaan uudelleen käyttöön. Sitten kun kellokeskeytys laukaisee osoittaen, että on aika lähettää seuraava bittikokoonpano siirtorekisteriin, kyseinen tieto luetaan nykyisestä lukupuskurista. Tällä tavalla puskuriin ei koskaan tule kirjoitusta, jota voidaan parhaillaan lukea kellon keskeytyksen aikana, mikä voi vioittaa vuororekistereihin lähetettyjä tietoja.

Muun kuljettajan suunnittelu oli suhteellisen yksinkertainen tapauskeskeinen suunnittelu. Esimerkiksi olen luonut objektin siirtorekisterin bittikuvan hallitsemiseksi mille tahansa näyttötilalle. Kappaleimalla bittikuvanhallintaan liittyvä koodi edellä mainitun kaksoispuskurimenetelmän luominen oli itsessään yksinkertainen tehtävä. Mutta en kirjoittanut tätä Instructablea korostamaan olio -suunnittelun hyveitä. Muita suunnitteluelementtejä ovat käsite Glyph ja RGB -kuva. Kuvio on peruskuvarakenne, jolla ei ole synnynnäisiä väritietoja. Voit ajatella sitä mustavalkoisena kuvana. Kun Glyph vedetään LED -näyttöön, väritiedot ilmaisevat, kuinka "valkoiset" pikselit tulisi värittää. RGB -kuva on kuva, jossa jokaisella pikselillä on omat väritietonsa.

Kehotan sinua tutustumaan Arduino -luonnosesimerkkeihin ja tutustumaan ohjaimen otsikkodokumentaatioon, jotta opit käyttämään ohjainta kuvien ja animaatioiden luomiseen RGB -LED -matriisiin.

Vaihe 4: LED -haamukuva

LED -haamukuvaus
LED -haamukuvaus
LED -haamukuvaus
LED -haamukuvaus

LED -matriisissa "haamukuvaus" on ilmiö siitä, että matriisin LED -valo hehkuu, kun sitä ei haluta, yleensä hyvin alhainen taso. Alkuperäinen laitteistosuunnitteluni oli altis haamukuville, etenkin viimeisellä rivillä. Syynä tähän on kaksi asiaa: transistorit eivät sammu heti ja loiskapasitanssi RGB -LEDeissä.

Kun skannaamme rivejä, transistorit eivät sammu heti, koska skannaussyklin edellinen rivi saa edelleen osittain virtaa, kun seuraava rivi kytketään päälle. Jos tietty sarake, joka oli pois päältä edellisellä rivillä, syttyy uudestaan, kun uusi rivi saa virtaa, edellisen rivin sarakkeen LED -valo palaa hetken, kun edellisen rivin kytkentätransistori on vielä kääntymässä vinossa. Transistorin sammuttamiseen kuluu huomattavan paljon aikaa, mikä johtuu transistorin pohjan kylläisyydestä. Tämä saa transistorikollektorin ja emitterin polun jatkamaan johtamistaan, kun virta poistetaan alustasta, ainakin kunnes kylläisyys haihtuu. Kun otetaan huomioon, että multipleksointipäivityssykli aiheuttaa rivien tarkoituksellisen käytön mikrosekunneissa mitattuna, aika, jonka edellisen rivin tyydyttynyt transistori pysyy johtavana, voi olla huomattava murto -osa tästä. Tämän seurauksena silmäsi voi havaita hyvin pienen ajan, jonka edellisen rivin LED syttyy.

Transistorin kyllästymisongelman korjaamiseksi Schottky -diodi voidaan lisätä transistoriin kannan ja kollektorin väliin, mikä aiheuttaa hieman takaisinvirtaa tukiasemaan, kun transistori on päällä, estäen transistorin kyllästymisen. Tämä puolestaan saa transistorin sammumaan nopeammin, kun virta poistetaan tukiasemasta. Katso tästä artikkelista syvällinen selitys tästä vaikutuksesta. Kuten tämän osion kuvasta näkyy, haamukuvaus on melko havaittavissa ilman diodia, mutta diodin lisääminen piiriin kullekin riville poistaa haamukuvan merkittävästi.

RGB -LEDit ovat alttiita toiselle ilmiölle, jota kutsutaan loiskapasitanssiksi. Tämän perimmäinen syy on se, että kullakin RGB -LED -yksikön kolmesta värillisestä LEDistä on erilaiset etujännitteet. Tämä eteenpäin suuntautuvien jännitteiden ero voi aiheuttaa sähköisen kapasitanssin vaikutuksen kunkin LED -värin välillä. Koska LED -yksikköön muodostuu sähkövaraus, kun se saa virtaa, loisen kapasitanssi on purettava, kun virta katkaistaan. Jos kyseinen LED -sarake on muuten päällä toisen rivin virtalähteenä, loisvaraus purkautuu kyseisen sarakkeen LED -valon läpi ja saa sen hehkumaan hetkeksi. Tämä vaikutus selitetään hienosti tässä artikkelissa. Ratkaisu on lisätä purkausreitti tälle loisvaraukselle muulla kuin itse LEDin kautta ja antaa sitten LEDille aikaa purkautua ennen kuin pylväs saa virran uudelleen. Laitteistossani tämä saavutetaan lisäämällä vastus jokaisen rivin voimalinjaan, joka yhdistää voiman maahan. Tämä aiheuttaa enemmän virtaa, kun rivi on kytketty päälle, mutta se tarjoaa purkausreitin loiskapasitanssille, kun rivi ei saa virtaa.

On kuitenkin syytä huomata, että käytännössä minusta loiskapasitanssin vaikutus on tuskin havaittavissa (jos etsit sitä, voit löytää sen), joten pidän tämän lisävastuksen lisäämistä valinnaisena. Tyydyttyneiden transistorien hidastusajan vaikutus on paljon voimakkaampi ja havaittavissa. Kuitenkin, jos tarkastelet tässä osiossa esitettyjä kolmea kuvaa, huomaat, että vastukset poistavat kokonaan kaikki haamukuvat, joita esiintyy edelleen hitaiden transistorien sammumisaikojen jälkeen.

Vaihe 5: Lopullinen valmistus ja seuraavat vaiheet

Image
Image

Tämän projektin viimeinen vaihe oli luoda piirilevy (PCB). Piirilevyn suunnittelussa käytin avoimen lähdekoodin ohjelmaa Fritzing. Vaikka 100 LED -valon asettaminen 10x10 -levylle oli paljon toistuvia tehtäviä, minusta tämä projektin vaihe oli todella outo. Jokaisen sähköisen reitin asettaminen oli kuin palapeli, ja sen ratkaiseminen loi onnistumisen tunteen. Koska en ole valmis valmistamaan piirilevyjä, käytin yhtä monista online -resursseista, jotka tekevät pieniä mukautettuja piirilevyjä. Osien juottaminen yhteen oli melko suoraviivaista, koska suunnittelussa käytettiin kaikkia reikäosia.

Tätä Instructablea kirjoittaessani minulla on seuraavat suunnitelmat RGB LED Matrix -projekteilleni:

  1. Jatka API-kerroksen ohjaimen parantamista, jotta ohjelmoija voi saada enemmän korkean tason toimintoja, etenkin tekstin vieritystä.
  2. Luo suurempia matriisimalleja, kuten 16x16 tai jopa 16x32.
  3. Tutustu MOSFETien käyttämiseen BJT: iden sijaan rivin tehonvaihtoon
  4. Tutustu DM13A: n käyttämiseen vakiovirta -ohjaimina 74HC595: n sijaan sarakkeen vaihtamiseen
  5. Luo ohjaimet muille mikro -ohjausjärjestelmille, kuten Teensy, ODROID C2 tai Raspberry Pi.

Huomaa, että sekä laitteiston suunnittelu että ohjain on julkaistu GPL v3: n avoimen lähdekoodin lisenssillä tässä GitHub -arkistossa. Lisäksi, vaikka piirilevyjen valmistajat tekevät "pieniä osia" piirilevyjen suunnittelusta, saan silti paljon enemmän kuin henkilökohtaisesti tarvitsen. Joten myyn täydellisiä sarjoja eri RGB -LED -matriisimalleihini (piirilevy ja kaikki osat) verkkosivustoltani täältä.

Suositeltava: