Quiz Game Controller med hjälp av "Ljus och ljud Buzzers" och Arduino (4 / 5 steg)
Steg 4: Arduino Program
Om du inte är bekant med programmering Arduino, ta lite tid innan du fortsätter att lära sig grunderna i programmering Arduino. Arduino Uno har en praktisk USB-port som ger en anslutning till datorn och även driver på Arduino från USB-ström. Du måste veta hur man ska programmera Arduino och ladda ner program till det så att du kan ladda ner programmet med dessa instruktioner till Arduino. Eller... du kan även skapa dina egna varianter. Det är en av de stora aspekterna av detta projekt, möjligheterna är obegränsade!
Arduino-webbplats (http://arduino.cc/) har nedladdningsbara programmeringsmiljöer och många resurser för att snabbt få dig igång på programmering Arduino.
OK, nu när du är bekant med Arduino Uno och kan ladda ett progam till det, går vi över driften av V1.1 av programmet levereras med dessa instruktioner.
Grundläggande drift
Det beteende vi vill uppnå från rutan kontroll är följande:
Efter slås på, väntar knapparna vara intryckt.
Den första knappen är "vinnare" och ljus och ljud på den knappen aktiveras. Sedan på knappen stänger av sig själv efter cirka 2 sekunder, styrenheten kommer att vänta på 2,5 sekunder och kommer att aktivera sedan lamporna bara på knappen, men inte ljudet. Detta håller synlig knappen som trycktes först, men håller inte buller upp en nivå, som skulle bli irriterande.
Andra knappar kan pressas efter den första knappen (detta är vad som normalt händer) och den ordning i vilken knapparna trycks upptäcks av registeransvarige.
Lysdioderna på rutan kontroll är belyst som följer, visar den ordning som trycktes på knapparna:
1: a plats - lysdioden är på fast
2: a plats - lysdioden blinkar snabbt
3: e plats - LED om blinkar långsamt
4: e plats - lysdioden är avstängd
Att trycka på reset-knappen kommer att stänga av alla lampor på rutan kontroll och sluta köra "Aktivera" linjen till vinnande knappen. Detta kommer att orsaka alla knapparna för att vara tyst och ha sina lampor efter knappen vinnande har slutfört den sista 2.5s cykel.
Om reset-knappen inte är intryckt, att 60 sekunder efter på "vinnare"-knappen trycks, systemet automatiskt återställa sig själv. Naturligtvis kan du justera 60 andra timeout-värde i koden till något annat om du vill ha.
Vi sätter ett "påskägg" i koden som något kul för folk att försöka hitta. Vi kommer att lämna det till dig att hitta det, och att ändra programmet för någon av dina egna "påskägg" som du kanske tänker på.
Teorin om Operation
Vi kommer att gå över några av de viktiga metoder och tekniker i programmet.
Polling vs. dröjsmål
Många av de Arduino exempel program kommer att använda delay(n); uttalande att uppnå blinkande lysdioder. Med tanke på att vi vill inte bara fånga vad knappen trycktes 1: a, men också knapparna efter detta, kommer den "delay" inte fungera för oss. Undra om den 1: a knappen trycktes och vi var i en slinga att köra LED med en 500 ms (1/2 sekund) fördröjning. 1/2 sekund är en lång tid och det kan ha funnits två eller ens tre knappar trycker "fördröjning" och vi skulle har inget sätt att veta om det! Flera saker kan hända, när vi läser knapparna, trycker på alla tre, eller kanske en trycks eftersom andra knappen trycktes och släpptes redan! Detta skulle göra spelarna mycket missnöjd med vårt spel.
Så, vi kan inte använda funktionen "delay". I stället kommer vi program "Ogiltig loop()" logiken i en "röstningen" metod. I grund och botten kontrollerar detta innebär att vi kommer att försöka miniminze eventuella förseningar i vår kod och hålla looping om och om igen status för knapparna. Vi kommer också att se om det är dags för oss att ändra status på en LED eller buttton. En timing av pooling slingan i V1.1 vi mätt Genomsnittlig tid tillbringa i öglan för att handla om 0.1ms eller 100 mikrosekunder. Som verkar vara en ganska snabb loop och minimerar risken för flera knapptryckningar sker inom en enda slinga.
Men om slingan bara kontroll för att se om en LED måste vara slås av eller på, vad säger oss vad vi ska göra om någon viss loop?
LED automat och profilerna
För att hantera de knappar och lysdioder skapar vi en "State sekvens Array." Inom arrayen definiera vi en profil. Ett exempel på en profil är "Blink ljuset snabbt", eller "Slå på ljuset." För varje profil finns en sekvens av staterna (eller steg). Till exempel i matrisen int LED_SEQ [] definiera vi en profil för blinkande lampor snabbt. Profilen består av följande statliga definitioner:
HÖG, 250, 1, / * profil 2 (2: a plats) börjar, steg 0 - "Blinka snabbt" * /
LÅG, 250, 0, / * profil 2, steg 1 * /
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0,
0, 0, 0, / * profil 2 slutet, steg 7 * /
Så en profil består av statliga definitioner som har 3 värden. Det första värdet är en av tre val, hög, låg eller -1.
HÖG - när du går in i detta tillstånd, köra utdata (till LED eller knappen) till hög.
LÅG - när man går in i detta tillstånd, drive utdata till låg.
-1 - när du går in i detta tillstånd, inte gör någon förändring till utgången.
Det andra värdet är längden av tid (i millisekunder) som detta tillstånd bör vara i kraft innan du flyttar till nästa tillstånd. Så säger profil 2 i koden fragmentet ovan, att upprätthålla staten 1 för 250ms (eller 1/4 sekund) och att även behålla 2 för 250ms.
Det tredje värdet är "nästa steg" eller staten. I profil 2 steg 0 är nästa steg steg 1. Nästa steg efter steg 1 är steg 0. Så kan du se att denna sekvens av stater eller steg är i en loop. steg 0 till steg 1 om du vill stega 0 och så vidare.
Definiera en "State sekvens Array" låter oss enkelt ändra beteendet för knappar och ljus genom att bara ändra "program" i matrisen scenen sekvens snarare än ändra C kod. Till exempel experimenterade vi med ljus beter sig på detta sätt:
Första plats - blinka en gång och vänta 1 sekund.
Andra plats - blinkar två gånger och vänta 1 sekund.
Tredje plats - blinkar tre gånger och vänta 1 sekund.
Fjärde plats - blinkar fyra gånger och vänta 1 sekund.
I denna testmetod med ett fåtal personer de gillade en "på fast," "blinka snabbt," "blinka långsamt" och "off" som indikeringen av 1 till 4 rum respektive.
Observera att vi gjort dessa ändringar i ljus beteende genom att endast ändra profilerna i LED_SEQ [] matris och vi inte behövde ändra C-programmet alls!
Så nu att vi får se hur staten (eller steg) definieras, hur vill vi hålla reda på vilket skick de olika färgade lysdioderna är?
LED-sekvens staten
Programmet håller koll på där varje färg LED är i matrisen"staten sekvens" (int LED_SEQ [] matris med tre variabler:
Första "profil index" - Detta är ett index i LED_SEQ [] för profil (eller uppsättning steg) som körs. Indexet börjar med noll.
Andra "steg index" - Detta är ett index för steget inom profilen. Indexet börjar med noll.
Tredje och sista, det långt heltalet som håller tiden som steget startades. Detta är värdet på gång ett steg var stirrade från builin funtion millis().
Dessa värden hålls i matrisen lLSS [] för varje färg. Så finns det 12 poster. För var och en av de fyra färgerna finns 3 sekvens tillståndsvariabler ovan. Med fyra färger och tre poster för varje färg, 4 x 3 = 12.
Så för varje "polling loop" i vår kod gör LED stat maskin bearbetning loopen följande:
För varje färg (noll till 3)
Letar upp den aktuella profilen.
Slår upp det aktuella steget
Ser upp det aktuella steget starttid.
Lägger till steget varaktigheten i starttiden steg. Om den aktuella tiden är mindre än den "steg längd + steg starttid", sedan inte gör något. Om den aktuella tiden är större än "steg längd + steg starttid", leta upp nästa steg nummer. Sedan utför åtgärden i nästa steg och update "nuvarande steg", "nuvarande profil" och "steg starttid" index.
LED-sekvensering
Så med detta program teknik, kan vi ändra LED staterna på komplicerade sätt och fortfarande se för knapp tryck på händelser i tid. Dessutom är det lätt att ändra hur Lysdioderna beter utan att ändra logiken i C-kod. Vi måste bara ändra profiler och steg i matrisen LED-SEQ [].
Detta är i själva verket hur vi programmerade vårt "Påsk ägg" beteende. Kan du hitta det? Vill du sätta i ditt eget "Påsk ägg" beteende. Gå vidare och göra det! Jobbet är inte klart förrän "Påsk ägg" är klar!
Knappen automat och profilerna
Processen för att manipulera den knapp beteendet är exakt densamma som för lysdioder ovan. Variabeln knappen stat"som innehåller"Profiler"och"steg"eller"ordnar"är int BTN_SEQ [] matris.
På samma sätt, den nuvarande profle och steg för varje färg bibehålls i matrisen lång lBSS [].
Diskussionen för lysdioderna sedan gäller knapparna med substitution av ovanstående knapp variabler.
Övergripande programflöde
De olika variablerna deklareras och variabelnamn för Arduino I/O Stifttilldelningar deklareras. Se appendix, koden eller schematiskt för Arduino stiften används.
Polling slingan består då av de allmänna instruktionerna nedan:
När på knappen presss och registrera ordern.
Hantera knapp sekvens staten för varje färg-knappen.
Hantera LED sekvens staten för varje färg LED
När på återställningsknappen (och sedan återställa knappen/LED sekvens statliga matrisen till profil 0, eller "off")
Kontrollera om eventuella särskilda Reset knappen villkor (dvs hölls för > TEST_MODE millisekunder, gå sedan in i en profil för "ljus" testläge.
Särskilda fall hanteringen av knapparna för att självständigt hantera både ljus och ljud med endast en signal linje beskrivs mer i detalj i avsnittet om ändringar av knappen.
Se tillägget för komplett program listan.
Extensions
Har vi missat något som du tror skulle vara riktigt snyggt? Till exempel kunde kanske det vara ett "Wheel of Fortune" spelläge, där en färg är också valts ut slumpmässigt och gett en förutbestämd mängd tid att svara.
Eller uppfinna egna nya spelläget.
Det är skönheten i en mikrokontroller implemting logik. Helt enkelt skapa dina egna program och göra det beter sig precis som du vill att.
Låt din fantasi vilda, och glad Arduino programmering!
Programmet källan kan hämtas på www.projectnotions.com.