Thursday, March 21, 2013

Världens nördigaste multifjärrkontroll

Nu har jag äntligen tagit mig tid att sätta ihop vad som antagligen är världens nördigaste multifjärrkontroll!
Det hela började med att jag hackade mina RF-fjärrströmbrytare och mina IR-Fjärrkontroller då jag byggde ihop ett fullt fungerande bibliotek över deras funktioner och hur de sänds.

Tanken med multifjärrkontrollen är att den ska ligga ute i vardagsrummet, där IR-diodena är synliga för stereon, TVn och projektorn och RF-sändaren har bra räckvidd till de flesta rum i lägenheten (den når ca 10m).

Specs Fjärrkontrollen
- Strömförsörjningen till fjärrkontrollen sker via en USB-kabel och en vanlig mobilladdare 5V.

-  nRF20L01 2,4 GHz (en annan modell av RF-sändare än den som pratar med fjärrströmbrytarna). Orsaken till det är att det är väldigt lätt att skicka data mellan två nRF24L01 och de har inbyggda funktioner som t.ex. analyserar om datan mottagits mm.  (se min tutorial som går igenom nRF24L01 ochAVR).

- RF-transmitter 433MhZ för att sätta  på/stänga av fjärrströmbrytarna.

- IR-dioder 2st snodda från gamla fjärrkontroller (ebay) skickar kommandon till stereo, TV & projektor.

- Atmega88 microkontroller - hjärtat i fjärrkontrollen, länken mellan nRF24L01 och övriga komponenter.

Prototypbräda 5x7cm - kretskortet

 Byggnation Fjärrkontroll
Efter nån timme med lödpennan så blev resultatet helt ok faktiskt:


ISP-kontaktena längst hitåt är för att kunna programmera Atmega88'an på plats, och linjärregulatorn till höger om nRF24L01 är för att den kräver 3,3V och resten går på 5V. Transistorn vid IR-diodena är för att jag inte ville bränna chippet då jag parallellkopplar två dioder på samma pinne. Den röda lysdioden längst bort är är bara en indikator som säger när fjärrkontrollen skickar kommandon med antingen IR lr RF (kunde inte hålla mig... ;)

Programvara Fjärrkontroll
Programmet är skrivet i AVR (C-programmering) och gör ingenting fören nRF24L01 mottagit ett packet data, då triggar den en interrupt-pin på Atmega88'an som med hådvaru-SPI läser av de tre byten som mottagits.
Den första byten säger vilken fjärrkontroll som ska simuleras, sedan om det visar sig vara en IR-fjärrkontroll så berättar andra byten vilken knapp som ska tryckas, och om det istället är en RF-fjärrkontroll så säger andra byten vilken fjärrströmbrytare som ska kontrolleras. Tredje och sista byten har endast en funktion om det är en RF-kontroll då den säger om den valda fjärrströmbrytaren ska slås av eller på.

Programmet fungerar mycket bra även utan extern kristall på chippet, så jag antar att timingarna inte är så noggranna när det kommer till IR och RF!



Specs Datorkontrollen
nRF20L01 2,4 GHz - för att trådlöst sända kommandon till fjärrkontrollen

USB-COM adapter för att sända kommandon från datorn till Atmega88 (se min tutorial om hur man får det att funka här)

Atmega88 microkontroller - länken mellan USB-COM adapter och nRF24L01.

Prototypbräda 5x7cm - kretskortet

Byggnation Datorkontroll

Datorkontrollen har jag inte lött ihop ännu, den sitter fortfarande på en test-prototypbräda. Den fungerar iaf så att USB-COM adapterns Tx, Rx och GND är kopplade till Atmega88'ans respektive pinne för att möjliggöra USART-kommunikation.




Programvara Datorkontrollen

Atmega88'an gör ingenting fören ett USART-interrupt går igång då datorn försöker skicka något via COM-porten. Atmegan läser då av de tre byten och skickar de direkt vidare via SPI till nRF24L01-modulen, som då sänder ut det till den mottagande multifjärrkontrollen. Efter lyckad sändning går Atmegan tillbaka till att tom-loopa.



Programvara Datorn
Datorns programvara är ett Windows-baserat VB-program som jag har jobbat på ett tag nu som antagligen ska få ett eget inlägg i bloggen när jag få tid lust och ork, men i stort fungerar den såhär:

Programmer ansluter till önskad COM-port, genom att välja ur listan och trycka på den stora knappen (eller som i mitt fall om har en "Silicon Labs CP210x" så ansluter den automatiskt när programmet startar)
Jag väljer att inte returnera inkommande från COM-porten, annars går programmet in i en oändlig loop eftersom Atmegan är satt att returnera det som skickas till den, och det vill jag inte. Jag väljer också att inte vidarebefordra meddelandet som returneras från atmegan till möjliga TCP-clienter. "StopByte" används för att slippa ange längd på packetet som ska mottas från Atmegan som istället är programmerad att skicka en stopbyte efter varje packet (3 byte data + "#")


Nästa tab är TCP-Servern, och den används för att tillåta inkommande data från internet/wifi. Bara att välja port, och trycka på stora knappen som innan hette "Start". Här vill jag faktiskt vidarebefodra inkommande TCP-data till COM-porten för att på så sätt kunna skicka kommandon från internet direkt till Atmegan. Jag har här valt att returnera inkommande meddelandet till TCP-clienten också, då android-appen är gjord så.


Nu på första tabben, där alla kommandon loggas, samt där man kan skriva kommandon i input text-boxen som i nuläget vidarebefodras till COM-Porten. Här visas också om COM-port är ansluten och om TCP-servern är ansluten och hur många clienter som är anslutna.


De övriga flikarna styr var och om all datakommunikation ska loggas, samt vilka funktioner i programmet som ska autostarta och om hela programmet ska autostarta med windows.



Programvara Android
Vad är väl en multifjärrkontroll om den inte kan styras från multi-enheter... jag satte igång och skapade en android-app som via TCP kan skicka kommandon till fjärrkontrollen:



Förstasidan som öppnas är den vänstra, där går man in i TCP-settings och ansluter till rätt IP och Portnr, som jag då sätter till min externa ip-adress för att kunna använda 3G och slippa ansluta till Wifi varje gång jag ska använda appen. Porten jag ansluter till har jag tidigare ställt in i routern såhär så att den forwardar till den rätta porten som ställts in i programmet på datorn.

På förstasidan väljer man sedan att simulera IR eller RF-fjärrkontroller, eller köra förprogrammerade macron där jag bla har ställt in en sekvens som sätter på stereon på AUX, sätter på projektorn och släcker lamporna som sitter på RF-fjärrströmbrytare.

Nästa uppdatering på appen är att man on the fly ska kunna programmera makron som hamnar på de tomma knapparna och sparas. Jag ska också uppdatera datorprogrammet så att det reagerar på vissa kommandon genom att sätta pausa spotify, sätta på XBMC och ändra bildinställningen till projektor-mode.


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

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! =)

Sunday, March 10, 2013

RF Fjärrströmbrytare Hack

Har kommit över ett gäng (~15-20st) fjärrströmbrytare med tillhörande fjärrkontroller. Strömbrytarna har länge legat i en låda för vem orkar ha 5 olika fjärrkontroller liggandes på bordet för att styra diverse lampor??

Jag har länge tänkt att jag ska försöka bygga en gemensam fjärrkontroll till dessa, och när jag nu äntligen fick lite energi att lägga på problemet uppstod vissa frågor:

1) Hur lyssnar man av RF (radio freq.) 433MHz som det står på dem?
2) Hur sänder man ut RF så att man kan simulera fjärrkontrollen?

Vill du inte läsa om mitt inte så lyckade försök, hoppa då ner:

**********************Inte så lyckat försök******************************************
Då jag hållit på en hel del med AVR-programmering, har jag lärt mig använda en modell av RF Transceivers (transmitter och receiver i samma modul) som heter nRF24L01 och sänder datapacket på 2,4GHz-bandet, så tänkte jag att jag skulle kunna få användning av ett par nRF905 (433MHz) som jag faktiskt hade liggande 3st av hemma, då de fungerar på i stort sett samma kod som 24L01'orna (hur jag fick dem att funka blir ett annat inlägg när jag får tid...)
                                                                                     

Jag tänkte att jag på nåt sätt kunde få 905'orna till att avlyssna luften efter RF-data!?
Sagt och gjort (eller snarare försökt) så la jag ner nån timme på att sätta upp, först en trådlös länk mellan 2 905or... Än så länge gick det bra, jag kunde skicka ett paket data från datorn, via en USB-COM adapter, och en Atmega88 till den ena nRF905, som i 433MHz-bandet trådlöst skickade det vidare till den andra 905'an, som tog emot datan, växlade till att bli tranceiver, och skickade tillbaka samma data som då visades på datorn.

                                                                      

Nu tog det tvärstopp... nRFxxx har ett förprogrammerat chip som gör att man först måste skicka/lyssna efter ett antal adressbitar, som iof är programmerbara men går inte att skippa, innan den börjar mottaga datan...
Jag gjorde några halvhjärtade försök att ställa in 905'an som receiver och endast använda 1 adressbyte följt av 32 datapacket-bytes, samtidigt som jag lät den andra skicka 1 adressbyte följt av 1 databyte, samtidigt som jag bombarderade receivern med fjärrkontrollen till strömbrytarna för att försöka få nåt utläst, men det sket sig och gav bara en massa dummy bytes...

Nä nRFxxx är grymma på att skicka data på ett säkert och lätt sätt, men är inte gjorda för den här typen av avlyssningar..

***********************Lyckad metod****************************************
Jag vek mig och började googla och fick lite insperation av denna sida. Så jag beställde ett likadant kit med en receiver och en transmitter från ebay.

                                                                                       

Problemet med hans metod var bara att han hade tillgång till en "Logic Analyzer", som inte jag hade (de kostar ~1200kr)...

                                                            

Skam den som ger sig, jag har ju AVR-chip! =)
Jag byggde min egna logiska analysator genom att med en Atmega88 koppla samman INT0, INT1 och mätpunkten. Aktiverade interruptet genom att sätta en på rising edge och den andra på falling edge... Med en enkel timer kunde jag sedan spara hur många mikrosekunder det var mellan varje upp, respektive nergång, som då lätt skickades till datorns USB via USB-COM adaptern.

Jag hade såklart inte ro i kroppen att vänta in de 3-5v det kan ta för ebay-fynd att dyka upp i brevlådan, framför allt inte efter att ha läst detta...
Efter att ha knäckt upp mina fjärrkontroller visade det sig att en av dem hade en liknande fristående RF-modul som i länken:

Kabelstumparna till vänster är jord (vit) och data (orange) som jag lödde fast. Kablarna till höger kopplade jag på 12v för att batteriet var dött...

Här en bild på den separata RF-modulens baksida


Jag kopplade in min hemgjorda logiska analysator och började logga när jag tryckte på knapp 1,2,3 osv... jag loggade 4ggr/knapp för att kunna se att det överensstämde och efter lite sammanställning i excel fick jag fram detta schema (över knapp 1on/off & 2on/off) som lätt går att se att det finns ett tydligt mönster i!
(Fick inte plats, egentligen är det en lång bild med 4 rader...)



Å tro't eller ej, när jag istället för att lyssna på RF-modulens data-pinne, programmerade om Atmega88'an att skickade ut samma data, ja då kunde jag stänga av/sätta på mina fjärrströmbrytare på första försöket! Det händer ju aldrig annars att det funkar på första försöket! Jag använder inte ens en extern kristall för att få till timingarna exakt på Atmega88'an!

Ska tilläggas att min hemmagjorda logiska analysator var lite flaky... det krävdes mer än ett försök att få till bra mätvärden, så jag blev mer och mer sugen på att införskaffa en vettig pryl, å efter lite sök på ebay hittade jag den här, som efter att ha läst om den verkade som ett trevligt alternativ för 75kr (ist för 1200kr), ett stycke beställdes tillsammans med kablar och prober. (Uppdaterad version för 64-bit datorer och som funkar med nyaste programvaran från Saleae Länk)

                             

Efter att ha sett hur den fristående RF-modulens data-pinne satt i förhållande till transistorn mm, så gjorde jag lite kvalificerade gissningar, och lyckades hitta var datan skickades (från chippet till RF-out) även på de andra fjärrkontrollerna. Efter lite piller-lödning lyckades jag sampla även deras data.
Grön kabelstump är data där jag hittade data och brun ute till höger är jordningen.
Denna kontroll (märke: Proov sys 2000) hade en knapp för att byta mellan 4 olika kontroller (de fyra svarta fälten till höger på bilden), och med 3 knappar/kontroll och då såg det ut såhär efter lite sammanställning:


Även dessa fick jag att fungera genom att programmera Atmega88'an och mata ut signalerna på den första fjärrkontrollens RF-modul (som fortfarande satt på kontrollen)! Den sista kontrollen var från jula, och den kunde jag läsa av, men fick aldrig att fungera tills min logiska analysator från ebay dykte upp och det visade sig att det var delayen som inte riktigt stämde!

Nu när jag äntligen hade listat ut vad som skickades, och hade t.o.m lyckats skicka datan via den första fjärrkontrollens rf-modul kunde det bara bli bättre! RF-modulen som jag beställt från ebay landade i brevlådan och fungerade även den out of the box! Skönt med tanke på att den separata RF-modulen från fjärrkontrollen krävde 12v som jag krånglade fram ur en 20v stor klumpig gamal skrivar-adapter...

Även den logiska analysatorn damp ner i lådan och efter att ha letat igenom några av länkarna på ebay så hittade jag en som länkade till programmet (en äldre version av saleaes logic, många mappnamn på kinesiska). Som bloggen jag pratade om förut går igenom så funkar inte analysatorn med nyare versione, en bummer då den enda gamla versionen jag har fått tag på bara funkar med 32bitars operativsystem...

Tog fram en äldre 32-bitars laptop, och där funkade allt perfekt! (installerade bara setuppen som i mappen "saleae") och behöll jumpern på! Försökte länge hitta en metod som får den att funka på 64 bitar, men då tror jag man måste byte EEPROM enligt detta hack...



Här är en bild på programmet när jag sniffar lite på en ir-fjärr (en vanlig TV-dosa).

Gör inte samma misstag som jag, som råkade komma åt 12v-kabeln som driver RF-dosan jag har med en av proberna... som framgår av bilden ovan är alla prober som inte används höga (5V) förrutom ettan som är bränd och har gått låg! nu har jag bara en 7-kanals analysator, och det verkar som att kanalen "smittar av sig" till andra kanaler vilket den inte gjorde innan jag brände ettan... ;) kanske kan vara smart att göra som killen på hack-sidan ovan föreslår ändå:

                                                                     


Skulle jag verkligen behöva 8 fräscha kanaler nån gång i framtiden får jag väl lägga ut 75 kr på en ny då... ;)

När jag nu hade ett fullt fungerande RF-bibliotek till mina strömbrytare samt en logisk analysator tänkte jag att det var på tiden att bygga en ultranördig multifjärrkontroll (RF & IR) som styrs med android... kommer i nästa inlägg!

Om nån mot förmodan skulle läsa det här och vara intresserade av hur nåt av stegen gick till mer i detalj, så skriv en kommentar så ska jag förklara!