soodan sivut

arkisto

196 kirjotelmaa.

avainsanat

Jo aika pitkään on sen isohkon ledimatriisin kasaamisesta kulunut aikaa. Alkaa pöytälaatikkokin täyttymään noista projekteista, niin ajattelin että pitää varmaan saada pikkuhiljaa sitä tyhjäksi että uudet mahtuu. Ja tietysti onhan se ihan kiva saada asioita valmiiksikin ja käyttöön, vaikkei se ole etenkään harrastuspuuhissa ihan niin kivaa kuin uusien jännien juttujen keksiminen. Tälle näytöllekin on kakkosversio jo tulossa vaikkei tämä eka protokaan ole aivan valmis. Joskus viime aikoina (lue: kuukausia sitten) puljasin tuolle ohjauslevyn miltei valmiiksi, ja nyt sit viimein jaksoin korjata siitä pari bugia ja tehdä ekan proton kotelointivalmiiksi. Nyt saa seinälle rullaamaan hassua tekstiä. Vielä pitää puuhata irkkibotti tuolle, jotta ohjaaminen olisi helpointa.

Päälevyn taisin syövytellä joskus astetta jumittavampana päivänä, kun tuli unohdettua rs232-tasomuunnin kontrollerin ja liittimen välistä. On se kumma kun ei bitti kulje kunnolla kun jännitteet ovat ihan pielessä, ei sentään rikki mennyt. Väsäsin muuntimelle sitten erillisen piirilevyn ja hoidin piuhasotkulla kuntoon, yäk. Noh, protot protoina. Lisäksi tuo bugaa jotenkin hämmentävästi kun näyttö saa dataa vajaa joka toinen kerta, pitää naksutella avr:n reset-nastaa. Varmaan jotain häiriöongelmia tms. En ole elektroniikkaekspertti, joten laitoin siihen resettiin (kätevästi isp-liittimeen vierekkäisiin nastoihin) napin roikkumaan piuhan päähän, jota saa räpsytellä kunnes kuva tulee. Erikoista on että useimmiten se kuitenkin juttelee sarjaporttiin ihan oikein (vaikkei joka kerta), ledit eivät vaan välky -- spi-väylälle ei lähde mitään vaikka koodi käskee. Käyttisnastaa tutkiessa jännite kyllä räpisee aika pahasti, puoli volttia eestaas eikä ihan lyhyinä piikkeinä, vaikka pari konkkaa siinä onkin kiinni. BOD-fusea (brown-out detector) varmaan voisi kokeilla, se resetoi kontrollerin jos jännite putoaa liian alas. Tai olenkohan saanut kontrollerin fyysisesti särki?

Muutoin tämän ykkösproton levyt suurena yllätyksenä toimivat miltei bugikorjauksitta. Itse ledilankut pelasivat muistaakseni ihan ok suoraan (no joo, niistä tein pari purkkaa ennen tätä oikeaa smd-osien protoa), ja ohjaimesta tosiaan unohtui vain se rs232-tasomuunnin joka nyt tuossa kuvissa kuitenkin on. Valotustasoisia kuvia levyistä ei tässä ole, koska en katso näiden olevan niin hienoja että kukaan niitä mihinkään käyttäisikään. Ehkä seuraavassa versiossa...

Ledilevyjen toiminnan siirtorekistereineen ("SR") taisinkin selittää ihan kivasti aiemmassa tekstissä. Ohjainlevyssä sijaitsee mikrokontrolleri kiteineen, rs232-jutteluvälineet ja virransyöttö sekä rivien ohjaintrankut. Ohjaintrankut ovat PNP-tyyppisiä kun SR:t vetävät ledit maihin päälle kytkettäessä. Voisi sen kai tehdä toisinkin päin, en enää muista minkä takia se nyt on näin päin. Trankuille tulee kantasignaali ihan suoraan mikrokontrollerilta vastuksen kera. Kantojen vastukset taisivat olla tuossa luokkaa 500 ohmia. PNP-trankku kytkee kun kontrollerilta tulee nollaa. Sitäkään en muista, minkä takia jätin nuo rivitrankut ohjainlevylle enkä ledilaudoille; ehkä ajattelin ketjuttavani ledilevyjä jotenkin niin, että näin on kätevämpää. Nykyiset rivitrankut lämpenevät suht hurjasti jos koko näyttö on päällä, mutta normaalilla tekstirullailulla mihin tuon suunnittelinkin ne voivat ihan hyvin.

Protohässäkän kotelointimateriaalia on tuskin turha edes mainita. Protot on protoja. Kotelo menee näppärästi yhdellä ruuvilla kiinni. Ja voihan tuon vaikka maalata jos alkaa häiritsemään.

Softa on ihan tylsä toistaiseksi. Varsinkin mikrokontrollerin puoli (ledmatrixmega-spi.c). Kontrolleri ottaa sarjaportista (rs232) dataa, varastoi sen bufferiin ja välittää näytölle SPI-väylällä ja niitä rivitrankkuja ohjaamalla. Tästä enemmän edelleen aiemmin selostetussa tekstissä sekä itse koodissa: SR:ille datat ja rivi kerrallaan päälle nopeasti välkyttäen (SPI:n kello pörrää megahertsin taajuudella; ei ihmeemmin näytä silmälle välkkyvän -- fps kai jotain vajaa 700 tai sitten vähän vähemmän kun väylä ei kuitenkaan ole täysillä ajossa; pitäis skoopata). Kontrollerin näyttöbufferin koon säätämiseksi moduulien koko ja määrä on kovakoodattu; softa pitää kääntää uusiksi jos haluaa modata rautaa. Sama määrä pitää ilmoittaa pc-puolellakin.

Koska näytön liitin on vasemmalla ja SPI-väylässä data kulkee alusta loppuun etenemällä noiden SR:ien läpi, niin ekana lähetetty bitti menee oikeanpuoleisimmalle rekisterille. Rekisterien outputit ovat niin päin, että viimeisenä lähetetty bitti on vasemmanpuoleisin, eli ledijärjestys seuraa samaa logiikkaa kuin rekisterijärjestys. Yhden rekisterin koko on kahdeksan bittiä ja väylälle saa siirrettyä näppärästi yhden tavun kerrallaan tuon avr:n rauta-SPI:llä; yksi siirtokäsky per rekisteri. Kontrollerin koodi on hyvä pitää yksinkertaisena jotta ruudun päivitys olisi maksimaalisen kivaa kun päivitystahti nyt on melkoinen, ja pc-puolen ajurikoodiin tehdään sitten inhottavuudet: ohjainkontrollerin koodissa bufferi on muistissa juuri samassa järjestyksessä kuin miten se lähetetään väyläänkin, eli rivit ovat kyllä peräkkäin mutta rivin pikselit väärin päin, oikealta vasemmalle. No joo, ehkäpä tuon voisi laskea ihan näyttökontrollerilla kuitenkin, kun ei kovin monimutkaista ole. Keskeytys joka tulee kun yksi tavu on lähetetty laskee ensin missä kohdassa mennään ja sitten ehkä kytkee seuraavan rivin päälle, ja vasta lopuksi puskee seuraavan tavun väylälle (SPDR-rekisteriin). Jos väylän käyttöprosentti pitäisi pitää korkealla, niin väylälle kannattaisi kirjoittaa heti keskeytysrutiinin aluksi.

PC-puolen softa (ledmatrixscroller.py) parsii tällä hetkellä näytön pikselit ihan normaalista kuvatiedostosta. Jos näytölle tahtoo tekstiä, niin softa rendaa ttf-fontista kuvaksi dataa, kynnystää sen (koska teksti on useimmiten antialiasoituakin mutta näyttö on yksivärinen) ja sitten puskee sitä näytölle. Koodi lukee kuvan muistiin pythonin PIL-kirjastolla, lukee siitä pikselit bufferiin ja työntää bufferin sarjaporttiin pyserial-kirjastolla jatkuvasti ennalta määritellyllä FPS:llä, ja joka framella rullaa kuvaa yhden pikselin verran vasemmalle. Ajattelin tehdä C++:lla mutta pythonkin on ihan riittävän tehokas toistaiseksi, isoin pullonkaula on sarjaportin siirtonopeus.

Parannuksia pitää tehdä sekä raudan että softan suhteen jos tästä aikoo jatkaa; näyttöjen piirilevyt on ehdottomasti tehtävä kaksipuolisina mikä vähentää hyppylankojen määrää aivan dramaattisesti, sekä pienentää levyn kokoakin kun SR:t mahtuvat kivasti eri puolille ja levyn kokoa rajoittaa vain itse ledinäyttö. Lisäksi noihin pitää tehdä joku järkevä liitinsysteemi jotta eri levyjä saa kytkettyä toisiinsa helposti. Joku piikkirima reunalle takapuolelle vaikka. Johdoissakin on tässä versiossa jotain kontaktihäröä, välillä pitää tökkiä sieltä täältä että kuva ei vääristy. Sellainenkin bugi tuohon tuli, että isp-ohjelmointipiuha ei mahdu kiinni jos näyttöpiuha on kiinni, niin testailuvaiheessa pitää repiä johtoja koko ajan.

Softassa taas voisi parantaa vähän kaikkea; kontrollerille mahtuu kahdeksan kilotavua ohjelmakoodia, ja nyt siinä on reilu 500, eli jotain 7 % maksimista -- tuohon tilaan mahtuisi vaikka mitä standalone-efektitemppuja, joita voisi käskyttää erikseen ilman, että kontrollerille tarvitsisi koko ajan puskea samaa dataa eri muodoissa vaikka juurikin tuota tekstin rullaamista ajatellen. Tuohon mahtuisi oma pieni fonttikin aika hyvin, ja sarjaväylästä riittäisi puhua mitä tekstiä haluaa näkyville. Iso ongelma on myös se, että framen alkua ei synkata mitenkään pc:n ja tuon välillä, joten jos joku siirto jää kesken niin seuraava ei alakaan sieltä oikeasta ylänurkasta vaan jostain keskivaiheilta ja looppaa reunalta yli. Sarjaportista tulee ihan pikseleitä raakana ilman minkäänlaisisa kontrollikoodeja. Ja onhan sarjaportti aika vanhentunut protokollakin, voisi laittaa kontrolleriin softa-usbin jos ajastuksien kanssa ei tule ongelmia kun näytön päivitystaajuus on melkoinen. Tietysti myös tuo käynnistymisongelma pitäisi tutkia, mutta luultavasti se ei johdu ainakaan koodista.

2 kommenttia

Oma kommenttisi

Mielipide tämän sivun asiasta? Kirjoita toki. Älä raapusta kuitenkaan ihan asiattomia juttuja.

Jos on yksityisempää asiaa, tarkkaa kysyttävää tai aihetta pidemmälle keskustelulle, käytä yhteydenottolomaketta kommentoinnin sijaan.

Hölmöt kommentit saatetaan moderoida pois jälkikäteen.

Nimimerkki:

Spammibottiesto: Mikä on nollan ja kahden summa? (vastaus numeroina)