KURS
Dodatkowe materiały
Kurs Arduino (1)
na CD/FTP
Język programowania
Rozpoczynamy naukę programowania Arduino. W pierwszej dardowych bibliotek dostępne są biblioteki
funkcji obsługi pamięci EEPROM, komuni-
kolejności zajmiemy się specyficznym językiem Arduino, który
kacji z komputerem, obsługi wyświetlaczy
dostępnymi bibliotekami oraz składnią niewiele różni się od języka
LCD, transmisji sieciowej ETHERNET, ob-
C. Dlatego też preferowana jest podstawowa znajomość składni
sługi kart pamięci SD, silników krokowych,
i komend języka C oraz ich użycia. W kolejnych częściach kursu
programowej wersji interfejsu RS232 czy
zapoznamy się z zestawem Arduino UNO i jego uruchomieniem
obsługi interfejsów SPI i I2C/TWI, w które
w środowisku Arduino IDE. W kolejnych częściach kursu
został wyposażony w mikrokontroler. Do
zaprezentujemy sposób programowania w tym systemie na podstawie niektórych bibliotek standardowych wyma-
gane będą elementy sprzętowe, jak choćby
praktycznych przykładów.
wyświetlacz LCD czy kontroler Ethernet. Jak
wspomniano, dostępne są również biblioteki
Jak wspomniano, język Arduino IDE jest pomiaru czasu. Arduino IDE ma również niestandardowe, które można ściągnąć z In-
zbliżony do języka C. Jego komendy umiesz- funkcje matematyczne, trygonometryczne ternetu. Biblioteki niestandardowe można
czono w tabeli 1. Składa się on ze struktur, czy funkcje generatorów pseudolosowych. podzielić na kilka grup. W grupie bibliotek
zmiennych oraz funkcji. W strukturach Se- Z mikrokontrolerami związane są nieodzow- komunikacyjnych można znalezć biblioteki
tup() oraz Loop(), wymaganych przez język nie operacje na bajtach oraz bitach. Dlatego umożliwiające obsługę wiadomości teksto-
Arduino, będzie się znajdował program. Po- też Arduino udostępnia funkcje związane wych, obsługi interfejsu 1Wire, klawiatury
zostałe struktury kontrolne, arytmetyczne, z bitami i bajtami. Umożliwiają one zapis z interfejsem PS2, obsługi telefonu komór-
bitowe czy logiczne pokazane w tab. 1 są bajtów, ich odczyt oraz ustawianie/kasowa- kowego czy serwera www. Dostępne są rów-
identyczne, jak dla języka C. nie i odczyt dowolnych bitów zmiennych. Są nież biblioteki umożliwiające komunikacje
W programowaniu w każdym języku są to bardzo pomocne funkcje przydatne w ope- zestawów Arduino ze sobą. W grupie bi-
wykorzystywane zmienne i związane z nimi rowania na portach mikrokontrolera. bliotek obsługujących czujniki są dostępne
typy danych oraz stałe. W języku Arduino, Kolejne funkcje są przeznaczone do ob- biblioteki obsługujące czujniki pojemnościo-
oprócz standardowych stałych dla języka C, sługi przerwań. Umożliwiają one przerwa- we oraz przyciski w jakie jest wyposażona
są dostępne dodatkowe stałe LOW, HIGH, IN- nie pracy programu głównego i wykonanie większość urządzeń. Dostępna jest również
PUT oraz OUTPUT związane z operacjami na bardziej priorytetowego zadania. Dostępne grupa bibliotek obsługujących wyświetlacze
liniach portów mikrokontrolera. Natomiast są funkcje obsługi przerwań zewnętrznych graficzne oraz wyświetlacze wielosegmen-
typy zmiennych są identyczne jak dla języka zgłaszanych od linii portów mikrokontrolera towe LED również z wykorzystaniem kon-
C. Nowością w języku Arduino są dostępne oraz wewnętrznych przerwań zgłaszanych trolerów firmy MAXIM. Biblioteki w grupie
funkcje związane z mikrokontrolerem. Do- przez peryferia mikrokontrolera jak czaso- generatory umożliwiają generowanie sygna-
stępne są funkcje wykonujące operacje na mierzy czy interfejsów komunikacyjnych. łu na dowolnym pinie mikrokontrolera lub
portach mikrokontrolera. Pierwsza z funkcji Ostania z dostępnych funkcji języka Ar- z wykorzystaniem scalonych generatorów
pinMode(pin, mode) umożliwia konfiguro- duino jest funkcją obsługi transmisji szere- PWM. Dostępna jest również grupa bibliotek
wanie poszczególnych wyprowadzeń portów gowej zgodnej z RS232. Będzie ona bardzo dotyczących czasu. Można w niej znalezć bi-
mikrokontrolera, ustalanie czy dana nóżka pomocna podczas komunikacji mikrokontro- bliotekę obsługującą zegar oraz kalendarz
ma być wejściem czy wyjściem. Pozostałe lera np. z komputerem lub innym urządze- bardzo przydatna biblioteka, gdy będzie wy-
funkcje digitalWrite() oraz digitalRead() doty- niem zgodnym i wyposażonym w interfejs magany zegar i kalendarz i związana z tym
czą zapisu lub odczytu wartości linii portu. RS232. Mogą to być np. moduły Bluetooth, np. rejestracja danych ze znacznikiem czasu
Kolejnymi funkcjami są funkcje dotyczą- GPS czy GSM. Dostępne funkcje języka Ar- rejestracji. Pozostałe biblioteki związane są
ce obsługi analogowych linii portów mikro- duino jak i inne instrukcje pokazane w tab. 1 z odmierzaniem czasu. Ostatnia grupa do-
kontrolera. Składają się one z funkcji ana- będą dokładniej opisane i pokazane z użyciu stępnych bibliotek dotyczy bibliotek do ob-
logReference(), analogRead() i analogWrite() podczas praktycznych przykładów ich wy- sługi tekstów czyli łańcuchów znaków przy-
odpowiednio: ustalających napięcie odnie- korzystania. datnych podczas wyświetlania tekstowych
sienia dla przetwornika A/C, funkcji odczy- komunikatów na wyświetlaczu LCD lub wy-
tu zmierzonej wartości analogowej i zapisu Biblioteki syłanych do komputera. Jak widać dostępna
wartości analogowej (sygnał PWM). Oprócz dostępnych instrukcji języka Ar- jest pokazna liczba bibliotek, która cały czas
Funkcje należące do grupy zaawanso- duino dostępne są liczne biblioteki funkcji jest rozwijana. W Internecie można znalezć
wanych służą odpowiednio do generowania umożliwiających obsługę różnych układów wiele innych niestandardowych bibliotek
tonu audio na dowolnej linii portu mikro- dołączanych do mikrokontrolera. Część dla Arduino umożliwiających obsługę wielu
kontrolera, generowania strumienia bitów z nich wymieniono w tabeli 2. układów dołączanych do mikrokontrolera.
oraz odczytu długości impulsu na linii mi- Są dostępne dwie grupy bibliotek bi- Biblioteki niestandardowe zawsze w pierw-
krokontrolera. Prawdopodobnie często będą blioteki dostępne z systemem Arduino czyli szej kolejności należy zainstalować. Składają
wykorzystywane funkcje służące do odmie- biblioteki standardowe oraz pozostałe nie- się one z jednego pliku z przedrostkiem .h
rzania czasu. Umożliwiają one wstawienie standardowe utworzone przez innych użyt- oraz jednego .cpp. W ramach kursu będą
w programie opóznień oraz wykonywanie kowników systemu Arduino. Wśród stan- dokładniej opisywane tylko biblioteki wy-
98 ELEKTRONIKA PRAKTYCZNA 4/2011
Kurs Arduino Język programowania
czytu sygnałów z czujników. W mi- stępnych portów będzie zależeć od zastoso-
Listing. 1. Szkic programy w Arduino
int buttonPin = 3; //inicjacja zmiennej
krokontrolerach ATmega jest moż- wanego mikrokontrolera, choć jest również
liwość programowego włączenia możliwość ich zwiększenia poprzez dołącze-
void setup() //struktura inicjalizująca
{
rezystora podciągającego, który do- nie do niego odpowiednich ekspanderów. Na
Serial.begin(9600);
pinMode(buttonPin, INPUT);
myślnie na linii wejściowej będzie płytce Arduino UNO dostępne są cyfrowe
}
ustalał stanu wysoki. Rozwiązanie linie portów oznaczone numerami od 0 do
void loop() //nieskończona pętla programu
z rezystorem podciągającym jest 13. Dlatego tez dla ułatwienia właśnie tymi
{
// ... bardzo często wykorzystywane pod- aliasami można się posługiwać podczas kon-
}
czas odczytu stanu z przycisków. figurowania portów I/O.
Jego naciśniecie, na linii wejściowej
korzystywane w przykładowych projektach ustawi stan niski a domyślnie po jego pusz- Obsługa analogowych linii
i związanymi z dołączanymi do zestawu Ar- czeniu będzie panował stan wysoki wymu- mikrokontrolera
duino UNO modułami AVTDUINO. szany przez rezystor podciągający. Cyfrowe W Arduino dostępnych jest kilka linii
linie mogą również być wyjściami na któ- analogowych z wykorzystaniem których
Program główny w Arduino rych stan może się zmieniać na niski lub wy- można mierzyć analogowe sygnały np. z czuj-
Nieodzownymi elementami programu soki co odpowiada napięciu 0 V i +5 V. Wy- ników (temperatury, ciśnienia) w przedziale
są zmienne w których przechowuje się dane dajność prądowa wyjść mikrokontrolerów napięcia od 0 V do +5 V i z rozdzielczością
oraz funkcje od których zależy działanie pro- ATmega umożliwia zasilanie dołączonych 10 bitów. 10-bitowa rozdzielczość oznacza,
gramu. Program główny systemu Arduino do nich diod LED. W przypadku większych że mierzone napięcie od 0 V do 5 V będzie
składa się z dwóch nieodzownych struktur obciążeń wymagane są dodatkowe wzmac- odczytywane wartościami od 0 do 1023. Dla
setup() oraz loop(). Wygląd szkicu programu niacze chociażby w postaci tranzystorów. Do 5 V daje to rozdzielczość (5 V/1024) 0,0049 V
w Arduino pokazano na listingu. 1. obsługi cyfrowych linii w Arduino dostępne (4,9 mV). Zakres rozdzielczości przetworni-
W pierwszej kolejności są inicjowane są trzy funkcje pinMode(), digitalWrite() i di- ka można zmienić za pomocą funkcji ana-
zmienne. Następnie w strukturze setup() ini- gitalRead(). Za pomocą funkcji pinMode(pin, logReference(). Pomiar wartości analogowej
cjowane są tryby pracy linii mikrokontrolera, mode) jest możliwość skonfigurowania typu trwa około 100 mikrosekund. Analogowe
jego peryferia, linie portów mikrokontrolera linii cyfrowej czy ma być wejściem czy linie mikrokontrolera oznaczone w Arduino
oraz funkcje zależne od wykorzystywanych wyjściem. Pierwszy parametr określa numer UNO są jako A0 do A5 i mogą być wykorzy-
bibliotek. Struktura ta jest wykonywana pinu mikrokontrolera zgodnie z opisem linii stane również jako linie cyfrowe. Konfiguruje
tylko raz podczas włączania zasilania lub na płytce zestawu Arduino UNO. Drugi pa- się je identycznie za pomocą funkcji pinMo-
zerowania mikrokontrolera. Po strukturze rametr mode może posiadać stałe parametry de(), digitalWrite() i digitalRead() z tym że pa-
inicjującej wymagana jest struktura loop(), INPUT lub OUTPUT co wskazuje czy linia ma rametr pin jest oznaczany za pomocą aliasów
która tworzy niekończoną pętle w której wy- być wejściem, czy wyjściem. A0 do A5. Na przykład aby skonfigurować
konywany jest program sterujący pracą CPU. Instrukcja: linie analogowa A0 jako wyjście wystarczy
Działanie instrukcji w pętli będzie zależeć pinMode(13, HIGH) oznacza że linia komenda pinMode (A0, OUTPUT);.
od użytkownika i napływających informa- 13 mikrokontrolera będzie linią wyjścio- Analogowe linie również posiadają cy-
cji z otoczenia mikrokontrolera. Oczywiście wą. Funkcja digitalWrite(pin, value) służy frowo załączane rezystory podciągające któ-
jest możliwe wychodzenie z nieskończonej do ustawiania stanu linii mikrokontrolera. re można włączyć z wykorzystaniem funkcji
pętli do obsługiwanych funkcji z biblio- Pierwszy parametr pin określa numer pinu, digitalWrite(). Aby działało wejście analogo-
tek lub własnych. Dla większej czytelno- natomiast drugi parametr określa jaki ma być we mikrokontrolera musi ono być wcześniej
ści programu i jego opisu działania, można jej stan (niski czy wysoki stałe parametry ustawione jako wejście z wykorzystaniem
wprowadzać komentarze które powinny być LOW lub HIGH). Instrukcja: digitalWrite(13, funkcji pinMode(). Należy również wyłączyć
oddzielone od instrukcji znakami // . Jest LOW) ustawia na linii 13 stan niski czyli na- rezystor podciągający. Do odczytu napięcia
możliwe również wprowadzenie komenta- pięcie 0V. Instrukcja digitalWrite() umożliwia z linii analogowej mikrokontrolera służy
rza w znakach otwierających komentarz /* również załączenie rezystora podciągające- funkcja analogRead(pin). Parametrem pin
oraz zamykających komentarz */ . Wszystko go na linii będącej wejściem. Aby do linii jest linia analogowa. Na przykład komenda
pomiędzy tymi znakami jest przez język Ar- wejściowej dołączyć wewnętrzny rezystor val = analogRead(A2); //odczyt wartości sy-
duino ignorowane. Komentowanie działania podciągający należy z wykorzystaniem funk- gnału z linii A2 powoduje odczyt wartości
programu jest dobrą praktyką gdyż po pew- cji digitalWrite() wpisać do linii wejściowej analogowej z linii A2 i zapis jej do zmiennej
nym czasie umożliwia to szybsze zapoznanie wartość HIGH co pokazano na poniższym val. Dostępna jest również funkcja analogRe-
się z działaniem programu. Każdy przygoto- przykładzie: ference(type) za pomocą której można zmie-
wany program będzie musiał być poddany pinMode(12, LOW); //Konfiguracja linii 12 nić parametry pracy przetwornika analogo-
kompilacji a mikrokontroler zaprogramowa- jako wejściowa wo-cyfrowego mikrokontrolera. Parametr
ny utworzonym plikiem z programem. digitalWrite(12, HIGH); //Włączenie rezysto- type określa napięcie odniesienia dla prze-
ra podciągającego do linii 12 twornika. Dostępne są następujące opcje:
Obsługa cyfrowych linii Powyższe dwie instrukcje powodują że DEFAULT: napięcie odniesienia dla prze-
mikrokontrolera linia 12 będzie linią wejściową z włączo- twornika jest napięciem zasilającym mi-
Cyfrowe linie portów mikrokontrolerów nym rezystorem podciągającym. Instrukcja krokontroler czyli 5 V lub 3,3 V.
mogą być skonfigurowane jako wejścia lub digitalRead(pin) służy do odczytu stanu linii INTERNAL: wbudowane napięcie odnie-
wyjścia. Dotyczy to również linii analogo- będącej wejściem. Parametr pin określa nu- sienia równie 1,1 V dla ATmega168,
wych. W zestawie Arduino z mikrokontro- mer pinu mikrokontrolera który jest odczy- INTERNAL1V1: wbudowane napięcie
lerem ATmega domyślnie linie portów są tywany. Funkcja zwraca stan odczytywanego odniesienia równie 1,1 V dla Arduino
skonfigurowane jako wejścia z wyłączonym stanu pinu zgodnie z przykładem: val = di- Mega,
rezystorem podciągającym. Czyli domyślnie gitalRead(12); - INTERNAL2V56: wbudowane napięcie
są to wejścia prawie nie pobierające prądu Do zmiennej val zostanie zapisany stan odniesienia równie 2,56 V dla Arduino
i bardzo często są wykorzystywane do od- 12 linii portu mikrokontrolera. Liczba do- Mega,
ELEKTRONIKA PRAKTYCZNA 4/2011 99
KURS
EXTERNAL: zewnętrzne napięcie odnie- (pin, value) gdzie pierwszym parametrem Typy pamięci
sienia dołączone do linii AREF miesz- jest numer linii cyfrowej PWM a value war- W mikrokontrolerach programowanych
czące się w przedziale od 0 V do 5 V. tością wypełnienia generowanego sygnału przez Arduino czyli ATmega istnieją trzy ro-
Możliwość zmiany napięcia odniesienia PWM w zakresie od 0 do 255. Wartość 255 dzaje pamięci:
dla przetwornika A/C mikrokontrolera daje daje stałe napięcie 5 V, wartość 127 da wy- pamięć FLASH (przestrzeń programu),
możliwość dostosowania się do wartości pełnienie 50%, czyli napięcie wyjściowe przechowywany jest w niej program na-
mierzonego sygnału analogowego z wymaga- po uśrednieniu 2,5 V, natomiast wartość 0 pisany w Arduino. Dane zapisane w tej
ną rozdzielczością pomiaru. da wypełnienie 0% i napięcie 0 V. pamięci nie są tracone po wyłączeniu
Z wykorzystaniem sygnału PWM moż- zasilania,
Obsługa generatora PWM na modyfikować np. jasność dołączonej pamięć SRAM (Static Random Access
Sygnał PWM jest to sygnał prostokąt- diody LED czy prędkości silnika. Sygnał Memory), pamięć na zmienne czyli dane
ny o modyfikowanym wypełnieniu. Z wy- PWM dla mikrokontrolera ATmega168, z obliczeń przeprowadzanych przez mi-
korzystaniem sygnału PWM i jego póz- który zamontowany jest w Arduino UNO krokontroler. Dane w tej pamięci są tra-
niejszym uśrednieniu z wykorzystaniem może być generowany na pinach 3, 5, 6, cone po wyłączeniu zasilania,
prostego filtra składającego się z rezystora 9, 10 i 11. Na przykład funkcja analogWri- pamięć EEPROM jest pamięć do stałego
i kondensatora można uzyskać prosty prze- te(5, 127); //Sygnał PWM o wypełnienia 127 przechowywania danych. Zapisane dane
twornik cyfrowo-analogowy na wyjściu generuje sygnał PWM na pinie 5 o wypeł- nie są wymazywane po wyłączeniu zasi-
którego wartość analogowa (napięcie) bę- nieniu 50 %. Nie trzeba również ustawiać lania. Można jej używać do przechowy-
dzie zależne od wypełnienia generowanego linii PWM jako wyjścia przez wywołaniem wania długoterminowego informacji.
sygnału PWM. funkcji analogWrite() ale dla czytelności Dla przykładu mikrokontroler ATme-
Częstotliwość sygnału PWM w Arduino programu zalecane jest ustawienie linii ga168 ma następujące rodzaje pamięci:
jest około 500 Hz. Do generowania sygnału PWM jako wyjście z wykorzystaniem funk- FLASH 16 kB (z czego 2 kB jest używa-
PWM dostępna jest funkcja analogWrite- cji pinMode(). ne dla bootloadera),
SRAM 1024 bajtów,
Tabela 1. Typy struktur, zmienne, funkcje języka Arduino EEPROM 512 bajtów.
Ten mikrokontroler stosunkowo małą
Struktury >> (bitshift right) Cyfrowe I/O
pamięć SRAM. Już zapisanie do niej przy-
setup() Pozostałe operatory pinMode()
loop() ++ (increment) digitalWrite() kładowego tekstu: char tekst[] = Arduino
Struktury kontrolne -- (decrement) digitalRead()
Elektronika Praktyczna ; zajmuje ponad 32
if += (compound addition) Analogowe I/O
bajtów. To może nie wydawać się dużo, ale
if...else -= (compound subtraction) analogReference()
wystarczy kilka takich tekstów, aby zapełnić
for *= (compound multiplica- analogRead()
switch case tion) analogWrite() - PWM
1024 bajty pamięci. Zwłaszcza, gdy jest duża
while /= (compound division) Zaawansowane I/O
ilość tekstu do wysłania do wyświetlacza czy
do... while &= (compound bitwise and) tone()
przez port RS232. Jest wiele sposobów na
break |= (compound bitwise or) noTone()
poradzenie sobie ze zbyt małą ilością pamię-
continue Zmienne shiftOut()
return Stałe pulseIn()
ci. Część danych można zapisać w pamięci
goto HIGH | LOW Czasu
EEPROM. Można również ciągi tekstów prze-
Składnia języka INPUT | OUTPUT millis()
chowywać w pamięci Flash mikrokontrolera
; true | false micros()
co można zrobić z wykorzystaniem funkcji
{} integer constants delay()
// fl oating point constants delayMicroseconds()
PROGMEM: prog_char tekst[] PROGMEM =
/* */ Typy zmiennych Matematyczne
{ Arduino Elektronika Praktyczna };.
#define void min()
Wykorzystanie pamięci EEPROM spo-
#include boolean max()
sobu zapisu i odczytu danych zostanie poka-
Operacje arytmetyczne char abs()
= (assignment operator) unsigned char constrain()
zane w dalszej części kursu w przykładach
+ (addition) byte map()
praktycznych. Do obsługi pamięci EEPROM
- (subtraction) int pow()
mikrokontrolera przewidziane są funkcje
* (multiplication) unsigned int sqrt()
/ (division) word Trygonometryczne znajdujące się w dodatkowej bibliotece
% (modulo) long sin()
EEPROM.
Operatory porównania unsigned long cos()
== (equal to) float tan()
Definiowanie zmiennych
!= (not equal to) double Losowe
< (less than) string - char array randomSeed() Zmienna jest zarezerwowanym miejscem
> (greater than) String - object random()
do przechowywania danych. Składa się ona
<= (less than or equal to) array Bitów i Bajtów
z nazwy, typu oraz wartości. Na przykład in-
>= (greater than or equal Konwersje lowByte()
strukcja Int PinLED = 13; tworzy zmienną na-
to) char() highByte()
Operatory logiczne byte() bitRead() zwaną PinLED typu int i wartości początkowej
&& (and) int() bitWrite()
13, która może być używana do wskazywania
|| (or) word() bitSet()
pinu 13, do którego dołączono diodę LED. Za
! (not) long() bitClear()
każdym odwołaniem się do nazwy PinLED
Operacje na wskaznikach float() bit()
* dereference operator Zmienne zakresowe Przerwania zewnętrzne
będzie wskazywana wartość 13, która w tym
& reference operator variable scope attachInterrupt()
przypadku jest numerem pinu portu mikro-
Operatory bitowe static detachInterrupt()
kontrolera. Zdefiniowana zmienną można
& (bitwise and) volatile interrupts()
szybko użyć w dowolnych funkcjach np. pin-
| (bitwise or) const noInterrupts()
^ (bitwise xor) Narzędzia Komunikacja
Mode (PinLED, OUTPUT);
~ (bitwise not) sizeof() Serial
Za pomocą tej funkcji linia PinLED o war-
<< (bitshift left) Funkcje
tości 13 (13 linia mikrokontrolera) zostaje
100 ELEKTRONIKA PRAKTYCZNA 4/2011
Kurs Arduino Język programowania
skonfigurowana jako wyjcie. Zaletą zmiennej zmiennej wartosc jest nadawana wartość po- trzeby powtarzania kodu programu. Funkcje
w tym przypadku jest to, że wystarczy okre- czątkowa 33. W zmiennych ważny jest rów- mogą wykonywać określone zadanie wielo-
ślić wartość pinu raz a używać wiele razy. nież zakres jej działania. Zależy on od miej- krotnie np. funkcja opóznienia która może
Więc jeśli pózniej zdecydujemy się na zmianę sca deklaracji zmiennej. Zmienne definiowa- być wykorzystana w programie wielokrotnie.
z pinu 13 na pin 12, wystarczy zmienić numer ne przed strukturami setup() oraz loop() będą Wywołanie funkcji powoduje wykonanie za-
pinu w jednym miejscu w kodzie programu. zmiennymi globalnymi i ich zakres działania wartego w niej programu i powrót po jego
Zmienna ma inne zalety w postaci możliwości będzie w całym przygotowanym progra- wykonaniu do programu głównego. Funkcje
przechowywania wartości liczbowej. Co naj- mie. Zmienne definiowane w funkcjach lub mogą posiadać parametry wejściowe jak np.
ważniejsze, można zmienić wartości zmiennej w strukturach setup() czy loop() będą działa- w przypadku funkcji opóznienia może to być
za pomocą prostej komendy (wskazane przez ły tylko w nich: czas opóznienia. Mogą również one zwra-
znak równości). Na przykład komenda PinLED void setup () cać wynik obliczeń. Jak wspomniano zale-
= 12; zmienia wartość zmiennej na wartość { ty funkcji uwidaczniają się gdy trzeba coś
12. Zauważyć można że nie jest już potrzebne Int PinLED = 13; w programie wielokrotnie powtórzyć. W pro-
określenie typu zmiennej. Wystarczy tylko raz pinMode (pin, OUTPUT); gramie bardzo często będą wykorzystywane
wskazać jej typ. Oznacza to, że nazwa zmien- digitalWrite (pin, HIGH); funkcje czy to własne czy z wykorzystywa-
nej jest na stałe związane z rodzajem, tylko } nych bibliotek. Funkcja ma swoją nazwę
jego wartość się zmienia. Przed przypisaniem W tym przypadku wartość PinLED zmie- oraz w nawiasie mogą się znajdować jej ar-
wartości do zmiennej zawsze w pierwszej niać się może tylko wewnątrz struktury gumenty. Funkcje należy w pierwszej kolej-
kolejności należy ją zdefiniować. W definio- setup(). Jeśli zmienna jest globalna, jej war- ności zdefiniować. W tym celu podaje się jej
waniu zmiennych ważna jest deklaracja od- tość można zmienić w dowolnym miejscu argumenty (identyczne jak typy zmiennych)
powiedniego jej typu. W tabeli 3 wymieniono w kodzie programu, co oznacza, że trzeba oraz typ wartości zwracanej przez funkcje.
typy zmiennych oraz zakresy ich wartości. zrozumieć cały program aby wiedzieć co się W przypadku, gdy funkcja nie będzie zwra-
Ich zastosowanie będzie zależne od typu obli- stanie. Jeśli zmienna ma ograniczony zakres, cała żadnych wartości lub nie będzie miała
czeń jakie będą przeprowadzane w programie. działanie programu jest łatwiej zrozumieć. żadnych wartości wejściowych wykorzystuje
Zmienne domyślnie są przechowywane w pa- się do tego zaznaczenia słowo void: void De-
mięci SRAM mikrokontrolera. Jak w języku C, Tworzenie funkcji lay_100ms(void);. Funkcja ta będzie powodo-
zmienne mogą być inicjowane: Funkcje czyli swego rodzaju procedury wać opóznienie programu o 100 ms.
Char znak; pozwalają programiście na dzielenie pro- Niżej umieszczono przykładową funkcję
Int wartosc = 33; gramu na moduły dzięki czemu jest bardziej do mnożenia dwóch liczb:
Pierwsza deklaracja deklaruje zmienną zrozumiały oraz dane moduły (funkcje) Int Mnozenie(int x, int y){
bez wartości początkowej, natomiast drugiej mogą być wykonywane wielokrotnie bez po- Int wynik;
REKLAMA
ELEKTRONIKA PRAKTYCZNA 4/2011 101
mtp_ExpopAutoma2011_210x145.indd
2
2/24/11
6:19:10 PM
KURS
Wynik = x * y;
Tabela 2. Biblioteki w Arduino
Return wynik; Biblioteki standardowe
EEPROM odczyt zapis do pamięci EEPROM
}
biblioteka funkcji sieciowych ETHERNET z wykorzystaniem modułu Ardu-
W powyższym przypadku deklarowana
Ethernet
ino Ethernet Shield
jest funkcja mnożenia o nazwie Mnozenie
Firmata biblioteka komunikacji z komputerem z wykorzystaniem RS232
która ma dwa argumenty typu int. Funkcja
LiquidCrystal biblioteka obsługi wyświetlaczy LCD
zwraca wartość typu int (iloczyn). Rezultat
SD biblioteka obsługi kart pamięci SD
działania funkcji jest zapisywany do zmien-
Servo biblioteka obsługi napędów servo
nej lokalnej wynik. Komenda return umożli- SPI biblioteka obsługi interfejsu SPI (Serial Peripheral Interface)
SoftwareSerial biblioteka obsługi programowej interfejsu komunikacyjnego RS232
wia zwrócenie wartości obliczeń przez funk-
Stepper biblioteka obsługi silników krokowych
cję. Użycie funkcji może być następujące:
Wirebi biblioteka obsługi interfejsu TWI/I2C (Two Wire Interface)
void loop{
Biblioteki komunikacyjne:
int i = 2;
Messenger biblioteka do przetwarzania wiadomości tekstowych z komputera
int j = 3;
NewSoftSerial ulepszona biblioteka do obsługi programowej transmisji RS232
int k;
OneWire biblioteka obsługi interfejsu 1Wire
k = Mnozenie(i, j); // wynik mnożenia to 6 PS2Keyboard biblioteka obsługi klawiatury z interfejsem PS2
biblioteka umożliwia wysyłanie wiadomości pomiędzy komputerem
}
Simple Message System
a Arduino
W przykładzie zadeklarowano dwie
umożliwia wysyłanie wiadomości tekstowych lub mail za pomocą tele-
SSerial2Mobile
zmienne i i j o wartość 2 i 3 oraz zmien-
fonu komórkowego (za pomocą poleceń AT)
ną na k na ich iloczyn. Wywołanie funkcji
Webduino biblioteka serwera WWW z wykorzystaniem Arduino Ethernet Shield
mnożenie z parametrami i i j spowoduje
X10 biblioteka umożliwia transmisje po liniach zasilających
XBee umożliwia komunikacje z API XBee
wykonanie funkcji i wykonanie mnożenia
SerialControl umożliwia zdalną kontrolę innych Arduino za pomocą interfejsu RS232
dwóch wartości zapisanych do zmiennych
Biblioteki do obsługi czujników:
i i j co da wynik 6 i jego zapis do zmien-
Capacitive Sensing biblioteka dla czujników pojemnościowych
nej k. Dzięki przykładowej funkcji w każdej
Debounce biblioteka do obsługi przycisków
chwili w programie gdy będzie potrzebne
Obsługa wyświetlaczy i matryc LED:
mnożenie dwóch liczb wystarczy wywołać
Improved LCD library biblioteka obsługi wyświetlaczy LCD
funkcje mnożenie podając jako jej parame-
GLCD biblioteka obsługi grafi cznych LCD z kontrolerem KS0108
try mnożone liczby. biblioteka sterująca 7-segmentowymi wyświetlaczami LED oraz LED ami
LedControl
z kontrolerami MAX7221 lub MAX7219
LedDisplay biblioteka obsługi wyświetlaczy z kontrolerem HCMS-29xx
Przykładowy program
Generatory:
W ramach podsumowania części teore-
biblioteka umożliwia generowanie dzwięku na dowolnym pinie mikro-
Tone
tycznej na listingu 2 pokazano prosty pro-
kontrolera
gram powodujący pulsowanie diody LED.
TLC5940 Umożliwia obsługę 16 kanałowego i 12 bitowego kontrolera PWM
Data i godzina:
W strukturze setup() jest konfigurowa-
DateTime biblioteka realizująca zegar i kalendarz
na linia 13 mikrokontrolera jako wyjście.
Metro biblioteka umożliwiające odmierzanie stałych odcinków czasu
Do tego wyjścia dołączona jest dioda LED.
MsTimer2 biblioteka generująca przerwanie co czas odmierzony w milisekundach
W strukturze loop() wykonywane są w nie-
Tekstowe:
skończonej pętli instrukcje z których pierw-
TextString biblioteka obsługi tekstów
sza powoduje ustawienie linii 13 w stan
PString biblioteka zapisu tekstu do bufora
wysoki (wyłączenie diody LED). Kolejna
Streaming uproszona biblioteka funkcji print()
funkcja delay z parametrom 1000 powoduje
Listing 2. Przykładowy program napisany dla Arduino
opóznienie działania programu o 1 sekun-
void setup() {
dę (1000 ms). Po opóznieniu wykonywana
pinMode(13, OUTPUT); //konfiguracja linii 13 jako wyjście
}
jest instrukcja ustawiająca stan niski na li-
nii 13 po czym następuje wykonanie kolej-
void loop() {
digitalWrite(13, HIGH); // wyłączenie diody LED
nej funkcji opóznienia o 1 sekundę. Po tej
delay(1000); // opóznienie 1 sekundy
instrukcji działanie programu rozpoczyna
digitalWrite(13, LOW); // włączenie diody LED
się od początku co powoduje miganie dio- delay(1000); // opóznienie 1 sekundy
}
dy dołączonej do pinu 13 mikrokontrolera.
Z praktycznym działaniem tego programu
Tabela 3. Zakresy typów zmiennych
będzie się można zapoznać w kolejnej czę-
Typ Zakres
ści kursu.
boolean True, False
char -128 do 127
Podsumowanie
unsigned char 0 do 255
W pierwszej części kursu Arduino opi-
byte 0 do 255
sano podstawowe funkcje i składnię języka
int -32768 do 32767
Arduino. Są to informacje niezbędne do pod-
unsigned int 0 do 65,535
jęcia programowania z tym systemie. W na-
word 0 do 65535
stępnych częściach kursu zostanie pokazane
long -2147483648 do 2147483647
środowisko programistyczne Arduino IDE
unsigned long 0 do 4294967295
wraz z instalacją zestawu Arduino UNO
fl oat 3,4028235E+38 do -3,4028235E+38
i jego uruchomieniem.
double (wartość 4-bajtowa)
Marcin Wiązania
string ciąg znaków
marcin.wiazania@ep.com.pl
102 ELEKTRONIKA PRAKTYCZNA 4/2011
Wyszukiwarka
Podobne podstrony:
Kurs Arduino 2 Oprogramowanie Arduino IDE(1)Kurs Arduino cz3Kurs Arduino cz6Kurs Arduino cz5Kurs Arduino cz4Kurs Arduino cz2Kurs Arduino 4 Obsluga modulu LEDKurs ArduinoKurs Arduino 3 Obsluga modulu LCDKurs Arduino 5więcej podobnych podstron