Arduino Programmering för nybörjare: Traffic Light Controller

Förra veckan lärde vi oss om den grundläggande strukturen i ett Arduino-program och tittade närmare på "blink" -exemplet. Förhoppningsvis tog du tillfället i akt att experimentera med kod, justera tidpunkterna.

Förra veckan lärde vi oss om den grundläggande strukturen i ett Arduino-program och tittade närmare på "blink" -exemplet.  Förhoppningsvis tog du tillfället i akt att experimentera med kod, justera tidpunkterna.
Annons

Trafikljuset är ett roligt litet projekt, som kan slutföras på under en timme. Lär dig hur du bygger din egen - med hjälp av en Arduino - och hur man ändrar kretsen för en avancerad modell.

Oroa dig inte om du aldrig har använt en Arduino innan vi har en nybörjarguide Komma igång med Arduino: En nybörjarhandbok Komma igång med Arduino: En nybörjarhandbok Arduino är en öppen källkods elektronik prototypplattform baserad på flexibel, att använda maskinvara och programvara. Den är avsedd för artister, designers, hobbyister och alla som är intresserade av att skapa interaktiva objekt eller miljöer. Läs mer .

Obs! Det här är det senaste i en serie nybörjarkurser för Arduino, open source-elektronikprototypplattformen. Här är en lista över tidigare artiklar i serien:

  • Vad är Arduino och vad kan du göra med det Vad är Arduino & Vad kan du göra med det? Vad är Arduino och vad kan du göra med det? Arduino är en anmärkningsvärd liten elektronik enhet, men om du aldrig har använt en tidigare, precis vad exakt är de, och vad kan du göra med en? Läs mer
  • Vad är en Arduino Starter Kit och vad innehåller den? Vad ingår i ett Arduino Starter Kit? [MakeUseOf Förklarar] Vad ingår i ett Arduino Starter Kit? [MakeUseOf Explains] Jag har tidigare introducerat Arduino open source-hårdvaran här på MakeUseOf, men du behöver mer än bara den verkliga Arduino att bygga något ut av det och faktiskt komma igång. Arduino "startpaket" är ... Läs mer
  • Mer coola komponenter att köpa med din startpaket 8 Fler kalla komponenter till dina Arduino-projekt 8 Fler kalla komponenter till dina Arduino-projekt Så du tänker på att få en Arduino-startpaket, men undrar om några grundläggande lysdioder och motstånd kommer att bli tillräckligt för att hålla dig upptagen för helgen? Antagligen inte. Här är ytterligare 8 ... Läs mer
  • Komma igång med ditt Arduino Starter Kit - Installera drivrutiner och ställa in styrningen och porten Komma igång med ditt Arduino Starter Kit - Installera drivrutiner och konfigurera styret och porten Komma igång med ditt Arduino Starter Kit - Installera drivrutiner och konfigurera styrelsen & Port Så du har köpt dig en Arduino startpaket, och eventuellt några andra slumpmässiga coola komponenter - nu vad? Hur kommer du faktiskt igång med att programmera denna Arduino sak? Hur ställer du upp det ... Läs mer
  • En närmare titt på strukturen i en Arduino App & Exempel Blink Program

Vad du behöver

Förutom den grundläggande Arduino behöver du:

  • Röd, gul och grön lysdioder.
  • En brödbräda.
  • 6 x 220? resistorer.
  • Anslutande ledningar.
  • 1 x tryckknappsbrytare.
  • 1 x 10k? motstånd

Nästan alla Arduino kommer att vara lämpliga, förutsatt att den har tillräckligt med pinnar. Se till att du läser vår köpguide Arduino Köpguide: Vilket styrelse ska du få? Arduino Köpguide: Vilket styrelse ska du få? Det finns så många olika typer av Arduino brädor där ute, du skulle bli förlåtad för att vara förvirrad. Vilket ska du köpa för ditt projekt? Låt oss hjälpa till med den här Arduino-köpguiden! Läs mer om du inte är säker på vilken modell du behöver. Du har nog dessa delar i startpaketet Vad finns i din Arduino Starter Kit? [Arduino Beginners] Vad finns i din Arduino Starter Kit? [Arduino Beginners] Inför en låda full av elektroniska komponenter är det lätt att bli överväldigad. Här är en guide till exakt vad du hittar i ditt kit. Läs mer redan.

Ett enkelt exempel

Låt oss börja små. En enkel, enkel trafikljus är ett bra ställe att börja. Här är kretsen:

arduino_traffic_light

Anslut anoden (långbenet) till varje LED till digitala stift åtta, nio och tio (via ett 220-motstånd). Anslut katoderna (kort ben) till Arduino marken.

Jag använde Fritzing för att rita dessa diagram. Det är inte bara lätt att använda, det är gratis!

Koden

Börja med att definiera variabler så att vi kan adressera ljusen efter namn i stället för ett nummer. Starta ett nytt Arduino-projekt, och börja med dessa rader:

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

Låt oss sedan lägga till installationsfunktionen, var ska vi konfigurera de röda, gula och gröna lysdioderna som ska matas ut. Eftersom du har skapat variabler för att representera stiftnumren kan du nu hänvisa till stiften i namnet istället.

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

Det var enkelt. Nu för den svåra delen - den faktiska logiken i ett trafikljus. Skapa en separat funktion för att byta ljus (du får se varför senare).

När du börjar programmera, är själva koden mycket rudimentär - det går ut på att hitta de minutiska logikuppgifterna som presenterar det största problemet. Nyckeln till att vara en bra programmerare är att kunna titta på vilken process som helst och bryta ner den i sina grundläggande steg. Här är 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); } 

Gjort! Ladda upp och kör nu (var noga med att välja rätt kartong och port i Verktyg > Port och Verktyg > Styrmenyerna). Du bör ha ett trafikljus som ändras var 15: e sekund, så här (sped up):

En gångkorsning

Nu när du vet grunderna, låt oss förbättra det. Lägg i en knapp för fotgängare att byta ljus när som helst:

arduino_traffic_light_with_button

Lägg märke till hur trafikljuset är exakt detsamma som i föregående exempel. Anslut knappen till digital stift 12. Du märker att strömbrytaren har en högimpedans 10k? motstånd kopplat till det, och du kanske undrar varför. Detta kallas ett neddragningsresistor. Det är ett svårt begrepp att förstå först, men bära med mig.

En strömbrytare låter strömmen strömma eller inte. Detta verkar enkelt nog, men i en logisk krets bör strömmen alltid strömma i antingen högt eller lågt tillstånd (kom ihåg - 1 eller 0, hög eller låg). Man kan anta att en knappbrytare som inte faktiskt drivs skulle definieras vara i ett lågt tillstånd, men i själva verket sägs det vara "flytande", eftersom ingen ström dras alls.

I det här flytande tillståndet är det möjligt att en falsk avläsning uppträder då den fluktuerar med elektrisk störning. Med andra ord ger en flytande brytare varken en pålitlig hög eller lågläsning. Ett dragningsmotstånd håller en liten mängd ström som flyter när brytaren är stängd och därigenom säkerställer en exakt lågläsning. I andra logikkretsar kan du i stället hitta ett dragmotstånd, det fungerar enligt samma princip, men i omvänd ordning, se till att den speciella logiska grinden är för hög.

Nu, i klockans del av koden, istället för att byta lampor var 15: e sekund, kommer vi läsa läget för tryckknappsbrytaren istället, och ändrar bara lamporna när den är aktiverad.

Koden

Börja med att lägga till en ny variabel till början av programmet:

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

Nu, i inställningsfunktionen, lägg till en ny rad för att deklarera omkopplaren som en ingång. Jag har också lagt till en enda linje för att starta trafikljusen i det gröna scenet. Utan denna initiala inställning skulle de stängas av, tills första gången en changeLights () initierades med en funktion.

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

Ändra hela slingans funktion till följande istället:

 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 borde göra det. Du kanske undrar varför knappen är markerad två gånger ( digitalRead (knapp) ), åtskilda av en liten fördröjning. Detta kallas debouncing. I likhet med att dragningsresistorn behövdes för knappen, stoppar den här enkla kontrollen koden som upptäcker mindre störningar som en knapptryckning. Du behöver inte göra det här (och det skulle förmodligen fungera bra utan det), men det är bra.

Genom att vänta inom if- utlåtelsen i 15 sekunder kan trafikljusen inte ändras under minst den tiden. När 15 sekunder är klar startar slingan om. Varje omstart av slingan läser läget på knappen igen, men om den inte trycks in aktiveras if- satsen aldrig, lamporna ändras aldrig och det startar helt enkelt igen.

Så här ser det ut (sped up):

En korsning

Låt oss prova en mer avancerad modell. I stället för en gångövergång, ändra din krets för att ha två trafikljus:

arduino_dual_traffic_light

Anslut det andra trafikljuset till digitala stiften 11, 12 och 13.

Koden

Tilldela först dina nya trafikljusstift till variabler och konfigurera dem som utgångar, precis som i det första exemplet:

 // 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); } 

Uppdatera nu din slinga för att använda koden från det första exemplet (istället för gågatan):

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

Än en gång utförs allt arbete i funktionen changeLights () . Istället för att gå rött > rött och gult > grönt, kommer denna kod att växla trafikljusen. När en är på grön, kommer den andra att vara röd. Här är 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); } 

Så här ser det ut (sped up):

Det är det för den här tiden, så jag hoppas att du lärde dig mycket och hade kul att skriva från början. Du har smutsiga dina händer med några lysdioder och motstånd, samt att lägga till en brytare med dragmotstånd - förhoppningsvis förstod du varför vi behöver en. Leka med koden, justera den och ha det viktigaste. Om du gör några tillägg eller ändringar, varför inte meddela oss om det i kommentarerna?

Bildkrediter: androsvector via Shutterstock.com

In this article