Robotyka - Arduino

Na naszych zajęciach wykorzystywać będziemy platformę Arduino Uno, wyposażoną w mikrokontroler ATmega328.

Budowa Arduino

plytka.png

Złącze zasilania zewnętrznego – aby mikrokontroler działał, niezależnie od tego czy jest podłączony do komputera czy nie, musimy zapewnić mu źródło zasilania. Może być nim zestaw baterii lub zewnętrzny zasilacz.
Port USB – port wykorzystywany do komunikacji z komputerem. Za każdym razem kiedy chcemy umieścić nowy program (lub stary, ale zmodyfikowany) w pamięci Arduino, musimy płytkę podłączyć do komputera za pomocą kabla USB i tego złącza.
Złącza cyfrowe - te złącza można wykorzystywać zarówno jako wejścia jak i wyjścia sygnałów. Są one przystosowanie do obierania i wysyłania tak zwanych stanów niskich (0 V) oraz stanów wysokich (5 V).
Wejścia analogowe – złącza te można wykorzystywać do pomiaru przyłożonego napięcia. Zwykle wykorzystuje się je do obierania wartości sygnałów analogowych pochodzących z czujników. Do każdego z tych wejść można doprowadzić napięcie w zakresie od 0 do 5 V.
Złącza zasilania – jeśli dodatkowe moduły, które chcemy podłączyć do naszej płytki Arduino wymagają dodatkowego zasilania, możemy wykorzystać te złącza. Dostarczają one napięcie
3,3 V oraz 5 V.
Mikrokontroler – Najważniejszy element systemu. Opisany powyżej.
Przycisk reset – przycisk umożliwiający ponowne uruchomienie programu z pamięci.

Minmalny program

void setup(){               
}
void loop(){
}

Program podzielony jest na dwie funkcje. Pierwsza opisana jako „void setup()” będzie zawierała podstawowe ustawienia programu, np. które złącza cyfrowe będziemy wykorzystywać. Jej zawartość będzie wykonywa tylko raz, podczas uruchomienia lub zrestartowania płytki. Druga funkcja to „void loop()” (“loop” – pętla). Tu wpisujemy główną część naszego programu, czyli dokładnie to, co ma się wykonać. Jak długo? Jeśli nie zaznaczymy tego inaczej, w nieskończoność lub do czasu odłączenia zasilania.

Pierwszy program - miganie

void setup(){   
    pinMode(13, OUTPUT);              
}
void loop(){
    digitalWrite(13, HIGH);
    delay(1000);
    digitalWrite(13, LOW);
    delay(1000);
}

Przyjrzymy się najpierw funkcji „pinMode”. Służy ona do określenia czy dany pin (złącze) ma być wykorzystywany jako wejście (INPUT) czy wyjście (OUTPUT). Następna funkcja to „digitalWrite”. Jak sama nazwa wskazuje służy ona do zapisania stanu (wysokiego lub niskiego) na wyjściu portu cyfrowego. W nawiasie zapisane są parametry tej funkcji, które oznaczają numer portu cyfrowego, na którym mamy ustawić stan, oraz to jaki stan ma zostać ustawiony. HIGH to stan wysoki, LOW to stan niski. Funkcja „delay” to funkcja wstrzymująca wykonanie następnej funkcji na czas podany w nawiasie, wyrażony w milisekundach.

Sprawdź teraz co się stanie, jeśli:

1. Usuniesz linijki digitalWrite(13, LOW) oraz delay(1000);
2. Usuniesz linijki digitalWrite(13, HIGH) oraz delay(1000);
3. Zamienisz delay(1000) na delay(500);
4. Zamienisz delay(1000) na delay(2000).

A teraz spróbuj napisać program, który po kolei wykonuje następujące czynności:

1. Dioda włączona jest przez sekundę i następnie przez sekundę jest wyłączona;
2. Dioda włączona jest przez dwie sekundy i następnie przez dwie sekundy jest wyłączona;
3. Dioda włączona jest przez trzy sekundy i następnie przez trzy sekundy jest wyłączona.

Zmienne i zwiększanie czasu

int dioda = 13;
int czas = 1000;
void setup(){   
    pinMode(dioda, OUTPUT);              
}
void loop(){
    digitalWrite(dioda, HIGH);
    delay(czas);
    digitalWrite(dioda, LOW);
    delay(czas);    
    czas=czas+100;
}

Przed nazwą zmiennej „dioda” musieliśmy dopisać „int”. Oznacza to, że do zmiennej zapisaliśmy liczbę całkowitą. Pierwsza delay odnosi się do początkowego czasu równego 1000 ms. Ostatnią linijkę można interpretować następująco: „oblicz nową wartość zmiennej ‘czas’ dodając do starej wartości liczbę 100”.
W kolejnych iteracjach, zmienna czas zmieniać się będzie następująco:
1. 1000,
2. 1000+100=1100,
3. 1100+100=1200,
4. 1200+100=1300 itd.
Czas będzie się zwiększał aż do zatrzymania programu (odłączenia zasilania, kabla USB itp.). Sprawdź co się stanie, jeśli na płytce wciśniesz przycisk „RESET”.

Instrukcja warunkowa

int dioda = 12;
int czas = 500;
void setup(){
    pinMode(dioda, OUTPUT);
}
void loop(){
    digitalWrite(dioda, HIGH);
    delay(czas);
    digitalWrite(dioda, LOW);    
    delay(czas);

    if(czas > 2500){
        czas = 500;
    }
    else{
        czas = czas+500;
    }
}

W każdej iteracji sprawdzany jest warunek czy zmienna czas jest większa niż 2500 ms - linia „if(czas>2500)”. Jeśli warunek nie jest spełniony to czas trwania zwiekszany jest o 500 ms.. Jeśli jest spełniony wykonuje się to co zapisane jest w nawiasie klamrowym czyli „czas=500”, zmieniamy więc wartość zmiennej czas.

Pętla for

int dioda = 12;
int czas = 500;
void setup(){
    pinMode(dioda, OUTPUT);
}
void loop(){
    for (int i = 0; i < 6; i = i + 1){
        digitalWrite(dioda, HIGH); 
        delay(czas);
        digitalWrite(dioda, LOW); 
        delay(czas);
    }
    delay(3000);
}

Kod powyższego programu powoduje, że dioda sześciokrotnie załącza się i wyłącza, a następnie pozostaje wyłączona przez 3 s. Linijka „for (int i=0; i<6; i=i+1)” pozwala ona określić nam ile razy ma wykonywać się zawartość nawiasu klamrowego (czyli włączenie i wyłącznie diody). W komendzie tej wykorzystywany jest licznik oznaczony jako „i”. Pierwsza część „int i=0” mówi nam od jakiej wartości mamy rozpocząć liczenie liczby powtórzeń, natomiast „i<6” kiedy to liczenie zakończyć. Aby obliczyć liczbę wykonań (gdyby wpisane cyfry były inne) wystarczy od 6 odjąć 0, co da nam 6 powtórzeń. Ostatnia część „i=i+1” informuje o tym o ile mamy zwiększać licznik. Zapis „i=i+1” oznacza zwiększenie o jeden.

Zadanie na koniec

Zadaniem na koniec jest napisanie programu wykorzystującego polecenie „for” i wysyłającego sygnał SOS w alfabecie Morse’a. Sygnał ten jest kombinacją następujących sygnałów: krótki, krótki, krótki, długi, długi, długi, krótki, krótki, krótki. Pamiętaj, aby na zakończenie każdej sekwencji dołączyć dłuższą przerwę, aby między kolejnymi sygnałami SOS była wyraźna przerwa.

Strona na licencji Creative Commons Attribution-ShareAlike 3.0. Autorzy: A. Czoska, M. Komosiński, B. Kowalczyk, A. Kupś, M. Lubawy