da es sich um einen mysteriösen Taster dreht, der den Servo mal ansteuert und mal nicht. Es handelt sich um ein einfaches Projekt das ich gerne verbessern möchte.
Das Ziel war es, den Servo mithilfe des Tasters zu steuern.
Aber hier kommt der Clou: Der Servo soll bei geschlossenen Taster den Servo in die eine Richtung bewegen, also die Garage schließen, wenn der Saugroboter startet und von der Lade Station weg fährt, öffnet der Taster und die Garage soll öffnen.
So weit so gut, dies funktioniert nur nicht immer. Manchmal habe ich das Gefühl es ist Wetterabhängig. Wenn der Taster geschlossen oder geöffnet wir dann passiert manchmal nichts, erst, wenn der ESP neu gestartet wird.
Was kann man im Code ändern oder muss ich vielleicht noch ein Bauteil einbauen?
#include <MobaTools.h>
MoToServo myservo; // Erstellen eines Servo-Objekts zur Steuerung eines Servos
int pos ; // Variable zur Speicherung der aktuellen Servoposition
const byte button = 4; // Die Taste wird auf Pin 4 gelegt
const byte POS_A = 10; // Ziel wenn Taster offen
const byte POS_B = 95; // Ziel wenn Taster zu
void setup()
{
myservo.attach(5, true); // verbindet das Servo an Pin 5 mit dem Servo ( mit auto OFF )
pinMode(button, INPUT_PULLUP); // Taste ist mit GND verbunden ( LOW wenn gedrückt )
}
void loop()
{
if (digitalRead(button) == HIGH) {
if ( myservo.read() != POS_A ) myservo.write( POS_A);
myservo.setSpeed(150); //Servo Geschwindigkeit
} else {
if ( myservo.read() != POS_B ) myservo.write( POS_B);
myservo.setSpeed(250); //Servo Geschwindigkeit
}
}
Kannst du herausfinden, ob das problem am taster oder am Servo liegt?
Wenns am taster liegt, probiere mal zusätzlich einen externen pullup widerstand anzuschließen
LG Frenik
Mechanische Taster prellen. Das bedeutet der Kontakt schließt und öfnet sich beim Betätigen mehrmals bevor der Kontakt eindeutig geöffnet bzw. geschlossen ist. Das passiert innerhalb von 0,02 Sekunden mehrmals.
Dein Code fragt den Taster auf seinen Schaltzustand ab.
Ergänze deinen Code um eine Status-Anzeige des Schaltzustands des Tasters. Am einfachsten ist es die Onboard-LED auf GPIO2 zu benutzen
#include <MobaTools.h>
MoToServo myservo; // Erstellen eines Servo-Objekts zur Steuerung eines Servos
int pos ; // Variable zur Speicherung der aktuellen Servoposition
const byte button_pin = 4; // Die Taste wird auf Pin 4 gelegt
const byte servo_pin = 5; // Die Taste wird auf Pin 4 gelegt
const byte LED_pin = 2; // Die Onboard LED als Statusanzeige für den Taster
const byte POS_A = 10; // Ziel wenn Taster offen
const byte POS_B = 95; // Ziel wenn Taster zu
void setup()
{
myservo.attach(servo_pin, true); // verbindet das Servo an Pin 5 mit dem Servo ( mit auto OFF )
pinMode(button, INPUT_PULLUP); // Taste ist mit GND verbunden ( LOW wenn gedrückt )
pinMode(LED_pin, OUTPUT); // onboard LED als Statusanzeige
}
void loop()
{
// schalte den Ausgang LED_Pin auf den gleichen Zustand wie den Taster
digitalWrite(LED_pin, digitalRead(button_pin) );
//digitalWrite(LED_pin, ! digitalRead(button_pin) );
if (digitalRead(button) == HIGH) {
if ( myservo.read() != POS_A ) myservo.write( POS_A);
myservo.setSpeed(150); //Servo Geschwindigkeit
} else {
if ( myservo.read() != POS_B ) myservo.write( POS_B);
myservo.setSpeed(250); //Servo Geschwindigkeit
}
}
die auskommentierte Zeile benutzt den invertierten Schaltzustand
Am Servo liegt es nicht, sicher am Taster, da es ein Hebel-Taster ist. weis leider nicht die genaue Bezeichnzung. wie müsste ich den Pullup Widerstand anschließen?
Vielen Dank
Pull-up der Name ist Programm ziehe den IO-pin auf Plus-Versorgungsspannung hoch. (Up)
Auf gar keinen Fall mit Vin verbinden. An Vin sind mehr als 3.3V
meistens 5V und die 5V würden den ESP8266 zerstören.
Der widerstand muss nicht 1kOhm groß sein. Der 4k7 (4760 Ohm) geht auch. Der pullup widerstand dient nur dazu um den geöffneten Taster auf ein definiertes Potential zu heben. Und muss nur groß genug sein, dass beim schließen des Tasters kein kurzschluss entsteht.
LG Frenik
Wollen den Internen Widerstand vom Pull Up (20 - 50K) verkleinern , wo zu, ist gute Frage
Oder @freniktest weis nicht das ESP hat auch interne Pull Up.
Wenn das Bild an wokwi erinnern soll, ist der Taster einfach falsch angeschlossen.
Wieso man einem pinMode (button, INPUT_PULLUP); nicht traut, verstehe ich auch nicht.
Vielleicht gibts ja auf dem PIN keinen internen?
Ich hatte mal irgendwo ein post, da stand drin bei welchen Pins das so ist - aber kein Lesezeichen gesetzt.
Ich hab das aus Spass mal umgeschrieben.
Ich habe keine Ahnung, was ich da gemacht habe.
Und mit allem gespart.
Ich will mal hören, was es als Ergebnis gibt.
#include <MobaTools.h>
MoToServo myservo; // Erstellen eines Servo-Objekts zur Steuerung eines Servos
constexpr byte buttonPin {4}; // Die Taste wird auf Pin 4 gelegt
constexpr byte servoPin {5};
constexpr byte servoPosAuf {10}; // Ziel wenn Taster offen
constexpr byte servoPosZu {95}; // Ziel wenn Taster zu
enum {auf, zu};
byte status = auf; // definierter Startzustand
void setup()
{
Serial.begin(115200);
Serial.println(F("Garage Start..."));
myservo.attach(servoPin, true); // verbindet das Servo an Pin 5 mit dem Servo ( mit auto OFF )
pinMode(buttonPin, INPUT_PULLUP); // Taste ist mit GND verbunden ( LOW wenn gedrückt )
}
void loop()
{
switch (status)
{
case zu:
myservo.write(servoPosZu); //
if (myservo.moving() == 0) // servo ist an der Endposition angekommen
{
if (digitalRead(buttonPin)) // Der Schalter ist geöffnet
{
myservo.setSpeed(250); //Servo Geschwindigkeit
status = auf;
}
}
break;
case auf:
myservo.write(servoPosAuf); //
if (myservo.moving() == 0) // servo ist an der Endposition angekommen
{
if (!digitalRead(buttonPin)) // Der Roboter ist eingefahren
{
myservo.setSpeed(150); //Servo Geschwindigkeit
status = zu;
}
}
break;
default:
status = auf;
break;
}
}
Joa das hatte ich ja bereits erwähnt, scheint aber niemanden zu interessieren, da wird jetzt lieber noch ein Widerstand mit eingebunden. Aber mir egal sollen alle mal machen hier.
Mir ist bekannt, dass der ESP einen Internen Pull Up Widerstand hat. Wollte nur sichergehen, dass es nicht daran liegt. Außerdem wird manchmal auch ein niedrigerer Wert zur Störsicherheit benötigt. Siehe auch why use an external pull up resistor leider nur auf Englisch.
Ich würde auch das Entprellen der Schalter wie in post 4 probieren. Probiere mal den Code aus.