Autossani Citroën Xantia vuodelta 1999 on vakiovarusteena ohjauspyörässä käyttönäppäimet radiosoittimelle. Nämä ovat tietenkin tarkoitettu käytettäväksi alkuperäisen Citroen-brandatun radion kanssa. Tarvikeradioita varten myydään yleisesti auto- ja radiokohtaisia sovitinsarjoja, jollaisen ostinkin heti auton hankkimisen jälkeen asentaessani vanhaa Pioneer-soitintani. Tämä kaupallinen tuote oli kuitenkin alusta alkaen pettymys: Ratin kahdeksasta napista adapteri hyödynsi vain viisi, jättäen osan tarpeellisistakin toiminnoista tyystin pois, ja osan (virittimen pikavalinnat) hankalasti kerrostaen toisen toiminnon kanssa samaan nappiin. Tätä hankaluutta olisi vielä jotenkin oppinut sietämään, mutta vehje toimi vieläpä hieman epäluotettavasti, toisinaan napit ohjasivat vääriä toimintoja, ja toisinaan ne eivät vain tehneet mitään. Tästä heräsi ajatus, että paremmanhan teen vaikka itse. Näin käynnistyi pieni harrastusprojekti mikrokontrollerilla toteutetusta adapterista.
Xantia -99 ratti nappeineen
Koska käytössäni oli jo tämä kaupallinen adapteri, oli ratin nappien ja radion käyttämät rajapinnat helppo selvittää niiden keskustelua oskilloskoopilla tutkimalla. Protokolla selvisi hyvin nopeasti: Radio ottaa komennot jänniteviestinä, ja ratissa kukin nappi kytkee signaalijohtimesta tietynsuuruisen resistanssiarvon maihin. Radiossa jänniteviesti tutkittiin AD-muunnoksella, ja tulossa oli valmiiksi sisäinen ylösveto viiteen volttiin, eli periaatteessa ratin signaalijohtimen olisi voinut kytkeä suoraan radion tuloon, ja napit olisivat ohjanneet radiota muodostuvan jännitejaon kautta.
Ratin nappien symbolien kuvaamat toiminnot eivät olleet vastusarvoiltaan tietenkään samat, kuin mitä radio olisi odottanut vastaavia toimintoja varten. Ilmiselvin ratkaisu olisi ollut vaihtaa ratin nappien kytkemät vastukset sopivan arvoisiksi. Tämä ei kuitenkaan tullut kyseeseen, koska Pioneerin protokolla on kaksikanavainen; Jänniteviesti kulkee yhdessä kanavassa, ja osa toiminnoista vaatii toisen kanavan maadoittamisen, eli se toimii eräässä mielessä kuten näppäimistön shift-nappi. Ratissa ei tällaista kakkoskanavaa ollut. Tarvittiin siis laite, joka lukee pelkkiä vastusarvoja, ja osaa käyttää näitä radion lukemia kahta kanavaa.
Pioneer DEH-3630MP
Ratin nappien vastusarvot löytyivät yksinkertaisesti yleismittarilla tutkimalla. Radion
tukemien toimintojen etsimisessä en luottanut pelkästään tämän kaupallisen mallikappaleen
toimintaan, vaan kytkin radion AD-kanavaan potentiometrin ja kakkoskanavaan maattavan kytkimen, ja
etsin näiden eri yhdistelmillä kaikki mahdolliset tuetut toiminnot. Toimintoja odotetusti oli
enemmän, kuin mitä mallisovellus osasi käyttää. Koska soittimen AD-kanava oli ylösvedetty viiteen
volttiin, löytyi siinä käytetyn ylösvetovastuksen (11kohm) arvo potentiometrillä siitä kohtaa
jossa
jännite oli laskenut 2,5 volttiin.
Keltaisessa taulukossa on ratin eri nappien antamat vastusarvot. Xantian rattinappiliitäntöjä on kolme erityyppistä, tämä malli on käytössä vuosimalleissa 1998-2000.
Vihreässä taulukossa on Pioneerin soittimen kaukosäädinliitännästä löytyneet toiminnot, sekä viimeisessä sarakkeessa muistiinpanot siitä mihin mikron IO-pinniin kyseisen toiminnon kytkin. Saman suuntaisia arvoja on löytynyt myös muista Pioneerin soittimista.
Edellä olevat taulukot olivat laitteelle muodostuvan määrittelyn ydintoiminnot. Lisäksi halusin ohjata napeilla muitakin toimintoja, kuten automaattivaihteiston ohjelmavalitsinta sekä vakionopeudensäädintä. Näitä lisätehtäviä varten en tässä vaiheessa varten nähnyt tarpeelliseksi integroitua auton omiin järjestelmiin sen syvällisemmin, vaan hoidan liitynnän yksinkertaisesti ohjaamalla mikrokontrollerilla releitä jotka kytken ao. toimintojen varsinaisten käyttökytkimien rinnalle.
Samalla tuli myös idea automaattiseen äänenvoimakkuuden säätöön. Kehittyneemmissä radioissa tämä ominaisuus on vakiona, mutta kyseisen Pioneerin mallin kanssa en ollut yhtä onnekas. Autossa on sähköisesti toimiva nopeusmittari, joten nopeussignaali löytynee jostakin, ja kontrolleri voi sen perusteella tehdä ohjausta volumeen. Koska tähän automalliin ei ole yleisesti saatavilla kunnon johdotuskaavioita, en vielä tässä vaiheessa tiennyt missä nopeussignaali kulkee, enkä päässyt tutkimaan sen aaltomuotoa. Niinpä signaalia vastaanottavan piirin tulee olla mahdollisimman sopeutuvainen, tuli signaali sitten kauniina TTL-pulssijonona, tai amplitudiltaan voimakkaasti vaihtelevana siniaaltotaajuusviestinä suoraan induktiiviselta anturilta.
Koko piirikaavio on sivun alareunan hw-linkin takana.
Seuraavaksi vuorossa oli sopivan mikro-ohjaimen valitseminen. Työympyröissäni käytettiin paljon Atmelin AVR -sarjan mikroja, tyypillisesti ohjaamassa yksittäisen piirilevyn toimintoja. Atmega8:ssa näytti olevan sopiva määrä IO:ta, ja koska näitä oli hyvin harjoituskappaleiksi tarjolla, valitsin sen. Erästä esimerkkiä mukaillen piirsin itse mikro-osuuden skeman, mukaanlukien JTAG-ohjelmointiliityntä. Kyseinen mikro tukee normaalia sarjaliikenneprotokollaa, ja tietenkin halusin sen käyttööni debuggausta ajatellen. Tätä varten lisäsin skemaan RS232-levelconvertterin, toinen vaihtoehto olisi ollut käyttää erikoiskytkettyä sarjakaapelia jossa itsessää olisi ollut tämä tasomuunnos.
Radiolle päin menevä ohjaus on toteutettu kutakin toimintoa vastaavalla diskreetillä vastuksella, joita mikro-ohjain kutakin vuorollaan kytkee maahan. Vaihtoehtoinen tapa olisi mahdollisesti ollut käyttää yhtä PWM-lähtöä sopivasti alipäästösuodatettuna, mutta koska IO:ta oli nytkin riittävästi tarjolla, oli selkeän vastusjaon toteuttava kytkentä varmempi valinta.
Virtalähdeosio on toteutettu perinteisellä LM7805-regulattorilla. Olin todennut tämän hyvin toimivaksi myös autokäytössä MegaSquirt-moottorinohjausprojektin yhteydessä, varustettuna tietenkin riittävillä suojauksilla vihamielistä autosähköä vastaan.
Releosio sisältää kolme vaihtorelettä, joiden ulostulot voidaan jumppereilla konffata normaalisti auki (NO) tai normaalisti kiinni (NC) -tyyppisiksi. Muut komponentit ovat releiden ohjaukseen ja niiden suojaamiseen liittyviä.
Nopeus-, eli VSS-signaalin käsittelyyn varauduin LM1815 "zero cross detector" -piirillä. Tämä kyseinen piiri on tarkoitettu erityisesti induktiivisen anturin tuottaman vaihtelevataajuuksisen (ja sitä kautta myös amplitudisen) sinisignaalin muuttamiseen turvallisesti TTL-tasoiseksi. Piirin voi tarvittaessa jättää kalustamatta, ja johtaa signaalin hyppylangalla suoraan inputista outputtiin.
Liittimiksi valitsin 10-pinniset Molex Microfit -liittimet, niiden kohtuullisen tilankäytön sekä näppärän lukitsinkynnen takia. Radion fyysinen liitin ohjauskanaville on perinteinen 3,5mm stereoplugi, joten sellaisen laitoin myös omaan laitteeseeni.
Skemanpiirtovaiheeseen meni noin viikon illat, sisältäen myös katselmoinnit parin työkaverin kanssa.
Koteloksi päädyin valitsemaan 47x57x33mm -kokoisen muovikotelon, ja sen mittojen perusteella piirsin levylleni ääriviivat. Tässä vaiheessa selvisi, etteivät aikomani komponentit millään mahtuisi tämän kokoiselle kaksipuoliselle PCB:lle, vaikka käytinkin pintaliitoskomponentteja niin paljon kuin vain käytössä olevat varastot sallivat. Lähinnä ongelmaksi muodostuivat läpireikästen releiden vaatima tila levyn pohjapuolelta. Koska levyni ei tule olemaan koneellisesti kasattava, saatoin sijoitella komponentit vapaasti levyn kummallekin puolelle. SMD:t tulivat alapuolelle, ja perinteiset yläpuolelle.
Tilanpuute ratkesi yllättäen korkeussuunnasta. Valitsemani kotelo oli niin korkea, että samaan koteloon saatoin laittaa kaksi PCB:tä päällekäin, ja silti kummallekin levylle tulevat korkeimmatkin komponentit, releet mukaanlukien, mahtuivat sopivasti. Päätoiminnot sijoitin alemmalle levylle, ja sen yläpuolelle tulevalle toissijaiset, eli releet, niiden moninapaliitin, sekä sarjaliikenteen D9-liittimen. Tarvittaessa laitetta saattaa siis käyttää ilman tuota ylempää levyä. Levyistä tuli myös sopivan kokoiset, jotta sain mahtumaan niitä kumpaakin kaksi paria yhdelle 100x160mm piirilevyaihiolle. Tämä on standardikoko valitsemallani piirilevytoimittajalla.
Samaisen piirilevytoimittajan tiukahkot suunnitteluvaatimukset tuottivat hieman päänvaivaa. Träkkien leveydet eivät olleet ongelma, käytin muutenkin riittävän leveää vetoa sekä eristevälejä, mutta heillä on reikiä vain muutamaa standardikokoa, jolloin träkkien läpiviennitkin piti tehdä 0,7mm rei'illä. Tämän ympärille vielä itse pädi, jolloin ympyrän halkaisija on jo 1,5mm, ja sellaisia ei montaa mahdukaan pienen 32-pinnisen TQFP-koteloisen Atmega8:n alle. PCB-kuvien hieromiseen meni toisen viikon illat.
Piirilevyt tilasin Olimexilta Bulgariasta. Kyseinen firma valmistaa levyjä myös yksityisille henkilöille, en halunnut puljata levyjä oman työpaikkani kautta. 100x160mm -paneelille tuli alveineen ja postikuluineen hintaa 46$, eli alle 40e. Hintaan olisi sisältynyt myös top-puolen silkkipainatus, mutta jätin sen pois. Tilauskuvio oli hieman hankala, ensimmäiset kolme viikkoa meni hukkaan siinä kun odottelin tilausvahvistusta faksiin joka ei mennytkään perille. Toisella yrittämällä prosessi käynnistyi, ja kuukauden päästä levyt olivat kotona. Levyjen laatu on protokäyttöön kelvollinen. Mikroskoopilla tutkimalla oikosulkuja tai katkoksia ei löytynyt, mutta näytti siltä että valmistaja itse oli korjaillut niitä. Levyn reunassa oli kapea puoliksi irronnut kuparisoiro, reunat piti viimeistellä viilalla. Sisäpuolisia avauksia (keepout layerissä) ei oltu jyrsitty. Parissa kohtaa juotteenestopinnoite on irronnut levystä pieneltä alalta. ROHS-yhteensopivuus on hoidettu kultauksella.
PCB on kaksiosainen, kaksipuoleinen.
Lähdekoodi on ladattavissa sivun alareunan linkeistä.
Levyjä odotellessa aloitin jo kirjoittelemaan softaa. Kokeilualustana toimi eräs toinen piirilevy, jossa oli Atmega16, sen powerointi, sarjaportti, yksi nappi sekä kolme lediä. Levyn muut toiminnot ovat tässä epäolennaisia. Napilla ja ledeillä pääsin tutkimaan kyseisen kontrollerin IO:n hallintaa, ja parissa tunnissa (sisältäen ohjelmointiympäristön pystytyksen) olikin valmis mikrokontrollerien "hello world", eli ledi syttyy nappia painettaessa. Ohjelmointiympäristönä käytin vapaan lähdekoodin WinAVR:ää, joka sisältää AVR-libc -kirjaston sekä valmiiksi viritetyt työkalut niin että AVR-ummikkokin pääsee äkkiä tekemisen makuun. Jopa laakista toimiva makefile syntyi työkaluilla näppärästi. Seuraavana iltana räppäsin mikron yhteen AD-tuloon potikan ylösvetoineen, ja ohjelman väsäsin lukemaan AD:tä sekä tulostamaan sen arvon sarjaporttiin. AVR:n softaukseen käytin AVR Stk500v2 jtag-ohjelmointipalikkaa
Seuraavaksi kirjoitin nopeusalgoritmin. Se ei triggaudu tietyissä absoluuttisissa nopeuspisteissä, vaan silloin kun nopeus on muuttunut tietyn verran (tässä 15km/h) suuntaan tai toiseen, jolloin volumea säädetään vastaavaan suuntaan. Tämä estää myös volumen sahaamisen ylös-alas tietyn nopeuspisteen ympärillä. Nopeustulo on sovitettu siten, että anturilta oletetaan tulevan 5000 pulssia per mile. Nopeussignaali kytketään prosessorin ulkoiseen keskeytysnastaan, ja aina kun saadaan nopeuspulssi, katsotaan paljonko laskuri on kulkenut sitten edellisen pulssin, jolloin saadaan laskettua nopeus. Algoritmi toimii välillä 5..300kmh. Nopeussignaalia ei itse autosta ole edelleenkään löytynyt, joten tämän toimivuus on testattu vasta signaaligeneraattorilla, ja valitut nopeus-volumepykälät ovat pelkkiä arvauksia.
AVR:n ulostulopuolen väsääminen käyttämääni kokeilualustaan olisi ollut turhan vaivalloista, joten tässä vaiheessa odottelin piirilevyjen saapumista. Levyt saapuivat, kahden setin kalustus oli yhden illan homma, ja virran kytkemisen sekä softauksen jälkeen ilo olikin suuri, kun hw toimi juuri niinkuin oli tarkoituskin. Myös "kuivaharjoitteluna" kirjoittamani ulostulopuoli toimi välittömästi oikein, lähtöliittimessä näkyi soittimen ylösvetoarvon kanssa juuri niitä jännitteitä kuin valittu toiminto edellyttikin.
Tämän jälkeen hienohierontaan meni vielä muutamia tunteja. Autoon kytkemisen jälkeen, eli todellisessa käyttötilanteessa tuli heti tarpeelliseksi hoitaa se alunperin aikomani vaihteiston ohjelmavalitsimen ohjaus ratin napeilla, joten yksi radion ohjaukseen tarkoitettu nappula piti uhrata. Mute-nappi tuntui tarpeettomimmalta, volume on riittävän nopea ihan normaaleilla vol+/- -napeilla, joten se sai mennä. Toinen tarpeelliseksi osoittautunut toiminto oli Band, eli "muistipaikkakertojan" käyttö. Tälle ei ollut ratissa alunperin nappia, mutta yhdistin tämän cd/tuner (eli SRC) valintaan siten että ratista lyhyt (alle 250ms) näpäytys SEL-nappia tekee Band-toiminnon, ja sitä pidempi on SRC. Hauskaksi tämän tekee se, että radiossa itsessään SRC-napissa on myös kaksi toimintoa, lyhyt painallus on SRC ja pitkä on/off. Nyt Ratista SEL-napista löytyy kolme toimintoa, riippuen kuinka pitkään sitä painaa. Kestoajat ovat varsin intuitiviset, "näpäytä", "paina" ja "pidä". Radio piippaa jokaisen toteutetun komennon kohdalla, joskus tämä on ärsyttävä toiminto, mutta rattikauko-ohjaimen kanssa tervetullut kuittaus.
Päälevy kummaltakin puolelta.
Relelevy kummaltakin puolelta.
Levyt ovat tässä kuvassa kiinni toisissaan pelkästään stacker-piikkirimalla. Kovemmassa käytössä lisätueksi voi laittaa korotusruuvin.
Takana kotelo
Testausta labraolosuhteissa.
Valmis boksi autoon kytkettynä. Kuminauhalla ympärille kiedottu lattakaapeli on JTAG-liitin. Siistimpi ratkaisu syntyisi lataamalla mikroon bootloaderi, ja käyttämällä sen jälkeen RS-232:a päivityksiin.
Tämän projektisivun tarkoitus on dokumentoida pienen AVR-pohjaisen sovelluksen toiminta, ja projektin eteneminen. Voit vapaasti hyödyntää kirjoittamaani ohjelmaa ja piirikaaviota omissa sovelluksissasi, toivon että niistä on apua jollekulle.
Tämä sivu ei ole rakennussarjan kasausohje. En pysty toimittamaan mitään osia, piirilevyjä tai valmistuspalveluja. Myöskään kumpikaan valmistamani fyysinen laitekappale ei ole myytävänä.
Mikäli joku seikka jäi askarruttamaan mieltäsi, kysy sähköpostilla. Vastaan mielelläni jos vain pystyn auttamaan.
Kari Monkala 27.4.2007