Liikennevaloprojekti, osa 4

Liikennevalot kasaamisen jälkeen havaitsimme toiminnassa vikaa, joka käy ilmi seuraavasta videosta:

Tämä bugittaminen jäljitettiin huonoon suodatukseen. Virransyöttö muutettiin kokoaaltotasasuunnatuksi, 230VAC tuloon liitettiin häiriönpoistokondensaattori ja kummallekin releille lisättiin kärjille oma varistori. Tällä tavalla mikrokontrollerille tulevia piikkejä saatiin tehokkaasti eliminoitua ja toiminnallisuus korjattua.

Kuitenkin juuri ennen Assembly 2011 -tapahtumaa mietimme sitten, että nappiohjaus ei ole kovin edustava ja halusimme ohjata valoja PC:llä. Alkuun mietimme sarjaväylän toteuttamista mutta siihen olisi kulunut liikaa aikaa kun modaaminen jäi tietenkin viime tippaan. Kämppäkaverilla oli ebaysta hankittu USB-relekortti (tarkat speksit DAE-CB/Ro8/12V-USB, esim ebay), joka keskiviikkona puolen yön aikaan asenneltiin paikalleen. Omatekemä kortti jäi tosin vähän tarpeettomaksi USB-kortin korvatessa sen kokonaan, mutta sen pariin tullaan ehkä vielä palaamaan.

USB-korttia voidaan ajaa Java-pohjaisella sovelluksella suoraan, mutta tämä ei meitä kiinnostanut vaan halusimme tietenkin itse määrätä miten valoja ohjaamme. Koska kortti käyttää yleistä FTDI:n piiriä, sille löytyy valmis ajuri ja kirjasto libftdi. Tästä voidaan itse kääntää Windows-versio tai käyttää valmista Win32-kirjastoa esimerkiksi täältä. Libftditä käytettäessä tarvitaan vielä open source-pohjainen libusb-kirjasto, jonka Win32-käännös löytyi sourceforgesta. Nämä ajurit korvaavat kortin mukana tulevat omat virtuaalisarjaporttiajurit (VCP Driver). Asennus on todella helppoa, paketissa oleva inf-wizard.exe ajetaan, täytetään muutama info ja kortin pitäisi näkyä Laitehallinnassa libusb-win32-laitteiden alla

Releitä ohjataan käyttämällä FTDI-rajapintaa ns. “bitbang”-moodissa eli jokaista virtuaalisen sarjaportin pinniä käytetään yksittäisenä bittinä (portti toimii enemmänkin kuten rinnakkaisportti). Omassa toteutuksessamme releet yksi ja kaksi löytyivät sarjaportin pinneistä TX ja RX joita vastaavat bitit 1 ja 2. Kortissa on yhteensä kahdeksan relettä joten laajennusvaraa riittää. Itse korttia ohjaava koodi voidaan toteuttaa periaattessa millä tahansa, hyvä C-kielinen esimerkki löytyy hackadaysta. Ilmeisesti ohjaamiseen voidaan käyttää myös FTDI:n omaa FTD2XX-kirjastoa mutta me toteutimme oman softamme libftdillä. Ohjelmointi tehtiin Qt:lla mutta mikä tahansa C/C++ -ympäristö toimii yhtä hyvin. Muutamia kirjastoriippuvuusongelmia tuli, ilmeisesti Qt:n Windows-puoli on vielä hieman hakusessa sillä Qt:n kirjastot mingwm10.dll, QtCored4.dll ja libgcc_s_dw2-1.dll piti käsin kopioida build-hakemistoon jotta ohjelma suostui käynnistymään.

Koodista: Kortin ohjaamiseen tehdään kahva, joka alustetaan. Tämän jälkeen laite avataan, FTDI-piiri asetetaan bitbang-modeen jonka jälkeen väylään voidaan asettaa dataa komennolla ftdi_write_data. Loppu onkin sitten bitinnypläystä ja sopivan loopin rakentamista. Esimerkkikoodissa on toteutettu konsolisovelluksena hyvin yksinkertainen kahden lampun scrolleri, jossa valo siirtyy punaisesta vihreään pienellä viiveellä. Huomasimme että viivettä ei voi asettaa kovin alhaiseksi koska kortti ei pysy perässä ja rajapinta pitää alustaa. Tätä tapahtui varsinkin javasoftalla hyvin usein.

Esimerkkejä siitä minkälaisia efektejä kahdella lampulla voidaan tehdä:

Qt-Esimerkkikoodi, vaatii Qt Creatorin, libusb:n ja libftdi:n.

Vielä triviatietoa: Toinen valojen kiinnityskorvake on tukittu spraymaalipurkin kannella ja toinen punaiseksi maalatulla Dolmio-purkin peltikannella :D (Mattamusta oli juuri tietenkin lopussa)

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>