Domyślnie środowisko Arduino jest wyposażone w zestaw bibliotek napisanych w języku C++, których zadaniem jest szybsze tworzenie programów. Uzyskuje się to przez wykorzystanie warstwy wyższego rzędu, która niweluje konieczność zapoznania się z rejestrami mikrokontrolera i pracy na nich. Utworzono szereg gotowych funkcji i bibliotek, które dostarczają użytkownikowi gotowych funkcji do operowania sygnałami wejściowi/wyjściowymi, kanałami ADC, przerwaniami itd. Dokładny opis tych funkcji można znaleźć na stronie Arduino.
Programowanie w języku C
Czasem jednak dla osób dopiero zaczynających swoją przygodę z programowaniem mikrokontrolerów, wykorzystanie gotowych funkcji nie jest dobra formą startu. Dlatego też, powstaje konieczność rozpoczęcia nauki programowania przez otworzenie dokumentacji mikrokontrolera i zapoznanie się z jego rejestrami. Jak przez ostawianie 0 i 1 na odpowiednich pozycjach w rejestracjach można ustawiać stany pinów, generować sygnał PWM, czy uruchamiać przerwania. W tym celu można napisać program w czystym języku C bezpośrednio w środowisku Ardunio. Taki program kompilujemy jak każdy inny i wgrywamy bez żadnych komplikacji. Poniżej przedstawiono przykładowy kod programu, który mruga diodą LED na płytce Arduino Nano podłączoną do pinu ,,PB5”:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include <avr/io.h> #include <stdlib.h> #include <string.h> #include <util/delay.h> #ifndef _BV #define _BV(bit) (1<<(bit)) #endif #ifndef sbi #define sbi(reg,bit) reg |= (_BV(bit)) #endif #ifndef cbi #define cbi(reg,bit) reg &= ~(_BV(bit)) #endif int main() { //Ustawienie pinu PB5 jako wyjscie //sbi(DDRB,PB5); DDRB|=(1<<PB5); while (1) { //Ustawienie pinu PB5 w stanie wysokim //sbi(PORTB,PB5); PORTB|=(1<<PB5); _delay_ms(500); //poczekanie 500ms-0,5s //Ustawienie pinu PB5 w stanie niskim //cbi(PORTB,PB5); PORTB&=~(1<<PB5); _delay_ms(500); //poczekanie 500ms-0,5s } } |
Programowanie w języku Asembler
Dla bardziej zaawansowanych programistów, którzy chcą poznać dokładnie jak działa mikrokontroler, bez ufania na zabiegi jakie poczyni kompilator np. języka C. Jak również poznać tajniki ustawiania rejestrów, zarządza stosem pamięci, kontrolowania przepływu zmiennych w pamięć i wszystkie operacje na poziomie maszynowym. Warto zaprezentować język programowania Asembler. Środowisko Arduino umożliwiaj skompilowanie programu bezpośrednio napisanego w języku Asembler i załadowanie do płytki Arduino Nano. w tym celu należy wykonać poniższe kroki:
- utworzyć pusty folder z miejscem na nowy projekt, nazwijmy go ,,test”
- wchodzimy do utworzonego folderu i tworzymy plik projektu arduino, plik nazywamy ,,test.ino” – rozszerzenie pliku musi być ,,ino”, plik zostawiamy pusty
- tworzymy plik o nazwie ,,test.S”, rozszerzenie musi być ,,S”. W tym pliku piszemy program w języku asembler
- tak przygotowany projekt, możemy uruchomić w środowisku Arduino, skompilować i wgrać do mikrokontrolera
Przykładowy program w języku asembler przedstawiono poniżej (program mruga diodą LED na płytce Arduino Nano podłączoną do pinu ,,PB5”):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
; Blink LED on PB5 #define __SFR_OFFSET 0 #include "avr/io.h" .global main main: sbi DDRB, 5 ; Set PB5 as output blink: sbi PINB, 5 ; Toggle PINB ldi r25, hi8(500) ldi r24, lo8(500) call delay_ms jmp blink delay_ms: ; Delay about (r25:r24)*ms. Clobbers r30, and r31. ; One millisecond is about 16000 cycles at 16MHz. ; The inner loop takes 4 cycles, so we repeat it 3000 times ldi r31, hi8(4000) ldi r30, lo8(4000) 1: sbiw r30, 1 brne 1b sbiw r24, 1 brne delay_ms ret |
Programowanie w języku C++ z wykorzystaniem systemu Arduino:
Uruchamiamy środowisko Arduino i z menu wybieramy ,,Plik -> Nowy”. Oprogramowanie Arduino automatycznie utworzy nam nowy projekt i utworzy pusty szablon programu do którego należy wkleić kod przedstawiony poniżej (program mruga diodą LED na płytce Arduino Nano podłączoną do pinu ,,PB5”):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void setup() { //ustawienie portu PB5 - numeracja w Arduino 13, jako wyjscie pinMode(13, OUTPUT); } // the loop function runs over and over again forever void loop() { digitalWrite(13, HIGH); //ustawienie stanu wysokiego //na PB5-numeracja Arduino 13 delay(1000); //poczekanie 1000ms-1s digitalWrite(13, LOW); //ustawienie stanu niskiego //na PB5-numeracja Arduino 13 delay(1000); //poczekanie 1000ms-1s } |
Programy w środowisku Arduino składają się z dwóch funkcji:
- funkcja ,,void setup()” – funkcja uruchamiana raz po uruchomieniu mikrokontrolera lub jego restarcie. W jej środku należy dokonywać jednorazowych czynności polegających na konfiguracji peryferiów, ustawianiu wartości zmiennych itd.
- funkcja ,,void loop()” – funkcja wywoływana cyklicznie, tutaj piszemy właściwy kod programu
Funkcje te można porównać do klasycznego programu w języku C jak na listingu poniżej:
1 2 3 4 5 6 7 8 9 |
int main() { setup(); //wywolanie funkcji po uruchomieniu programu while(1) { loop(); //wywolywana cyklicznie } return 0; } |