Arduino i bootloader

Włączam Arduino IDE, podłączam mojego chińskiego klona UNO R3. Otwieram projekt, nad którym pracowałem przez ostatnie dni, klikam 'Upload’, a w zamian dostaję:
avrdude stk500_getsync() not in sync resp=0x00
O sssso chodzi?!

Spójrzmy na taki scenariusz:

  • Dostaję nowe Arduino UNO R3;
  • W pierwszym momencie podłączam je do komputera przez kabel USB (taki z 'inną’ wtyczką USB – typ B);
  • Instalacja bezproblemowa (nawet w przypadku modelu z CH340G) pojawia się port np. COM5;
  • Odpalam Arduino IDE i ładuję podstawowy przykład 'Blink’ (Plik->Przykłady->Basics->Blink) – dioda na płytce mruga uroczo: OK;
  • Podłączam programator ICSP, otwieram Atmel AVR Studio i ładuję jakiś przykładowy projekt na pomocą programatora: OK;
  • Z powrotem podłączam UNO do komputera kablem USB, otwieram Arduino IDE i wgrywam inny program…: UPS!

Nie panikuj! Nic nie popsułeś. Po prostu nadpisałeś sobie bootloader! Skoro masz programator, nic się nie stało – zaraz to naprawimy!

Bootloader i ICSP

Zacznijmy od samego bootloadera. Bootloader to niewielki program, którego rolą jest uruchamianie Waszych projektów na mikrokontrolerze Atmel (który jest sercem Arduino). Jest on konieczny tylko wtedy, gdy ładujecie kod za pomocą kabla USB podłączonego do Arduino.

Dlaczego?

Układ ICSP jest charakterystyczny dla mikrokontrolerów. Programuje je trochę 'z boku’, przejmując na chwilę kontrolę na resetowaniem procesora. ICSP niejako wymusza na kontrolerze wpisanie nowego kodu do pamięci.

Co robi zatem bootloader Arduino (i inne, jak np. micronucleus na DigiSpark)? Najpierw instaluje się w pamięci flash w miejscu, gdzie normalnie są już pierwsze instrukcje programu. Gdy kontroler startuje, najpierw wykonuje program bootloadera (jak każdy inny kod). Bootloader najpierw sprawdza, czy ktoś – jak Arduino IDE na Twoim komputerze – nie chce przypadkiem wgrać nowego kodu. Bootloader czeka sekundę czy dwie; jeżeli nie ma takiego  żądania – wykonuje ostatnio zapisany program. Jeżeli jednak 'ktoś’ (znaczy Arduino IDE) chce wgrać nowy kod – skrzętnie umieszcza go w pamięci flash „za sobą” – i za chwilę staruje.

Port USB służy Arduino nie tylko do programowania, ale i do przesyłania danych; bootloder zatrzymuje się na chwilę, żeby sprawdzić o który tryb aktualnie chodzi. Dlatego też właśnie musicie wyłączać narzędzie 'serial monitor’ przed rozpoczęciem programowania Arduino.

To właśnie dzięki dzięki bootloaderowi możecie tak swobodnie korzystać z Arduino podłączając je do komputera za pomocą zwykłego USB.

Oczywiście są sytuacje, kiedy bootloader może przeszkadzać, np.:

  • Zajmuje trochę miejsca w pamięci flash (1-2KB);
  • Opóźnia start właściwego programu.

I tu z pomocą przychodzi ICSP. Gdy użyjecie go z poziomu Atmel Studio (lub np. avrdude) zapisze wskazany przez Was program do pamięci kontrolera. Jeżeli użyjecie domyślnego adresu startowego –  nadpisze bootloader podanym przez Was programem. Różnicę zauważycie dopiero, gdy będziecie próbowali wgrać coś z poziomu Arduino IDE po kablu USB.

Nie ma bootloadera, nie ma programowania przez USB z Arduino IDE (oczywiście dalej można programować przez ICSP).

Bootloader: come back!

Pytanie więc brzmi: jak mogę odzyskać bootloader?!

Postępuj zgodnie z tymi krokami:

  1. Podłącz Arduino przez ICSP do komputera;
  2. Uruchom Atmel Studio;
  3. Użyj: 'Tools/Device Programming’
  4. W polu 'Tool’ wybierz swój programator a w 'Device’ chip Arduino (najczęściej ATmega 328P);
  5. Kliknij 'Apply’ a potem w ramce 'Device Signature’ przycisk 'Read’; czasami trzeba to powtórzyć kilka razy aż pojawi się sygnatura;
  6. Na liście z lewej powinno pojawić się kilka możliwości, wybierz: 'Memories’;
  7. Teraz jesteś gotowy wybrać bootloader, który zostanie wysłany na kontroler;
  8. W polu 'Flash’ kliknij przycisk '…’ – otworzy się okienko wyboru pliku; przejdź do katalogu z programem Arduino IDE; u mnie katalog z bootloaderami znajdował się to (Arduino IDE 1.5.x):

    C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\optiboot

    Znajdziesz tam kilka plików 'hex’, np.:

    optiboot_atmega8.hex Bootloder dla ATTiny
    optiboot_atmega168.hex Bootloder ProMini z procesorem Atmel 168 (3,3V i 8 MHz)
    optiboot_atmega328.hex Bootloder dla wszystkich 328P – np. UNO, NANO (5V)
  9. Po wybraniu odpowiedniego bootloadera pozostaje wciśnięcie klawisza 'Program’.

icsp_bootloader
Jeżeli wszystko poszło dobrze, możecie już z powrotem cieszyć się możliwością programowania z Arduino IDE przez kabel USB (bez ICSP).

Podobno bootloader można też wypalić z poziomu samego Arduino IDE. Mi jednak (jak do tej pory) nie udało się skomunikować IDE z moim programatorem (AVR ISP mk II), który z Atmel Studio chodzi bez problemu (mimo Windows 8.1)

Suplement

Zamiast AVR Studio możecie użyć programu AVR Dude, Dużo informacji na ten temat znajdziecie na przykład tutaj: Kupione na wyprzedaży…

Źródła

Ten sposób programowania bootloadera znalazłem tutaj. Ja jednak darowałem sobie ustawianie fuse bitów.

8 komentarzy do “Arduino i bootloader”

    1. Witaj,
      spróbuj z ICSP i avrdude – na portalu znajdziesz wiele przykładów, jak to zrobić, np:
      $ sudo avrdude -c usbasp -v -p m328p -U flash:w:optiboot_atmega328.hex:i -B 20

      Powinno pomóc…
      Pozdrawiam,
      A

  1. Witam.
    Mam podobny problem. U mnie Arduino zgłasza się w menadzerze urządzeń, ale nie mozna zaprogramować przez USB. Atmega sprawna (sprawdzona na drugim Arduino-programuje się). Diody Rx i Tx nie świecą wogóle. Czy ktoś moze pomóc w naprawieniu.
    Oryginalna płytka arduino uno R3 nie klon.

Dodaj komentarz