{"id":869,"date":"2015-07-31T23:25:59","date_gmt":"2015-07-31T22:25:59","guid":{"rendered":"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/?p=869"},"modified":"2019-01-11T13:07:50","modified_gmt":"2019-01-11T12:07:50","slug":"arduino-als-usb-joystick","status":"publish","type":"post","link":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/2015\/07\/31\/arduino-als-usb-joystick\/","title":{"rendered":"Arduino als USB-Joystick"},"content":{"rendered":"<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_869\" class=\"pvc_stats all  \" data-element-id=\"869\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n<dl>\n<dt><a href=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2015\/07\/IMAG1861.jpg\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2015\/07\/IMAG1861-300x170.jpg\" alt=\"IMAG1861\" width=\"300\" height=\"170\"><\/a><\/dt>\n<dd><em>Arduino als USB-Joystickinterface<\/em><\/dd>\n<\/dl>\n<p style=\"text-align: justify\">Die gro\u00dfe Welt der kleinen Microcontroller und vor allem der sehr g\u00fcnstigen Microcontroller und deren Vielf\u00e4ltigkeit, hat mich beim folgenden &#8218;Projektchen&#8216; wieder motiviert sie zu verwenden. F\u00fcr die eher weniger outdoorlastigen kalten Wintertage habe ich mir ein Projekt vorgenommen, dass das Thema Retrocomputer betrifft. Zum einen habe geplant, die Website um die Rubrik der alten Computer zu erweitern (zumindest sollen die paar wenigen aus meiner Sammlung vorgestellt und in Betrieb genommen werden&#8230;) und zum anderen will ich mir eine Arcade-Station bauen, deren Kern das neue RaspBerry2 Modell ist . Auf dem soll die Emulatorplattform <a href=\"http:\/\/blog.petrockblock.com\/retropie\/\" target=\"_blank\" rel=\"noopener\">Retropie<\/a> aus dem gleichnamigen Projekt zu Einsatz kommen. Die ersten Versuche mit den Images aus dem Projekt sehen sehr gut aus. Die alten 8-Bit und 16-Bit Computer laufen in der Emulation ausgezeichnet (C64, Atari, Amiga usw&#8230;). Was die Anbindung von Eingabeger\u00e4ten betrifft, kann man nat\u00fcrlich Maus und Keyboard vom PC an den Raspberry anschliessen und alles steuern. Die Jungs aus dem Projekt haben auch selbst einige Boards entwickelt, die die Anbindung von Joysticks und co an des Raspberry erm\u00f6glichen. (zB. den <a href=\"http:\/\/blog.petrockblock.com\/2012\/10\/21\/the-retropie-gpio-adapter\/\" target=\"_blank\" rel=\"noopener\">GPIO Adapter<\/a>). Aber da ich ein paar Arduino Unos herumliegen habe, dachte ich mir, warum nicht diese verwenden. Da es beim Arduino m\u00f6glich ist, den Mega 16U2 zu flashen (der Chip wird als Programmer f\u00fcr den Atmega 328 auf dem Uno &#8211; Board verwendet) und aus dem Uno-Board so zum Beispiel ein USB-HID (Human Interface Device) zu machen -sprich Keyboard, Mouse, was auch immer, bot sich der als ideale Plattform an.<\/p>\n<p style=\"text-align: justify\">Tutorials, den Arduino zu einem HID-Interface zu flashen, gibt es mittlerweile schon sehr viele. Zum Beispiel findet man <a href=\"http:\/\/mitchtech.net\/arduino-usb-hid-keyboard\/\" target=\"_blank\" rel=\"noopener\">hier<\/a> eine sch\u00f6ne Anleitung. Je nach dem welche Arduino-Uno Boardversion man hat, kann man sich den zus\u00e4tzlichen Widerstand f\u00fcrs DFU-Flashen sparen. (z.Bsp. bei meinen Boardversionen R3 ist der Widerstand nicht n\u00f6tig.) Auf den neuen Boards ist auch nicht mehr der Atmega 8U2 verbaut, sondern der 16U2. Man mu\u00df einfach im Atmega Flash-Tool &#8222;ATMEL-FLIP&#8220; den entsprechenden Chip ausw\u00e4hlen. Die entsprechenden Firmwarefiles findet man im Netz&#8230;<\/p>\n<p>Arduino-keyboard-0.3.hex<br \/>\nArduino-mouse-0.1.hex<\/p>\n<p style=\"text-align: justify\">Ist der Arduino dann geflasht, so wird er beim Anschluss an den PC eben als Keyboard oder Maus erkannt. Jetzt braucht man nur mehr den gew\u00fcnschten Code in den Atmega328 zu schreiben und die Arduino UNO Eing\u00e4nge f\u00fchren z.Bsp. Tastaturbefehle aus. Um die Firmware jetzt nicht jedes Mal zwischen Programmer und USB-HID zu \u00e4ndern, verwende ich einfach einen zweiten UNO der als Programmer dient und stecke einfach den geflashten Chip immer um (ist viel einfacher beim Testen).<\/p>\n<p style=\"text-align: justify\">Da das Interface jetzt soweit passt, habe ich mich mit dem <a href=\"http:\/\/www.freebsddiary.org\/APC\/usb_hid_usages.php\" target=\"_blank\" rel=\"noopener\">HID-Codetable<\/a> besch\u00e4ftigt und die entsprechenden Tasten, die die Joystickbewegungen an den PC senden sollen herausgesucht.<\/p>\n<p style=\"text-align: justify\">Hier der sehr einfache Code der momentan die alten Commodore Joystickbewegungen umsetzt:)<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/* HID Joystickinterface f\u00fcr Arduino UNO im HID Modus\r\n Jun2015 by I.Bihlo\r\n Die Tasten brauch i  Taste\/Hexcode\/Dec-Code  \r\n  KEY_LEFT_CTRL    0x01  \/\/01 \r\n  KEY_LEFT_SHIFT    0x02  \/\/02 \r\n  KEY_LEFT_ALT    0x04  \/\/04 \r\n  KEY_LEFT_GUI    0x08  \/\/08 \r\n  KEY_RIGHT_CTRL    0x10  \/\/16 \r\n  KEY_RIGHT_SHIFT 0x20  \/\/32 \r\n  KEY_RIGHT_ALT   0x40  \/\/64 \r\n  KEY_RIGHT_GUI   0x80  \/\/128 \r\n\r\n  KEY_RIGHT_ARROW 0x4F  \/\/79 \r\n  KEY_LEFT_ARROW  0x50  \/\/80 \r\n  KEY_DOWN_ARROW  0x51  \/\/81 \r\n  KEY_UP_ARROW    0x52  \/\/82 \r\n  KEY_TAB         0x2B  \/\/43 \r\n  KEY_ENTER       0x28  \/\/40 \r\n  KEY_SPC         0x2C  \/\/44 \r\n *\/ \r\n     uint8_t keyNone&#x5B;8] = { 0, 0, 0, 0, 0, 0, 0 }; \r\n     uint8_t keyA&#x5B;8] = { 0, 0, 4, 0, 0, 0, 0 };  \/\/left \r\n     uint8_t keyD&#x5B;8] = { 0, 0, 7, 0, 0, 0, 0 }; \/\/right \r\n     uint8_t keyW&#x5B;8] = { 0, 0, 26, 0, 0, 0, 0 }; \/\/up \r\n     uint8_t keyS&#x5B;8] = { 0, 0, 22, 0, 0, 0, 0 }; \/\/down \r\n     uint8_t keySPACE&#x5B;8] = { 0, 0, 44, 0, 0, 0, 0 }; \/\/space \r\n      \r\n     uint8_t keyLEFT&#x5B;8] = { 0, 0, 80, 0, 0, 0, 0 };  \/\/left \r\n     uint8_t keyRIGHT&#x5B;8] = { 0, 0, 79, 0, 0, 0, 0 }; \/\/right \r\n     uint8_t keyUP&#x5B;8] = { 0, 0, 82, 0, 0, 0, 0 }; \/\/up \r\n     uint8_t keyDOWN&#x5B;8] = { 0, 0, 81, 0, 0, 0, 0 }; \/\/down \r\n     uint8_t keyENTER&#x5B;8] = { 0, 0, 40, 0, 0, 0, 0 }; \/\/enter \r\n      \r\n \/\/ DEFINE inputs \r\n const int UPA = 12; \r\n const int DOWNA = 13; \r\n const int LEFTA = 2; \r\n const int RIGHTA = 3; \r\n\r\n const int UPB = 4; \r\n const int DOWNB = 5; \r\n const int LEFTB = 6; \r\n const int RIGHTB = 7; \r\n\r\n int out=0; \/\/f\u00fcrs Testen am Serial Monitor im Programmermodus \r\n\r\n void setup() { \r\n    \r\n   \/\/ Die Pins als Eingang definieren (Intern PullUP setzen - ist bei mir n\u00f6tig da actice Low geschaltet wird \r\n   pinMode(UPA, INPUT_PULLUP); pinMode(DOWNA, INPUT_PULLUP); pinMode(LEFTA, INPUT_PULLUP); pinMode(RIGHTA, INPUT_PULLUP);  \r\n   pinMode(A0, INPUT); \r\n   pinMode(UPB, INPUT_PULLUP); pinMode(DOWNB, INPUT_PULLUP); pinMode(LEFTB, INPUT_PULLUP); pinMode(RIGHTB, INPUT_PULLUP);  \r\n   pinMode(A1, INPUT);    \r\n    \r\n   Serial.begin(9600); \r\n    \r\n } \r\n\r\n  void loop() { \r\n     \r\n    \/\/ Joystickbewegungen abfragen und senden \r\n    \/\/ Da das Interface einen Invert-Schmitt Trigger verpasst bekommen hat, werden die Ausg\u00e4nge auf active LOW abgefragt - wenn nix passiert sind alles Eing\u00e4nge HIGH \r\n     \r\n    if (digitalRead(UPA)==LOW) {out=120; Serial.write(keyW, 8);}   \r\n      \r\n    if (digitalRead(DOWNA)==LOW) {out=121; Serial.write(keyS, 8);}   \r\n      \r\n    if (digitalRead(LEFTA)==LOW) {out=122; Serial.write(keyA, 8);}  \r\n      \r\n    if (digitalRead(RIGHTA)==LOW) {out=123; Serial.write(keyD, 8);}  \r\n     \r\n    if (digitalRead(A0)==LOW) {out=124; Serial.write(keySPACE, 8);}  \r\n      \r\n     \r\n    if (digitalRead(UPB)==LOW) {out=130; Serial.write(keyUP, 8);}  \r\n      \r\n    if (digitalRead(DOWNB)==LOW) {out=131; Serial.write(keyDOWN, 8);}  \r\n       \r\n    if (digitalRead(LEFTB)==LOW) {out=132; Serial.write(keyLEFT, 8);}  \r\n       \r\n    if (digitalRead(RIGHTB)==LOW) {out=133; Serial.write(keyRIGHT, 8);}  \r\n       \r\n    if (digitalRead(A1)==LOW) {out=134; Serial.write(keyENTER, 8);}  \r\n      \r\n  delay(20);   \r\n  \/\/Serial.println(out); \/\/des is nur f\u00fcrs debuggen im serial monitor \r\n  Serial.write(keyNone, 8); \/\/ den Tastendruck beenden \r\n\r\n delay(20); \r\n}\r\n<\/pre>\n<dl>\n<dt><a href=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2015\/07\/IMAG1858.jpg\"><img decoding=\"async\" src=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2015\/07\/IMAG1858-300x170.jpg\" alt=\"IMAG1858\" width=\"300\" height=\"170\"><\/a><\/dt>\n<dd><em>Lochrasterplatine am Arduino<\/em><\/dd>\n<\/dl>\n<p style=\"text-align: justify\">Als n\u00e4chstes habe ich ein Interfaceboard (eine einfache Lochrasterplatine) mit zwei 9-poligen SUB-D-Buchsen f\u00fcr den Anschluss der Joysticks gebastelt. Da der Arduino gen\u00fcgend Ports besitzt, habe ich auf ein Multiplexen oder Matrixverschalten der insgesamt zehn Steuerleitungen verzichtet und jeden Joystickkontakt direkt auf einen Port gelegt. Das funktioniert schon einmal ganz gut. Aber das Prellen der Federkontakte und Microtaster in den Joysticks muss nat\u00fcrlich softwarem\u00e4\u00dfig entfernt werden. Um jetzt nicht in jeder Softwareversion einen debounce-code mitzuf\u00fchren entschloss ich mich das Entprellen in der Hardware zu machen. Einfach ein RC-Glied (10k &#8211; 1uF) an einen Schmitt-Trigger und gut ist\u00b4s. Also schnell ein Board gelayoutet (das geht schneller als am Lochrasterprint zu l\u00f6ten), ge\u00e4tzt und best\u00fcckt&#8230; und heraus kam das Board hier:<\/p>\n<dl id=\"attachment_885\">\n<dt><a href=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2015\/07\/IMAG1870.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2015\/07\/IMAG1870-300x170.jpg\" alt=\"IMAG1870\" width=\"300\" height=\"170\"><\/a><\/dt>\n<dd><em>Board ge\u00e4tzt und gebohrt<\/em><\/dd>\n<\/dl>\n<dl>\n<dt><a href=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2015\/07\/IMAG1871.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.fh-kaernten.at\/ingmarsretro\/files\/2015\/07\/IMAG1871-300x170.jpg\" alt=\"IMAG1871\" width=\"300\" height=\"170\"><\/a><\/dt>\n<dd>fertig best\u00fcckt am Arduino<\/dd>\n<\/dl>\n<p style=\"text-align: justify\">Der Funktionstest verlief positiv. Die Bewegungen des Sticks werden sauber umgesetzt. Ein schneller Test mit <a href=\"http:\/\/vice-emu.sourceforge.net\/\" target=\"_blank\" rel=\"noopener\">WinVice<\/a> lie\u00df sofort das Zockergef\u00fchl von vor 30 Jahren aufkommen \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_869\" class=\"pvc_stats all  \" data-element-id=\"869\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p>Arduino als USB-Joystickinterface Die gro\u00dfe Welt der kleinen Microcontroller und vor allem der sehr g\u00fcnstigen Microcontroller und deren Vielf\u00e4ltigkeit, hat mich beim folgenden &#8218;Projektchen&#8216; wieder motiviert sie zu verwenden. F\u00fcr die eher weniger outdoorlastigen kalten Wintertage habe ich mir ein Projekt vorgenommen, dass das Thema Retrocomputer betrifft. Zum einen habe geplant, die Website um die&hellip; <br \/> <a class=\"read-more\" href=\"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/2015\/07\/31\/arduino-als-usb-joystick\/\">Weiterlesen<\/a><\/p>\n","protected":false},"author":86,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"ngg_post_thumbnail":0,"footnotes":""},"categories":[1187,57],"tags":[293,289,294,291,290,295,298,292,297,296],"class_list":["post-869","post","type-post","status-publish","format-standard","hentry","category-arduino","category-elektronikbastler","tag-arduino-joystick","tag-arduino-uno","tag-arduino-usb-joystick","tag-ardunio-retropie","tag-ardunio-usb-hid","tag-atmel-flip","tag-commdore-emulator","tag-retropie","tag-vice-emulator","tag-winvice"],"a3_pvc":{"activated":true,"total_views":560,"today_views":0},"_links":{"self":[{"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/posts\/869","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/users\/86"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/comments?post=869"}],"version-history":[{"count":0,"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/posts\/869\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/media?parent=869"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/categories?post=869"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.fh-kaernten.at\/ingmarsretro\/wp-json\/wp\/v2\/tags?post=869"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}