Arduino Uno - Kompilacja programu i wysłanie go do mikrokontrolera bez Arduino IDE
Ostatnio stałem się szczęśliwym posiadaczem platformy Arduino Uno, stąd na stronie będą się pojawiać notatki dotyczące tego sprzętu jak i szerzej pojętego programowania mikrokontrolerów. Pierwsza z nich dotyczyć będzie kompilacji programu i przeniesienia go do mikrokontrolera, poza środowiskiem Arduino IDE na systemie Linux.
Dlaczego programować mikrokontroler poza środowiskiem Arduino IDE
Platforma i środowisko Arduino to świetny punkt startowy do rozpoczęcia przygody z programowaniem mikrokontrolerów oraz projektowania i tworzenia urządzeń elektronicznych. Język przygotowany do tych potrzeb, który de facto jest tylko opakowaniem do języka C, daje sposobność do wygodnego i prostego obsłużenia platformy Arduino wraz z innymi komponentami elektronicznymi. Ta prostota, która jest zaletą tego języka, może stanowić również wadę, jeśli komuś zależy na bardziej niskopoziomowym zrozumieniu i programowaniu mikrokontrolerów. Pierwszym krokiem w tym kierunku, niech będzie wyjście ze środowiska Arduino IDE, czyli kompilacja programu i jego załadowanie do mikrokontrolera, przy pomocy narzędzi, stojących za tym środowiskiem. Innymi słowy, zrobimy ręcznie coś, co Arduino IDE, robi za nas w tle. Tym samym staniemy się bardziej niezależni i elastyczni, bo prezentowane poniżej podejście, można uogólnić do innych programatorów i mikrokontrolerów innego rodzaju.
Jak skompilować i załadować program do mikrokontrolera?
Zacznijmy uściślenia kilku rzeczy. Pierwsza - Arduino Uno wyposażone jest w mikrokontroler ATMega328 i do niego właśnie spróbujemy wgrać program. Po drugie, wykorzystamy do tego celu narzędzia takie jak: avr-gcc, avr-objcopy oraz avrdude, które są instalowane razem ze środowiskiem Arduino IDE. Po trzecie i ostatnie, po podłączeniu Arduino Uno do komputera, dostępne jest w systemie jako urządzenie: /dev/ttyACM0.Wiedząc te rzeczy, spójrzmy na poniższy przykład pliku Makefile, którego zadaniem jest przełożenie kodu języka C, to kodu maszynowego i przeniesienie go do pamięci mikrokontrolera. Nie jest to najlepiej skonstruowany Makefile, ale istotne w tym przykładzie jest przede wszystkim samo wykorzystanie narzędzi o jakich wspominałem.
DF_CPU=16000000UL
MMCU=atmega328p
CONNECTION_PORT=/dev/ttyACM0
BAUD=115200
led.hex: led
avr-objcopy -O ihex -R .eeprom led led.hex;
sudo avrdude -F -V -c arduino -p ATMEGA328P -P $(CONNECTION_PORT) -b $(BAUD) -U flash:w:led.hex
led: led.o
$(CC) -mmcu=$(MMCU) led.o -o led
led.o: led.c
$(CC) -Os -DF_CPU=$(DF_CPU) -mmcu=$(MMCU) -c -o led.o led.c
Nie będę szczegółowo omawiał każdego z poleceń, odsyłam natomiast do ich dokumentacji aby zrozumieć co dokładnie ma miejsce, patrząc przez pryzmat użytych flag wywołań. To co jest najważniejsze, to to, że w pierwszej kolejności (patrząc od końca pliku Makefile) kompilujemy kod programu tworząc plik obiektowy, następnie linkujemy go uzyskując pełen program, na którego podstawie stwarzamy plik IHEX, wysyłany ostatecznie do pamięci Flash mikrokontrolera.
W ten sposób możemy obsłużyć urządzenie Arduino Uno bez konieczności użycia dedykowanego mu środowiska.
Komentarze (1)