Prispôsobenie diaľkového ovládania Opel [ATtiny13]
Ovládanie autorádia Kenwood, originálnymi tlačidlami na volante Opel
myrgo, 30.07.2010-12:51

Technicky zameranému človeku to ale po čase začne vŕtať v hlave a len tak nezáväzne začne zháňať informácie. Zapojenie tlačidiel na volante sa dalo nájsť vcelku jednoducho spolu so zapojením Opel konektora, čo bola nutnosť k montáži hneď po kúpe rádia.
Konektor v jednom celku združuje ISO-A a ISO-B časti plus rozšírenie o ďalšiu časť so zbernicou I2C k displayu na stredovaj konzole, kde originálne autorádio posiela na zobrazenie údaje o naladenej stanici apod (toto mám v pláne skúmať zas niekedy neskôr).
Tlačidlá ovládania su zapojené ako skratovacie priečky odporového deliča, ktorý je jedným koncom pripojený na zem vozidla, druhý koniec je dostupný na zmienenom konektore, konkrétne pin 2 časti A.
Poznámka: konektor síce na prvý pohľad vyzerá, ako ISO-A+B+čosi navyše, ale je plytší a má iné zaskakovacie zámky, takže štandardné protikusy rádia do neho nezapadnú.


Väčší problém bol zohnať popis ovládania autorádia.
Uvedený model má podľa návodu jednak možnosť ovládania IR ovládačom, ktorý ako optional k rádiu nebol (a ani sme nehľadali variant s ovládačom, v aute mi to pripadá nepraktické a zbytočné). Druhá možnosť ovládania je priamo cez vodič vyvedený na zadnej strane, označený "REMO.CONT". Návod je stručný, píše, že k tomu treba špeciálny adaptér. Na webe som našiel zaujímavú informáciu, že ovládanie je v rádiu vedené do jedného vstupu riadiaceho procesora z vodiča REMO.CONT, aj z IR prijímača (demodulátora), t.j. ovládanie je rovnaké, až na nosnú pre IR. Nemajúc diaľkový ovládač, aby som si mohol zosnímať povely, hľadal som popis protokolu.
Nakoniec mi pomohol dobrý človek na e-mailovej konferencii HW-List.

Nebudem tu podrobne rozoberať protokol, uvediem odkazy na web:
1. Názorný základ, ale bez povelov a ich kódov
2. Originálny "káblový" ovládač s doslova popisným opisom povelov (2 pulzy, medzera,..)
3. Najkomplexnejší popis, kde aj hodnoty kódov tlačidiel dávajú zmysel (napr. povely číselných predvolieb rádia majú zodpovedajúce hodnoty)

Časovanie sa v jednotlivých popisoch mierne líši. Použil som to z 2. odkazu. Dĺžka pulzov štartovacej sekvencie je rovnako uvedená aj v popise 3. Pri pulzoch jednotlivých dátových bitov je v odkazoch 1 a 2 uvedená zhodná dĺžka úrovní H a L, v odkaze 3 sú dĺžky odlišné. Samotná dĺžka puzlov a ani jej násobok v štartovacej sekvencii (18x-on a 9x-off podľa 2., 16x a 8x podľa 1. a ešte menej podľa 3.) nie je kritická, to som pokusne overil.

Realizácia

Použil som AVR-ko. Na konkrétnom type nezáleží, podmienkou je len ADC a ak je v pláne využívať ovládanie IR LED-kou, tak aj timer pracujúci v režime CTC s možnosťou priamo preklápať pin MCU, čo je využité na generovanie nosnej IR. Sám som vyvíjal na ATmega88, aby som sa neobmedzoval pamäťou a prostriedkami.
Nakoniec sa ukázalo, že s rezervou stačí ATtiny13, pracujúci na frekvencii 1.2MHz.

V schéme je zakreslený aj odporový delič tlačidiel na volante. Aby bolo možné AD prevodníkom vyhodnocovať všetky stavy tlačidiel, vrátane chybových (delič nepripojený, alebo skrat), výstup deliča je priamo pripojený na vstup AD prevodníka a cez ďalší rezistor na VCC, ktoré AD prevodník používa ako referenčné.

Zakreslené sú oba možné spôsoby zapojenia výstupu. Vstup rádia REMO.CONT interne používa pull-up odpor, v zapojení teda nie je potrebný.
Ak sa využije výstup na IR LED, odpor obmedzovacieho rezistora je potrebné zvoliť s ohľadom na prúd LED-kou. Ako napájanie LED môže poslúžiť VCC (+5V), alebo +12V z palubnej siete. V zapojení som použil stabilizátor 78L05, teda prípadné pripojenie LED na VCC je prúdovo obmedzené a spoľahlivý dosvit je doslova pár desiatok cm. Lepšie je zapojiť LED oproti palubnej sieti.

Pred stabilizátorom je ochranný obvod tvorený diódou, cievkou, kondenzátormi a transilom. Všetko toto by malo zachytiť prepäťové implulzy od zapaľovania.

V schéme je zakreslený aj programovací ISP konektor. V aute sú otrasy, MCU nie je vhodné dávať do pätice, treba ho priamo pripájkovať na DPS. Pri možnej budúcej aktualizácii firmware sa konektor hodí. Výstup timera (OC0A), ktorý generuje nosnú IR, zdieľa pin s programovacím signálom MOSI. Aby počas programovania nelietal výstup, tranzistor je držaný v zavretom stave signálom reset cez schottkyho diódu do bázy.

Schéma je nasledovná:





Plošný spoj som nenavrhoval, zapojil som si to na univerzálnej DPS. Ale iniciatíve sa medze nekladú


Program
Zdrojový kód je dostatočne komentovaný, preto popíšem len základné vlastnosti.

Program je písaný v C, kompilovaný AVR-GCC s optimalizáciou Os a takto zaberá menej ako 400B programovej pamäti.

Ako IDE používam Eclipse s AVR pluginom, adresár teda obsahuje aj projektové a riadiace súbory tohto prostredia. Program je napísaný tak, aby bol minimálne závislý od použitého typu MCU a jeho frekvencie. Stačí prekompilovať so správnym typom MCU a nastavenou F_CPU. Pri väčšej zmene F_CPU je vhodné zmeniť preddeličku ADC zmenou #define ADC_PRESCALER. Nosná frekvencia pre IR LED je generovaná timerom. Raster jej hodnôt vyplývajúci z diskrétnej hodnoty definujúcej rýchlosť pretečenia timera, je tým hrubší, čím nižšia je F_CPU. Našťastie selektivita IR prijímača v rádiu (aj všeobecne) je nízka, t.j. +/- pár kHz nehrá rolu, s výnimkou dosahu. V rozmeroch interiéru auta toto nie je podstatné. V popisovanom zapojení je F_CPU=1.2MHz, v zdrojáku požadovaná nosná má frekvenciu 38kHz, reálne však vyjde 40kHz. Overil som, že táto diferencia na použiteľnosti neuberá.

Je potrebné si zvoliť, či bude výstup zapojený priamo na REMO.COMT vstup, alebo cez IR LED. Tomu treba prispôsobiť funkciu programu zakomentovaním (priame zapojenie), alebo uvoľnením (IR LED) #define CONNECTION_IR v main.c, o zvyšok sa postará podmienený preklad.

Funkcie
Všetky známe kódy povelov s popisom správania sa rádia sú spísané v main.c. Je možné si na tlačidlá zavesiť ľubovoľnú z funkcií. Použil som nasledovné:



Program rieši problém so snímaním analógovaj hodnoty stlačenia tlačidiel. Aj keď v zapojení odporového deliča nie sú použité kondenzátory, prechodový dej pri stlačení a uvoľnení tlačidiel, spôsobený kapacitami kabeláže, je dostatočne pomalý a spôsobuje načítanie medzistavov. Okamžité zosnímané napätie ADC prevodníkom môže zodpovedať stlačeniu iného tlačidla. Program preto porovnáva niekoľko krát po sebe výsledok vyhodnotenia a až pri viacnásobnej zhode považuje tlačidlo za stlačené. Program vyhodnocuje aj chybové stavy nepripojenia deliča a skratu, v oboch prípadoch nevyvolá žiadnu akciu. Naopak korektný stav je nestlačenie žiadneho tlačidla, čo vyhodnocuje ako uvoľnenie naposledy stlačeného tlačidla - urobí potrebné akcie týkajúce sa autorepeatu. Samotné vyhodnotenie stlačeného tlačidla je riešené postupným porovnávaním načítanej hodnoty z ADC s definovanými medzami. Na stanovenie medzí som si urobil jednoduchú prepočítavaciu tabuľku (xls), je priložená v programovom balíku.

Pre kompletnosť nastavenie fuses: low=0x2A, high=0xFB. Obrázok je screenshotom z AVR pluginu v Eclipse:




Čo na záver?
Pár fotiek




tento článok je z mikroZONE
( https://www.mikrozone.sk/pluginy/content/content.php?content.70 )