W poprzedniej części tego poradnika udało się dobrać do układu atmega16u2.
Do pracy używam konfiguracji złożonej z:
- Arduino UNO r3 z AtMega16u2
- Zasilanie Arduino z zewnętrznego zasilacza 12V przez gniazdo DC
- Programator USBASP2 połączony z Arduino tasiemką wpiętą do ICSP czipu usb
- Programator połączony z komputerem (Win8.1) kablem USB
- Arduino IDE 1.6.1
Użyjemy teraz programatora ISP do zmiany oprogramowania czipu atmega16u2 tak, aby Arduino było rozpoznawane jako klawiatura HID (Human Interface Device).
UWAGA: POST W TRAKCIE ODŚWIEŻANIA
UWAGA: wszystkie przedstawione poniżej operacje przećwiczyłem na własnej skórze (znaczy sprzęcie). Nadal coś może pójść nie tak – pamiętajcie, działacie na własną odpowiedzialność.
Plan odwrotu
Zacznijmy od planu odwrotu. Jeżeli zmienicie firmware czipu usb (nawijmy tak umownie tą 'dodatkową’ atmega16u2), stracicie możliwość wgrywania oprogramowania po USB. Przećwiczmy więc na początek odzyskiwanie tej możliwości.
Oryginalne oprogramowanie do atmega16u2 znajduje się w pliku: C:\Program Files (x86)\Arduino\hardware\arduino\avr\firmwares\atmegaxxu2\Arduino-COMBINED-dfu-usbserial-atmega16u2-Uno-Rev3.hex.
Jak widać z rozszerzenia jest to plik hex czyli gotowy do wgrania na czip. Sprawdźmy najpierw sygnaturę i czytanie fusebitów:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
c:\cd "C:\Program Files (x86)\Arduino\hardware\tools\avr" c:\avr\bin\avrdude -C etc\avrdude.conf -c usbasp -v -p m16u2 ... Reading | ################################################## | 100% 0.03s avrdude: Device signature = 0x1e9489 avrdude: safemode: lfuse reads as FF avrdude: safemode: hfuse reads as D9 avrdude: safemode: efuse reads as F4 avrdude: safemode: lfuse reads as FF avrdude: safemode: hfuse reads as D9 avrdude: safemode: efuse reads as F4 avrdude: safemode: Fuses OK (H:F4, E:D9, L:FF) |
Raz kozie śmierć:
1 2 3 4 5 6 7 8 9 10 11 12 |
c:\.\bin\avrdude -C ".\etc\avrdude.conf" -c usbasp -v -p m16u2 -U flash:w:..\..\arduino\avr\firmwares\atmegaxxu2\Arduino-COMBINED-dfu-usbserial-atmega16u2-Uno-Rev3.hex ... Writing | ################################################## | 100% 2.53s ... avrdude: 15668 bytes of flash written ... avrdude: reading on-chip flash data: ... Reading | ################################################## | 100% 2.13s avrdude: verifying ... avrdude: 15668 bytes of flash verified |
Podłączcie jeszcze na chwilę przez USB do komputera i wgrajcie przykład Blink. Powinno być ok.
Budowanie z Lufą
Lufa jest fajna, ale dostarczana jako kod źródłowy. Oznacza to, że trzeba ją (fuj!) skompilować – tzn. użyć odpowiednich narzędzi, które przetłumaczą kod źródłowy na postać zrozumiałą dla komputerów. Nie bójcie się – to wcale nie jest tak trudne. Wszystkie instrukcje znajdziecie tutaj:
- Zacznijcie od pobrania lufy z tej strony. Uwaga: pobieracie wersję 100807! – nie tą najnowszą. Otrzymacie w ten sposób archiwum zip – rozpakujcie je do znanego miejsca na dysku. Dla prostoty niech to będzie 'c:\lufa_100807′.
- Zainstalujcie narzędzie WinAVR. Pobierzcie je stąd – nie przejmujcie się wiekiem. Uruchomcie instalację wskazując folder do instalacji – domyślnie 'C:\WinAVR-20100110′.
Możecie spróbować z narzędziami atmela – mnie się nie udało (same problemy przy kompilacji). Pobierzcie narzędzia stąd. Musicie podać email na który przyjdzie link do załadowania kodu. Uruchomcie instalację wskazując folder do rozpakowania – ja dla prostoty mam 'C:\avr8-gnu-toolchain’
- Teraz czas na takiego mini-linuxa pod Windows – czyli pakiet http://www.mingw.org. Pobierzcie plik „mingw-get-setup.exe” i zainstalujcie w 'C:\MinGW’. Instalator otworzy okno, w którym musicie wybrać pakiety do zainstalowania. Wybierzcie 'Basic Setup’ i następujące pakiety:
Teraz na kawę. Trochę to potrwa. - Czas na dodanie zmiennych środowiskowych:
- Klawisz windows, wpiszcie 'zmienne środowiskowe’, wybierzcie 'Edytuj zmienne środowiskowe systemu’; w oknie 'właściwości systemu’ wybierzcie 'Zmienne środowiskowe’
- Znajdźcie zmienną 'Path’ i dopiszcie na końcu:
;C:\MinGW\msys\1.0
(lub podobne jeżeli macie inne katalogi). WinAVR dopisze swoją ścieżkę sam przy instalacji.
- Zatwierdźcie i zamknijcie
- Klawisz windows, wpiszcie 'zmienne środowiskowe’, wybierzcie 'Edytuj zmienne środowiskowe systemu’; w oknie 'właściwości systemu’ wybierzcie 'Zmienne środowiskowe’
- Do katalogu projektów lufy 'c:\Lufa_100807\Projects’ skopiujcie katalog z instalacji Arduino 'c:\Program Files (x86)\Arduino\hardware\arduino\avr\firmwares\atmegaxxu2\arduino-usbserial\’
- Wejdźcie do nowego katalogi i zgodnie z tą instrukcją zmieńcie ProductID i VendorID w pliku 'Descriptors.c’:
VendorID = 0x2341,
ProductID = 0x0001, - Uruchomcie 'C:\MinGW\msys\1.0\msys.bat’
- W linii komend przejdźcie do katalogu z lufą i uruchomcie kompilację, np:
$ cd /c/Lufa_100807/Projects/arduino-usbserial
$ make
W rezultacie powinniście uzyskać plik 'Arduino-usbserial.hex’. Jeżeli jest on taki sam jak 'Arduino-usbserial-uno.hex’ – gratulacje – udało Wam się zbudować firmware dla atmega8u2, który był używany we wcześniejszych wersjach Arduino UNO!
Co zrobić, żeby uzyskać plik firmware dla atmega16u2: 'Arduino-usbserial-atmega16u2-Uno-Rev3.hex’?
- Zmodyfikuj wpisy w makefile:
MCU = atmega16u2
MCU_AVRDUDE = atmega16u2
MCU_DFU = atmega16u2
...
ARDUINO_MODEL_PID = 0x0043 - Zmodyfikuj 'ProductID’ w 'Descriptors.c’:
z:
.ProductID = 0x0001,
na:
.ProductID = 0x0043
Po przebudowaniu powinniście dostać 'Arduino-usbserial.hex’ z zawartością identyczną jak w instalce Arduino. Jeżeli tak – jest ok.
VendorID i ProductID Arduino | |||
Model | VendorID | ProductID | ARDUINO_MODEL_PID |
---|---|---|---|
Gdzie: | Descriptors.c | Descriptors.c | makefile |
UNO | 0x03EB | 0x204B | 0x01 |
UNO | 0x2341 | 0x0001 | 0x01 |
UNO R3 | 0x2341 | 0x0043 | 0x43 |
CDN
Źródła
- https://github.com/NicoHood/HID/wiki/Updating
- http://forum.arduino.cc/index.php?topic=72236.0