TVZ Mechatronics Team


Zagreb University of Applied Sciences, Professional Study in Mechatronics

Uvodna vježba

Priprema

  1. Ako još niste, sada je pravo vrijeme da otvorite račun na Mbed-ovoj stranici. Za otvaranje računa potrebno je u gornjem desnom kutu odabrati opciju sign up kao što je prikazano na slijedećoj slici:
    /media/uploads/dfraj/otvaranje_racuna.jpg

  2. Nakon otvaranja računa pročitajte uvodni dio o mbed LPC1768 mikroupravljaču i dodajte navedeni mikroupravljač u vaš Mbed Compiler odabirom opcije Add to your Mbed Compiler (prikazano na slici).
    /media/uploads/dfraj/dodavnje_mikroupravljaca.jpg

  3. Spojite mikroupravljač na računalo. Ono će ga prepoznati kao prijenosnu memoriju (engl. memory stick). Provjerite je li na mikroupravljaču instaliran najnoviji firmware. Provjeru obavljate tako da na računalu otvorite mbed-ov direktorij, pronađete datoteku s .HTM ekstenzijom, te ju otvorite pomoću Notepad-a. /media/uploads/dfraj/direktorij.jpg

    Unutar navedene datoteke pronaći ćete oznaku firmware-a. Ako nije instaliran najnoviji firmware, instalirajte ga koristeći ove upute.

Napomena

Direktorij mikroupravljača na slici imenovan je MBED, međutim moguće je da mikroupravljač koji koristite neće biti tako imenovan zbog laboratorijskih vježbi iz kolegija "Komunikacijske tehnike u mehatronici" gdje ćete mikroupravljačima pridjeljivati uloge MASTER-a i SLAVE-a te ćete ih tako i imenovati.

Vježba

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

Za ovu vježbu nije potrebno spajati vanjske LED-ice budući da mbed LPC1768 platforma ima četiri ugrađene LED-ice prikazane na slijedećoj slici oznakama od LED1 do LED4. Program s kojim ćete započeti ovu vježbu osnovni je blinky HelloWorld program kojim ćete omogućiti blinkanje LED-ice s oznakom LED1.

/media/uploads/dfraj/boardlayoutsmall.png

  1. Uvezite dolje prikazani HelloWorld program u Mbed Compiler. Klikom na ikonu Import Program u internet pregledniku otvara se nova kartica sa stranicom Mbed Compiler-a te slijedeći skočni prozor na kojem možete modificirati ime programa te ga na kraju uvesti u Mbed Compiler klikom na tipku Import.

    Import program

    00001 #include "mbed.h"
    00002 
    00003 DigitalOut myled(LED1);
    00004 
    00005 int main() {
    00006     while(1) {
    00007         myled = 1;
    00008         wait(0.2);
    00009         myled = 0;
    00010         wait(0.2);
    00011     }
    00012 }
    
    /media/uploads/dfraj/newprogram.jpg

  2. Nakon uvođenja i otvaranja programa (klikom na njegovo ime ) prozor Mbed Compiler-a će se podijeliti na tri dijela prikazana na slijedećoj slici. /media/uploads/dfraj/compiler.jpg

    Na lijevom dijelu prozora nalazi se stablo mapa u kojem su prikazane sve mape od kojih se sastoji program. Klikom na datoteku main.cpp otvara se program te se njegov programski kod prikazuje na gornjem desnom prozoru. Prevedite program odabirom Compile ikone u Mbed Compiler-u. Nakon prevođenja, u donjem desnom prozoru pojavit će se poruka o uspješnom ili neuspješnom prevođenju programa. Ako je riječ o neuspješnom prevođenju, u istom prozoru dobit ćete upozorenje u kojem dijelu programskog koda je došlo do greške. U slučaju uspješnog prevođenja pojavit će vam se skočni prozor s upitom gdje želite spremiti prevedeni program (.bin datoteka) ili će se datoteka s programom automatski spremiti na određeno mjesto na računalu. Spremljenu .bin datoteku prebacite u mbed-ov direktorij te pritiskom na tipkalo na vašem mikroupravljaču resetirat ćete isti i time pokrenuti zadnji program koji ste prebacili na njega, u ovom slučaju to je HelloWorld program.
  3. 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. Dokumentaciju možete pregledati na dva načina:
    1. (TRENUTNO NEDOSTUPNO) U Mbed Compiler-u, u stablu mapa nalazi se mbed biblioteka (ikona zupčanika). Klikom na navedenu mapu prikazuju se njene podmape te je potrebno otvoriti podmapu pod nazivom Classes. Unutar te podmape nalazi se popis i dokumentacija svih klasa koje se mogu koristiti.
    2. na ovom linku moguće je pronaći dokumentaciju za sve klase koje ćemo koristiti na ovom kolegiju (a i na KTM-u).
  4. Modificirajte program tako da blinka samo jedna od 3 preostale LED-ice (samo jedna LED-ica može blinkati).
  5. Modificirajte program tako da blinkaju 2 ili više LED-ica (gotovo) istovremeno.
  6. Kreirajte novi program. Svaki program može imati samo jednu main.cpp datoteku. Unutar mape vašeg programa nemojte dodavati nove datoteke s .cpp ekstenzijom. Za kreiranje novog programa potrebno je u izbornoj traci Mbed prevoditelja odabrati New (gore lijevo) te zatim izabrati New program.
    /media/uploads/dfraj/new.png

    Nakon toga otvoriti će se skočni prozor prikazan u nastavku:
    /media/uploads/dfraj/newprogram_WP1ffL4.jpg

    U njemu je potrebno podesiti postavke programa. Najprije je u polju Platform potrebno postaviti platformu za koju ćete pisati programski kod. U polju će se automatski odabrati platforma mbed LPC1768 budući da je trenutno samo ona dodana u compiler. Međutim, dodavanjem drugih platformi iz navedenog polja moći će se pomoću padajućeg izbornika odabrati željena platforma. U slijedećem polju nazvanom Template moguće je iz padajućeg izbornika odabrati izgled programa. Hoće li on biti potpuno prazan ili će imati predložak mbed OS Blinky LED HelloWorld kao u prvom zadatku. Potrebno je odabrati navedeni (i prikazani) mbed OS Blinky LED HelloWorld predložak budući da on osim programskog koda sadrži i sve osnovne biblioteke za mbed platforme koje bi u slučaju odabira praznog predloška morale biti ručno dodane. U zadnjem polju nazvanom Program Name potrebno je definirati naziv programa.
    /media/uploads/dfraj/newprogram01.jpg

    U ovom zadatku modificirajte program iz prethodnog zadatka 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.
  7. 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.
  8. Kreirajte novi program koji sadrži jednu LED-icu i sljedeći uzorak blinkanja:
    1. LED-ica se najprije uključuje na vrijeme od 5 sekundi, zatim se isključuje na vrijeme od pola sekunde.
    2. Nakon toga se vrijeme uključenja smanjuje na 4 sekunde, uz fiksno vrijeme isključenja od pola sekunde.
    3. Ciklus se nastavlja dok vrijeme uključenja ne dosegne 1 sekundu, nakon čega kreće ponavljanje ciklusa od početka.
  9. Prethodni zadatak poopćite tako da vrijeme uključenja od 5 sekundi zamijenite proizvoljnim brojem sekundi (cijeli broj), a dekrement vremena uključenosti i dalje ostaje 1 sekunda.

Čestitke!

Završili ste sve zadatke iz teme Uvodna vježba. U nastavku laboratorijskih vježbi slijede i zanimljivije teme.

Povratak na naslovnu stranicu TVZ Mechatronics Team-a.

Dodatni zadaci za vježbu

Kao alat za vježbanje, testiranje i simuliranje programskih kodova koji će se obrađivati na ovom kolegiju, može se koristiti Mbed simulator. Simulatoru možete pristupiti preko ovog linka te on simulira rad mbed LPC1768 platforme. Pomoću navedenog simulatora moguće je testirati blinky HelloWorld program iz 1. zadatka, prekidne rutine (engl. Interrupts), pulsno širinsku modulaciju (engl. PWM - Pulse Width Modulation), komunikaciju s LCD zaslonom, temperaturnim senzorom itd., više o simulatoru i njegovom korištenju možete pročitati ovdje.

Binarni zapis

Kao što znamo brojevi u binarnom zapisu mogu poprimii samo dvije vrijednosti 0 ili 1 što kod mikroupravljača predstavlja nisko ili visoko stanje digitalnih izlaza i ulaza. U nastavku je prikazan oblik 4-bitnog binarnog zapisa kojim je moguće prikazati brojeve u dekadskom zapisu od 0 do 15. Potencije broja dva počinju s desne strane zapisa od bita s najmanjom težinom vrijednosti (engl. LSB - Least Significant Bit) čija vrijednost iznosi 20 tj. 1 te se povećavaju sa svakim slijedećim bitom i to rezultira bitom s najvećom težinom vrijednosti (engl. MSB - Most Significant Bit) koji se nalazi na lijevom kraju zapisa gdje potencija tj. vrijednost tog bita (u ovom slučaju) iznosi 23 tj. 8.

/media/uploads/dfraj/binarni_zapis.jpg

Klasa BusOut

Razlog zašto je gore ukratko objašnjen 4-bitni binarni zapis je taj da ćete se s tim zapisom susretati na kolokvijima na ovom kolegiju, a i na laboratorijskim vježbama iz kolegija "Komunikacijske tehnike u mehatronici". Znanje korištenja tog zapisa testirat ćete pri radu s klasom BusOut. U nastavku će biti objašnjena samo inicijalizacija objekta navedene klase, a cijelu njenu dokumentaciju možete proučiti prema postupcima objašnjenim u 3. zadatku.

Inicijalizacija objekta BusOut klase biti će prikazana na primjeru programskog koda koji broji od 0 do 15. Ako ovaj primjer testirate kod kuće i trenutno nemate pri ruci mbed LPC1768 platformu, navedeni program možete simulirati u prije spomenutom Mbed Simulatoru.

BusOut klasa omogućuje stvaranje sabirnice koja se sastoji od više digitalnih izlaza (u ovom slučaju četiri ugrađene ledice na platformi) kojima možemo istovremeno upravljati. Binarni zapis pri inicijalizaciji objekta klase BusOut zrcalna je slika standardnom binarnom zapisu. Stoga je potrebno kao prvi argument, u dolje prikazanom primjeru, objektu myleds klase BusOut predati naziv pina kojim se upravlja LED-icom LED4 jer taj argument predstavlja bit s najmanjom težinom vrijednosti (LSB), a zadnji argument (LED1) predstavlja bit s najvećom težinom vrijednosti.

Primjer programa za brojanje prikazan je u nastavku:

Brojanje od 0 do 15

#include "mbed.h"

             //LSB               MSB
BusOut myleds(LED4, LED3, LED2, LED1);

int main() {
    while(1) {
        for(int i = 0; i < 16; i++) {
            myleds = i;
            wait(0.5);
        }
    }
}

Bitwise operatori

Sada kad ste testirali BusOut klasu shvatili ste da je nju samu po sebi jednostavno koristiti stoga ćemo u programski kod uvesti operatore s kojima možemo raditi operacije na razini bitova (engl. Bitwise operators).

Bitovni operatori s kojima ćete se susresti u ovom zadatku su:

  • bitovno I (engl. AND) (simbol &) - uzima dva broja kao argumente i izvršava operaciju I na svakom bitu tih dvaju brojeva. Rezultat operacije I je 1 samo ako vrijednosti oba bita iznose 1.
  • bitovno ILI (engl. OR) (simbol |) - uzima dva broja kao argumente i izvršava operaciju ILI na svakom bitu tih dvaju brojeva. Rezultat operacije ILI je 1 ako vrijednost barem jednog od dva promatrana bita iznosi 1.
  • pomicanje ulijevo (engl. left shift) (simbol <<) - uzima dva broja kao argumente te pomiče bitove prvog argumenta ulijevo za broj pozicija naveden kao drugi argument. Početni bitovi (MSB) prvog argumenta se zanemaruju, a na mjesto krajnjih bitova (LSB) se upisuju nule. Pomicanje broja za jednu poziciju ulijevo odgovara množenju tog broja s 2.
  • pomicanje udesno (engl. right shift) (simbol >>) - uzima dva broja kao argumente te pomiče bitove prvog argumenta udesno za broj pozicija naveden kao drugi argument. Krajnji bitovi (LSB) se zanemaruju, a na mjesto početnih bitova (MSB) će se u ovom slučaju upisivati nule. Pomicanje broja za jednu poziciju udesno odgovara dijeljenju tog broja s 2.
  • bitovna negacija NE (engl. NOT) (simbol ) - uzima jedan argument i invertira sve njegove bitove.

U nastavku je prikazan programski kod s primjerom rada opisanih bitovnih operatora kojeg je moguće pokrenuti na mbed LPC1768 platformi ili u mbed simulatoru:

BusOut - primjer rada bitovnih operatora

#include "mbed.h"

BusOut myleds(LED4, LED3, LED2, LED1);
unsigned char a, b;

int main() {
    a = 4; // 00000100
    b = 9; // 00001001
    while(1) {
        myleds = a;         //00000100 == 4
        wait(1);
        myleds = b;         //00001001 == 9
        wait(1);
        myleds = a | b;     //00001101 == 13
        wait(1);
        myleds = a & b;     //00000000 == 0
        wait(1);
        myleds = a << 1;    //00001000 == 8
        wait(1);
        myleds = a >> 1;    //00000010 == 2
        wait(1);
		myleds = ~b;		//11110110 == 246 - na LED-icama će se prikazati samo vrijednost broja 6
    }
}

Slijedeći programski kodovi prikazuju primjere kombinacija binarnih operatora pomoću kojih je moguće upravljati određenim bitovima tj. digitalnim ulazima ili izlazima na sabirnici. Prikazan je način paljenja i gašenja pojedinih LED-ica dok stanja ostalih LED-ica na sabirnici ostaju nepromijenjena. Kao i kod matematičkih zapisa najprije se rješavaju operacije unutar zagrada s napomenom da u programerskom svijetu brojanje počinje od nule.

Testirajte prikazane programske kodove te provjerite rade li ono što ste od njih očekivali.

BusOut - paljenje LED-ice LED3

#include "mbed.h"

BusOut ledice(LED4, LED3, LED2, LED1);

int main(){
    while(1){
       ledice = 0b1001;
       wait(2);
       ledice = ledice | (1<<1);
       wait(2);
    }
}

BusOut - gašenje LED-ice LED1

#include "mbed.h"

BusOut ledice(LED4, LED3, LED2, LED1);

int main(){
    while(1){
       ledice = 13;
       wait(2);
       ledice = ledice & ~(1<<3);
       wait(2);
    }
}

Probajte upaliti/ugasiti jednu od preostalih LED-ica na mbed platformi. Primjetite da koristeći BusOut klasu, njenom objektu možete pridodati vrijednost cijelog broja, kao što je to prikazano u gornjim primjerima s LED-icama (ledice = 13) te ta radnja rezultira prebacivanjem tog broja iz dekatskog u binarni zapis i paljenjem tj. gašenjem određenih LED-ica koje odgovaraju tom zapisu.

Vrijednost cijelog broja koju pridodajete objektu klase BusOut, možete zapisati na više načina:

  • dekadskom: 1, 2, 3, 4, 5...
  • binarnom - potrebno je koristiti prefiks 0b: 0b0001, 0b0010, 0b0011, 0b0100, 0b0101...
  • heksadecimalnom - potrebno je koristiti prefiks 0x: 0x01, 0x02, 0x03, 0x04, 0x05...

Povratak na naslovnu stranicu TVZ Mechatronics Team-a.


All wikipages