Arduino-programmering voor beginners: de verkeerslichtregelaar

Vorige week leerden we over de basisstructuur van een Arduino-programma en onderzochten we het 'knipper'-voorbeeld. Hopelijk heb je van de gelegenheid gebruik gemaakt om met code te experimenteren en de timing aan te passen.

Vorige week leerden we over de basisstructuur van een Arduino-programma en onderzochten we het 'knipper'-voorbeeld.  Hopelijk heb je van de gelegenheid gebruik gemaakt om met code te experimenteren en de timing aan te passen.
Advertentie

Het verkeerslicht is een leuk klein project, dat in minder dan een uur kan worden voltooid. Leer hoe je je eigen kunt bouwen - met behulp van een Arduino - en hoe je het circuit kunt aanpassen voor een geavanceerd model.

Maak je geen zorgen als je nog nooit een Arduino hebt gebruikt, we hebben een beginnershandleiding Aan de slag met Arduino: een beginnershandleiding Aan de slag met Arduino: een beginnershandleiding Arduino is een prototype-platform voor open-source elektronica op basis van flexibele, gebruiksvriendelijke om hardware en software te gebruiken. Het is bedoeld voor kunstenaars, ontwerpers, hobbyisten en iedereen die geïnteresseerd is in het maken van interactieve objecten of omgevingen. Lees verder .

Opmerking : dit is het nieuwste in een reeks tutorials op beginnersniveau voor Arduino, het prototypeplatform voor open source-elektronica. Hier is een lijst van de vorige artikelen in de serie:

  • Wat is Arduino en wat kun je ermee doen Wat is Arduino en wat kun je ermee doen? Wat is Arduino en wat kun je ermee doen? De Arduino is een opmerkelijk klein elektronisch apparaat, maar als je er nog nooit een hebt gebruikt, wat precies zijn ze dan, en wat kun je ermee doen? Lees verder
  • Wat is een Arduino-starterkit en wat zit erin? Wat zit er in een Arduino Starter Kit? [MakeUseOf Explains] Wat zit er in een Arduino Starter Kit? [MakeUseOf Explains] Ik heb eerder de Arduino open-source hardware hier op MakeUseOf geïntroduceerd, maar je zult meer nodig hebben dan alleen de echte Arduino om er iets van te maken en daadwerkelijk aan de slag te gaan. Arduino "starter kits" zijn ... Lees meer
  • Meer coole onderdelen om te kopen met uw startpakket 8 meer coole onderdelen voor uw Arduino-projecten 8 meer coole componenten voor uw Arduino-projecten Dus u denkt erover om een ​​Arduino-starterkit te kopen, maar u vraagt ​​zich af of sommige basis-LED's en -weerstanden zullen worden genoeg om je het weekend bezig te houden? Waarschijnlijk niet. Hier zijn nog eens 8 ... Lees meer
  • Aan de slag met uw Arduino-starterkit - Stuurprogramma's installeren en het board en de poort aan de slag Aan de slag met uw Arduino-starterkit - Stuurprogramma's installeren en het board en de poort instellen Aan de slag met uw Arduino-starterkit - Stuurprogramma's installeren en het moederbord instellen & Port So, je hebt jezelf een Arduino-starterkit en mogelijk enkele andere willekeurige coole componenten gekocht - wat nu? Hoe begin je eigenlijk met het programmeren van dit Arduino-ding? Hoe stel je het in ... Lees meer
  • Een nadere blik op de structuur van een Arduino-app & het voorbeeld-knipperprogramma

Wat je nodig hebt

Afgezien van de basis Arduino, heb je nodig:

  • Rode, gele en groene LED's.
  • Een breadboard.
  • 6 x 220? weerstanden.
  • Draden verbinden.
  • 1 x drukknopschakelaar.
  • 1 x 10k? weerstand

Bijna elke Arduino zal geschikt zijn, mits hij voldoende pennen heeft. Zorg ervoor dat u onze koopgids leest Arduino Koopwijzer: welk bord moet u kopen? Arduino Koopwijzer: welk bord moet je kopen? Er zijn zoveel verschillende soorten Arduino-boards, dat je zou worden vergeven dat je in de war was. Welke moet je kopen voor je project? Laat ons helpen, met deze Arduino koopgids! Meer lezen als u niet zeker weet welk model u nodig hebt. Je hebt deze onderdelen waarschijnlijk in je startpakket. Wat zit er in je Arduino Starter Kit? [Arduino Beginners] Wat zit er in je Arduino Starter Kit? [Arduino Beginners] Geconfronteerd met een doos vol met elektronische componenten, is het gemakkelijk om overweldigd te worden. Hier is een gids voor precies wat u in uw kit zult vinden. Lees Meer al.

Een eenvoudig voorbeeld

Laten we klein beginnen. Een eenvoudig, één verkeerslicht is een goed beginpunt. Dit is het circuit:

arduino_traffic_light

Sluit de anode (lange been) van elke LED aan op digitale pinnen acht, negen en tien (via een 220 "weerstand). Verbind de kathodes (korte poot) met Arduino-grond.

Ik heb Fritzing gebruikt om deze diagrammen te tekenen. Het is niet alleen gemakkelijk te gebruiken, het is gratis!

De code

Begin met het definiëren van variabelen zodat we de lichten kunnen aanspreken op naam in plaats van op een nummer. Start een nieuw Arduino-project en begin met deze lijnen:

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

Laten we vervolgens de setup-functie toevoegen, waar zullen we de rode, gele en groene LED's configureren die als outputs moeten worden gebruikt. Omdat u variabelen hebt gemaakt om de pincodes weer te geven, kunt u nu naar de pinnen op naam verwijzen.

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

Dat was gemakkelijk. Nu voor het moeilijke deel - de werkelijke logica van een verkeerslicht. Maak een aparte functie om de lichten te veranderen (je zult later zien waarom).

Wanneer je voor het eerst met het programmeren begint, is de code zelf erg rudimentair - het is uitzoeken wat de meest logische details zijn die het grootste probleem vormen. De sleutel tot het zijn van een goede programmeur is om naar elk proces te kunnen kijken en het op te splitsen in zijn fundamentele stappen. Dit is de rest van de code:

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

Gedaan! Upload en voer nu uit (zorg ervoor dat u de juiste kaart en poort selecteert in de menu's Extra > Poort en Extra > Bord ). U zou een werkend verkeerslicht moeten hebben dat elke 15 seconden verandert, zoals dit (versneld):

Een voetgangersoversteekplaats

Nu dat je de basis kent, laten we het verbeteren. Voeg een drukknop toe voor voetgangers om het licht te veranderen wanneer ze maar willen:

arduino_traffic_light_with_button

Merk op hoe het verkeerslicht precies hetzelfde is als in het vorige voorbeeld. Sluit de knop aan op digitale pen 12. U zult merken dat de schakelaar een hoge impedantie heeft van 10k? weerstand die eraan verbonden is, en u vraagt ​​zich misschien af ​​waarom. Dit wordt een pull-down-weerstand genoemd. Het is een moeilijk begrip om eerst te begrijpen, maar wees geduldig.

Een schakelaar laat de stroom lopen, of niet. Dit lijkt eenvoudig genoeg, maar in een logisch circuit moet de stroom altijd in een hoge of een lage status stromen (onthoud - 1 of 0, hoog of laag). Je zou kunnen veronderstellen dat een drukknopschakelaar die niet daadwerkelijk wordt ingedrukt, zou worden gedefinieerd als zijnde in een lage toestand, maar in feite wordt er gezegd dat het 'zwevend' is, omdat er helemaal geen stroom wordt getrokken.

In deze zwevende staat is het mogelijk dat er een foutieve aflezing optreedt wanneer deze fluctueert met elektrische interferentie. Met andere woorden, een zwevende schakelaar geeft geen betrouwbare hoge of lage statuswaarde. Een neertrekweerstand houdt een kleine hoeveelheid stroom in stand als de schakelaar wordt gesloten, waardoor een nauwkeurige lage statuswaarde wordt gegarandeerd. In andere logische circuits vindt u mogelijk een pull-up-weerstand - dit werkt op hetzelfde principe, maar dan omgekeerd, en zorg ervoor dat bepaalde logische poorten standaard te hoog zijn.

Nu, in het lusgedeelte van de code, in plaats van de lichten om de 15 seconden te veranderen, gaan we in plaats daarvan de toestand van de drukknopschakelaar lezen en alleen de lichten veranderen wanneer deze wordt geactiveerd.

De code

Begin met het toevoegen van een nieuwe variabele aan het begin van het programma:

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

Voeg nu in de setup-functie een nieuwe regel toe om de switch als input te declareren. Ik heb ook een enkele regel toegevoegd om de verkeerslichten in de groene fase te starten. Zonder deze initiële instelling zouden ze worden uitgeschakeld, tot de eerste keer dat een changeLights () werd gestart met behulp van een functie.

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

Wijzig in plaats daarvan de hele lusfunctie naar de volgende:

 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 } } } 

Dat zou het moeten doen. U vraagt ​​zich misschien af ​​waarom de knop twee keer wordt gecontroleerd ( digitalRead (knop) ), gescheiden door een kleine vertraging. Dit wordt debouncing genoemd. Net als de pull-down-weerstand die nodig was voor de knop, stopt deze eenvoudige controle de code die kleine interferentie detecteert als een druk op de knop. Je hoeft dit niet te doen (en het zou waarschijnlijk prima werken zonder het), maar het is een goede gewoonte.

Door gedurende 15 seconden in de if- instructie te wachten, kunnen de verkeerslichten gedurende ten minste die duur niet veranderen. Zodra 15 seconden voorbij zijn, start de lus opnieuw. Elke herstart van de lus, lees de status van de knop opnieuw, maar als deze niet wordt ingedrukt, wordt de if-opdracht nooit geactiveerd, de lampjes veranderen nooit en worden gewoon opnieuw gestart.

Hier ziet u hoe dit eruit ziet (versneld):

Een knooppunt

Laten we een geavanceerder model proberen. In plaats van een voetgangersoversteekplaats, pas je circuit aan om twee verkeerslichten te hebben:

arduino_dual_traffic_light

Sluit het tweede verkeerslicht aan op digitale pinnen 11, 12 en 13.

De code

Wijs eerst uw nieuwe stoplichten toe aan variabelen en configureer ze als uitgangen, net als in het eerste voorbeeld:

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

Werk nu je loop bij om de code uit het eerste voorbeeld te gebruiken (in plaats van het zebrapad):

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

Nogmaals, al het werk wordt uitgevoerd in de functie changeLights () . In plaats van rood > rood en geel > groen te gaan, zal deze code de verkeerslichten afwisselen. Als iemand groen is, is de andere rood. Hier is de code:

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

Zo ziet dat eruit (versneld):

Dat is het deze keer, dus ik hoop dat je veel hebt geleerd en plezier hebt gehad van nul. Je hebt je handen vies met een paar LED's en weerstanden, evenals een schakelaar met een pull-down weerstand toegevoegd - hopelijk begreep je waarom we er een nodig hebben. Speel rond met de code, pas hem aan en vooral veel plezier. Als u toevoegingen of wijzigingen aanbrengt, kunt u ons dit laten weten in de opmerkingen.

Beeldcredits: androsvector via Shutterstock.com

In this article