sobald ich anstelle des USB-Kabels eine 9V-Batterie nutze, bleibt der Zustand der Eingangspins bis zu drei Sekunden länger auf HIGH, als dort eine Spannung anliegt. Aufgrund eines engen Bauraumes habe ich die PINS jetzt vor jeder Abfrage über digitalWrite auf LOW gesetzt, in der Hoffnung, dass der interne Pull-Down den PIN-Eingang dann entsprechend spannungsfrei an den digitalRead übergibt. Leider funktioniert dies nicht wie geplant.
Gibt es andere Möglichkeiten, den PIN zu "resetten", ohne einen externen Pulldown, bzw. liegt mein Problem vielleicht sogar ganz woanders?
Interne Pulldown gibt es nicht! Das sind PullUp und die Ziehen auf HIGH.
Das ist kein Problem, da musst Du nur die Logik anpassen.
Für genauere Betrachtungen brauchen wir Deine Beschaltung und Deinen Sketch.
Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
#define LeftSens 2
#define RightSens 3
int ValRight;
int ValLeft;
void setup() {
pinMode(LeftSens, INPUT);
pinMode(RightSens, INPUT);
}
void loop() {
/*digitalWrite(LeftSens, LOW); //Nutzung des internen Pull-Downs, um eine sichere Zustandserkennung des Sensors zu gewährleisten (Fake-Arduino verwendet)
digitalWrite(RightSens, LOW);*/
ValLeft = digitalRead(LeftSens);
ValRight = digitalRead(RightSens);
if ((ValLeft==0 and ValRight==0) || (ValLeft==1 and ValRight==1)){
//Unterprogramm1
} else if (ValLeft==1 and ValRight==0){
//Unterprogramm2
}else{
//Unterprogramm3
}
//Überprüfung
Serial.print("Links: ");
Serial.print(ValLeft);
Serial.print(" Rechts: ");
Serial.println(ValRight);
}
So sieht der Code aus, wenn man ihn auf das Problem entkernt, also echt nichts spektakuläres. Ist mehr oder weniger auch Spielzeug. Allerdings hatte ich dieses Problem so noch nie, trotz häufiger externer Stromversorgung.
Der Sensor gibt einfach nur HIGH oder LOW zurück, also alles ganz einfach... eigentlich
Edit: Die Spannung liegt übrigens wirklich so lange an. Ich hatte zuerst den Code selbst im Verdacht und habe die Spannung direkt an den Pins abgegriffen.
ich weiß nicht ob es zielführend istz, aber ich hatte ein ähnliches problem, ein digital pin auf low zu bekommen.
workaround war analogWrite(pin, 10)
schlagt mich, aber das hatte geholfen.
Wenn Du weder PullUp noch PullDown widerstände an Deinen Eingängen hast, fangen diese in der Art einer Antenne alles (un)mögliche ein und Du hast einen eher zufälligen Pegel. In manchen Fällen kann der auch immer/meistens HIGH sein.
Bei Betrieb an einer Batterie ist der Effekt noch stärker, da GND vom Rechner meist geerdet ist und damit mit etwas Glück weniger Störungen auftreten.
Merke: Du musst einen INPUT immer auf ein definiertes Ruhepotential legen. Welches das ist, ist elektrisch gesehen egal. Es bestimmt nur die Auswertung des Eingangs.
Heißt: PullUP - 'ziehe hoch' - zieht den unbeschalteten Pin (also der Taster ist offen) nach 'oben'.
Dadurch hast Du definitiv ein HIGH, der Eingang hört kein Radio und die Innereien des Pin schwingen auch nicht sinnlos hin und her.
Der Taster muß Dann natürlich nach GND geschaltet sein.
Wenn jetzt der Taster gedrückt ist, 'sieht' der Arduino LOW.
Wenn der Taster losgelassen wird, zieht der PullUP den Pegel wieder auf HIGH und genau Das sieht der Arduino dann auch.
In Deinem Sketch ändert sich 'nur die Logik'.
Anstatt 'If (pin==HIGH)' --> 'if (pin==LOW)'
... nennt man auch LOW-Aktiv (macht was, wenn LOW anliegt).
Habe in irgend einer LIB oder einen Sketch eine Möglichkeit gesehen, die Frage-'Richtung' im Head einstellen zu können - dort wurden einfach statt HIGH/LOW/TRUE/FALSE neue Zustände definiert #define gedrueckt=LOW
und Abgefragt wurde dann 'if (pin==gedrueckt)' bzw 'if (pin!=gedrueckt)'
Etwas schöner wird's vll., wenn man
const boolean gedrueckt=TRUE;
const boolean geloest=!gedruekct;
const boolean an=LOW;
const boolean aus=!an;
So kann man im Sketch mit 'gedrueckt' ausdrücken, was Da wohl Außen passiert, und ist Innen so frei, daß man 'sowohl so rum, wie auch anders herum' anschließen kann.
Mag ja auch Konstellationen geben, wo ein externes Signal eben nun Mal schon vorgibt, in welche Richtung die Logik geht - zumindest hier.
Tommy56:
Merke: Du musst einen INPUT immer auf ein definiertes Ruhepotential legen. Welches das ist, ist elektrisch gesehen egal. Es bestimmt nur die Auswertung des Eingangs.
Ich möchte Deine Aussage etwas relativieren und gleichzeitig prezisieren.
Wenn das Signal am Eingang ein HIGH und ein LOW liefern kann, dann braucht es keinen Pullup/Pulldown Widerstand.
Ist das Signal nur ein HIGH und hochohmig bzw ein LOW und hochohmig wie zB ein Taster, Schalter, oder Open Kollektor bzw Open Drain Transitorausgang dann braucht es als "Gegenpol" einen Widerstand der den zweiten Zustand ( LOW bzw HIGH ) erzeugt. Ein Eingang der an einem hochohmigen Signal hängt liest einen zufälligen unter anderem von Störungen bestimmten Zustand.