Stap 4: Arduino programma
Als u niet bekend bent met het programmeren van de Arduino, even duren alvorens over te gaan om te leren van de basisprincipes van het programmeren van de Arduino. De Arduino Uno heeft een handige USB-poort biedt een verbinding met de computer en ook de bevoegdheden op de Arduino van USB macht. U moet weten hoe te programmeren van de Arduino en programma's downloaden naar het zodat kunt u het downloaden van het programma met deze instructies in de Arduino. Of... u kunt ook uw eigen varianten maken. Het is een van de grote aspecten van dit project, dat de mogelijkheden zijn onbegrensd!
De Arduino website (http://arduino.cc/) heeft downloadbare programmeeromgevingen en vele middelen om snel je op snelheid over het programmeren van de Arduino.
OK, nu dat u vertrouwd bent met de Arduino Uno en een progam ernaar kunt laden, gaan we over de werking van V1.1 van het programma voorzien van deze instructies.
Basisbediening
Het gedrag dat we willen bereiken vanuit de control box is als volgt:
Na wordt ingeschakeld, de knoppen zijn te wachten om te worden ingedrukt.
De eerste knop ingedrukt is de "winnaar" en de lichten en geluiden op die knop geactiveerd. Aangezien de knop zichzelf na ongeveer 2 seconden schakelt, de controller zal wachten op 2,5 seconden en vervolgens de lampjes alleen op de knop, maar niet het geluid zal opvijzelen. Dit houdt de knop die werd ingedrukt eerst, maar houdt het lawaai niet niveau omhoog, die vervelend worden zou zichtbaar.
Andere knoppen ingedrukt kan worden na de eerste knop (dit is wat er normaal gebeurt) en de volgorde waarin de knoppen worden ingedrukt wordt gedetecteerd door de controller.
De LED's op de control box zijn verlicht als volgt weergegeven: de volgorde waarin de knoppen werden ingedrukt:
1e plaats - de LED brandt solid
2e plaats - de LED knippert snel
3e plaats - de LED als knippert langzaam
4e plaats - de LED is uitgeschakeld
Indrukken van de resetknop zal uitschakelen alle LEDs op de control box, en stoppen met de "Activeer" lijn rijden naar de winnende knop. Hierdoor worden alle knoppen worden stil en hebben hun lichten uit nadat de laatste 2.5s van de winnende knop cyclus.
Als de reset-knop niet ingedrukt is, wordt 60 seconden nadat de "winnaar" knop is ingedrukt, het systeem automatisch gereset zelf. Natuurlijk kunt u 60 tweede waarde voor de time-out in de code naar iets anders aanpassen, indien u wenst.
We hebben een "Easter Egg" in de code als iets leuks voor mensen om te proberen te vinden. Wij zullen laat het aan u om het te vinden en het programma voor om het even welk van uw eigen "Easter Eggs" wijzigen die u zou kunnen bedenken.
Bediening
We gaan over enkele van de belangrijkste benaderingen en technieken in het programma.
Polling vs. vertraging
Veel van de Arduino voorbeeld programma's zal gebruik maken van de delay(n); verklaring tot knipperende LED's. Gezien het feit dat we willen niet alleen vastleggen welke knop is ingedrukt 1ste, maar ook de knoppen na dit, zal de "vertraging"-aanpak niet werken voor ons. Vraag me af of de 1e knop werd ingedrukt en we in een lus waren te rijden van de LED met een vertraging van 500 ms (1/2 seconde). 1/2 seconde is een lange tijd en misschien zijn er twee of zelfs drie knoppen ingedrukt gedurende de tijd dat "vertraging" en zouden we geen manier hebben om te weten over het! Verschillende dingen zouden kunnen gebeuren, als we de knoppen lezen, alle drie worden ingedrukt, of misschien een wordt gedrukt omdat de andere knop werd ingedrukt en al losgelaten! Dit zou de spelers erg ongelukkig met onze spel maken.
Dus, we de "vertraging"-functie niet gebruiken. In plaats daarvan zullen we de logica van de "ongeldig loop" in een "stembureaus" methode program. Dit betekent dat we zullen proberen te miniminze eventuele vertragingen in onze code en houden een lus over en weer controle in feite de status van de knoppen. We zullen ook zien als het is tijd voor ons om te veranderen van de status van een LED of knop. In een timing van de bundeling lus in V1.1 we gemeten dat de gemiddelde tijd doorbrengen in de lus over 0.1ms of 100 microseconden. Dat lijkt te zijn een vrij snel lus, en minimaliseert de kans op meerdere knooppersen gebeurt binnen een enkele lus.
Maar als de lus is gewoon om te zien als een LED worden uitgeschakeld moet of op de controle, wat vertelt ons wat we geacht worden te doen op elke gegeven lus?
LED statusmachine en profielen
Voor het beheren van de knoppen en de LED's maken we een "staat reeks Array." Binnen de matrix definiëren we een profiel. Een voorbeeld van een profiel is "Knipperen de lampjes snel", of "Turn op het licht." Er is een opeenvolging van Staten (of stap) voor elk profiel. Bijvoorbeeld in de int LED_SEQ [] matrix definiëren we een profiel voor het snel knipperen van de lichten. Dat profiel bestaat uit de volgende definities van de staat:
HOOG, 250, 1 / * profiel 2 (2e plaats) beginnen, stap 0 - "Knipperen snel" * /
LAGE, 250, 0, / * profiel 2, stap 1 * /
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0, / * profiel 2 einde, stap 7 * /
Dus een profiel bestaat uit de definities van de staat die 3 waarden hebben. De eerste waarde is één van de drie keuzes, HIGH, LOW of -1.
HOOG - wanneer gaan op deze situatie, rijden de uitvoer (naar de knop of LED) op hoog.
LOW - wanneer gaan in deze staat, station de uitgang op laag.
-1 - wanneer gaan op deze situatie, niet merk ieder wisseling naar de uitvoer.
De tweede waarde is de lengte van tijd (in milliseconden) dat die staat van kracht worden moet voordat hij naar het volgende frame. Profiel 2 in het bovenstaande codefragment aldus te handhaven staat 1 voor 250ms (of 1/4 seconde) en te onderhouden ook staat 2 voor 250ms.
De derde waarde is de "next step" of staat. In profiel 2 stap 0 is de volgende stap stap 1. De volgende stap na stap 1 is stap 0. Dus, u ziet dat deze opeenvolging van Staten of stappen in een lus. stap 0 tot stap 1 om 0, enzovoort.
Definitie van een "staat reeks Array" laat ons gemakkelijk het gedrag van de knoppen en de lichten veranderen door gewoon veranderen van het "programma" in de fase reeks Array in plaats van C-code te wijzigen. Bijvoorbeeld experimenteerden we met de lichten zich gedraagt op deze manier:
Eerste plaats - knipperen één keer en wacht 1 seconde.
Tweede plaats - twee keer knipperen en wacht 1 seconde.
Derde plaats - drie keer knipperen en wacht 1 seconde.
Vierde plaats - vier keer knipperen en wacht 1 seconde.
In deze testmethode met een paar mensen die ze graag een "op solide," "knipperen snel," "langzaam knipperen" en "off" als de indicatie van de 1e tot 4e plaats respectievelijk.
Let op dat wij die wijzigingen in het licht gedrag aangebracht door alleen het wijzigen van de profielen in LED_SEQ [] matrix en we hoefde niet te veranderen van de C-programma helemaal!
Dus nu dat we zien hoe de staat (of stappen) zijn gedefinieerd, hoe we bijhouden van welke staat de verschillende gekleurde LED's in?
LED reeks staat
Het programma houdt spoor van waar elke kleur LED is in de "staat reeks matrix" (int LED_SEQ [] matrix met drie variabelen:
Eerste de "profiel index" - Dit is een index in LED_SEQ [] voor het profiel (of reeks stappen) wordt uitgevoerd. De index begint bij nul.
Tweede de "stap index" - Dit is een index van de stap binnen het profiel. De index begint bij nul.
Derde en laatste, het lange gehele getal dat geldt het tijdstip waarop de stap werd gestart. Deze waarde is ingesteld op het moment dat een stap was staarde uit de millis() van de builin functie neer.
Deze waarden worden gehouden in de array [] lLSS voor elke kleur. Er zijn dus 12 posten. Voor elk van de vier kleuren zijn er de 3 staat reeks variabelen hierboven. Met vier kleuren en drie vermeldingen voor elke kleur, 4 x 3 = 12.
Dus voor elke "polling lus" in onze code doet de LED staat machine verwerking lus het volgende:
Voor elke kleur (0 tot 3)
Het huidige profiel opgezocht.
De huidige stap opgezocht
De huidige stap zoekt de begintijd.
Voegt de stap tijdsduur aan de begintijd van de stap. Als de huidige tijd kleiner is dan de "stap duur + begintijd van de stap", vervolgens niet alles doen. Als de huidige tijd groter is dan de "stap duur + begintijd van de stap", vervolgens de volgende stap nummer opzoeken. Voer de actie voor de volgende stap, en update de "huidige stap", "huidige profiel" en "stap begintijd" indexen.
LED Sequencing
Dus, met de techniek van dit programma, wij kunnen de LED Staten wijzigt op een ingewikkelde manier en nog steeds kijken voor knop pers evenementen in een tijdige wijze. Daarnaast is het gemakkelijk om te veranderen van het gedrag van de LEDS zonder te wijzigen van de logica van de C-code. We hebben net de profielen en de stappen in de matrix LED-SEQ [] te wijzigen.
In feite, dit is hoe we ons gedrag "Easter Egg" geprogrammeerd. Vind je het? Wilt u plaatsen in uw eigen gedrag "Easter Egg". Ga je gang en doe het! De baan is niet afgewerkt tot de "Easter Egg" wordt gedaan!
Knop statusmachine en profielen
Het proces voor het manipuleren van het gedrag van de knop is precies hetzelfde als beschreven voor de bovenstaande LEDs. De knop staat variabele"met het"profielen"en de"stappen"of de"reeksen"is de int BTN_SEQ [] array.
Gelijkenis, de huidige profle en de stap voor elke kleur wordt onderhouden in de lange lBSS [] matrix.
De discussie voor de LEDs dan geldt voor de knoppen met de vervanging van de bovenstaande knop variabelen.
Algemene programmeerstroom
De verschillende variabelen worden gedeclareerd, en de namen van de variabelen voor de Arduino i/o-pin-toewijzingen worden gedeclareerd. Zie het aanhangsel, de code of het schema voor de pinnen van de Arduino gebruikt.
De polling-lus wordt vervolgens bestaat uit de volgende algemene stappen:
Controleren op de knop presss en opnemen van de bestelling.
De knop volgorde staat voor elke kleurenknop beheren.
Beheren van de LED reeks staat voor elke kleur LED
Controleer of de Reset-knop (en opnieuw de knop/LED reeks staat array aan profiel 0, of "off")
Controleren voor eventuele speciale voorwaarden voor knop Beginwaarden (d.w.z. gehouden voor > TEST_MODE milliseconden, ga dan naar een profiel voor "Lights Test" modus.
De speciale behandeling van een aanvraag van de knoppen voor het zelfstandig beheren van zowel licht en geluid met slechts één signaal lijn is meer gedetailleerd beschreven in de sectie op de knop wijzigingen.
Zie de bijlage voor de complete programma-aanbieding.
Extensies
Hebben we missen iets waarvan u denkt dat zou echt gaaf? Bijvoorbeeld, kan misschien er een "Wheel of Fortune" game mode ook, waar een kleur is willekeurig gekozen en gegeven een vooraf bepaalde hoeveelheid tijd te beantwoorden.
Of uw eigen nieuwe spelwijze uitvinden.
Dat is de schoonheid van een microcontroller implemting de logica. Gewoon uw eigen programma samenstellen en maken het zich gedragen precies de manier waarop u dat wilt.
Laat uw verbeelding in werking gestelde wild, en gelukkig de programmering van de Arduino!
De bron van het programma kan worden gedownload op www.projectnotions.com.