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.

Arduino IDE: Informácia o aktuálnom nastavení pripojenej dosky

Ú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.

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.

Schéma zapojenia semafora pre nočný režim režim

Úloha

Vo funkcii setup() inicializujte PIN č. 3 na výstupný.

Ú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ť.

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.

Schéma zapojenia semafora pre denný režim

Ú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.

Schéma zapojenia semafora pre spolu s tlačidlom pre prepínanie režimov

Ú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.

Ú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

  1. 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á.

  2. 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

#define ORANGE_LED 3
#define RED_LED 5
#define GREEN_LED 4
#define BUTTON_PIN 2

void night_mode(){
  Serial.println(">> Entering Night Mode");

  do{
    digitalWrite(ORANGE_LED, HIGH);
    delay(1 * 1000);
    digitalWrite(ORANGE_LED, LOW);
    delay(1 * 1000);
  }while(digitalRead(BUTTON_PIN) == LOW);
}

void day_mode(){
  Serial.println(">> Entering Day Mode");

  do{
    digitalWrite(RED_LED, HIGH);
    delay(5 * 1000);
    digitalWrite(ORANGE_LED, HIGH);
    delay(2 * 1000);
    digitalWrite(GREEN_LED, HIGH);
    digitalWrite(RED_LED, LOW);
    digitalWrite(ORANGE_LED, LOW);
    delay(5 * 1000);
    digitalWrite(ORANGE_LED, HIGH);
    digitalWrite(GREEN_LED, LOW);
    delay(2 * 1000);
    digitalWrite(ORANGE_LED, LOW);
  }while(digitalRead(BUTTON_PIN) == LOW);
}

int main(){
  // setup
  init();
  Serial.begin(9600);
  pinMode(ORANGE_LED, OUTPUT);
  pinMode(RED_LED, OUTPUT);
  pinMode(GREEN_LED, OUTPUT);
  pinMode(BUTTON_PIN, INPUT);

  // superloop
  for(;;){
    night_mode();
    day_mode();
  }

}