Arduino Mega 2560 als Tastatur verwenden

Hallo an alle,
ich möchte meinen Arduino Mega 2560 als Tastatur/Mouse verwenden.
Dafür muß ich den Atmega8U2 laut folgender Beschreibung mit "Atmel Flip" umprogrammieren:
https://www.instructables.com/id/How-to-Make-a-Arduino-HID-Keyboard/
Sobald ich "Settings -> Communications -> USB -> Open" durchführe, bekomme ich nur die lapidare Rückmeldung: "Could not open USB device"
Wie beschrieben, habe ich den Resetpin auf GND kurzgeschlossen.
Dadurch verschwindet wie erwartet der Arduino aus dem Gerätemanager (wie es sein soll).

Laut dieser Beschreibung

müßte der Arduino als USB-Gerät aufscheinen.
Allerdings finde ich nach entfernen der Brücke ihn nun nur als das übliche Com-5-Gerät.

Wo habe ich was übersehen?

Danke im Voraus!

Lösung gefunden!

Beim Atmega 2560 Board braucht es 2 Jumper-Brücken!

Wieso willst Du einen MEGA nehmen? Ein Leonardo / MICRO macht das ohne Update.
Nachdem Du die Firmware des ATmega8U2/16U2 ausgetauscht hast, funktioniert der Upload via USB nicht mehr.
Grüße Uwe

ich möchte meinen Arduino Mega 2560 als Tastatur/Mouse verwenden.

ok

Dafür muß ich den Atmega8U2 laut folgender Beschreibung mit "Atmel Flip" umprogrammieren:

Nicht unbedingt.

Dein 8U2 oder 16U2 kann unverändert bleiben, wenn du dem ATMega2560 V-USB beibringst.(ungetestet)
Alle Betriebsysteme sind dafür ausgerüstet, V-USB-HID Geräte zu erkennen und zu nutzen.

Danke für Eure Antworten!
Das mit der Firmware hat jetzt wunderbar funktioniert.
Den Sketch muß ich nun halt mit dem ISP-Programmer raufladen, was gut funktioniert.

Den Arduino Mega 2560 hab ich genommen, weil er:
a) schon lange ungenutzt herumliegt
b) weil ich viele Eingang-Pins benötige

Das Projekt ist nämlich, einen alten Spielhallencomputer, in dem jetzt ein PC werkelt, anzusteuern.
Dafür braucht es 2x 4-Pins für die Joystick , 2x 6-Pins für die Taster, 2x Münzeinwurf, 2x Spielertaste und noch 1x Spezialtaste!
Insgesamt also 25 Eingang-Pins!!!

Erstmal verwende ich nachfolgenden Sketch zum Testen

uint8_t buf[8] = { 0 }; //Keyboard report buffer
#define PIN_W 4 // Pin for w
#define PIN_A 5 // Pin for a
#define PIN_S 6 // Pin for s
#define PIN_D 7 // Pin for d

void setup() {
Serial.begin(9600); // Setup Serial communication
//Set pinmode of Input pins
pinMode(PIN_W, INPUT);
pinMode(PIN_A, INPUT);
pinMode(PIN_S, INPUT);
pinMode(PIN_D, INPUT);
}

void loop() {

//When button representing W is pressed
if (digitalRead(PIN_W) == HIGH) {
buf[2] = 26; // W keycode
Serial.write(buf, 8); // Send keypress
releaseKey();
}

//When button representing A is pressed
if (digitalRead(PIN_A) == HIGH) { buf[2] = 4; // A keycode
Serial.write(buf, 8); // Send keypress
releaseKey();
}

//When button representing S is pressed
if (digitalRead(PIN_S) == HIGH) { buf[2] = 22; // S keycode
Serial.write(buf, 8); // Send keypress
releaseKey();
}

//When button representing D is pressed
if (digitalRead(PIN_D) == HIGH) { buf[2] = 7; // D keycode
Serial.write(buf, 8); // Send keypress
releaseKey();
}
}

// Function for Key Release
void releaseKey() {
buf[0] = 0;
buf[2] = 0;
Serial.write(buf, 8); // Send Release key
}

Es wird der zu sendende Wert immer nur auf buf[2] übermittelt.
Also immer nur ein Buchstabe nach dem anderen.

Wie kann ich aber mehrere Tasten gleichzeitig senden.
Der Code ist ja im Moment alles andere als elegant.
Dabei geht es mir erstmal nicht um die Erfassung der Inputs, sondern wie ich z.B. 6 gleichzeitig gedrückte Tasten in einem Wusch an den PC sende.
6 gleichzeitig gedrückte Tasten sind bei einem 2-Player Arcade Automaten eh schon untere Grenze.
Gewünscht wären schon eher 10 Tasten gleichzeitig. Klingt viel, aber z.B. bei Street Fighter kann das leicht gebraucht werden.

Ich hab nämlich noch nicht herausgefunden, für was die verschiedenen Bytes des "buf[]" verwendet werden.....

Prinzipiell hab ich auch noch nicht heraus gefunden, ob man da nicht auch an die Grenzen des HID-Protokolls kommt?

V-USB-HID klingt auch interessant.
Da werd ich mich wohl noch damit befassen.
Da die Basics beim aktuellen Projekt aber soweit schon mal funktionieren, bin ich da hoffentlich vom Ziel nicht weit entfernt.....
8)
Letzte Alternative wäre, auf PS2 umzusteigen, da soll das anscheinend funktionieren.

Inzwischen Danke

Hi

Du sendest bei jeder gedrückten Taste, daß Diese auch wieder losgelassen wurde.
Allerdings ist das Loslassen anscheinend für alle Tasten identisch.
buf[0] wird beim Lösen auch auf 0 gesetzt - allerdings nirgens auf einen anderen Wert.

Der PC, Der die Kommunikation entgegen nimmt - muß doch ein Programm dafür laufen haben.
Das Mal Google zum Fraß vorwerfen und schauen, was bei raus kommt.

Momentan sendest Du immer 8 Byte, wovon das 3.te Byte die gedrückte Taste ist (oder 0 wenn wieder gelöst).

MfG

Der PC, Der die Kommunikation entgegen nimmt - muß doch ein Programm dafür laufen haben.

Glaub ich nicht. Er emuliert ja eine Tastatur.

Grüße Uwe

Hi

Die Serial.print() kommen dann wie 'am anderen Ende' an?
Bzw. - Das müsste sich doch aus dem Quellcode des 8U2/16U2 ableiten lassen, Was dort Wie verwurschtelt wird ... gibt die Quelle der Firmware Aufschluss über den Quellcode?

MfG

Hi,
als Firmware verwende ich die:
arduino-keyboard.hex

Damit wird der Arduino am Computer als Tastatur gesehen und das Serial.write ergiebt ein gedrückte Tastatur-Taste.

Daß ich mit dem momentanen Sketch nur immer einen Anschlag sende und dann auf Null setzte ist mir klar.
Ich hab schon einiges mit dem buf[] probiert, was aber meistens zu wilden Ausgaben führte.

Mein größtes Problem ist im Moment, daß ich nichts gefunden habe, wo die Keywords aufgelistet sind, sodaß ich gezielt weiterarbeiten kann.
Vorerst ists mehr ein Fischen im Trüben :frowning:

LG
Reinhard

Anderes Thema!
Wieder zurück flashen!

Habe nun das HEX-File von folgender Adresse genommen und damit den Atmega8U2 beschrieben:
...\arduino-1.8.10-windows\arduino-1.8.10\hardware\arduino\avr\firmwares\atmegaxxu2\arduino-usbserial\Arduino-usbserial-mega.hex

Nun scheint er wieder brav als Com5-Port auf.
Die Boardinformationen zeigen:

BN: Arduino/Genuino Mega or Mega 2560
VID: 0x2341
PID: 0x0010
SN: 64932343638351C080C1

Beim Testen mit Blink kommt nun allerdings die Fehlermeldung:

Arduino: 1.8.10 (Windows 10), Board: "Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

Der Sketch verwendet 1448 Bytes (0%) des Programmspeicherplatzes. Das Maximum sind 253952 Bytes.
Globale Variablen verwenden 9 Bytes (0%) des dynamischen Speichers, 8183 Bytes für lokale Variablen verbleiben. Das Maximum sind 8192 Bytes.
E:\Arduino\arduino-1.8.10-windows\arduino-1.8.10\hardware\tools\avr/bin/avrdude -CE:\Arduino\arduino-1.8.10-windows\arduino-1.8.10\hardware\tools\avr/etc/avrdude.conf -v -patmega2560 -cwiring -PCOM5 -b115200 -D -Uflash:w:C:\Users\TUTTOF~1\AppData\Local\Temp\arduino_build_194732/Blink.ino.hex:i 

avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "E:\Arduino\arduino-1.8.10-windows\arduino-1.8.10\hardware\tools\avr/etc/avrdude.conf"

         Using Port                    : COM5
         Using Programmer              : wiring
         Overriding Baud Rate          : 115200
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer

avrdude done.  Thank you.

Beim Hochladen des Sketches ist ein Fehler aufgetreten

Die RX/TX-Led bleiben dunkel.
Höchstens ein einmaliges Aufblinken hie und da.

Beim Flashen gab es keine Fehlermeldungen und ich kann auch wieder die Keyboard-Hex zurückflashen, die auch soweit funktioniert.
Deshalb kann wohl ein Hardwaredefekt ausgeschlossen werden.

Im Gerätemanager habe ich auch den Arduino deaktiviert und dann wieder neu eingerichtet.

Ist das HEX-File vieleicht das falsche?
Oder kann es auch ein Treiberproblem sein?
Oder muß ich in der Boards.txt was einstellen????

Danke im Voraus
cu Reinhard

Problem gelöst!
Mußte den Bootloader neu mit dem ISP raufladen
:smiley:

Fein, dann sind dir ja jetzt die Zusammenhänge deutlich klarer geworden.

Hallo!
Hab jetzt was neues gefunden!
HoodLoader2

https://github.com/NicoHood/HoodLoader2/wiki/Overview

Das klingt nun nach genau dem, was ich gesucht habe..... :sunglasses:
Was mich im Moment noch verunsichert, daß nach dem flashen mit HoodLoader2 nachher der Atmega8U2 nicht mehr mit "Atmel Flip" und der originalen Firmware beschrieben werden kann.

Das Aufspielen des HootLoader2 erfolgt mit einem Arduino-Sketch über einen zweiten Arduino.
Es stehen folgende Firmware-Versionen zu Auswahl:

// Newest HoodLoader2.0.5 hex files
#define HEXFILE_HoodLoader2_0_5_Leonardo_atmega32u4_hex 1
#define HEXFILE_HoodLoader2_0_5_Micro_atmega32u4_hex 2
#define HEXFILE_HoodLoader2_0_5_Uno_atmega16u2_hex 3
#define HEXFILE_HoodLoader2_0_5_Mega_atmega16u2_hex 4
#define HEXFILE_HoodLoader2_0_5_Uno_atmega32u2_hex 5
#define HEXFILE_HoodLoader2_0_5_Mega_atmega32u2_hex 6
#define HEXFILE_HoodLoader2_0_5_Uno_at90usb82_hex 7
#define HEXFILE_HoodLoader2_0_5_Mega_at90usb82_hex 8
#define HEXFILE_HoodLoader2_0_5_Uno_at90usb162_hex 9
#define HEXFILE_HoodLoader2_0_5_Mega_at90usb162_hex 10
#define HEXFILE_HoodLoader2_0_5_Uno_atmega8u2_hex 11
#define HEXFILE_HoodLoader2_0_5_Mega_atmega8u2_hex 12

// Legacy versions
#define HEXFILE_HoodLoader2_0_4_Uno_16u2_hex 101
#define HEXFILE_HoodLoader2_0_4_Mega_16u2_hex 102
#define HEXFILE_HoodLoader2_0_4_Uno_32u2_hex 103
#define HEXFILE_HoodLoader2_0_4_Mega_32u2_hex 104

// Original DFU Bootloader with/without USB-Serial Firmware
#define HEXFILE_Arduino_COMBINED_dfu_usbserial_atmega16u2_Uno_Rev3_hex_Full 201
#define HEXFILE_Arduino_COMBINED_dfu_usbserial_atmega16u2_Mega2560_Rev3_hex_Full 202
#define HEXFILE_Arduino_COMBINED_dfu_usbserial_atmega16u2_Uno_Rev3_hex 203

// Recomplied Lufa DFU bootloaders (compatible with Arduino Leds)
#define HEXFILE_BootloaderDFU_atmega32u4_leo_hex 301
#define HEXFILE_BootloaderDFU_atmega16u2_hex 302
#define HEXFILE_BootloaderDFU_atmega32u2_hex 303
#define HEXFILE_BootloaderDFU_at90usb82_hex 304
#define HEXFILE_BootloaderDFU_at90usb162_hex 305
#define HEXFILE_BootloaderDFU_atmega8u2_hex 306

Für mich käme die Datei "HEXFILE_HoodLoader2_0_5_Mega_atmega8u2_hex" in Frage.

Was mir nun aber noch Bauchweh macht, welche Datei -um den Arduino wieder in Originalzustand zurückzusetzten- die richtige ist?
Ich denk mal entweder der "HEXFILE_BootloaderDFU_atmega8u2_hex" oder der "HEXFILE_BootloaderDFU_at90usb82".
Letzterer wahrscheinlich, da ich beim "Atmel Flip" auch immer den at90usb82 auswählen mußte...

Oder wär da ein direktes Flashen mit einem ISP-Programmer besser?
Nehm ich da dann die "Arduino-usbserial-mega.hex"?
Welches Programm würdet Ihr zum Flashen verwenden?

Danke im Voraus
Reinhard

Welches Programm würdet Ihr zum Flashen verwenden?

Würde verwenden?

Verwende!
Die Arduino IDE.

Habe mir zu dem Behufe eine eigene Boarddefinition gebaut, um die 16U2 und 8U2 der verschiedenen Arduinos brennen zu können.

Board Definition in Sketchbook/hardware kopieren.
IDE neu starten
Beliebigen ISP Programmer aufstecken (und in der IDE wählen)
Board auswählen und "Bootloader brennen" drücken.

Alle Konfigurationen habe ich noch nicht getestet.

ArduinoFirmwareRestore.zip (81.2 KB)

#define HEXFILE_HoodLoader2_0_5_Mega_atmega8u2_hex 12
und wahrscheinlich für den alten Mega
#define HEXFILE_BootloaderDFU_atmega8u2_hex 306

Der AT90xxxx ist ein anderer Controller.

Grüße Uwe

spaceball:
Hab jetzt was neues gefunden!

Prima, gratuliere!

Leg' Dir am besten noch ein paar Arduinos zu. Wenn Du genügend davon hast, kannst Du für jede neue Entdeckung einen anderen programmieren, ohne dafür etwas aufgeben zu müssen. Damit Du nicht erst suchen musst: Brainfuck gibt's hier.

Gruß

Gregor

Der AT90xxxx ist ein anderer Controller.

Naja, es gab da mal eine Signaturverwirrung.

Zusätzlich: Lesestoff

Danke an Euch beide!

Werd erstmal (falls etwas mit dem HoodLoader2 schief geht) Variante-Uwe und dem HoodLoader2-Installations-Sketch verwenden.
Plan B ist dann die Version von "combie" ... Nochmal Danke für den super Service!

thx
Reinhard