Bootloader to specjalny program zapisany w pamięci mikrokontrolera, który uruchamia się jako pierwszy po starcie i umożliwia wgrywanie szkiców przez USB bez dedykowanego programatora.
Dzięki bootloaderowi programujesz Arduino jednym kablem USB i Arduino IDE – szybko, wygodnie i bez dodatkowego sprzętu.
Czym jest bootloader i po co go używać?
Bootloader to mały fragment kodu (zwykle kilka kilobajtów), który nasłuchuje komend z komputera przez interfejs szeregowy (USB/UART) i wgrywa nowy program (szkic) do pamięci flash mikrokontrolera. Nie musisz kupować drogiego programatora ISP – wystarczy kabel USB i Arduino IDE.
Zalety bootloadera:
Oto najważniejsze korzyści korzystania z bootloadera:
- prostota programowania – wgrywasz kod jednym kliknięciem w Arduino IDE;
- kompatybilność – działa z płytkami jak Arduino Uno, Nano czy Pro Mini;
- odtwarzalność – idealny do klonowania projektów na nowych mikrokontrolerach ATmega328P.
Bez bootloadera mikrokontroler wymaga programatora jak USBasp lub ST-Link, co komplikuje pracę początkującym. Wgranie szkicu przez programator ISP nadpisuje bootloader – aby wrócić do programowania przez USB, trzeba go ponownie wgrać.
Wymagane narzędzia i przygotowanie
Do podstawowych operacji przygotuj poniższe elementy:
- Dwie płytki Arduino Uno – jedna jako programator, druga jako cel z mikrokontrolerem ATmega328P;
- przewody połączeniowe (jumper wires) – do spięcia pinów ISP między płytkami;
- Arduino IDE – najnowsza wersja z arduino.cc;
- komputer z Windows, Linux lub macOS – do uruchomienia IDE i komunikacji przez USB.
Uwaga dla zaawansowanych: przy „nagim” ATmega328P przyda się kwarc 16 MHz (jeśli nie ma go na płytce) oraz dwa kondensatory 22 pF. Do symulacji możesz wykorzystać bibliotekę Arduino dla Proteus.
Metoda 1 – wgrywanie bootloadera za pomocą Arduino jako ISP (najprostsza dla początkujących)
To najłatwiejszy sposób na odzyskanie bootloadera w ATmega328P z użyciem działającej płytki Arduino Uno – zamieniamy jedną płytkę w programator ISP.
Krok 1 – połączenia sprzętowe
Podłącz Arduino B (programator) z Arduino A (cel) w następujący sposób:
| Pin Arduino B | Pin Arduino A |
|---|---|
| 5V | 5V |
| GND | GND |
| D11 (MOSI) | D11 |
| D12 (MISO) | D12 |
| D13 (SCK) | D13 |
| D10 (RESET) | RESET |
Arduino B podłącz do komputera przez USB – zasilisz w ten sposób obie płytki. Dla Arduino Mega użyj pinów: MOSI–D51, MISO–D50, SCK–D52, RESET–D53.
Wskazówka: dodaj diody LED z rezystorami 330 Ω na pinach D9 (heartbeat), D8 (błąd), D7 (programowanie) na programatorze – ułatwiają diagnostykę.
Krok 2 – konfiguracja Arduino IDE
Postępuj zgodnie z poniższymi krokami:
- Otwórz Arduino IDE.
- Załaduj szkic ArduinoISP (File > Examples > ArduinoISP) na Arduino B i wgraj go jak zwykły program.
- W menu Tools > Board wybierz płytkę docelową (np. Arduino Uno dla ATmega328P).
- Ustaw Tools > Programmer > Arduino as ISP.
- Wybierz Tools > Burn Bootloader. Diody TX/RX będą migać przez ok. 30 s. Po sukcesie pojawi się komunikat:
Done burning bootloader
Po wszystkim zmień z powrotem Tools > Programmer na AVR ISP, aby wgrywać szkice przez USB.
Rozwiązywanie problemów
Najczęstsze problemy i ich szybkie rozwiązania:
- błąd avrdude – sprawdź połączenie RESET (w szkicu ArduinoISP możesz zmienić pin:
#define RESET SSna np. D9); - brak migania diod – upewnij się, że Arduino B ma wgrany ArduinoISP i jest podłączone przez USB;
- Arduino Leonardo/Micro – programuj przez złącze ICSP, nie przez piny cyfrowe.
Po tej procedurze Arduino A ma wgrany bootloader i programuje się jak oryginalna płytka Uno.
Metoda 2 – programowanie ATmega328P przez USBasp lub UART
Dla samodzielnego układu ATmega328P (poza płytką) użyj taniego programatora USBasp (~10–20 zł), a następnie programuj szkice przez UART z konwerterem USB–UART.
Procedura:
Wykonaj następujące kroki, aby wgrać bootloader:
- Podłącz ATmega328P do USBasp: VCC→5 V, GND→GND, MOSI→PB3 (pin 17), MISO→PB4 (pin 18), SCK→PB5 (pin 19), RESET→PC6 (pin 1).
- W Arduino IDE ustaw: Tools > Programmer > USBasp; Tools > Board > Arduino Nano; Processor > ATmega328P (Old Bootloader).
- Wybierz Tools > Burn Bootloader. Po zakończeniu układ jest gotowy do programowania przez RX/TX z konwerterem USB–UART.
Uwaga: po wgraniu szkicu przez USBasp bootloader zostaje nadpisany – wgraj go ponownie, jeśli chcesz wrócić do programowania przez USB.
Zaawansowane – bootloader dla STM32 Blue Pill (Arduino Core)
STM32F103C8T6 (Blue Pill) nie ma natywnego bootloadera Arduino, ale możesz go wgrać i programować przez USB z poziomu Arduino IDE.
Wymagane:
Do uruchomienia procedury przygotuj:
- STM32 Blue Pill – płytka z mikrokontrolerem STM32F103C8T6;
- konwerter USB–UART (np. CH340) lub ST-Link – do pierwszego programowania;
- STM32CubeProgrammer – narzędzie do wgrywania pliku .bin do pamięci Flash;
- bootloader .bin z STM32duino – np. generic_boot20_pc13.bin.
Kroki:
Postępuj według poniższej instrukcji, aby wgrać bootloader STM32duino:
- Połączenia USB–UART – PA9 (TX) → RX konwertera, PA10 (RX) → TX konwertera, GND → GND, 3.3 V → 3.3 V.
- Ustaw zworki: BOOT0 = HIGH, BOOT1 = LOW (uruchomienie z system memory).
- W STM32CubeProgrammer: wybierz Port COM (115200 baud) → Connect → Erasing & Programming → wskaż plik .bin (adres 0x08000000) → Start.
- Ustaw BOOT0 = LOW, podłącz USB – płytka powinna wykryć się jako port COM.
- W Arduino IDE dodaj URL: http://dan.drown.org/stm32duino/package_STM32duino_index.json; zainstaluj STM32F1 Boards; wybierz Generic STM32F103C i wgraj szkic przyciskiem Upload.
Po tej procedurze Blue Pill działa z Arduino IDE przez USB jak klasyczna płytka Arduino.
Porównanie metod wgrywania bootloadera
Poniższa tabela zestawia popularne metody pod kątem trudności, kosztu i zastosowań:
| Metoda | Trudność | Koszt | Zastosowanie |
|---|---|---|---|
| Arduino as ISP | Niska | 0 zł | ATmega328P, początkujący |
| USBasp | Średnia | 10–20 zł | „Gołe” układy ATmega |
| STM32CubeProgrammer | Wysoka | ~20 zł | STM32 Blue Pill |
Bezpieczeństwo i dobre praktyki
Stosuj poniższe zasady, aby uniknąć problemów i oszczędzić czas:
- backup bootloadera (.hex) – wykonaj kopię zapasową przed eksperymentami;
- stabilne zasilanie 5 V – unikaj 3.3 V dla ATmega bez modyfikacji układu zegara;
- testy na płytce stykowej – przenieś projekt z Arduino Uno na „goły” ATmega328P z kwarcem 16 MHz;
- diagnostyka sygnałów – użyj diod LED lub oscyloskopu na liniach SPI.