Lab 1. Środowisko Arduino

Internet Rzeczy – IoT

Na danym kursie będziesz miał możliwość poznać podstawowe techniki programowania mikrokontrolerów powszechnie wykorzystywanych w dzisiejszych czasach do budowy Internetu Rzeczy. Czym zatem jest Internet rzeczy? Niczym innym jak pewną koncepcją, w której przedmioty mogą pośrednio lub bezpośrednio gromadzić, przetwarzać lub wymieniać pomiędzy sobą dane.

A do czego to wykorzystać? IoT jest niezbędnym elementem budowy inteligentnych domów, domowej automatyki, prototypownia i wielu innych aspektów. W zasadzie zastosowanie jest ograniczone jedynie wyobraźnią i potrzebą osoby projektującej układ.

Dla początkującego adepta IoT najprostszym sposobem z zaznajomieniem się z w/w zagadnieniem jest wykorzystanie gotowej platformy mikrokontrolera. Jedną z najpopularniejszych platform są Arduino i Rasperry Pi. To właśnie z wykorzystaniem tych narzędzi na tym kursie będziesz miał możliwość zaznajomienia się z tajnikami mikrokontrolerów.

Kurs ten nie wymaga głębokiej znajomości zagadnień elektroniki. Będzie bardziej nastawiony na przedstawienie możliwości łączenia różnego rodzaju komponentów w środowisko AVR oraz ich zaprogramowania. Jednakże podstawowa wiedza z zakresu elektroniki będzie bardzo pomocna.

Semestr zostanie podzielony na 3 części, w którym:

  • Laboratorium 1-6 będzie poświęcone środowisku Arduino
  • Laboratorium 7-11 będzie poświęcone środowisku Rasperry Pi
  • Laboratorium 12-15 będzie poświęcone na zespołowe projekty studentów

Czym jest Arduino ?

Logo projektu Arduino

Z punktu widzenia osoby początkującej, Arduino, to gotowy „zestaw uruchomieniowy” z popularnym mikrokontrolerem AVR firmy Atmel – ATMega328. Platforma została stworzony według odpowiednich założeń, dzięki czemu:

  1. Nie wymaga zewnętrznego programatora (np. JTAG’a)
  2. Współgra, bez najmniejszych problemów, z dedykowanym kompilatorem
  3. Możesz dokupić do niego „nieskończoną” liczbę płytek rozszerzających (np.: sterowniki silników, wyświetlacze, moduły wykonawcze, czujniki, etc.)

Jednakże Arduino to dużo więcej, o czym możesz poczytać szczegółowo tutaj: https://forbot.pl/blog/czym-jest-arduino-sony-spresense-jako-6-rdzeniowe-uno-id38674 oraz tutaj: https://www.arduino.cc/en/Main/AboutUs.

Prawdziwa potęga Arduino kryje się jednak w dedykowanym języku programowania bazującym na C/C++. Zaczynając przygodę z mikrokontrolerami warto poznać chociażby podstawy na temat ich budowy i tego jak działają. Jeśli nie słyszałeś nigdy czym są rejestry, to możesz poświęcić chwilkę na przeczytanie artykułu: Mikrokontroler – wszystko o jego działaniu.

Na szczęście, w przypadku Arduino, aby zaprogramować swój układ, nie jest wymagana znajomość rejestrów mikrokontrolera. Wszystko opiera się o przyjazne biblioteki, dzięki którym stworzenie nawet skomplikowanego programu jest w zasięgu początkującego programisty – choć będzie on oczywiście mało optymalny.

Arduino to moduły z mikrokontrolerami, które w bardzo łatwy sposób programować można, z wykorzystaniem ogólnodostępnych bibliotek, w języku zbliżonym do C/C++.

Zalety Arduino

ArduinoCommunityLogo

Projekt zaczął być rozwijany w 2005 roku, we Włoszech. Od tej pory zgromadził rzeszę zwolenników i fanatycznych użytkowników. Od samego początku Arduino było przygotowywane z myślą o osobach, które nie miały wcześniej wiele wspólnego z programowaniem mikrokontrolerów. Doskonałe środowisko, przyjazna składnia oraz niska cena, sprawiły, że Ardunio stało się niezwykle popularne.

Społeczność zbudowana wokół tego projektu jest olbrzymia. Niesie to za sobą wiele korzyści. Z punktu widzenia początkującego najważniejsze są trzy:

  • Ogromna ilość gotowych rozwiązań. Na Arduino powstają przeróżne projekty. Jeśli wymyśliliście coś „nowego” i ciekawego to na 90% ktoś już wykonał to na Arduino wcześniej, a opis projektu umieścił w Internecie.
  • Popularność platformy sprawiła, że producenci przygotowali niezliczoną ilość odmian płytek oraz rozszerzeń – przykładowy opis płytek Arduino możesz znaleźć tutaj: https://www.robotshop.com/community/blog/show/arduino-microcontroller-feature-comparison.
  • Duża ilość użytkowników ułatwia znalezienie pomocy, gdy utknie się w ważnym punkcie projektu.

Arduino – wybór platformy sprzętowej

Arduino jest platformą typu Open Hardware. Oznacza to, że udostępnione są wszelkie materiały potrzebne do stworzenia własnego zestawu rozwojowego działającego w tym standardzie. Z tego powodu znaleźć można wiele różnych płytek zgodnych z Arduino.

W chwili obecnej, na swoich stronach, Arduino oficjalnie mówi o około 20 dostępnych modelach. W każdym dobrym sklepie znajdziecie przynajmniej kilka różnych zestawów. Na potrzeby kursu została wybrana najpopularniejsza płytka – Arduino UNO R3.

Arduino jest projektem, który ciągle się rozrasta – zarówno programistycznie jak i sprzętowo. Płytka UNO w wersji 3 jest w chwili obecnej podpowiadana przez Arudino, jako ta, na której przez długi czas będzie można korzystać z najnowszych bibliotek oraz płytek rozszerzających.

Arduino UNO R3 board

Specyfikacja Arduino UNO R3

Sercem układu jest popularny, 8 bitowy mikrokontroler firmy Atmel, AVR ATmega328 pracujący z częstotliwością 16 MHz.

Praca z taką częstotliwością w dużym uproszczeniu oznacza, że mikrokontroler jest w stanie wykonać 16 milionów operacji na sekundę. To bardzo dużo!

Specjalne złącza, umieszczone charakterystycznie po bokach płytki, to wyprowadzenia najważniejszych sygnałów. Znajdziemy tam 14 programowalnych cyfrowych wejść/wyjść. Sześć z nich można używać jako wyjścia PWM (np. do sterowania silnikami), a kolejne 6 jako analogowe wejścia. Znajdziemy tam również sygnał resetu oraz zasilanie.

Arduino może być zasilane na kilka sposobów. Najpopularniejsze metody to:

  1. Zasilanie przez przewód USB
  2. Zasilanie przez zasilacz wtyczkowy (optymalnie 7V – 12V) lub baterie

Najważniejsze elementy zaznaczone zostały na poniższej grafice:

  1. Złącze USB – wykorzystywane do zasilania, programowania oraz komunikacji z komputerem
  2. Złącze zasilania (optymalnie 7V – 12V)
  3. Stabilizator napięcia – napięcie wejściowe ze złącza nr 2 obniżane jest do 5V dzięki temu układowi
  4. Przycisk resetu – resetuje płytkę Arduino
  5. Mikrokontroler odpowiedzialny za komunikację z komputerem przez USB
  6. Złącze programowania do mikrokontrolera z punktu 5.
  7. Złącze sygnałowe Digital PWM
  8. Złącze sygnałowe Digital PWM
  9. Dioda LED sygnalizująca podłączenie napięcia do Arduino
  10. Wyjście programatora dla mikrokontrolera z punktu 13.
  11. Złącze sygnałowe Analogowe
  12. Złącze zasilania
  13. Serce Arduino, główny mikrokontroler AVR ATmega328
  14. Diody LED sygnalizujące transmisję do/z komputera
  15. Dioda LED do dyspozycji użytkownika
  16. Rezonator ceramiczny taktujący mikrokontroler (punkt 13) z częstotliwością 16MHz
  17. Zworka, której przecięcie wyłącza automatyczne resetowanie Arduino.
  18. Pola lutownicze z wyprowadzonymi sygnałami mikrokontrolera z punktu 5, używane ekstremalnie rzadko w bardzo specyficznych i niestandardowych sytuacjach.

Bardziej szczegółowy opis mikrokontrolera znajdziesz tutaj: https://forbot.pl/blog/mikrokontroler-wszystko-co-powinniscie-wiedziec-o-jego-dzialaniu-id1314.

Opis zestawu laboratoryjnego

Każdy Student w trakcie laboratorium będzie pracował z wykorzystaniem Arduino UNO R3 wraz z niezbędnymi komponentami, zamkniętymi i podłączonymi do płytki wewnątrz obudowy:

Opis elementów zestawu laboratoryjnego:

  1. Płytka Arduino UNO R3
  2. Wyświetlacz LCD 16×2 – Hitachi HD44780 + interfejs I2C
  3. Przycisk zielony
  4. Enkoder
  5. Przycisk czarny – RESET
  6. Potencjometr 10kOhm
  7. Przycisk czerwony
  8. Dioda LED RGB (analogowa)
  9. Termometr Maxim DS18B20
  10. Termometr Maxim Ds18B20 na kablu
  11. Przyłącze USB do komputera

Schemat połączeń przedstawia poniższy obrazek:

Dokładniejszy opis stanowiska znajdziesz w dokumencie: Opis_Stanowiska_Arduino.pdf

Arduino IDE

Czym właściwie jest Arduino IDE? Arduino IDE jest wieloplatformową aplikacją napisaną w języku Java służącą do programowania platformy Arduino. Środowisko jest zaprojektowane w taki sposób, aby było przyjazne dla hobbystów i osób niezajmujących się tworzeniem oprogramowania na co dzień. Arduino IDE zawiera w sobie wiele pomniejszych „programów” (lista poniżej), które działając wspólnie pozwalają nam na zaprogramowanie mikrokontrolera. Najważniejsze „podprogramy” zawarte w tym środowisku:

  1. Edytor kodu źródłowego – pomaga nam w pisaniu naszego programu, poprzez chociażby takie funkcje jak podświetlenie składni, czy też automatyczne wcięcia w kodzie;
  2. Kompilator – zmienia nasz program w kod czytelny dla mikrokontrolera, czyli język binarny; jeżeli nie korzystalibyśmy z kompilatora, cały szkic musiałby być napisany, tylko z użyciem „0” i „1”;
  3. Uploader – wgrywa gotowy kod do Arduino, dzięki czemu możemy obserwować efekty naszej pracy

Dzięki tym wszystkim, wymienionym powyżej, funkcjom jesteśmy w stanie (korzystając z jednego programu) napisać, skompilować, a następnie uruchomić wcześniej napisany program.

Przyjrzyjmy się teraz graficznemu interfejsowi:

  1. Pola edycji kodu źródłowego – tutaj piszemy program
  2. Przyciski funkcyjne:

  Verify               Weryfikuje (kompiluje) poprawność kodu

  Upload            Kompiluje i wgrywa kod do mikrokontrolera

  New                 Tworzy nowy projekt

  Open                Otwiera istniejący projekt

  Save                 Zapisuje projekt na dysk

  1. Przycisk Serial Port Monitor otwiera okno monitora portu szeregowego. Poprzez to okno można nawiązać dwukierunkową komunikację z mikrokontrolerem przypominającą konsolę
  2. Zakładki z kodem – większy projekt warto podzielić na logiczne części poprzez zakładki. Wszystkie zakładko tworzą jeden projekt i są kompilowane jednocześnie – w kolejności ich ułożenia w IDE.
  3. Okno informacji diagnostycznych – wyświetla komunikaty z kompilacji oraz wgrywania kodu do pamięci mikrokontrolera
  4. Informacja o konfiguracji IDE do pracy z rodzajem platformy oraz portem do, którego ta platforma jest podłączona

Arduino IDE nie jest jedynym graficznym środowiskiem jakie wykorzystuje się do programowania mikrokontrolerów lub szerzej do projektowania IoT. W zasadzie to Arduino IDE jest jednym z słabszych środowisk dostępnych, ale jego prostota ma przeważające zalety w sytuacji gdy rozpoczyna się dopiero przygodę z programowaniem mikrokontrolerów. Jeśli będziesz szukał czegoś bardziej zaawansowanego to warto przyjrzeć się choćby Atmel Studio, Visual Studio Code, Atom’owi czy PlatformIO. Szerzej na temat alternatywnych środowisk do IoT możesz przeczytać tutaj: https://forbot.pl/blog/platformio-alternatywne-srodowisko-dla-arduino-ide-id28167

Konfiguracja IDE do pracy z płytką Arduino UNO

Środowisko Arduino IDE jest kompletnym oprogramowanie do pisania oraz ładowania kodu do pamięci mikrokontrolera. Jednak, aby można było skompilowany kod wgrać na płytkę należy je wcześniej odpowiednio skonfigurować. Domyślnie IDE będzie komunikowało się z mikrokontrolerem poprzez wirtualny port COM podłączony do portu USB komputera. Arduino UNO jest wyposażony w konwerter USB do portu szeregowego (serial interface). Za funkcjonalność tą odpowiada chip CH340. W Windows 10 znajduje się już odpowiedni sterownik dla tego urządzenia, natomiast jeśli korzystasz ze starszej wersji systemu to należy ten sterownik zainstalować samem. Instrukcja instalacji sterownika jest dostępna na stronie producenta: https://www.arduino.cc/en/Guide/DriverInstallation. (Sterownik ten jest także dostarczany wraz z instalatorem Arduino IDE – zazwyczaj)

Po poprawnym podłączeniu płytki UNO do komputera należy ustalić port szeregowy na jakim została ona rozpoznana w systemie operacyjnym. W tym celu należy otworzyć w panelu sterowania Device Manager (Menedżer urządzeń). Odszukaj sekcję Ports (COM and LPT), w której powinno być widoczne nasze urządzenie Arduino UNO:

W naszym przykładzie płytka Arduino została przyłączona do portu COM3. Zapamiętaj tę wartość, ta informacja jest niezbędna, aby odpowiednio skonfigurować w kolejnym kroku środowisko IDE.

Uruchom Arduino IDE. W pierwszej kolejności należy ustawić typ płytki podłączonej do komputera. Przejdź do Tools->Board i wybierz płytkę Arduino/Genuino UNO:

Następnie ustawiamy port szeregowy na jakim jest podłączona płytka. Przejdź do Tools->Port i wybierz wcześniej ustalony port z Device Managera. W naszym przykładzie był to port COM3:

Aby zweryfikować poprawność konfiguracji środowiska wybierz opcję Tools->Get Board Info. Jeśli wszystko jest w porządku to powinieneś zobaczyć podstawowe informacje o płytce:

Szkielet programu Arduino

Teraz możemy przejść do omówienia podstawowego szkieletu programu w Arduino. W przeciwieństwie do standardowego języka C, w którym funkcją startową jest funkcja main() – w środowisku Arduino zostało to zaprojektowane inaczej. Szkielet programu Arduino składa się z dwóch funkcji:

void setup() {
 //Instrukcje, które wykonają się jeden raz
}

void loop() {
 //Instrukcje, które będą wykonywały się w nieskończoność (w pętli)
}

Funkcja setup() uruchamia się jeden raz, jako pierwsza funkcja po włączeniu mikrokontrolera. W tej funkcji wykonujemy niezbędną inicjalizację i konfigurację naszych zmiennych oraz rejestrów mikrokontrolera. Druga funkcja o nazwie loop() charakteryzuje się tym, że jest wykonywana wielokrotnie w nieskończonej pętli. W tej funkcji powinien znajdować się kod realizujący logikę naszego programu.

Mikrokontroler w momencie uruchomienia wykonuje jako pierwszą funkcję setup() a następnie przechodzi do nieskończonej pętli, w której ciągle wykonuje funkcję loop().

Dla tych, którzy znają język C pomocnym może być przedstawienie sposobu wykonania kodu w środowisku Arduino w postaci kodu języka C. W zasadzie to środowisko Arduino w trakcie kompilacji doprowadza wykonanie dwóch powyższych funkcji do uruchomienia ich w funkcji startowej main() w poniższy sposób:

int main(void){

   setup();

   while(1){
      loop();
   }
}

Uruchomienie przykładowego programu

W kolejnym kroku zajmiemy się uruchomieniem przykładowego programu. Zazwyczaj każdą przygodę w programowaniu rozpoczyna się od napisania programu typu Hello World. Tylko, że tutaj nie posiadamy jeszcze niczego co mogło by nam pokazywać napisy. W środowisku mikrokontrolerów odpowiednikiem programu Hello World jest prosty program zwany Blink. Ma on za zadanie migać diodą LED. Płytka Arduino Uno jest wyposażona w wbudowaną diodę LED, którą w tym trywialnym przykładzie nauczymy się migać. W zasadzie celem poniższego ćwiczenia nie jest zrozumienie dlaczego ona miga, ale raczej ukazanie jak skompilować oraz załadować program do mikrokontrolera. Dlatego nie będziemy tego programu pisać, a użyjemy gotowego przykładu (takich przykładowych „programików” jest bardzo dużo w Arduino IDE), który załadujemy poprzez wykonanie opcji File->Examples->01. Basics->Blink.

Po wybraniu powyższej opcji powinien otworzyć się nowy projekt (sketch), z przykładowym kodem przypominający ten poniżej:

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

Twój mikrokontroler jest już podłączony i skonfigurowany, dlatego możemy przejść do wgrania programu. W tym celu wykonaj opcję weryfikacji i załadowania programu do mikrokontrolera:

Pierwsza opcja (Verify) jest odpowiednikiem spotykanego w innych środowiskach „Kompiluj„. Proces ten odpowiada za sprawdzenie poprawności kodu oraz jego kompilację, czyli zamianę na język zrozumiały dla programowanych urządzeń elektronicznych.

Drugie polecenie (Upload) odpowiada za załadowanie programu do płytki Arduino UNO. Po kliknięciu przycisku Upload na płytce powinny zamigać diody opisane jako TX oraz RX. Oznacza to, że dane są przesyłane z/do komputera.

Gdy proces przebiegnie poprawnie, na dole Arduino IDE znajdziemy stosowny komunikat. Pojawi się tam informacja, że program został przesłany oraz ile miejsca zajął w pamięci naszego mikrokontrolera – w tym wypadku było to 2846 bajtów:

Oczywiście, to że program został poprawnie przesłany możemy zaobserwować również na Arduino. Tak jak wspomniałem wcześniej na płytce do dyspozycji mamy 1 diodę LED. Po wgraniu programu powinna ona migać. Tak jak poniżej:

Jeśli dioda LED na Twoim Arduino UNO miga to znaczy, że popranie udało Ci się skompilować i uruchomić Twój pierwszy kod na mikrokontrolerze.

Zadania

  1. Aby utrwalić sobie wiedzę proponuje, aby przyjrzeć się programowi Blink i postarać się zrozumieć co on robi. Następnie zmodyfikuj go tak, aby dioda LED migała sygnał SOS, a następnie gasła na 5 sekund i ponownie nadawała sygnał SOS.