Arduino – Wprowadzenie do AVR
Rozpoczęcie na studiach przedmiotu Technika Mikroprocesorowa zachęciło mnie do zabawy z najprostszym dla początkujących układem Arduino. Dzięki niej każdy może zacząć swoją przygodę z elektroniką oraz programowaniem. Przejdźmy zatem do rzeczy.
Z czego składa się Arduino?
Sercem Arduino jest mikrokontroler. Wszystkie pozostałe elementy znajdujące się płytce odpowiadają za zasilanie układu bądź pozwalają na komunikację z komputerem.
Mikrokontroler jest małym komputerem zamkniętym w pojedynczym chipie. Jest dwudziestoośmiostykowym chipem umieszczonym w gnieździe znajdującym się na środku płytki. Posiada wbudowane układy procesora i pamięci.
Arduino posiada procesor, kilka kilobajtów pamięci RAM (Random Access Memory) służącej do przechowywania danych, kilka kilobajtów pamięci programowalnej EEPROM (Electrically Erasable Programmable Read-Only Memory), także złącza wejścia / wyjścia. Wspomniane złącza wejścia mogą odbierać sygnały cyfrowe oraz sygnały analogowe, wyjścia natomiast konfigurujemy zwarciem bądź rozwarciem (ustawiając 0V lub 5V). Ponadto można ustalić wartość napięcia na danym złącza.
Elementy płytki:
- Złącza zasilania
- złącze Reset – resetuje mikrokontroler, żeby to zrobić należy połączyć pin Reset z pinem masy,
- złącze GND (ground) – złącze masy, dostarcza napięcie równe 0V,
- Pozostałe piny są źródłem napięcia.
- Wejścia analogowe
- Złącza oznaczone A0 – A5 pomimo swojego oznaczenia mogą być również stosowane do cyfrowych zastosowań. Pomiędzy tymi złączami a masą płyną niewielkie prądy, ponieważ charakteryzują się dużą rezystancją wewnętrzną.
- Złącza cyfrowe
- mowa o pinach 0 – 13. Pierwsze dwa złącza 0 oznaczone jako RX (odbiór) oraz 1 TX (transmisja) są stosowane podczas połączenia z komputerem. Są bezpośrednio połączone z USB. Mogą zapewnić prąd maksymalny równy 40mA.
- Mikrokontroler
- na płytce Arduino Uno umieszczony jest ATmega328.
- Pozostałe
- kwarcowy generator – generuje 16 milionów impulsów na sekundę, z każdym impulsem mikrokontroler wykonuje jedną operację matematyczną,
- przycisk Reset – wciśniecie powoduje wysłanie sygnału logicznego powodującego wyczyszczenie pamięci operacyjne i ponowne uruchomienie wgranego programu.
- chip interfejsu USB – przetwarza sygnał na akceptowalny dla płytki Arduino
Konfiguracja środowiska do Arduino
Domyślnym IDE ( Integrated Development Environment) jest Arduino IDE, które jest idealne na rozpoczęcie pracy z płytką. Ja jednak zaprezentuję pracę z programem Atmel Studio, który pozwala na wiele więcej operacji i jest zdecydowanie bardziej rozbudowanym środowiskiem. Po drugie zauważyłem, że problematyczne jest poprawne skonfigurowanie tego IDE. Dlatego też postaram się wyjaśnić jak to zrobić, żeby móc wgrywać oprogramowanie na płytkę korzystając z Atmel Studio.
Instalacja Arduino IDE i Atmel Studio
Pliki wykonywalne możemy pobrać przechodząc na strony twórców korzystając z poniższych odnośników:
- Arduino IDE – pobieramy Windows Installer, for Windows XP and up
- Atmel Studio – pobieramy Atmel Studio 7.0 (build 2397) web installer (recommended)
Żeby poprawnie skonfigurować Atmela będziemy potrzebować znać numer portu, do jakiego jest przypisane Arduino. Żeby to sprawdzić potrzebujemy podłączyć płytkę do komputera. Następnie w menadżerze urządzeń możemy sprawdzić wspomniany numer. W moim przypadku jest to COM4. U każdego może być on inny.
Gdy pobierzemy wymagane oprogramowanie należy uruchomić Atmel Studio oraz przejść do zakładki Tools -> External Tools.
Po otwarciu wklejamy kolejno wskazane przeze mnie linijki. Zauważ, że w kategorii Arguments wskazujemy na numer portu. Pamiętaj, że należy go zmienić jeśli się różnią (chodzi o argument -P, w moim przypadku jest podane COM4, u Ciebie może być COM7, COM21 czy inny przydzielony Arduino port).
Title: ArduinoTool
Command: C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe
Arguments: -C "C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf" -p atmega328p -c arduino -P COM4 -b 115200 -U flash:w:"$(ProjectDir)Debug\$(TargetName).hex":i"
Initial Directory: $(TargetDir)
Oraz zaznaczamy „Use Output Window”.
Oczywiście należy zaznaczyć, że podane powyżej ścieżki mogą być różne, zależy to od miejsca instalacji Arduino IDE. Ponadto pragnę wspomnieć, że program avrdude.exe możemy pobrać osobno. Ja zdecydowałem się na pobranie całego środowiska ze względu na to, że dopiero zaczynam naukę Arduino i korzystam zamiennie z obydwu środowisk.
Jakby ktoś nie był zaznajomiony z program AVRDUDE, jest to narzędzie do pobierania / przesyłania / manipulowania zawartością ROM i EEPROM mikrokontrolerów AVR z wykorzystaniem techniki programowania systemowego (ISP).
Uruchomienie pierwszego projektu
Żeby sprawdzić, czy wszystko zostało poprawnie skonfigurowane możemy utworzyć nasz pierwszy projekt.
Tworzymy nowy projekt w języku C, który jest wykonywalny:
Wybieramy urządzenie ATmega328P i zatwierdzamy:
Wyświetli się okno z otworzonym plikiem main.c. Wklejamy poniższy kod, którego zadaniem jest pozwolenie diodzie podpiętej do dowolnego z pinów 9 – 13 mruganie.
#define F_CPU 1000000UL // 1 MHz - czestotliwosc taktowania procesora
#include <avr/io.h> // Biblioteka definiujaca porty, piny etc.
#include <util/delay.h> // Dodaje funkcje, ktore opozniaja czas _delay_ms()
int main(void)
{
DDRB = 0xff; // Data Direction Register B: konfigurowanie portow B jako wyjscie
while (1)
{
PORTB = 0b11111111; // Uruchamia wszystkie piny na miejscu PORTB
_delay_ms(1000); // czekaj
PORTB = 0b00000000; // wyłącza wszystkie piny wchodzace w sklad B
_delay_ms(1000); // czekaj
}
return 0;
}
Oraz kompilujemy projekt klikając F7. Jeśli całość przeszła pomyślnie możesz program wgrać na płytkę. Oczywiście musi ona być podczas tego procesu podłączona do komputera.
Program wgrywamy wchodząc w zakładkę Tools i klikamy w przed chwilą utworzone rozszerzenie ArduinoTool:
Jeśli wszystko przebiegło poprawnie powinieneś otrzymać output jak poniżej:
Patrząc na układ wszystko działa poprawnie:
PIN 13 jest podpięty do katody diody, rezystor jedną nóżką do anody, drugą końcówką do masy.
Wytłumaczenie kodu
Poniżej prezentuje się mapa pinów Arduino. Widzimy kolejno do jakich są przydzielone poszczególne porty mikrokontrolera ATmega. Zauważmy, że rejestry B znajdują się bezpośrednio na pinach 9 – 13 płytki Arduino.
Schemat kodu do programowania AVR:
[wstępne makrodefinicje && dołączone biblioteki]
[definicje funkcji]
int main(void) {
[inicjalizacje chipów]
while (1) {
[kod, który działa na płytce w nieskończoność]
}
return 0;
}
Gdy konfigurujemy pin w mikrokontrolerze operacja wygląda podobnie jak zapisywanie wartości do zmiennej. Rejestry sprzętowe są takie same jak gniazda pamięci RAM, których używamy do zapisywanie wartości zmiennych, jednak z pewną różnicą. Pisząc DDRB = 0b00000001; zwracamy się do wszystkich komórek pamięci nie tylko zapisując logiczne „1” do zmiennej ale też ustawiamy tranzystory, które są przełącznikami bezpośrednio połączonymi do każdej z 8 komórek pamięci.. Każdy slot pamięci AVR jest bajtem, który ma 8 bitów.
Najważniejsze rejestry sprzętowe:
- DDRx – Data Direction Registers (port x) – kontroluje, które piny są wejściowe, które wyjściowe.
- PORTx – kiedy DDRx ustawione jest na output, rejestr PORT kontroluje, czy na wyjściu ma znajdować się stan HIGH, czy LOW.
- PINx – rejestry PIN wczytują zadane wartości napięcia, gdy DDRx jest skonfigurowane jako input.
DDRB = 0xff; // Data Direction Register B: konfigurowanie portow B jako wyjscie
Dlatego powyższa linijka mówi, że wszystkie rejestry B są ustawione jako output. 0xff to zapis w kodzie szesnastkowym (przez 0x informujemy kompilator, że będzie to liczba heksadecymalna, natomiast przez 0b, że będzie to liczba binarna).
PORTB = 0b11111111; // Uruchamia wszystkie piny na miejscu PORTB
_delay_ms(1000); // czekaj
Tutaj zwracamy się już do wyjściowych rejestrów i ustawiamy je wszystkie na stan logiczny „1”, czyli HIGH. Następnie występuję pauza na tysiąc milisekund i ustawiany jest stan LOW, co powoduje mruganie diody.
Podsumowanie
W powyższym wpisie udało nam się zobaczyć co wchodzi w skład popularnej płytki Arduino UNO, skonfigurować środowisko programistyczne oraz uruchomić program wywołujący mruganie diody. Ponadto mogliśmy dokładnie zrozumieć co się dzieje w kodzie. To wprowadzenie pozwoli nam na pisanie bardziej zaawansowanego oprogramowania w przyszłości. Zachęcam oczywiście do zakupu płytki i samodzielne zgłębianie wiedzy na temat systemów wbudowanych, ponieważ jest to bardzo ciekawy i jakże rozległy temat.
Gdybyś chciał poznać płytkę nRF52 DK oraz uruchomić na niej pierwszy projekt zachęcam przeczytać ten wpis.
Linki referencyjne:
ATmega168/328P-Arduino Pin Mapping
Program / Flash Arduino Uno with Atmel Studio