Stap 15: Software
De software is geschreven in C en op basis van een voorbeeld-project van objectieve ontwikkelingen V-USB lib. Dit is een groot stuk van software, en het is gratis en open source voor persoonlijk/niet-commercieel gebruik.
http://www.obdev.at/Products/vusb/index.html
Ik ga niet in detail gaan over hoe de software werkt. De reverse-engineering is de nadruk van dit Instructable. Hier is de korte versie:
U moet twee programma's om dit werk te maken. Een programma op uw computer en firmware voor de microcontroller.
Microcontroller:
De werkelijke RF-uitzendingen wordt gedaan door een interrupt routine. Ik gebruik een timer onderbreken, want dit de gemakkelijkste manier is om precieze timing. De timer-interrupt leest uit een globale buffer waar de vertragingstijden zijn opgeslagen. Ik opslaan niet de aan/uit-status van de RF-zender sinds in- en uitschakelen altijd plaatsvervangers. Ik begin met een puls af, dan in- en uitschakelen pulsen worden afgewisseld.
De buffer bevat 42 waarden. Er zijn 21 bits toegezonden, en elk heeft een lage periode en een hoge periode. Deze configuratie is niet erg efficiënt RAM, maar de ATmega8 heeft overvloed. Ik zal de handel van RAM voor de leesbaarheid van de code in plaats van ongebruikte ram!
De buffer wordt gevuld door de functie send_rf_frame (netwerk, lading). Het vult de juiste tijdsinstellingen in de rf buffer matrix, begint met de startbit, gevolgd door de 12 bits netwerk-id en de 8 bits van lading + controlesom. Wanneer de buffer gevuld, is wordt de variabele buffer positie teruggesteld aan 0, zodat de interrupt routine te werken vanaf bit 0 in de buffer begint zal.
Wanneer gegevens worden verzonden naar de microcontroller via USB, wordt de functie usbFunctionSetup() wordt genoemd. Dit is een functie die u maakt en waar u uw binnenkomende USB code zetten.
Afhankelijk van het type van de aanvraag verzonden vanaf de PC, kan je verschillende dingen binnen deze functie. Ik heb twee aanvraagtypen geconfigureerd, set_network_id en send_command.
Het set_network_id-verzoek alleen neemt de 12 bit netwerk-id verzonden vanaf de computer en slaat deze op in een globale integer-waarde.
Het send_command-verzoek roept send_rf_frame() en geeft de ontvangen opdracht byte aan het. Na dat neemt de interrupt routine.
Binnen de main() lus:
usbPoll(); moet elke paar milliseconden worden genoemd (10 of 50, niet zeker) voor de USB te laten functioneren.
Nadat dat wordt gedaan, is de analoge comparator ingeschakeld. Als de lading pomp spanning te laag is, wordt de lading pomp wordt gestart. Als er op de gewenste spanning, is de lading pomp sluit af.
Tot slot is een status-LED ingesteld op ON als de vlag rf_busy actief is.
Computer:
Aan de computer-kant bewerkt ik ook het voorbeeld geboden door doelstelling ontwikkeling. Voegde ik wat code als u wilt parseren argumenten vanaf de opdrachtregel. Ik schreef ook een functie om de nettolading byte. Duurt het argumenten zoals lamp, aan/uit, uitzending.
Libusb de computersoftware gebruikt om te communiceren met de microcontroller.
Ik heb ook een klein php script om te bellen naar de commandline computerprogramma wanneer knoppen op een webpagina wordt gedrukt. Open de webpagina op uw Android/iPhone en de verlichting! : D