Arduino UNO copy/paste

Hallo,
ich möchte ein Programm schreiben um einen Arduino UNO als Copy/Paste Tastatur zu benutzen.
Ich habe einen Quellcode gefunden der das realisieren soll. Sobald Pin 5 mit GND verbunden wird soll beispielsweise markierter Text kopiert werden. Nur leider funktioniert das nicht. Ich habe den Quellcode mit der Arduino Win Software upgeloadet.
Es blinkt zwar das TX Lämpchen wenn man Pin5 mit GND verbindet aber es kommt nichts am PC an. Wenn ich den Arduino vom PC trenne, wieder verbinde und dann nochmal Pin5 mit GND verbinde leuchtet nichteinmal mehr das TX Lämpchen.
Ich bin allerdings kompletter Arduino Anfänger. Vermutlich habe ich irgendwas falsch gemacht.
Ich freue mich auf eure Tipps!

/* Arduino USB Keyboard HID demo
 * Cut/Copy/Paste Keys
 */
 
#define KEY_LEFT_CTRL	0x01
#define KEY_LEFT_SHIFT	0x02
#define KEY_RIGHT_CTRL	0x10
#define KEY_RIGHT_SHIFT	0x20
 
uint8_t buf[8] = { 
  0 }; 	/* Keyboard report buffer */
 
#define PIN_COPY 5
#define PIN_CUT 6
#define PIN_PASTE 7
 
int state = 1;
 
void setup() 
{
  Serial.begin(9600);
 
  pinMode(PIN_COPY, INPUT);
  pinMode(PIN_CUT, INPUT);
  pinMode(PIN_PASTE, INPUT);
  // Enable internal pull-ups
  digitalWrite(PIN_COPY, 1); 
  digitalWrite(PIN_CUT, 1);
  digitalWrite(PIN_PASTE, 1); 
 
  delay(200);
}
 
void loop() 
{
  state = digitalRead(PIN_CUT);
  if (state != 1) {
    buf[0] = KEY_LEFT_CTRL; 	// Ctrl
    buf[2] = 27;    // Letter X
    // buf[2] = 123;	  // Cut key: Less portable
    Serial.write(buf, 8);	// Ssend keypress
    releaseKey();
  } 
 
  state = digitalRead(PIN_COPY);
  if (state != 1) {
    buf[0] = KEY_LEFT_CTRL; 	// Ctrl
    buf[2] = 6;    // Letter C
    // buf[2] = 124;	  // Copy key: Less portable
    Serial.write(buf, 8);	// Send keypress
    releaseKey();
  } 
 
  state = digitalRead(PIN_PASTE);
  if (state != 1) {
    buf[0] = KEY_LEFT_CTRL; 	// Ctrl
    buf[2] = 25;    // Letter V
    // buf[2] = 125;	  // Paste key: Less portable
    Serial.write(buf, 8);	// Send keypress
    releaseKey();
  } 
}
 
void releaseKey() 
{
  buf[0] = 0;
  buf[2] = 0;
  Serial.write(buf, 8);	// Release key  
  delay(500);
}

Könnte es vielleicht an der Beschaltung liegen (ich habe ein SMD Board)? Ich habe bis jetzt nichts weiter angeschlossen an der Grundplatine.

Beethoven1989:
ich möchte ein Programm schreiben um einen Arduino UNO als Copy/Paste Tastatur zu benutzen.

Erkläre bitte mal, nach welchem Tutorial Du vorgegangen bist!

Und beschreibe ausführlich, welche Modifizierungen Du an Deinem Arduino UNO vorab vorgenommen hast, bevor Du den Sketch aufgespielt hast!

Den code habe ich von dieser Seite:

Ich habe den neuen Arduino aus der Verpackung genommen, die Windowssoftware für Arduino installiert (Arduino 1.0.5), anschließend den Quellcode eingefügt und auf Upload geklickt. Der Upload wurde auch erfolgreich durchgeführt. Es kam zumindest keine Fehlermeldung. Lediglich Upload abgeschlossen und "Binäre Sketchgröße: 2.722 Bytes (von einem Maximum von 32.256 Bytes)"

Dazu musst du den zweiten Atmega auf dem Board für die USB Schnittstelle flashen. Hat mich schon gewundert wie das sonst ohne Leonardo funktionieren sollte.Hast du das gemacht?

Beethoven1989:
Ich habe den neuen Arduino aus der Verpackung genommen, die Windowssoftware für Arduino installiert (Arduino 1.0.5), anschließend den Quellcode eingefügt und auf Upload geklickt. Der Upload wurde auch erfolgreich durchgeführt. Es kam zumindest keine Fehlermeldung. Lediglich Upload abgeschlossen und "Binäre Sketchgröße: 2.722 Bytes (von einem Maximum von 32.256 Bytes)"

Kannst Du kein Englisch?

Auf der von Dir verlinkten Seite steht doch ausdrücklich die Modifikation, die Du durchführen mußt, wenn das mit dem Sketch klappen soll:

Arduino Device Firmware Update (DFU)
The Atmega8U2 chip on the Arduino UNO can be programmed directly using the special USB protocol called Device Firmware Update (DFU). This is completely independant of the ‘normal’ method of flashing sketches to the board using the Arduino IDE.

Hast Du wohl nicht gemacht, oder?

Hast Du überhaupt einen ISP-Programmer?

Laut der Anleitung geht das sogar ohne Programmer:

Die Boards haben zwar inzwischen einen 16U2, aber das scheint keinen Unterschied zu machen

Serenifly:
Laut der Anleitung geht das sogar ohne Programmer:
http://arduino.cc/en/Hacking/DFUProgramming8U2

Ohne ISP-Programmer ist es allerdings nicht besonders komfortabel, wenn Du dann vor dem Aufspielen eines neuen Sketches per Bootloader erst die USB-Serial-Firmware auf den 8U2 laden mußt, dann den neuen Sketch auf das Board lädst, dann wieder die USB-HID Firmware auf den 8U2 lädst und dann erst den Sketch testen kannst. Mit zwischendurch mehrfachem Abstöpseln und Anstöpseln des Boards und Aktivierung des DFU-Mode am 8U2.

Und für jede Änderung am Sketch alle diese Schritte wiederholen mußt.

Also dann doch lieber einen ISP-Programmer zum Hochladen der Sketche.

Mhh stimmt. Soweit hatte ich dann nicht gedacht :slight_smile:

Serenifly:
Dazu musst du den zweiten Atmega auf dem Board für die USB Schnittstelle flashen. Hat mich schon gewundert wie das sonst ohne Leonardo funktionieren sollte.Hast du das gemacht?

Leonardo ist das richtige Stichwort. Der Leonardo ist für die Simulation von Tastatur- und anderer Eingaben gemacht. Ich empfehle dir einen Leonardo(-clone) zu besorgen und damit zu arbeiten. Allerdings müsstest du die Übertragungsbefehle von der deiner Beispielseite gegen die vom Leonardo austauschen oder gleich passenden Code von anderen Seiten nehmen bzw. selber programmieren.

Hey,
vielen Dank für die vielen Antworten. Ich bin davon ausgegangen, dass mein neuer Arduino auch eine aktuelle Firmware besitzt (zumindest aktueller als in der Anleitung). Vermutlich gibt es da wieder unterschiedliche Firmwareversionen aber wie gesagt ich beschäftige mich erst seit gestern mit Arduinos.
Der Leonardo klingt nach einer komfortablen alternative. Da könnte ich direkt mit dem entsprechenden Quellcode loslegen ohne mich mit der Firmware rumzuschlagen?

Ich bin gerade dabei besagte Firmware zu flashen (laut Anleitung geht das ohne ISP Programmer). Natürlich klappt das nicht auf anhieb.
Ich fürchte es liegt am DFU mode. Ich schaffe es nicht in diesen Modus zu kommen.

Mein vorgehen:

  1. Arduino mit PC Verbinden und Device Manager öffnen.

    Arduino UNO wird erkannt.

  2. Den DFU MODE aktivieren :

    Rotes Kabel anschließen (verbunden lassen). Danach Grünes Kabel eine Sekunde an den Kondensator halten. L LED Blinkt auf. Am Ende rotes Kabel entfernen.
    Ich habe die Anleitung aus dem Internet. Allerdings gibt es für mein Boardlayout keine Anleitungen weshalb ich nicht weiß ob ich den richtigen Kondensator erwischt habe. Inzwischen habe ich jedoch alle Bauteile ausprobiert.

  3. Device Manager aufrufen:

    Gerät wird nicht mehr erkannt. Laut Anleitung müsste da jetzt sowas stehen wie: Arduino uno DFU

  4. FLIP öffnen AT90USB82 und USB Kommunikation auswählen.

    USB Device wird nicht gefunden.

Was habe ich falsch gemacht?

Die normalen Arduinos haben kein USB Host Interface. Die haben lediglich einen FTDI Chip oder einen zweiten Atmega, der als USB/Seriell Wandler arbeitet. Das ist der Prozessor zwischen dem Quarz, der USB Buchse und dem 6-Pin Header. Also braucht man eine spezielle Firmware für diesen Chip damit man machen kann was du willst.

Und danach wird wie gesagt der normale Upload nicht mehr funktionieren. Also ist ein Programmiergerät angebracht. Alternativ ein zweiter Arduino.

Der Leonardo hat einen anderen Prozessor drauf, der einen eingebauten USB Controller hat. Daher muss man da keine solchen Tricks machen.

Bei anderen hat es doch schon funktioniert. Es sei mal dahingestellt wie aufwendig das ist. Mein Code ist ja schon auf dem Hauptchip. Wenn ich nun die Firmware vom USB-Chip aktualisiere sollte es doch klappen?
Mir geht es jetzt erstmal um die Frage wie ich in den dfu Modus gelangen kann.

Beethoven1989:
Ich bin davon ausgegangen, dass mein neuer Arduino auch eine aktuelle Firmware besitzt

Ja, selbstverständlich kommt Dein Arduino-Board mit einer aktuellen Firmware.

Beethoven1989:
Was habe ich falsch gemacht?

Was Du falsch machst, ist folgendes:

Ein UNO ist schlichtweg NICHT DAFÜR VORGESEHEN, dass Du ihn als HID-Device (Keyboard oder Maus) am PC betreibst.

Was Du Dir da herausgesucht hast, ist ein Frickelbastler-Bastelprojekt, wie man mit dem UNO etwas machen kann, für das er eigentlich nicht vorgesehen ist. Das ist etwas für Profi-Bastler mit Ahnung von dem, was sie machen. Das ist kompliziert. Das erfordert viele Schritte, die zu 100% korrekt in exakt vorgegebener Reihenfolge durchgeführt werden müssen. Mit Eingriffen in die Firmware des Boards. Das ist nichts für blutige Anfänger!

Was Du brauchst, ist:

  • ein Arduino LEONARDO
  • ein ISP-Programmer

Ein LEONARDO-Board hat nämlich die von Dir gewünschte HID-Device Fähigkeit bereits eingebaut. Es gibt fertige Libraries und auch Tutorials, die Du verwenden kannst. Auch für Anfänger geeignet. Also solltest Du einen Arduino LEONARDO für Deine Tastatur- und Mausexperimente nehmen.

Und dringend alles beachten, was hier zu den Besonderheiten des Boards steht:
http://arduino.cc/de/Guide/ArduinoLeonardoMicro

Das wird Dir als Anfänger natürlich mit einer Wahrscheinlichkeit von 99,99% nicht gelingen, sondern Du wirst Dein LEONARDO-Board bei Experimenten, das Board als Tastatur und Maus zu verwenden, in kürzester Zeit bricken, also außer Funktion setzen, so daß sich das Board tot stellt und Du keinen neuen Sketch mehr hochladen können wirst. Und in dem Fall benötigst Du einen (am besten schon vorsorglich beschafften) sogenannten "ISP-Programmer" zusätzlich, um Software über den 6-pin ISP-Anschluss hochladen zu können. Das funktioniert nämlich auch dann noch, wenn Du durch fehlerhafte Software den LEONARDO außer Betrieb gesetzt hast und ein Upload über USB mit Bootloader dann nicht mehr möglich ist.

Wenn Du mit Frickelbastelei anfängst, einem UNO die Firmware unter dem Hintern wegzuflashen, um ihm eine andere Firmware unterzuschieben, dann bist Du bei Frickelbastelei. Das vollständige Tutorial dafür hast Du doch. Also richte Dich danach!

Nachtrag:
Es ist mir zum Beispiel auch völlig schleierhaft, wieso Du in Atmels Flip Software zum Beispiel als Device einen 90usb82 Controller auswählst und nicht den Atmega16U2, der auf dem Board drauf sein sollte, wenn ich mich nicht täusche. Ist es Dir einsichtig, weshalb (offensichtlich auch in dem Tutorial) von 90usb82 statt von 16U2 die rede ist? Also ich verstehe den Punkt nicht.

Ich habe mich an dieses Tutorial gehalten:
http://forum.arduino.cc/index.php/topic,111.0.html
Es ist mir nicht ersichtlich, es wird lediglich gesagt, dass man nicht den ATmega8u2 und damit vermutlich auch nicht den ATmega16u2 verwenden soll.

Das wurde auch von der offiziellen Seite verlinkt:
http://arduino.cc/de/Main/ArduinoBoardUno

Ich werde mir jetzt vermutlich den Leonardo zulegen. Ich hatte schon befürchtet Arduino Projekte müssen so kompliziert sein...
Mich würde es trotzdem noch interessieren wie man in diesen DFU Modus kommt.

Für SMD Boards gibt es ja leider keine Anleitungen. Ansonsten muss das so funktionieren:

Ich habe das nie gemacht.

Laut dem hier:

Ist die untere Stiftleiste schon GND. Was man auch merkt wenn man es durchmisst. Also reicht ein einfacher Jumper. Von der Verbindung auf den Widerstand steht da nichts. Das hängt vielleicht mit dem Teil zusammen wo man einen 10k Widerstand hinten anlöten soll. Was aber laut der Anleitung bei der SMD Variante nicht nötig ist.

Und wegen dem hier:

Mein Code ist ja schon auf dem Hauptchip. Wenn ich nun die Firmware vom USB-Chip aktualisiere sollte es doch klappen?

Das geht aber davon aus, dass der Code korrekt ist und genau macht was du willst. Wahrscheinlich willst du dann doch mal irgendwas anpassen.

Ja das habe ich auch schon probiert. Nur leider kommt dann bei FLIP die Meldung "Could not open USB device".

So ich habs hinbekommen. Am Ende war es nur ein Treiberproblem. Ich habe einfach einen Treiber für den Arduino im DFU Modus installiert und jetzt Funktioniert alles. In dem Copy/Paste Tutorial gab es auch eine .hex Datei um die Firmware für die USB Schnittstelle wieder zurück zu setzen. Es lässt sich also immer noch komfortabel ein Skatch uploaden.

Durchaus für Anfänger geeignet das Prinzip 8)

Der Treiber wird beispielsweise unter folgendem Link mitgeliefert:

Für Windows: dfu-programmer-win-0.6.2.zip

Im Gerätemanager dann Rechtsklick auf unbekanntes Gerät (Arduino im DFU Modus)>>Eigenschaften>>Hardware>>Eigenschaften>>Treiber>>Treiber aktualisieren>>Auf Computer nach Treibersoftware suchen
Dann nur noch den Pfad zum Ordner angeben in dem der Treiber liegt.