Android-styrda pneumatiska kanon drivs av Arduino (9 / 11 steg)
Steg 9: Programmera din Arduino
Hela källkoden Arduino är ansluten. Om inte du är intresserad av ändrande den eller lära sig hur det fungerar, kan du bara hämta och distribuera den. Om du vill se hur det fungerar, Läs igenom detta steg och sedan bläddra igenom koden.
Start i evt_loop.cpp, anropar programmet först evt_loop_init. Då, upprepade gånger samtal event_loop_proc på obestämd tid, tills Arduino förlorar makt. Titta på dessa två funktioner, ser du att de flesta av Arduino koden är centrerad kring idén om meddelandeköer . Meddelandeköer är användbart i situationer där ett system måste prata med en annan i en asynkron sätt. I vår situation har vi ett Bluetooth-modem som kan ta emot data när som helst. I allmänhet går mycket arbete in i att se till att data aldrig försvinner, oavsett vad enheten gör när meddelandet anländer. Tack och lov, Arduino Uno har en inbyggd 128 byte maskinvara seriell buffert. Eftersom var och en av våra Bluetooth meddelanden 1 byte, kommer denna buffert förmodligen vara mer än tillräckligt för vårt program. Så sitter vår ansökan i en loop, väntar på ett meddelande för att komma in från Bluetooth. I en kommersiell produkt är det typiskt för mikrokontroller att gå in i ett lågenergi / viloläge här att spara energi. För enkelhetens skull gjorde vi inte det här (se bt.cpp's bt_wait_for_msgs funktion).
När ett meddelande anländer till Bluetooth kö (se bt.cpp's bt_check_for_msgs funktion), data läses i och lagt till en meddelandekö tillägnad hantering av data kommer in från Bluetooth-modulen. Vi gör detta eftersom vi ville att våra microcontroller att vara fri att göra andra saker när det inte hanterar meddelanden. Meddelandekön är som en brevlåda. Nästa gång programmet får en chans, ska det kolla postlådan och se om det finns några meddelanden för den. Inte använda en meddelandekö är som skriker högljutt från andra sidan rummet. Allt skulle i så fall måste sluta och tjänsten omedelbart kommandot innan han återvände till vad det gjorde. Msgq_push returneras (definieras i msgq.cpp) en mängd svarskoder (definieras i msgq.h) som indikerar ett olika antal kö villkor. Till exempel om programmet aldrig kollat sin postlåda, är det möjligt för denna kö att fylla upp. I så fall skulle svar värdet visar att kön var full. Detta möjliggör felhantering, som är en viktig del av inbäddade systemutveckling.
Tillbaka i evt_loop_proc läses meddelandet in i en lokal variabel. Dessutom skickas en pekare till en svarstyp i. Et-tecknet (&) före den variabla rsp innebär rsp's adress i minnet att paseed i msgq_pop, i stället för dess värde. Om du inte har hört talas om detta begrepp innan, IBM vet mycket om det, och de skulle älska att avslöja denna information till dig. Den här pekaren berättar msgq_pop en plats i minnet där det kan sätta svar värdet. Det är ungefär som ett sätt att få en funktion för att returnera två värden--meddelandet, och status.
Efter att meddelandet från kön (liknar ta brevet ur brevlådan), kontrolleras svaret. Om åtgärden inte lyckades, hela Bluetooth meddelandekön återställs och programmet fortsätter. Det är egentligen inte en hel del annat programmet kunde göra i detta tillstånd.
Om programmet gör det förbi det fel baksidan, ser det på värdet av meddelandet. Om meddelandet var en '1', hanterar den en relä. Om det var en '2', hanterar den annan. Något annat, och det ignorerar meddelandet.
Vår enhet har inte en manometer, så det finns inget sätt för Android app att veta om materialet i burkarna är trycksatt eller inte. Som ett resultat, är hänsyn nog tryckluft, det möjligt för ännu vara tillräckligt Tryck vänster att skjuta två gånger utan att behöva fylla på tanken. För att ta hänsyn till detta, Stäng reläet Arduino en sekund efter det öppnas. Detta förhindrar extra luft slösas fat är tom. Koden som hanterar växla reläer finns i relay.cpp.
För att hantera denna automatisk stängning, använder vi en timer. De flesta mikrokontroller har hårdvara timers för hög precision timing, så i det här exemplet är en bra introduktion. Ta en titt på timer.h och timer.cpp om du vill veta mer om hur timern fungerar. När ett giltigt Bluetooth meddelande har tagits emot, motsvarande reläet är omedelbart stängt (evt_loop.cpp's evt_loop_proc funktion), vilket gör att nuvarande att flöda från batteriet till sprinkler ventil. En timer är sedan, upphör att gälla på en sekund (1.000.000 mikrosekunder i koden). Callback-funktionen ange sedan vara evt_loop_handle_timer, som modulen timer kommer att kalla när den angivna tiden har förflutit.
Inuti evt_loop_handle_timer öppnas båda kavlarna, som stoppar flödet av luft från båda burkarna. Vi tänkte att detta skulle vara det enklaste sättet att ta. När ett kommando har behandlats, evt_loop_proc kallas igen (från cannon.pde) och processen upprepas.
När din Arduino är programmerad, startar det automatiskt köra ditt program när du tillämpar kraft via en 9V batteri.