Potenciometr na dálkové ovládání

Do nového lampového zesilovače jsem si postavil dálkově ovládaný potenciometr. Je to infračervený přijímač, který ovládá krokový motor, nasazený zezadu na potenciometr. Vzhledem k rozmanitosti infračervených dálkových ovladačů - viz níže - berte tenhle článek jenom jako inspiraci. Bez určitého laborování tohle zařízení s jiným ovladačem než mám já asi nerozchodíte. Minimálně to chce na odladění digitální osciloskop a taky trochu znalostí z programování mikrokontrolérů. Jinak, pokud se rozhodnete si tuhle srandičku postavit, vám přeju hodně zábavy.

IR_Pot IR_Pot

Infračervený přijímač

Použil jsem šrot z nějaké staré televize. Ale tyhle přijímače jsou nové za pár korun běžně k dostání. Než ho koupíte, akorát si dejte pozor, jakou frekvenci nosné vysílá dálkový ovladač, který chcete použít. A vůbec, problematika infračervených dálkových ovladačů je na Internetu popsaná na mnoha místech, tak se pokusím zbytečně neopakovat, co už napsali jiní...

Já budu používat ovladač k televizi. Myšlenka je jednoduchá - když koukám na televizi, tak neposlouchám muziku a obráceně. Takže mi nevadí, že budu mít jeden ovladač na dvě zařízení. Televize je už docela stařena - Grundig ST70-270. A tady jsem narazil. Googloval jsem ve snaze nalézt popis protokolu, ale neúspěšně. Nakonec bylo jednodušší udělat trochu zpětného inženýrství. Protokol je podobný protokolu RC-5, ale opravdu jenom podobný. Používá kódování Manchester a telegram má délku 13 bitů. Délku bitu jsem naměřil 1.06 ms, po prvním bitu jsou dva bity vynechány, potom následuje 10 bitů - start bit, 8 bitů data a 1 bit zřejmě parita. Toggle bit, jak ho popisují u RC-5 jsem tady neobjevil. Ovladač při stisknutí pošle v datech nejdříve samé nuly (nebo jedničky ?) a potom příslušný kód. Při držení tlačítka už opakuje pouze kód v intervalu cca 100 ms.

Grundig protokol

Přijímač je samoučící. Přepnutím do režimu učení přijímá povely a ukládá je do mezipaměti. Pokud přijme pětkrát za sebou tentýž kód, uloží si ho do EEPROM. Režimy učení jsou dva - pro zesilování a zeslabování. Je to velmi primitivní. Nejdříve jsem se snažil to udělat nějak univerzální, pro různé typy ovladačů - tedy i pro různé způsoby kódování a různé protokoly. Něco podobného řeší Michal tady. Ale neměl jsem s tím moc velký úspěch. Použil jsem hodně jemné vzorkování a zhruba 20 ms od začátku telegramu jsem sejmul do 10 bytů. Problém byl v tom, že to nefungovalo spolehlivě. Přijímač měnil šířku pulsů. Když byl vysílač daleko, byly pulzy užší. Nebylo to nijak výrazné, ale stačilo to k tomu, že pokud se přijímač naučil kód ze vzdálenosti 30 cm, nerozpoznal ho na metr a obráceně. Takže jsem nakonec ustoupil a udělal snímání pouze pro tento protokol. Od první hrany odpočítám ty první nezajímavé bity a potom snímám vzorky vždy ve čtvrtině bitu. Sejmu 8 bitů - paritu ignoruju. Funguje to velmi spolehlivě, ale jsem si vědom toho, že až budu chtít vyměnit ovladač za jiný typ, bude to téměř určitě zase vyžadovat trochu bádání.

V učícím režimu je potřeba nějak dát najevo, jestli se nový kód podařilo uložit do paměti. Použil jsem k signalizaci krokový motor. Pokud do něj pustím akustický kmitočet, motor se nehne, ale zapíská. Není to nijak silný zvuk ale dostatečně slyšitelný. Pokud by vám motor nepískal, asi by šlo připojit paralelně k jedné z cívek malé piezo. Při neúspěšném porovnání právě přijatého povelu s předchozím, jednotka pípne krátce vyšším tónem. To se stane vždy při přijetí prvního kódu - není s čím porovnávat. Pokud se podaří kód úspěšně ověřit a uložit do paměti, pípne jednotka nižším a vyšším tónem.

Krokový motor

Měl jsem doma několik let krokový motor z nějaké tiskárny, tehdy mi bylo líto ho vyhodit, teď se hodil. Takže celé zapojení jsem přizpůsobil tomu, co bylo k dispozici. Motor je dvoucívkový, na 5 V, má krokový úhel 7,5 °, tedy 48 kroků na otáčku. Když odečteme mrtvý úhel potenciometru, prakticky zůstává 40 regulačních kroků. Bylo by lepší sehnat motor s jemnějším krokováním, ale co se dá dělat. Obrovskou výhodou je, že motor je spojený s hřídelí potenciometru přímo. Mechanicky je to velmi jednoduché a tedy i velmi spolehlivé. Koupil jsem potenciometr, který má hřídel přístupnou i zezadu a má tam šlic pro šroubovák. Na motoru byl mosazný pastorek - ten jsem tam nechal a napájel na něj mosaznou válcovou hlavu se šlicem odříznutou ze šroubu M4. Mezi motor a potenciometr jsem vložil spojku vyříznutou z cuprextitu, která zapadá do obou šliců - je samozřejmě nutné proti sobě motor s potenciometrem dobře uchytit, co nejlépe v ose. Pokud motor není pod napětím, klade otáčení jenom velmi malý odpor, dělá navíc kroky, jak tomu bývá u drahých přístrojů.

IR_Pot

Řídící jednotka

Elektricky je to velmi primitivní obvod - chuchvalec několika součástek kolem procesoru. Srdcem řídící jednotky je procesor PIC 12F629. Hardwarově je využitý na 100%. Je tak využitý, že na přepínání režimu mi zbyl už jenom jeden vstup. Použil jsem proto analogový komparátor s vnitřním referenčním napětím. Vstup je v normálním režimu držený odporovým děličem na polovině napájecího napětí. Při učení se propojkou připne na 5 V resp. na nulu. Jedním vstupem tak lze rozlišit tři stavy (komparátor by zvládl mnohem víc). Procesor běží s vnitřním oscilátorem. I díky tomu je celé zapojení tak jednoduché, že už asi jednodušší být ani nemůže.

Motor bere asi 400 mA. Výstupy z procesoru jsem proto posílil koncovým stupněm z tranzistorů BC639/BC640. Úbytek napětí na koncovém stupni motoru moc na síle neubral. Celé zapojení je minimalistické.

Stabilizátor by si možná zasloužil nějaký menší chladič. Pokud se motorem hýbe pár vteřin, tak to nevadí. Ale při testech, kdy jsem nepřetržitě točil motorem několik desítek vteřin, už se docela výrazně ohřál.

Tišťák je malý a velmi jednoduchý. Radši jsem tam nasázel pár propojek, než se proplétat cestičkama mezi vývody součástek. No, na kladenské průmyslovce by mě za to asi vyloučili ze školy :-)


Firmware

Program jsem napsal v assembleru. Je docela jednoduchý. Zdroják je v archivu, který je ke stažení na konci stránky. Je tam i přeložený HEX soubor. Jenom chci upozornit - při programování si dejte pozor, abyste nepřišli o kalibrační hodnotu vnitřního oscilátoru, která je uložená na poslední pozici programové paměti.

Hlavní smyčka programu jenom odpočítává délku pulzu do krokového motoru, po jejím uplynutí výstup vypne. Takže v klidu se vlastně pořád dokola jenom nulují výstupy a resetuje časovač watchdogu.

Pokud začne přicházet povel, hrana na vstupu z infračerveného přijímače aktivuje přerušení. Tam se odehrává téměř všechno. Rutina příjmu povelu odpočítá tři a čtvrt bitu a sejme ze vstupu další vzorek, potom vzorkuje dále po bitu až sejme celkem 8 vzorků - ty se odrotují do vstupního bufferu. Protože jsem původně plánoval delší buffer, je to napsané pro pole s volitelnou délkou. Využívá se tedy v tuto chvíli pole s délkou jeden byte. Po přijetí povelu se sejme a vyhodnotí vstup pro volbu režimu: pracovní - učit zeslabování - učit zesilování a provede se skok do příslušné rutiny.

V pracovním režimu se obsah vstupního bufferu porovná s daty v EEPROM pro jednotlivé povely a při nalezení shody se povel vykoná. Respektive se na výstupech nastaví příslušná kombinace a nastaví se proměnné časovače. Tím přerušení končí. O uvedení výstupů do klidu se postará časovač v hlavní smyčce programu.

V režimu učení se provede porovnání právě přijatého povelu s předchozím. Pokud dojde ke shodě, odečte se počítadlo úspěšných pokusů. Pokud toto počítadlo dojde na nulu, přijatý povel se zapíše do EEPROM, na pozici zvolenou učícím režimem. Pokud ke shodě nedojde, počítadlo pokusů se nastaví na maximální počet pokusů a buffery pro nový a předchozí povel se prohodí. Vyřešil jsem to pomocí nepřímého adresování. V paměti jsou dva buffery a dvě proměnné ukazatelů. Při startu se každý z ukazatelů naplní adresou jednoho z bufferů. Potom stačí prohodit hodnoty těchto dvou ukazatelů. V tuto chvíli to asi postrádá trochu smysl, ale při původně plánované délce 10 bytů to bylo výrazně lepší řešení, než data kopírovat z jednoho bufferu do druhého. No a přerušení končí, čeká se na přijetí dalšího povelu.


tady je ke stažení celý projekt v Piklabu

P15/1, K15 - prosinec 2006, naposledy aktualizováno: leden 2024