DIGITAL PINS spielen verrückt

Hallo,

ich habe seit ca. 2 Wochen einen Arduino Leonardo mit dem ich schon viele Projekte erfolgreich abgeschlossen habe. Bei meinem aktuellen Projekt versuche ich mit 4 an die Pins 2,4,7 und 8 angeschlossenen Pushbuttons Eingaben der Tastatur zu simulieren. Dies hat genau mit der aktuellen Schaltung und dem Sketch auch schon super funktioniert. Auf einmal jedoch geben die genannten Pins jedoch fast dauerhaft ein HIGH aus. Selbst nachdem ich die gesamte Schaltung abgebaut habe und nichts mehr an den Pins angeschlossen habe ist dies der Fall.

Ich würde mich sehr freuen wenn mir jemand schnell helfen könnte oder mir nur einen Tipp geben könnte damit ich selber weiter recherchieren kann.

Danke im Vorraus!

rhein7:
Ich würde mich sehr freuen wenn mir jemand schnell helfen könnte oder mir nur einen Tipp geben könnte damit ich selber weiter recherchieren kann.

Wie sollen wir helfen, wenn wir weder Schaltung noch Sketch von dir kennen.
Im Wahrsagen bin ich einfach schlecht.

Pins nicht richtig definiert, im Setup als Eingang.
Keine Pullup bzw. Pulldownwiderstände vorhanden.

Weiß ich was da noch alles falsch ist?

Somit Sketch hier posten.

Code-Tags verwenden.

Schaltbild posten.

Mein Code:

#include <Keyboard.h>
// Pins der Buttons
const int button1Pin = 2;
const int button2Pin = 4;
const int button3Pin = 7;
const int button4Pin = 8;


void setup() {
  // Festlegen der Pins als INPUT
  pinMode(button1Pin, INPUT);
  pinMode(button2Pin, INPUT);
  pinMode(button3Pin, INPUT);
  pinMode(button4Pin, INPUT);
  Keyboard.begin(); 
}

void loop() {

  if (digitalRead(button1Pin) == HIGH) { //Wenn Button 1 gedrückt wird
    Keyboard.write('a');
    delay(100);
    Keyboard.write(KEY_RETURN);
    delay(1000);
  }

  if (digitalRead(button2Pin) == HIGH) { //Wenn Button 2 gedrückt wird
    Keyboard.write('b');
    delay(100);
    Keyboard.write(KEY_RETURN);
    delay(1000);
  }
  
  if (digitalRead(button3Pin) == HIGH) { //Wenn Button 3 gedrückt wird
    Keyboard.write('k');
    delay(100);
    Keyboard.write(KEY_RETURN);
    delay(1000);
  }
  
  if (digitalRead(button4Pin) == HIGH) { //Wenn Button 4 gedrückt wird
    Keyboard.write(KEY_RETURN);
    delay(1000);
  }

}

Mach mal serielle debug Ausgaben rein, dass du auch sicher weisst, dass es die Eingänge sind und nicht der Rest.

Habe ich bereits gemacht! Liegt an den Pins!

Und deine Schaltung? Hast du Pulldown-Widerstände verbaut? Danach fragte ja HotSystems bereits...

Mach mal anstatt

"pinMode(button1Pin, INPUT);"

besser

"pinMode(button1Pin, INPUT_PULLUP);"

dadurch wird zumindest der interne Pullup eingeschalten und der Pin ist nicht mehr so ganz empfindlich.
Offene Pins, ohne irgendeine Beschaltung, sind sehr empfänglich für Störungen.

Laut dem leicht zu übersehenden Bild im Anhang von #2 sind Pulldowns vorhanden

sth77:
Und deine Schaltung? Hast du Pulldown-Widerstände verbaut? Danach fragte ja HotSystems bereits...

Laut gesendeten Bild schon.
Grüße Uwe

Wie Guntherb schrieb, ist auch meine Empfehlung, das ganze umdrehen.

Interne Pullups verwenden und auf LOW abfragen.

Na, dann isses doch ganz einfach.

If(Sketch == ok) & (Schaltung == ok)
{
Leonardo == RIP;
}

:sunglasses:

Ich würde spaßeshalber mal die Pins als Ausgang definieren und mit LED mal high/low testen. Kostet kaum Zeit und bringt etwas mehr Erkenntnis.

Anderseits würde ich auch durchaus auf Fehler im Aufbau tippen. Aber Schaltung == ok haben wir ja gelernt.

Okay, das Schaltbild hatte ich komplett übersehen, mein Fehler. Ob es aber tatsächlich so aufgebaut wurde? Alle Anzeichen deuten auf einen unbeschalteten Eingang hin. Kann mir nicht vorstellen, dass mit einem nicht funktionierenden Pin oder gar Port dieses Fehlerbild auftritt, wenn extern ein Widerstand den Pin auf Masse zieht.

Klaus_ww:
Na, dann isses doch ganz einfach.

If(Sketch == ok) & (Schaltung == ok)
{
Leonardo == RIP;
}

Im Prinzip schon, aber so schnell stirbt ein Arduino nicht.

Man beachte die Anzahl der Posts des TE, deshalb weiter insistieren

Deshalb habe ich ja auch noch einen Vorschlag gemacht.

sth77:
Okay, das Schaltbild hatte ich komplett übersehen, mein Fehler. Ob es aber tatsächlich so aufgebaut wurde? Alle Anzeichen deuten auf einen unbeschalteten Eingang hin. Kann mir nicht vorstellen, dass mit einem nicht funktionierenden Pin oder gar Port dieses Fehlerbild auftritt, wenn extern ein Widerstand den Pin auf Masse zieht.

Bestimmte Annahmen müssen wir treffen, da man ansonsten alles in Zweifel ziehen muß. ICh nehme mal an daß die aufgebaute Schaltung dem Bild entspricht.
Ich gebe Dir recht daß man bei der Fehlerbeschreibung auf fehlende Pullup/Pulldown-Widerstände denkt.
Grüße Uwe

Ich würde trotzdem mal die interen Pullup anschalten. Es gibt viele Einflüsse, wie z.B. schlechte Kontakte im Steckbrett, gebrochene Leitungen etc. Wenn der interen Pullup an ist, dann hat man zumindest keinen floatenden Eingang.

Hallo,
vielen Dank erstmal für die vielen Antworten!
Ich habe jetzt alle Pins als INPUT_PULLUP definiert und dann abgefragt ob die Pins LOW sind, sodass dieser Code entsteht:

#include <Keyboard.h>
// Pins der Buttons
const int button1Pin = 2;
const int button2Pin = 4;
const int button3Pin = 7;
const int button4Pin = 8;


void setup() {
  // Festlegen der Pins als INPUT
  pinMode(button1Pin, INPUT_PULLUP);
  pinMode(button2Pin, INPUT_PULLUP);
  pinMode(button3Pin, INPUT_PULLUP);
  pinMode(button4Pin, INPUT_PULLUP);
  Keyboard.begin(); 
}

void loop() {

  if (digitalRead(button1Pin) == LOW) { //Wenn Button 1 gedrückt wird
    Keyboard.write('a');
    delay(100);
    Keyboard.write(KEY_RETURN);
    delay(1000);
  }

  if (digitalRead(button2Pin) == LOW) { //Wenn Button 2 gedrückt wird
    Keyboard.write('b');
    delay(100);
    Keyboard.write(KEY_RETURN);
    delay(1000);
  }
  
  if (digitalRead(button3Pin) == LOW) { //Wenn Button 3 gedrückt wird
    Keyboard.write('k');
    delay(100);
    Keyboard.write(KEY_RETURN);
    delay(1000);
  }
  
  if (digitalRead(button4Pin) == LOW) { //Wenn Button 4 gedrückt wird
    Keyboard.write(KEY_RETURN);
    delay(1000);
  }

}

Dies funktioniert auch ohne Probleme!

Jedoch frage ich mich warum die andere Lösung mit der Abfrage nach HIGH immer funktioniert hat und jetzt aufeinmal nicht mehr.

Auf jeden Fall kann ich jetzt erstmal weiter “basteln”.

Vielen Dank!

Jedoch frage ich mich warum die andere Lösung mit der Abfrage nach HIGH immer funktioniert hat und jetzt aufeinmal nicht mehr.

Die genaue Ursache kann ich dir nicht liefern...

Aber die tiefere Schicht des Problems. (evtl)

  1. Wenn du gewusst hättest, wo das Problem ist, hättest du hier nicht fragen müssen.
  2. Du hast uns alles gezeigt, wo du das Problem vermutest.
  3. Wäre es da, dann hättest du, oder wir, es gefunden.
  4. Das Problem steckt da wo du es nicht vermutest.
  5. Darum hast du uns auch nicht die fehlerhafte Stelle gezeigt.
  6. Darum weißt du (so wie wir) auch immer noch nicht, wo es geklemmt hat.

Tipp:
Der (gefundene) Fehler steckt immer da, wo man zuletzt gesucht hat.
Und die schönsten Fehler stecken in den Bereichen, wo man sich zu 100% sicher ist, dass sie da nicht stecken können.

:smiling_imp: :smiling_imp: :smiling_imp: :smiling_imp:

rhein7:
Dies funktioniert auch ohne Probleme!

Jedoch frage ich mich warum die andere Lösung mit der Abfrage nach HIGH immer funktioniert hat und jetzt aufeinmal nicht mehr.

Es gibt immer eine zweite Lösung und die jetzt gewählte, ist die "BESSERE".

rhein7:
Jedoch frage ich mich warum die andere Lösung mit der Abfrage nach HIGH immer funktioniert hat und jetzt aufeinmal nicht mehr.

Kontaktprobleme der Pulldown werden immer gerne genommen.

Hast du das mal mit dem Multimeter durchgemessen?