Arduino digitalRead falsch lesen

10

Ich habe mein Arduino UNO mit 4 Eingangsleitungen eingerichtet. Sie werden an den Port 10, 11, 12, 13 angeschlossen. Sie werden mit nichts als dem Kabel an mein Steckbrett angeschlossen.

Mein Code wäre einfach:

Serial.println(digitalRead(13));
Serial.println(digitalRead(12));
Serial.println(digitalRead(11));
Serial.println(digitalRead(10));

Die Sache ist, nachdem ich kurz einen Pin an 5V oder 3V3 angeschlossen habe, würde der Messwert verrückt werden wie: 1 0 0 1 0 1 1 1 0 1 0 1 1 0 0 Ohne Sinn! Ohne dass ein Kabel direkt an mein VCC (5V oder 3V3) angeschlossen ist, ändert sich der Messwert ständig, wenn er Null sein sollte!

Ist mein Arduino tot? Wie kann ich das beheben?

Guilherme Garcia da Rosa
quelle
Verbinden Sie einfach Ihren Auslösestift mit Masse, wenn er nicht ausgelöst wird!

Antworten:

18

Was Sie haben, heißt FloatingPin. Digitale Eingangsstifte reagieren sehr empfindlich auf Änderungen und nehmen, sofern sie nicht positiv in den einen oder anderen Zustand (hoch oder niedrig) getrieben werden, Streukapazität von nahe gelegenen Quellen wie Steckbrettern, menschlichen Fingern oder sogar der Luft auf. Jedes daran angeschlossene Kabel wirkt wie eine kleine Antenne und bewirkt, dass sich der Eingangszustand ändert. Und ich meine jeden Draht, die Spur auf der Platine, den Draht zum Steckbrett, den Steckbrettstift, sogar den Metallstift des IC selbst.

Dies wird auf der Arduino-Referenzseite erwähnt:

Wenn der Pin mit nichts verbunden ist, kann digitalRead () entweder HIGH oder LOW zurückgeben (und dies kann sich zufällig ändern).

Wenn Sie sich das Arduino Digital Pin Tutorial ansehen :

Dies bedeutet jedoch auch, dass Eingangsstifte, an die nichts angeschlossen ist, oder Drähte, die nicht mit anderen Schaltkreisen verbunden sind, scheinbar zufällige Änderungen des Stiftzustands melden, elektrisches Rauschen aus der Umgebung aufnehmen oder den Zustand kapazitiv koppeln eines nahe gelegenen Stiftes.

Oft ist es nützlich, einen Eingangspin in einen bekannten Zustand zu lenken, wenn kein Eingang vorhanden ist. Dies kann durch Hinzufügen eines Pullup-Widerstands (bis + 5V) oder eines Pulldown-Widerstands (Widerstand gegen Masse) am Eingang erfolgen, wobei 10K ein gemeinsamer Wert ist. Im Atmega-Chip sind außerdem praktische 20K-Pullup-Widerstände integriert, auf die über Software zugegriffen werden kann. Auf diese eingebauten Pullup-Widerstände wird auf folgende Weise zugegriffen.

pinMode(pin, INPUT);           // set pin to input
digitalWrite(pin, HIGH);       // turn on pullup resistors

Diese schwachen Zugwiderstände zwingen den Eingangsstiftzustand in einen bekannten Zustand und können leicht durch stärkere Eingangsspannungen wie eine direkte Verbindung mit Masse oder +5 V überschrieben werden.

Passant
quelle
2
Wie wäre es zu erwähnen pinMode(pin, INPUT_PULLUP)? Es ist leicht zu merken und sehr schwer zu vermasseln.
Piojo
6

Das ist normal. Sofern ein Eingang nicht mit etwas verbunden ist, wird HIGH oder LOW angezeigt oder ändert sich ständig. Dies wird durch die beschrieben digitalRead- Referenzseite auf der Arduino-Website beschrieben.

Der Eingangspin verhält sich mit einer kleinen Kapazität. Wenn Sie ihn also kurz an 3V3 oder 5V anschließen, wird die Kapazität aufgeladen. Sie können einen ähnlichen Effekt mit bloßem Finger feststellen.

Sie können das Problem vermeiden, indem Sie einen großen Widerstand zwischen Pin und GND hinzufügen.

Fragen Sie sich, warum Sie Null erwarten?

James Cameron
quelle
1
pinMode (pin, INPUT_PULLUP);
Jippie