Arduino programmering for nybegynnere: Trafikklyskontrolleren

I forrige uke lærte vi om den grunnleggende strukturen til et Arduino-program og tok en nærmere titt på "blink" -eksemplet. Forhåpentligvis tok du muligheten til å eksperimentere med kode, justere timingen.

I forrige uke lærte vi om den grunnleggende strukturen til et Arduino-program og tok en nærmere titt på "blink" -eksemplet.  Forhåpentligvis tok du muligheten til å eksperimentere med kode, justere timingen.
Annonse

Trafikklyset er et morsomt lite prosjekt, som kan fullføres på under en time. Lær hvordan du bygger din egen - ved hjelp av en Arduino - og hvordan du endrer kretsen for en avansert modell.

Ikke bekymre deg hvis du aldri har brukt en Arduino før, vi har en nybegynnerveiledning Komme i gang med Arduino: En nybegynnersveiledning Komme i gang med Arduino: En nybegynnersguide Arduino er en åpen kilde elektronikk prototyping plattform basert på fleksibel, å bruke maskinvare og programvare. Det er ment for kunstnere, designere, hobbyister, og alle som er interessert i å lage interaktive objekter eller miljøer. Les mer .

Merk : Dette er det siste i en serie av nybegynnernivåopplæringsprogrammer for Arduino, open source-elektronikkprototypingsplattformen. Her er en liste over tidligere artikler i serien:

  • Hva er Arduino og hva kan du gjøre med det Hva er Arduino og hva kan du gjøre med det? Hva er Arduino og hva kan du gjøre med det? Arduino er en bemerkelsesverdig liten elektronikk enhet, men hvis du aldri har brukt en før, akkurat hva er de, og hva kan du gjøre med en? Les mer
  • Hva er en Arduino Starter Kit og hva inneholder den? Hva er inkludert i en Arduino Starter Kit? [MakeUseOf Forklarer] Hva er inkludert i et Arduino Starter Kit? [MakeUseOf Forklarer] Jeg har tidligere introdusert Arduino open-source hardware her på MakeUseOf, men du trenger mer enn bare den faktiske Arduino å bygge noe ut av det og faktisk komme i gang. Arduino "startpakker" er ... Les mer
  • Flere kjølige komponenter for å kjøpe med startpakken 8 Flere kjølige komponenter for dine Arduino-prosjekter 8 Flere kule komponenter for dine Arduino-prosjekter Så du tenker på å få et Arduino-startpakke, men lurer på om noen grunnleggende lysdioder og motstander kommer til å bli nok til å holde deg opptatt i helgen? Sannsynligvis ikke. Her er en annen 8 ... Les mer
  • Komme i gang med Arduino Starter Kit - Installere drivere og sette opp styret og porten Komme i gang med Arduino Starter Kit - Installere drivere og sette opp styret og porten Komme i gang med Arduino Starter Kit - Installere drivere og sette opp styret & Port Så, du har kjøpt deg en Arduino startpakke, og muligens noen andre tilfeldige, kule komponenter - nå hva? Hvordan kommer du faktisk i gang med programmering av denne Arduino-tingen? Hvordan setter du opp ... Les mer
  • En nærmere titt på strukturen av en Arduino App & Eksempel Blink Program

Hva trenger du

Bortsett fra det grunnleggende Arduino, trenger du:

  • Røde, gule og grønne lysdioder.
  • Et brødbrett.
  • 6 x 220? motstander.
  • Kobling av ledninger.
  • 1 x trykknappbryter.
  • 1 x 10k? motstand

Nesten noen Arduino vil være egnet, forutsatt at den har nok pins. Sørg for at du leser vår kjøpeguide Arduino Kjøpsguide: Hvilket styre bør du få? Arduino Kjøpsguide: Hvilket styre bør du få? Det er så mange forskjellige typer Arduino boards der ute, du vil bli tilgitt for å være forvirret. Hvilken bør du kjøpe for prosjektet ditt? La oss hjelpe, med denne Arduino kjøpesiden! Les mer hvis du ikke er sikker på hvilken modell du trenger. Du har sikkert disse delene i startpakken Hva er i din Arduino Starter Kit? [Arduino Beginners] Hva er i din Arduino Starter Kit? [Arduino Beginners] Faced med en boks full av elektroniske komponenter, er det enkelt å bli overveldet. Her er en guide til nøyaktig hva du finner i ditt sett. Les mer allerede.

Et enkelt eksempel

La oss starte små. Et grunnleggende, enkelt trafikklys er et godt sted å starte. Her er kretsen:

arduino_traffic_light

Koble anoden (langbenet) til hver LED til digitale stifter åtte, ni og ti (via en 220-motstand). Koble katodene (kort ben) til Arduino bakken.

Jeg brukte Fritzing til å tegne disse diagrammene. Ikke bare er det enkelt å bruke, det er gratis!

Koden

Begynn med å definere variabler slik at vi kan adressere lysene etter navn i stedet for et tall. Start et nytt Arduino-prosjekt, og begynn med disse linjene:

int red = 10; int yellow = 9; int green = 8; 

Deretter la vi legge til oppsettfunksjonen, hvor skal vi konfigurere de røde, gule og grønne LEDene som skal utgange. Siden du har opprettet variabler for å representere pinnumrene, kan du nå referere til pinnene ved navn i stedet.

 void setup(){ pinMode(red, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT); } 

Det var lett. Nå for den vanskelige delen - den faktiske logikken til et trafikklys. Lag en egen funksjon for å skifte lysene (du vil se hvorfor senere).

Når du begynner programmeringen, er selve koden veldig rudimentær - det er å finne ut de øyeblikkelige logikkdetaljer som presenterer det største problemet. Nøkkelen til å være en god programmør er å kunne se på hvilken som helst prosess, og bryte den ned i grunnleggende trinnene. Her er resten av koden:

 void loop(){ changeLights(); delay(15000); } void changeLights(){ // green off, yellow on for 3 seconds digitalWrite(green, LOW); digitalWrite(yellow, HIGH); delay(3000); // turn off yellow, then turn red on for 5 seconds digitalWrite(yellow, LOW); digitalWrite(red, HIGH); delay(5000); // red and yellow on for 2 seconds (red is already on though) digitalWrite(yellow, HIGH); delay(2000); // turn off red and yellow, then turn on green digitalWrite(yellow, LOW); digitalWrite(red, LOW); digitalWrite(green, HIGH); delay(3000); } 

Ferdig! Last opp og kjør nå (sørg for å velge riktig bord og port fra Verktøy > Port og Verktøy > Styret menyer). Du bør ha et trafikklampe som endres hvert 15. sekund, slik som dette (sped up):

En fotgjengerovergang

Nå som du vet det grunnleggende, la oss forbedre det. Legg i en trykknapp for fotgjengere for å endre lyset når de liker:

arduino_traffic_light_with_button

Legg merke til hvordan trafikklyset er nøyaktig det samme som forrige eksempel. Koble knappen til digital pin 12. Du vil merke at bryteren har en høyimpedans 10k? motstand festet til den, og du lurer kanskje på hvorfor. Dette kalles en nedtrekksmotstand. Det er et vanskelig konsept å forstå først, men bære med meg.

En bryter lar enten strømmen strømmer, eller ikke. Dette virker enkelt nok, men i en logikkkrets bør strømmen alltid flyte i enten høy eller lav tilstand (husk - 1 eller 0, høy eller lav). Du kan anta at en trykknappbryter som ikke egentlig blir presset, ville bli definert som å være i lav tilstand, men faktisk sies det å være "flytende", fordi det ikke blir trukket noen strøm i det hele tatt.

I denne flytende tilstand er det mulig at en falsk avlesning vil oppstå når den svinger med elektrisk forstyrrelse. Med andre ord gir en flytende bryter hverken en pålitelig høy eller lav tilstandsavlesning. En nedtrekksmotstand holder en liten mengde strøm som strømmer når bryteren er stengt, og sikrer dermed en nøyaktig lavtilstandsavlesning. I andre logikkkretser kan du finne en opptrekksmotstand i stedet - dette fungerer på samme prinsipp, men i omvendt, sørg for at den aktuelle logiske porten er for høy.

Nå, i loop-delen av koden, i stedet for å bytte lys hvert 15. sekund, skal vi lese tilstanden til trykknappbryteren i stedet, og bare endre lysene når den er aktivert.

Koden

Start med å legge til en ny variabel til starten av programmet:

 int button = 12; // switch is on pin 12 

Nå, i oppsettfunksjonen, legger du til en ny linje for å erklære bryteren som en inngang. Jeg har også lagt til en enkelt linje for å starte trafikklysene i det grønne scenen. Uten denne innledende innstillingen, ville de bli slått av, til første gang ble en changeLights () startet ved hjelp av en funksjon.

 pinMode(button, INPUT); digitalWrite(green, HIGH); 

Endre hele loop-funksjonen til følgende i stedet:

 void loop() { if (digitalRead(button) == HIGH){ delay(15); // software debounce if (digitalRead(button) == HIGH) { // if the switch is HIGH, ie. pushed down - change the lights! changeLights(); delay(15000); // wait for 15 seconds } } } 

Det burde gjøre det. Du lurer kanskje på hvorfor knappen er merket to ganger ( digitalRead (knapp) ), skilt med en liten forsinkelse. Dette kalles debouncing. I likhet med at nedtrekksmodstanden var nødvendig for knappen, stopper denne enkle kontrollen koden som oppdager mindre forstyrrelser som en trykknapp. Du trenger ikke å gjøre dette (og det vil nok fungere fint uten det), men det er god praksis.

Ved å vente i if- setningen i 15 sekunder, kan trafikklysene ikke endres i minst denne varigheten. Når 15 sekunder er opp, starter sløyfen på nytt. Hver omstart av sløyfen, les tilstanden til knappen igjen, men hvis den ikke trykkes, aktiverer if- setningen aldri, lysene endres aldri, og det starter bare på nytt.

Slik ser dette ut (sped opp):

Et veikryss

La oss prøve en mer avansert modell. I stedet for en fotgjengerovergang må du endre kretsen for å ha to lyskryss:

arduino_dual_traffic_light

Koble det andre trafikklyset til digitale pinner 11, 12 og 13.

Koden

Først tilordne de nye trafikklyspinnene til variabler, og konfigurer dem som utdata, akkurat som i det første eksemplet:

 // light one int red1 = 10; int yellow1 = 9; int green1 = 8; // light two int red2 = 13; int yellow2 = 12; int green2 = 11; void setup(){ // light one pinMode(red1, OUTPUT); pinMode(yellow1, OUTPUT); pinMode(green1, OUTPUT); // light two pinMode(red2, OUTPUT); pinMode(yellow2, OUTPUT); pinMode(green2, OUTPUT); } 

Oppdater nå løkken din for å bruke koden fra det første eksemplet (i stedet for fotgjengerovergangen):

 void loop(){ changeLights(); delay(15000); } 

Igjen blir alt arbeidet utført i funksjonen changeLights () . I stedet for å gå rødt > rødt og gult > grønt, vil denne koden skifte trafikklysene. Når en er på grønt, vil den andre være på rødt. Her er koden:

 void changeLights(){ // turn both yellows on digitalWrite(green1, LOW); digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); delay(5000); // turn both yellows off, and opposite green and red digitalWrite(yellow1, LOW); digitalWrite(red1, HIGH); digitalWrite(yellow2, LOW); digitalWrite(red2, LOW); digitalWrite(green2, HIGH); delay(5000); // both yellows on again digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); digitalWrite(green2, LOW); delay(3000); // turn both yellows off, and opposite green and red digitalWrite(green1, HIGH); digitalWrite(yellow1, LOW); digitalWrite(red1, LOW); digitalWrite(yellow2, LOW); digitalWrite(red2, HIGH); delay(5000); } 

Her er det som ser ut som (sped up):

Det er det for denne gangen, så jeg håper du lærte mye og hadde det gøy å skrive fra bunnen av. Du fikk dine hender skitne med noen få lysdioder og motstander, samt å legge til en bryter med en nedtrekksmotstand - forhåpentligvis forstod du hvorfor vi trenger en. Spill deg med koden, juster den, og viktigst, ha det gøy. Hvis du gjør noen tilføyelser eller endringer, hvorfor ikke gi oss beskjed om det i kommentarene?

Bildekreditt: androsvector via Shutterstock.com

In this article