Saturday, March 16, 2013

IR fjärrkontroll Hack

Här kommer en redogörelse för hur jag lyckades hacka mina IR-fjärrkontroller som tillsammans med de redan hackade RF-kontrollerna tog mig ett steg närmare den ultimata nörd-fjärrkontrollen ;)

Då jag nu hade tillgång till min logiska analysator var det svårare än att leta reda på de där gamla IR-mottagarna som jag beställt nån gång för länge sen på ebay ;)

                                                                                 

IR-mottagarna är världens simplaste grej! Mata med 5V på högra benet (framifrån), jord på mittenbenet, så kommer vänstra benet vara hög tills en IR-diod lyser på den (lr snarare blinkar på den i 38kHz), då går vänstra benet lågt tills blinkningarna slutar.

Börja med att ställa in en kanal av den logiska analysatorn på  0 (den börjar spela in när kanalen jordas) och koppla in kanalens probe på vänstra benet av IR-mottagaren, och jord-proben på mitten. Nu är det bara att sikta en fjärrkontroll å skjuta några gånger! Då ser det ut så här:

                               

Lite förstoring på en av signalerna, samt sampling från 3 olika knappar kan se ut så här:


Jag hade tyvärr ingen IR-diod liggandes hemma, så det blev till att offra en gammal fjärrkontroll som ändå inte användes för att kunna testa om jag verkligen lyckats...
Tydligen ska man vara lite försiktig när man kopplar in IR-dioder, de flesta går på lägre än 5v, men den jag hade var 5v!
Ett bra test man kan göra för att inte paja dioden man hittat är att ta upp mobilkameran och rikta den mot en vanlig fjärrkontroll medan man trycker på en av knapparna. En mobilkamera registrerar nämligen IR-ljus som lila-vitt ljus som då syns, lägg märke till hur starkt det är. Gör sedan samma sak med dioden du hittat när du kör ~1,5v, lyser den för lite så testa 3v, å annars se så den inte lyser för starkt på 5v!

Om man kollar på signalerna ovan, så struntar mottagaren i att skicka ut 38 kHz, utan visar bara konstant jord om den tar emot en ljussigna, eller konstant 5v om den inte... för att mottagaren ska förstå IR-signalen måste koden använda s.k. "manchester encoding" som ser ut så här (timingarna är inte samma på min!):

                                                                                 

Nu till det lite kluriga, hur matar jag ut 38 kHz???
Som i tidigare hacks så använder jag mig av en Atmega88, och det visade sig inte vara svårare än att köra vanliga _delay_us(); med 13us på och 13us av, eftersom 1/38000 ~=26us. Noggrannare än så behövdes tydligen inte (inte heller denna gång kör jag med extern kristall, å funkar klockrent ändå)


Funktionen tar in en integer ("i") som bestämmer hur många gånger loopen ska köra, så längden på signalen = 26*i.

Nu var det bara att sätta sig ner och spela in alla fjärrkontroller jag ville ha för att skapa mig ett bibliotek av simulerade knapptryckningar.

Jag har länge stört mig på att vi inte har någon fjärrkontroll till stereon vi har i vardagsrummet som används när vi tittar på film på projektorn, sjukt drygt att resa sig upp å sätta på den eller att gå fram och sänka mm. Så när jag var klar med mitt IR-bibliotek så störde jag mig lite på att den saknades... chalange accepted!!

Jag hade en gammal multifjärr hemma som hade en kod som faktiskt fungerade halvhyffsat på stereon. Dvs tryckte man på en konstig knapp så sattes radion på, och man kunde faktiskt sänka och höja med den, så jag utgick från inspelningarna jag hade av de knapparna (faktiskt de som syns i den inzoomade bilden en bit upp) så jag började med min analys:

1. Självklart började jag med att försöka se ett mönster, och göra smarta gissningar för att hitta rätt kod... jag är ovanligt rik på tålamod, men gav rätt snabbt upp efter att ha sett att alla andra fjärrkontroller inte alls hade nån logik i sig.

2. Nu återstår brutal force ;)

3. Antar att alla signaler börjar med en hög (syns som låg på mottagaren). Det ger 26 höga/låga, vilket är 2^26 = 67108864 möjliga kombinationer aoooo ;(

4. Nu till min revolutionerande upptäckt: tas första biten bort, kommer de ALLTID i antingen låg=>hög, eller hög=>låg, aldrig hög=>hög eller låg=>låg!

Denna upptäckt ger 2^13 = 8192 möjliga kombinationer, vilket är en reducering med 99,987 % =) Har jag dessutom väldigt tur, så gissar jag rätt när jag antar att alla koder börjar på låg=>hög (efter startbiten och ur sändarens perspektiv), då alla tre hittills fungerande koder börjat så. Det skulle isf betyda 2^12 = 4096 olika kombinationer att testa för att hitta rätt =)

Sagt och gjort, jag tillverkade (en mycket smart kod om jag får säga det själv) som loopade igenom de 8192 kombinationerna med 3s mellanrum (märkte rätt snabbt att om jag bara körde med ca 200ms mellanrum så reagerade inte stereon på de värden som de annars brukade (1066 = Vol-)


Så de 8192 kombinationerna tog alltså ca 8192*3/3600 ~=6h, men då jag hade rätt med att allt fanns inom 4096, så tog det bara 3h! =) jag behövde ju inte vara så aktiv, mer än att hålla ett öga på när det hände något, och om det var det jag ville åt så kollade jag vad USARTen rapporterat till datorn! =)

Nu när jag har ett komplett bibliotek med både RF och IR fjärrkontroller är det dags att börja tänka multifjärrarnas multifjärrkontroll!

Om nån vill ha mer info, så skriv en kommentar! =)

No comments:

Post a Comment