IPhone-kontrollerade Entertainment Center (22 / 24 steg)
Steg 22: Arduino programvara
Det fanns en hel del debatt om hur exakt du partitionera programvaran mellan Arduino och iPhone app. Men först ska jag ge lite bakgrund om det systemet som vi använder.Arduinoen ansluter till vårt hem wifi nätverk och sätter upp en trådlös server. IPhone ansluter till servern och kommer att skicka någon form av information till Arduino beroende på indata från användaren.
Anledningen till att jag säger "någon sorts information" är eftersom det finns egentligen två typer av kommandon som vi kan skicka, hög nivå och låg nivå. Låga nivån kommandon skulle vara olika knapptryckningar på en avlägsen, som "slå på TV: N på" eller "slå upp en klick på förstärkaren". Höga nivån kommandon är buntar av dessa låg nivå funktioner som "Titta på DVD". Detta kommando måste slå på DVD-spelare, förstärkare och TV, sedan öppna den DVD driva, sedan inställd inställningen rätt ingång på förstärkaren, och ställa in TV: N till rätt ingång inställning, bör det också kontrollera att amp volymen är på en rimlig nivå, etc. Det finns en hel del information och kommandon instoppad i "Titta på DVD". Och så frågan är: skickar vi hög nivå kommandon till Arduino, och sedan den Arduino programvaran bryter ner dessa kommandon i alla separata låg nivå kommandon? Eller å andra sidan, vill vi göra allt av fördelningen i de låga kommandona på iPhone app och skicka individuella låg nivå kommandona ner till Arduino, som bara kör dem?
En annan fråga är. Varje låg nivå kommandot har en ~ 200 siffriga lista med tal som motsvarar en PWM kod för IR-LED som faktiskt ansvarar för att överföra informationen till oavsett medieenhet vi pratar med. Förvarar vi denna lista på Arduino eller iPhone app? (mer om denna typ av signal senare i det här steget).
Det enklaste och mest effektiva man kan göra skulle vara att lagra allt på Arduino. Detta sätt, vi behöver bara skicka en liten mängd information över trådlösa, och eftersom Arduino gör all bearbetning, det skulle vara lätt att styra allt från en webbsida precis som iPhone app. (om iPhone var skicka låg nivån kommandon via trådlös, sedan webbsidan skulle behöva göra samma sak och det skulle vara besvärligt att använda).
Dock den Arduino Uno endast har ca 32 kb minne ombord (vi ursprungligen med en Uno innan du byter till Mega). Det finns en micro SD kortläsare på wifi skölden, och vi planerar att använda som för att lagra vissa overflow data, men vi kunde inte få det att fungera.
Arduino Mega har mycket mer minne, ca 128 kb, men vi försökte använda den för att styra IR LEDs och det fungerade inte. Vi spårat problemet att slingan i koden som skapar bärvågsfrekvensen för IR-signalen. Låt mig förklara hur signalen faktiskt genereras och skickas:
Det fungerar mycket som en AM-radio. IR-LED: n blinkar på en viss bärvågsfrekvens (32 kHz), och sedan finns det en fyrkantsvåg ingraverad över det som faktiskt bär informationen. De listor som vi använder för att lagra informationen som kommandot ser ut något som [300, 50, 200, 60]. Detta innebär aktivera bärvågsfrekvensen för 300 millisekunder, och sedan stänga av den för 50, sedan slå på den för 200, och av 60. Varje kommando signal är faktiskt på väg 50 i kommandona "on-off".
Nu, för att faktiskt generera en signal som denna med Arduino, behöver du en funktion som matar ut bärfrekvensen, och sedan en annan funktion som anropar funktionen bärare vid rätt tid och rätt länge. Eftersom alla dessa Tidsproblem har så hög upplösning, är det också nödvändigt att anropa en funktion som berättar Arduino inte att göra något annat alls under denna process, att tidpunkten är mycket exakt. Annars skulle signalen inte identifieras av oavsett vilken enhet du är pekat det på, som en DVD-spelare till exempel.
Som jag sa, var problemet vi hittade i byte från Uno till Mega i funktionen bärare frekvens. Denna funktion har ett par digitala skrivkommandon som faktiskt generera signal, men den har också ett par förseningar så att sammantaget funktionen körs på rätt frekvens. Nu, en digital Skriv kommandot på en Uno faktiskt tar ca 3 millisekunder för att köra, så du måste räkna detta i när bestämma hur långa förseningar bör vara. Men en digital Skriv kommandot på en Mega tar lite längre tid, och så, när vi sätter Uno koden på Mega, vi genererar en felaktig bärfrekvens! Tack vare min pappa som listat allt detta ut.
Så, med detta problem fast, vi kunde övergå till att använda en Mega. Detta var bra eftersom den inte bara gav oss alla minne vi behövde (hoppas vi) att lagra alla låg nivå kommandot bryts ner och andra logik på Arduino, men också gav oss mer stift att arbeta med.