Reverse engineering: USB kontrollerade hemautomation hacka (15 / 19 steg)
Steg 15: programvara
Mjukvaran är skriven i C och utifrån ett exempel projekt från mål utveckling V-USB-lib. Detta är en stor bit av programvara, och det är gratis och öppen källkod för personlig/icke-kommersiellt bruk.
http://www.obdev.at/Products/vusb/index.html
Jag tänker inte gå in i detalj på hur programvaran fungerar. Reverse engineering är betoningen av detta Instructable. Här är den korta versionen:
Du behöver två program att göra detta arbete. Ett program på datorn och firmware för mikrokontroller.
Mikrokontroller:
Faktiska RF överföringarna görs genom en avbrott rutin. Jag använder en timer avbryta eftersom detta är det enklaste sättet att få exakt timing. På timer avbryta läser från en global buffert där fördröjningstiderna lagras. Jag lagra inte på/av status för RF sändaren sedan på och av alltid suppleanter. Jag börjar med en off puls, då alternativa på och av pulser.
Bufferten innehåller 42 värden. Det finns 21 bitar som skall överföras, och alla har en låg period och en hög tid. Denna konfiguration är inte mycket RAM effektiv, men ATmega8 har gott. Jag ska handla RAM för koden läsbarhet i stället för att oanvända ram!
Bufferten fylls av funktionen send_rf_frame (nätverk, nyttolast). Fyller i rätt timings i matrisen rf buffert, börjar med den startbit, följt av 12 bitar nätverks-id och 8 bitar av nyttolasten + kontrollsumma. När bufferten är fylld återställs variabeln buffert position till 0, så att avbryta rutin kommer att börja arbeta från bit 0 i bufferten.
När data skickas till mikrokontroller med USB, kallas funktionen usbFunctionSetup(). Detta är en funktion som du skapar och där du sätter din inkommande USB-kod.
Beroende på begäran skickas från datorn, kan du göra olika saker inuti funktionen. Jag har två begäran typer konfigurerad, set_network_id och send_command.
Set_network_id begäran bara tar 12 bit nätverks-id skickas från datorn och lagras i en global heltalsvärde.
Send_command begäran kallar send_rf_frame() och passerar den mottagna kommandobyte till den. Efter det tar avbryta rutin över.
Inuti main () loop:
usbPoll(); har att kallas varje några millisekunder (10 eller 50, inte säker) för USB att fungera korrekt.
Efter det är gjort, kontrolleras den analoga motsvarigheten. Om pumpen laddningsspänningen är för låg, startas avgift pumpen. Om det är på den önskad spänningen, är avgift pumpen avstängd.
Slutligen, en status LED är satt till ON om flaggan rf_busy är aktiv.
Dator:
På den dator sidan ändrade jag också exemplet som tillhandahålls av syfte utveckling. Jag lade till lite kod för att tolka argument på kommandoraden. Jag skrev också en funktion för att skapa den payload byten. Det tar argument som lampa nummer, på/av, TV-sändning.
Datorprogram använder libusb för att kommunicera med mikrokontroller.
Jag skapade också ett litet php-script för att ringa commandline programmet när du trycker på knappar på en webbsida. Öppna webbsidan på din Android/iPhone och kontrollera lamporna! : D