Stap 22: Arduino Software
Er was veel discussie over hoe precies te partitioneren van de software tussen de Arduino en de iPhone app. Maar eerst zal ik wat achtergrond geven op de regeling die wij gebruiken.De Arduino verbonden met ons netwerk van huiswifi en een draadloze server ingesteld. De iPhone verbinding met die server en stuurt een soort van informatie naar de Arduino afhankelijk van invoer van de gebruiker.
De reden dat ik zeg "soort informatie" is omdat er eigenlijk twee soorten opdrachten die we sturen kunnen, hoge niveau en laag niveau zijn. Lage niveau opdrachten zou verschillende knooppersen op een afstandsbediening, zoals "de TV op" of "het volume omhoog één klik op de versterker uitschakelen". Hoog niveau opdrachten zijn bundels van deze lage functies, zoals "Watch DVD". Deze opdracht moet inschakelen op de DVD-speler, versterker en TV, open de DVD-schijf, dan het amp ingesteld op de juiste ingang instelling vervolgens, zet de TV op de juiste ingang instelling, daarnaast moet worden gecontroleerd om ervoor te zorgen dat het volume van de versterker is op een redelijk niveau, enz. Er is een heleboel informatie en opdrachten gevuld in "Watch DVD". En dus, de vraag is: sturen we hoog niveau opdrachten naar de Arduino, en vervolgens de Arduino software breekt deze opdrachten in alle afzonderlijke laag niveau opdrachten? Of aan de andere kant, we doen alles voor de verdeling naar de laag commando's op de iPhone app, en stuur die afzonderlijke laag niveau opdrachten tot de Arduino, die deze gewoon worden uitgevoerd?
Een andere vraag is dit. Elke laag niveau opdracht heeft een lijst van de ~ 200 cijfer van getallen die overeenkomen met een PWM-code voor de IR-LED die eigenlijk verantwoordelijk voor het overbrengen van die informatie naar welke media-apparaat we zijn in gesprek met is. Wij deze lijst opslaan op de Arduino of de iPhone app? (meer over dit soort signaal verderop in deze stap gezegd).
De gemakkelijkste en meest efficiënte ding om te doen zou zijn om op te slaan alles op de Arduino. Op deze manier moeten wij slechts een kleine hoeveelheid informatie sturen over wireless, en aangezien de Arduino alle de verwerking doet, zou het gemakkelijk om te controleren alles van een webpagina, net als de iPhone app. (als de iPhone was het verzenden van laag niveau opdrachten via draadloze, dan de web-pagina hebben zou hetzelfde te doen en het zou lastig te gebruiken).
De Arduino Uno heeft echter alleen ongeveer 32 kb geheugen aan boord (we gebruikten oorspronkelijk een Uno voordat u naar Mega). Is er een micro SD-kaartlezer op de wifi-schild, en we waren van plan over het gebruik van die voor het opslaan van sommige van de gegevens van de overloop, maar we het werkend kon krijgen.
De Arduino Mega heeft veel meer geheugen, ongeveer 128 kb, maar we geprobeerd met behulp van het bepalen van de IR LEDs en werkte het niet. We het probleem aan de lus in de code die de draaggolffrequentie voor het infrarood signaal genereert opgespoord. Laat het me uitleggen hoe het signaal eigenlijk is gegenereerd en doorgegeven:
Het werkt een stuk als een AM-radio. De IR-LED knippert bij een bepaalde draaggolffrequentie (32 kHz), en dan is er een blokgolf bovenop dat dat eigenlijk bestemd is voor de informatie. De lijsten die zijn we met behulp van de opdracht gegevens opslaan lijken iets [300 50, 200, 60]. Dit betekent de draaggolffrequentie voor 300 milliseconden, inschakelen dan uitschakelen voor 50, vervolgens zwenking op weerom voort voor 200, en uit voor 60. Elke stuursignaal is eigenlijk ongeveer 50 van deze 'on-off'-opdrachten.
Nu moet je wilt eigenlijk genereren een signaal uitzien met Arduino, een functie die de draaggolffrequentie uitgangen, en vervolgens een andere functie die de vervoerder functie aanroept op het juiste moment en voor de juiste duur. Aangezien al deze kwesties timing dergelijke hoge resolutie hebben, is het ook noodzakelijk om een functie die de Arduino niet te doen iets anders helemaal tijdens dit proces vertelt, ervoor te zorgen dat de timing zeer nauwkeurig is roepen. Anders zou het signaal niet worden herkend door welk apparaat u bent wees het op, zoals een DVD-speler bijvoorbeeld.
Zoals ik al zei, was het probleem dat we vonden in het overschakelen van Uno naar Mega in de functie van de frequentie vervoerder. Deze functie heeft een paar digitale schrijven opdrachten die eigenlijk het genereren van het signaal, maar het heeft ook een paar vertragingen, zodat over het geheel genomen de functie op de juiste frequentie uitvoert. Nu, een digitale schrijven commando op een Uno eigenlijk duurt ongeveer 3 milliseconden uit te voeren, zodat u dit moet factor in het bepalen hoe lang de vertragingen wanneer moet worden. Echter, een digitale schrijven commando op een Mega duurt een beetje langer, en zo, wanneer we de Uno-code op de Mega, waren we een onjuiste draaggolffrequentie genereren! Dankzij mijn vader die dit alles bedacht.
Dus, met dit probleem opgelost, konden we overstappen naar het gebruik van een Mega. Dit was geweldig, omdat het niet alleen gaf ons al het geheugen die we nodig hadden (hopen we) voor het opslaan van alle het lage niveau opdracht breken en andere logica op de Arduino, maar ook ons gaf meer pinnen om mee te werken.