TVZ Mechatronics Team


Zagreb University of Applied Sciences, Professional Study in Mechatronics

You are viewing an older revision! See the latest version

Digitalni izlazi i ulazi

mbed Hello World

Riješite sljedećih nekoliko zadataka s ciljem upoznavanja s mbed razvojnom platformom NXP LPC1768:

  1. Pročitajte uvodni dio o mbed LPC1768 mikroupravljaču. Provjerite da li je na vašem primjerku instaliran najnoviji firmware. Ako nije, instalirajte ga koristeći ove upute. Pokrenite Hello World program.
  2. Modificirajte program tako da blinkaju ostale 3 LED-ice.
  3. Modificirajte program tako da blinkaju 2 ili više LED-ica (gotovo) istovremeno.
  4. Modificirajte program tako da LED1 blinka 4 sekunde, nakon čega se LED1 isključuje, a počinje blinkati LED2 u trajanju od 4 sekunde. Zatim se isključuje LED2 i ciklus kreće ispočetka s LED1. Koristite while i for petlje u ovom zadatku.
  5. Deklarirajte i inicijalizirajte dvije konstantne realne varijable T_TOTAL i T_FLASH, koje će određivati ukupna vremena blinkanja pojedinih LED-ica iz prethodnog zadatka, kao i trajanje pojedinog blinka. Npr. postavite ukupno trajanje blinka pojedinih LED-ica T_TOTAL na 10 sekundi umjesto 4 i trajanje pojedinog blinka na 0,5 sekundi umjesto pretpostavljenih 0,2 sekunde. Ideja je promjene napraviti samo na ta dva mjesta, a ostatak kôda se mora pobrinuti za obavljanje zadatka.
  6. Pregledajte dokumentaciju klase DigitalOut. Uključite ili isključite bilo koju LED-icu koristeći funkciju write kao pripadnicu klase DigitalOut. Objasnite ulogu operator= u dokumentaciji klase.

U sljedeće dvije vježbe spojit ćete LED-ice na dva načina i usporedit ćete dva različita moda rada digitalnih izlaza.

Standardni digitalni izlazi s vanjskim LED-icama

Napomena

Za izvođenje sljedećih vježbi bit će vam potrebne dvije LED-ice, dva 220 ili 330 Ohmska otpornika, SPDT i SPST mehaničke sklopke (klizna sklopka i tipkalo), optički transmisivni i reflektivni senzori, žice, prototipna pločica (breadboard) i naravno mbed razvojna platforma.

Dobar tutorial o sklopkama (poles, throws, NO, NC, ...) možete pronaći ovdje i preporuča se da ga proučite.

Spojite komponente na prototipnu pločicu prema sljedećoj shemi spajanja:

Conventional digital outputs

Proučite sljedeći programski kôd:

#include "mbed.h"

DigitalOut green(p5);
DigitalOut red(p6);

int main() {
    while(true) {
        green = 1;
        red = 0;
        wait(0.5);
        green = 0;
        red = 1;
        wait(0.5);
    }
}

Primijetite da su digitalni izlazi (p5 i p6) deklarirani pomoću klase DigitalOut, koja (još) nema podršku za postavljanje izlaznog moda. Pretpostavljeni (default) mod je standardni, u kojem je izlazni pin izvor (struja teče iz pina, odnosno unutarnjeg izvora, prema trošilu).

Pokrenite program. Trebali biste vidjeti naizmjenično blinkanje zelene i crvene LED-ice svakih pola sekunde.

Digitalni izlazi u modu otvorenog odvoda (open drain mode)

Spojite komponente na prototipnu pločicu prema sljedećoj shemi spajanja:

Digital outputs in open drain mode

Proučite sljedeći programski kôd:

#include "mbed.h"

DigitalInOut green(p22, PIN_OUTPUT, OpenDrain, 1); // prvi nacin konfiguracije digitalnog izlaza
DigitalInOut red(p21); // drugi nacin konfiguracije digitalnog izlaza

int main() {
    red.output(); // prvi dodatak za drugi nacin konfiguracije digitalnog izlaza
    red.mode(OpenDrain);  // drugi dodatak za drugi nacin konfiguracije digitalnog izlaza
    red = 1; // iskljuci crvenu LED-icu (inverzna logika)
    while(true) {
        green = 1;
        red = 0;
        wait(0.5);
        green = 0;
        red = 1;
        wait(0.5);
    }
}

Na ovaj su način digitalni izlazi konfigurirani u modu otvorenog odvoda (open drain mode). Klasa koja se koristi u ovu svrhu je DigitalInOut, budući da klasa DigitalOut (još) nema podršku za postavljanje moda digitalnog izlaza. Klasa DigitalInOut ima dva konstruktora. Oba konstruktora su korištena i komentirana u gornjem primjeru programskog kôda.

Također primijetite i inverznu logiku ove konfiguracije. Kad je izlaz postavljen u logičko stanje 1, potencijal tog pina je postavljen u visoko stanje (3,3 V). Stoga je razlika potencijala na LED-ici i otporniku jednaka 0 i LED-ica ne svijetli. Kad je izlaz postavljen u logičko stanje 0, potencijal pina povlači se na 0, razlika potencijala sada na LED-ici i otporniku postaje 3,3 V i LED-ica prosvijetli.

Budite oprezni!

Ako se LED-ice spoje za open drain mod (druga shema), a izlazi se ne konfiguriraju kao open drain izlazi, postoji opasnost od oštećenja mbed sklopovlja ili u blažoj varijanti mogućnost neispravnog rada sustava. Naime, open drain mod se tipično koristi ukoliko je napon napajanja potreban za uključivanje nekog aktuatora (npr. relej) veći od 3,3 V (npr. 5 V, 12 V ili 24 V). Ako je pak napon od 3,3 V (uz dostatan iznos izlazne struje mikroupravljača) dovoljan za pokretanje aktuatora, ispravno će raditi i standardni mod i open drain mod digitalnog izlaza, ali se preporuča pravilno korištenje istih čak i u tim slučajevima.

Digitalni ulazi

Prvoj shemi s LED-icama dodajte single-pole double-throw (SPDT) sklopku, prema shemi sa sljedeće slike:

Conventional digital outputs with digital input

Proučite sljedeći programski kôd:

#include "mbed.h"

DigitalOut green(p5);
DigitalOut red(p6);
DigitalIn switchInput(p10);

int main() {
    int switchState;
    while(true) {
        switchState = switchInput; // citanje stanja ulaza samo jednom u prolazu petlje
        if(switchState == 0) {
            green = 0; 
            red = 1; 
            wait(0.5);
            red = 0;
            wait(0.5);
        } else if (switchState == 1) {
            red = 0; 
            green = 1; 
            wait(0.5);
            green = 0;
            wait(0.5);
        } else {
            // nemoguc slucaj
            red = 1;
            green = 1;
        }
    }
}

Pokrenite gornji program. Trebali biste vidjeti blinkanje crvene LED-ice kad je sklopka S1 u položaju #1, dok u isto vrijeme zelena LED-ica ne svijetli. Obrnut slučaj je kad je sklopka S1 u položaju #3. Tada blinka zelena LED-ica, a crvena ne svijetli.

Sad uklonite žicu koja spaja kontakt #1 sklopke S1 s GND-om. Promotrite ponašanje LED-ica. Ne bi trebali uočiti nikakve promjene u odnosu na slučaj prije uklanjanja žice. Ovo znači da je ulazni pin mbed-a (p10) spojen na GND interno, tj. pin je u pretpostavljenom (default) modu PullDown (dosad nismo namještali mod rada ulaza).

Sljedeći korak je modificirati program na način da se mod ulaznog pina p10 postavi u PullUp. Neposredno nakon početka main() funkcije (linija 8) dodajte sljedeću liniju:

    switchInput.mode(PullUp);

Pokrenite modificirani program (ostavite odspojenu žicu iz prethodnog koraka). Sad bi trebali primijetiti da zelena LED-ica blinka, a crvena ne svijetli, neovisno o stanju sklopke S1. Ulazni pin p10 je sad interno povučen gore (na potencijal 3,3 V) kad je sklopka S1 u položaju #1.

Sljedeći mod rada ulaza je PullNone. Promjenom linije 8 postavite mod ulaznog pina p10 u PullNone. Pokrenite program i promotrite ponašanje LED-ica nakon promjene stanja sklopke S1. Trebali bi primijetiti da je ulazni pin p10 podložan smetnjama (šum, statički elektricitet ili drugi električni poremećaj), kad je sklopka S1 u položaju #1. Stanje LED-ica u tom je položaju nepredvidivo.

Konačno, spojite uklonjenu žicu natrag u strujni krug prema izvornoj shemi. Promotrite ponašanje LED-ica u ovisnosti o stanju sklopke S1 za sve navedene modove rada (PullDown, PullUp i PullNone). Funkcionalnost programa je sad vraćena, neovisno o stanju sklopke S1 i postavljenom modu rada ulaznog pina p10. Može se zaključiti da je važno postaviti pravilan mod rada ulaza, ovisno o električnoj shemi i tipu sklopke, kako bi mogli razlučiti dva moguća stanja.

Vježbu zaključite promjenom SPDT sklopke u gornjoj shemi SPST (single-pole single-throw) sklopkom, tj. tipkalom (push button). Tipkalo spojite prema sljedeće dvije sheme, a program prilagodite tako da u oba slučaja možete razlučiti da li je tipkalo pritisnuto ili ne:

/media/uploads/tbjazic/tipkalo001.png

/media/uploads/tbjazic/tipkalo002.png

Brojanje događaja

U ovoj vježbi modificirat ćete gornji program (shema sa SPDT sklopkom) tako da broji koliko je puta sklopka S1 promijenila stanje. Ako je broj promjena stanja manji od 20, zelena LED-ica mora svijetliti, a crvena je isključena. Ako je broj promjena stanja sklopke S1 veći ili jednak 20, zelena LED-ica mora biti isključena, dok crvena mora svijetliti.

Dodatno, kad brojač dosegne 20, program nakon 10 sekundi od trenutka kad je brojač dosegnuo 20 mora resetirati brojač. Crbena LED-ica će prema tome svijetliti 10 sekundi.

Prije nego pogledate rješenje zadatka, pokušajte razmisliti kako bi problem riješili sami, te probajte implementirati vlastito rješenje.

Program koji rješava zadatke ove vježbe je sljedeći:

#include "mbed.h"
 
DigitalOut green(p5);
DigitalOut red(p6);
DigitalIn switchInput(p10);
 
int main() {
    int switchState; // trenutno stanje sklopke
    int previousSwitchState = -1; // stanje sklopke u prethodnom prolazu kroz petlju
    int x = 0; // brojac promjene stanja sklopke
    while(true) {
        switchState = switchInput.read(); // citanje stanja ulaza samo jednom u prolazu petlje
        if (previousSwitchState == -1)  // provjera da li je ovo prvi prolaz kroz petlju
            previousSwitchState = switchState; // postavlja se prethodno stanje u prvom prolazu
        if (previousSwitchState != switchState)
            x++; // povecaj brojac ako je doslo do promjene stanja sklopke
        if(x < 20) {
            green = 1; 
            red = 0; 
        } else {
            green = 0; 
            red = 1; 
            wait(10);
            x = 0;
        }
        previousSwitchState = switchState; // osvjezi prethodno stanje sklopke za iduci korak
    }
}

Analizirajte programski kôd, pokrenite program i prebrojite koliko puta je potrebno promijeniti stanje sklopke S1 da prosvijetli crvena LED-ica. Očekivani broj je 20, ali u praksi će to biti puno manji broj. Razlog tome je tzv. bouncing effect, koji će biti obrađen u narednim vježbama.

Optički senzori

Na raspolaganju su transmisivni i reflektivni optički senzori.

Spojite komponente na prototipnu pločicu prema sljedećoj shemi spajanja:

/media/uploads/tbjazic/opto001.png

Napišite program koji će uključivati/isključivati mbed LED-ice (LED1 i LED2) ovisno o stanjima transmisivnog i reflektivnog optičkog senzora.

Čestitke!

Završili ste sve vježbe iz teme Digitalni izlazi i ulazi.

Povratak na naslovnu stranicu TVZ Mechatronics Team-a.


All wikipages