Arduino jako joystick (DFU, LUFA i HID) – cz. 2

W poprzedniej części tego poradnika udało się dobrać do układu atmega16u2.
IMG_20150319_174205
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:

Raz kozie śmierć:

Podłączcie jeszcze na chwilę przez USB do komputera i wgrajcie przykład Blink. Powinno być ok.
Clipboard01

 

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:

  1. 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’.
  2. 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’

  3. 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:
    minigw_install
    Teraz na kawę. Trochę to potrwa.
  4. 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’
      win_zmienne_srodowiskowe2
    • 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.
      win_ustaw_zmienn
    • Zatwierdźcie i zamknijcie
  5. 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\’
  6. Wejdźcie do nowego katalogi i zgodnie z tą instrukcją zmieńcie ProductID i VendorID w pliku ‚Descriptors.c’:
    VendorID = 0x2341,
    ProductID = 0x0001,
  7. Uruchomcie ‚C:\MinGW\msys\1.0\msys.bat’
  8. 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

Dodaj komentarz