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

arduino_atmega16u2Do kolejnego projektu potrzebuję ‚coś’ co będzie emulowało urządzenie HID (Human Interface Device).  Podłączone do portu USB komputera lub Raspberry, zostanie rozpoznane jako joystick z kilkoma przyciskami. Tym urządzeniem będzie Arduino z Joystick Shield.

Arduino wyposażono w gniazdo USB. Po podłączeniu do komputera, USB służy do programowania (komunikacji z bootloaderem Arduino), zasilania i wymiany danych po porcie szeregowym.

Potrzebuję zmienić to zachowanie. Teraz, podłączone do komputera Arduino, będzie rozpoznawane jako joystick z kilkoma przyciskami. Mam nadzieję, że np. RetroPie rozpozna tak zmodyfikowane Arduino jako… kontroler do gier.

Potrzebujecie

  • Arduino UNO z układem AtMega16u2 (kontrolującym połączenie po USB),
  • Joystick Pad
  • Programator USBasp z tasiemką i wtyczką 2×3 pin,
  • Nóż segmentowy,

Nie każde Arduino się nadaje się do tego projektu. Dowcip polega na przeprogramowaniu układu realizującego komunikacje z mikrokontrolera do portu USB. Większość chińskich klonów opiera się na układzie CH340. Spełnia on swoje zadanie. Nawet w Windows 8 nie wymaga dodatkowych sterowników. Niestety nie można go przeprogramować. To jest układ realizujący transmisję po USB i kropka.

W oryginalnych Arduino UNO rolę tą spełnia AtMega16u2. Różnica polega na tym, że AtMega16u2 można przeprogramować.

Wpisując alternatywny firmware do tego układu pozbawiamy się możliwości programowania UNO za pomocą kabla USB. Oczywiście jest to operacja całkowicie odwracalna, ale będzie wymagać programatora ISP. Ja korzystam z USBasp2 f-my msx-elektronika.pl (instrukcje do instalacji usbasm znajdziecie tutaj):
IMG_20150127_210950

Programowanie DFU Arduino UNO jest możliwe za pomocą samego kabla USB. Są fora, które podają, co trzeba dolutować a co zewrzeć. Wydaje mi się, że użycie programatora ISP jest dużo łatwiejsze. A nawet przy opcji z USB: jak coś nawali, i tak będziecie potrzebowali programatora, żeby to naprawić.

„Normalnie” programując UNO z pomocą ISP, podłącza się tasiemkę do wschodniej krawędzi płytki (po przeciwnej stronie gniazda USB i jack DC, na rysunku oznaczona na czerwono). Ale UNO, które posiadają czip AtMega16u2 wyposażono w dodatkowe złącze znajdujące się po stronie zachodniej, tuż przy porcie USB (oznaczono na żółto).
arduino_isp
Niestety ze względu na położenie ISP dla AtMega16u2, standardowa wtyczka z programatora nie wejdzie. Jej klucz (wypustka na wtyczce od strony pinu 1) zahacza o gniazda wyprowadzeń portów. Nie ma wyboru – trzeba ją ściąć za pomocą np. noża segmentowego. To prosta operacja, tylko uważajcie na palce.
arduino i programator usbasp

Programator posiada zworkę pozwalającą na zasilenie z niego UNO. Ustawcie ją na 5V. Jeżeli zauważycie z tym problemy (np. brak odczytów z avrdude), wyciągnijcie zworkę i zasilcie UNO zewnętrznie – np. 12V zasilaczem przez gniazdo DC jack.

Gdy to zrobicie podłączcie:

  • Taśmą 6 pin: programator z ISP AtMega16u2 na Arduino
  • Kablem USB A: programator z komputerem

Sprawdzimy teraz, czy 16u zostanie wykryty przez avrdude.

AVRDUDE

avrdude to narzędzie, które zajmuje się przeniesieniem zbudowanych programów (pliki hex) do pamięci kontrolera. Program dostarczany jest razem z Arduino IDE (niektórzy mówią odwrotnie: IDE jest dostarczane z avrdude) w katalogu C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe (może być różny w zależności od tego, gdzie zainstalowaliście IDE).

Dla wersji 1.6 IDE uruchamiajcie avrdude z C:\Program Files (x86)\Arduino\ (gdzie znajduje się plik cygwin1.dll)

Otwórzcie linię poleceń (Windows-Run-cmd)i przejdźcie do tego katalogu (nie zapomnijcie o cudzysłowiach ze względu na spacje w ścieżce):

Do uruchomienia, avrdude wymaga kilku parametrów:

Parametr Znaczenie Przykładowe użycie
-C plik konfiguracyjny avrdude Uzyjemy tego z IDE:
-C „C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf”
-c Typ programatora -c usbasp
-p typ procesora Dla głównego procesora (AtMega328p): -p m328p
Dla 16u: -p m16u2
-U [co]:[operacja]:[plik][:format]
[co]:flash, eeprom, lfuse, hfuse, efuse
[operacja]: r:odczyt, w:zapis, v:veryfikacja
[plik]: nazwa pliku lub ‚-‚ gdy nic
[format]: h:hex
 -U lfuse:r:-:h
-v Wyświetl wszystko co odczytasz
-F Pomiń weryfikację sygnatury

Teraz:

Między innymi zobaczycie:

Sygnatura AtMega328p: 0x1e950f
Sygnatura atmega16u2: 0x1e9489

Ok, macie więc teraz dostęp do atmega16u2. W kolejnej części zajmiemy się jego przeprogramowaniem.

Dodaj komentarz