Der geheimnisvolle Taster: Servo-Ansteuerung für Saugroboter Garage

Liebe Arduino-Enthusiasten,

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?

Bauteile:
*** NodeMCU ESP8266 (AZDelivery)**
*** Servo MG955 (AZDelivery)**
*** Taster mit Hebel**

#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

1 Like

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

  //digitalWrite(LED_pin, ! digitalRead(button_pin) );

das erzeugt den jeweil gegnsätzlichen Schaltzustand

  //digitalWrite(LED_pin, ! digitalRead(button_pin) );

vgs

Hallo ron85

Schau mal hier rein:

Die Kabel am Taster müssen nicht gegenüberliegend angebracht werden, sondern nebeneinander.

Vielen Danke, das werde ich die Tage mal versuchen und schauen ob es so funktioniert. Gebe gern Feedback

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

so

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.

vgs

Vielen dank, würde da ein 4760 Ohm Widerstand gehen oder sollte es er ein 1000ohm Widerstand sein. Habe gerade nur die 4760 Ohm Widerstand da.
Grüße

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

Kann mir mal wer erklären, was ihr mit dem Widerstand da vor habt?

1 Like

Wollen den Internen Widerstand vom Pull Up (20 - 50K) verkleinern , wo zu, ist gute Frage :wink:
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.

A propos wokwi:
Wolltest du sowas machen?

1 Like

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. :roll_eyes:

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.

2 Likes

Und ich hatte die Hoffnung, das mal irgendwer meinen Schnipsel probiert....

:slight_smile: Hab dasselbe mal eben schnell selbst hingeschrieben. Wenn du dein #16 meinst, mein #14 zeigt auch nur, dass das Ganze nicht der Rede wert ist.

Wenn im echten Leben da unerklärliche Sachen auftreten, liegt das Problem außerhalb des am Schreibtisch testbaren.

1 Like

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.

LG Frenik