Traffic Lights Controlled by Arduino
o diódach, rezistoroch, tlačidlách a základoch programovania pre Arduino
Objectives
- Osvojiť si základy práce prototypovacou doskou Arduino.
- Osvojiť si základy práce s elektronikou.
- Porozumieť významu Pull-Up a Pull-Down rezistorov.
About
Na tomto cvičení vyrobíme a naprogramujeme bežný semafor, ktorým sa riadi premávka na križovatkách. Aby to však nebolo až také jednoduché, semafor bude pracovať v dvoch režimoch - v nočnom, kedy bude svietiť len oranžové svetlo, a v dennom, kedy budú svietiť všetky tri farby. K prepnutiu režimu dôjde vtedy, keď obsluha stlačí príslušné tlačidlo. Poďme na to!
Postup
Get Ready
V tomto kroku si overíme, či máme nainštalované všetko potrebné pre potreby cvičenia a či vie operačný systém komunikovať s doskou Arduino Uno. Toto overenie vykonáme pomocou príkladu Blink.
Úloha
Pripojte dosku Arduino Uno k vášmu počítaču.
Úloha
Spustite vývojové prostredie Arduino IDE.
Aktuálne sú dostupné dve verzie prostredia:
- Arduino IDE 1.x
- Arduino IDE 2.x
V princípe je jedno, ktorú verziu budete používať, pretože sú si veľmi podobné. Ale odporúčame používať novšiu verziu prostredia.
Úloha
Nastavte pripojenie vašej dosky v prostredí.
Začnite výberom dosky pomocou menu
Tools > Board > Arduino AVR Boards
. Zo zoznamu si
vyberte svoju dosku, napríklad Arduino Uno
.
Pokračujte výberom portu, do ktorého je vaša doska pripojená pomocou
menu Tools > Port
. Zo zoznamu portov si vyberte ten, do
ktorého máte svoju dosku zapojenú, čo v OS Linux môže byť napr. cesta
/dev/ttyACM1
alebo v OS Windows to môže byť napríklad
sériový port označený ako Serial 1
.
O tom, akú dosku a kde ju máte pripojenú, sa viete rýchlo dozvedieť v pravom dolnom rohu.
Upozornenie
V prípade, že používate čínsky klon dosky Arduino na operačnom systéme Windows, budete potrebovať nainštalovať osobitne aj ovládač. Tieto dosky totiž používajú iný prevodník, ako oficiálne dosky Arduino, ktorých podporu v OS Windows nájdete. Potrebujete nainštalovať ovládač pre CH340/CH341, ktorý môžete stiahnuť napríklad z tejto stránky.
Úloha
Nahrajte na dosku Arduino ukážkový príklad Blink.
V Arduino IDE v menu
File > Examples > Basic
otvorte príklad s názvom
Blink
a nahrajte ho na vašu dosku pomocou tlačidla
Upload
. Ak ste postupovali správne, na doske začne v 1s
intervaloch blikať zabudovaná LED dióda.
Upozornenie
Ak ste používateľ OS Linux, pravdepodobne proces nahrávania
skončí s chybovou hlášku o nedostatočných prístupových právach. Overte
preto, či sa váš používateľ nachádza v skupine dialout
. Ak
nie, tak ho do tejto skupiny pridajte príkazom:
sudo moduser -aG dialout $USER
Traffic Lights - The Night Mode
Začneme zľahka rozblikaním jednej oranžovej LED diódy. Blikanie oranžového svetla bude práve reprezentovať nočný režim semaforu.
Úloha
Cez rezistor pripojte na pin č. 3 oranžovú LED diódu.
Pri zapájaní si dajte pozor na správnu polaritu diódy a taktiež nezabudnite na umiestnenie odporu pred samotnú diódu.
Úloha
Vo funkcii setup()
inicializujte PIN č. 3 na
výstupný.
Poznámka
Nezabudnite, že používanie globálnych premenných nevedie k dobrým návykom. Ak si teda budete chcieť PIN č. 3 pomenovať, použite na to makro.
Úloha
Vytvorte funkciu night_mode()
, po zavolaní ktorej dôjde
k spusteniu nočného režimu.
Funkcia bude reprezentovať jeden cyklus nočného režimu - na
1 sekundu sa svetlo rozsvieti a následne na 1 sekundu
svetlo zhasne. Jej volanie následne umiestnite do funkcie
loop()
sketch-u.
Táto funkcia nebude mať žiadne parametre, ani nebude vracať žiadnu hodnotu.
Úloha
Overte vaše vytvorené riešenie.
Pokiaľ ste postupovali správne, po nahratí programu do Arduina sa bude oranžová dióda v sekundových intervaloch rozsvecovať a zhasínať.
Upozornenie
V prípade, že sa vám nepodarí program preniesť do Arduina, skontrolujte si, či máte nastavený správny port a zvolený správny typ dosky.
Traffic Lights - The Day Mode
Keďže úlohou semaforov je usmerňovať premávku pomocou všetkých troch farieb, v tomto kroku sa sústredíme práve na vyriešenie tohto problému.
Úloha
K oranžovej LED dióde zapojte podobným spôsobom aj zelenú (PIN č. 4) a červenú (PIN č. 5) LED diódu.
Úloha
Inicializujte PIN-y č. 4 a 5 vo funkcii setup()
.
Úloha
Vytvorte funkciu day_mode()
, po zavolaní ktorej sa
semafor prepne do denného režimu.
Funkcia bude reprezentovať jeden cyklus denného režimu. Ten sa bude správať nasledovne:
- Po zapnutí, resp. zavolaní funkcie (v čase 0 sekúnd) bude na semafore svietiť len červená LED dióda.
- V čase 5 sekúnd začne okrem červenej LED diódy svietiť aj oranžová.
- V čase 7 sekúnd začne svietiť len zelená LED dióda.
- V čase 12 sekúnd začne svietiť len oranžová LED dióda.
- V čase 14 sekúnd sa ukončí cyklus denného režimu zhasnutím oranžovej LED diódy.
Funkcia nemá žiadne vstupné parametre a taktiež nevracia žiadnu hodnotu.
Úloha
Overte vami vytvorené riešenie.
Vytvorenú funkciu zavolajte zvnútra funkcie loop()
.
Pokiaľ ste postupovali správne, semafor začne pracovať v dennom
režime.
The Magic Button
Za normálnych okolností by sme zmenu nočného režimu na denný a opačne riešili buď časovačom alebo svetelným senzorom. V našom prípade si však vystačíme s jedným tlačidlom.
Na PIN č. 2 pripojte tlačidlo, po stlačení ktorého sa na tomto PIN-e bude dať odčítať napätie reprezentujúce úroveň logickej jednotky.
Poznámka
Pri zapájaní nezabudnite na to, že ak na PIN nie je privedené žiadne napätie (tlačidlo nie je stlačené), neznamená to automaticky, že sa na ňom nachádza 0V! Zvážte preto použitie Pull-UP alebo Pull-Down rezistorov.
Úloha
Vo funkcii loop()
implementujte kód, pomocou ktorého
budete vedieť prepnúť režim pracovania semaforu z denného na nočný a
opačne.
Vzhľadom na aktuálnu implementáciu bude možné prepnúť režim práce semaforu až po ukončení jeho aktuálneho pracovného cyklu. Čo je však dôležité - po zmene pracovného cyklu sa tento cyklus musí neustále opakovať, až pokiaľ nestlačíte tlačidlo znova.
Poznámka
Túto úlohu vyriešte bez použitia globálnych premenných!
Úloha
Overte správnosť svojej implementácie.
Pokiaľ ste postupovali správne, stlačením tlačidla dôjde k prepnutiu režimu práce semafora z nočného na denný alebo opačne. Čo je však dôležité, semafor bude v uvedenom režime pracovať aj vtedy, keď sa zvolený cyklus skončí a spustí sa znova.
Ďalšie úlohy
Aktuálne ste vytvorili semafor, ktorý riadi premávku áut. Rozšírte teda svoje riešenie o semafor pre chodcov, ktorý bude bude synchronizovaný s vašim semaforom pre autá.
Pokúste sa upraviť svoje riešenie tak, aby bolo možné z jedného režimu do druhého prejsť stlačením tlačidla kedykoľvek - aj počas práve prebiehajúceho cyklu.
Ďalšie zdroje
Arduino Language Reference
delay() - Pauses the program for the amount of time (in miliseconds) specified as parameter.
millis() - Returns the number of milliseconds since the Arduino board began running the current program.
digitalWrite() - Write a HIGH or a LOW value to a digital pin.
digitalRead() - Reads the value from a specified digital pin, either HIGH or LOW.
pinMode() - Configures the specified pin to behave either as an input or an output. See the description of digital pins for details on the functionality of the pins.
Nástroj Fritzing
Online nástroj circuits.io
#define ORANGE_LED 3
#define RED_LED 5
#define GREEN_LED 4
#define BUTTON_PIN 2
void night_mode(){
.println(">> Entering Night Mode");
Serial
do{
(ORANGE_LED, HIGH);
digitalWrite(1 * 1000);
delay(ORANGE_LED, LOW);
digitalWrite(1 * 1000);
delay}while(digitalRead(BUTTON_PIN) == LOW);
}
void day_mode(){
.println(">> Entering Day Mode");
Serial
do{
(RED_LED, HIGH);
digitalWrite(5 * 1000);
delay(ORANGE_LED, HIGH);
digitalWrite(2 * 1000);
delay(GREEN_LED, HIGH);
digitalWrite(RED_LED, LOW);
digitalWrite(ORANGE_LED, LOW);
digitalWrite(5 * 1000);
delay(ORANGE_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
digitalWrite(2 * 1000);
delay(ORANGE_LED, LOW);
digitalWrite}while(digitalRead(BUTTON_PIN) == LOW);
}
int main(){
// setup
();
init.begin(9600);
Serial(ORANGE_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
pinMode
// superloop
for(;;){
();
night_mode();
day_mode}
}