ESP8266 Servo mit Taster auf / zu fahren Saugroboter

Hallo, mein Vorhaben ist eine Garage für den Saugroboter unter dem Küchenschrank.

Bin natürlich NEU in der Arduino Sache, obwohl das mit so einer kleinen Wetterstation zu lösen war.

Diese Garage soll mittels Servo geöffnet / geschlossen werden.

Der Servo soll durch einen Druckschalter (Taster) ausgelöst werden, wenn der Saugroboter in die Ladestation gefahren ist löst dieser dann den Taster aus.

Also so zu sagen das bei z.B. bei geschlossen Taster der Servo auf sagen wir mal auf 20° (Tor zu) stellt und bei geöffneten Taster dann auf 90° (Tor auf) stellt

Nun habe ich mich 2 Tage hier durch das Forum gelesen und probiert, konnte mein Ziel näherkommen, fand dabei auch noch, dass ich das langsamer zufahren kann.

Leider Funktioniert das noch nicht so richtig wie ich mir das vorstelle.

Mein Problem ist, wenn ich den Wemos D1 mini mit Strom versorge dann stellt er IMMER auf 90° (Tor auf) ich muss also erst den Taster betätigen damit es funktioniert, egal in welchen Schaltzustand sich der Taster befindet.

Ich möchte bei geschlossen Taster 20° und bei geöffneten 90° und würde gern noch den die Verbindung trennen da der Servo in beiden Stellungen brummt.

Was gibt es noch für Lösungsansätze für mich?

Nutze den Servo AZDelivery MG995, ESP8266 WEMOS D1 mini Wlan und einen Taster mit Hebel

Der Servo ist mit GND / 5V / D1 verbunden der Taster mit D2 / GND

Grüße :grinning:

#include <Servo.h>

Servo myservo;  // create servo object to control a servo 
int pos ;    // variable to store the current servo position


const byte button = 4;  // The button will be on Pin 4
const byte POS_A = 14;   // Ziel wenn Taster offen
const byte POS_B = 90; // Ziel wenn Taster zu

void setup()
{
  myservo.attach(5);  // attaches the servo on pin 5 to the servo
  pinMode(button, INPUT_PULLUP);  // button connects to GND ( LOW when pressed )
}

void loop()
{
 
   if (digitalRead(button) == HIGH) {
        if ( pos > POS_A)  {
          // in steps of  1°
          myservo.write(--pos);      // tell servo to go stepwise down to POS_A
          delay(20);
      }
  }

  if (digitalRead(button) == LOW) {
       if ( pos < POS_B)  {
          // in steps of  1°
          myservo.write(++pos);      // tell servo to go stepwise up to POS_B
          delay(5); // langsame Bewegung : 20 ° / Sekunde
      }
  }
  
}```

Du suchst Servo - Arduino Reference was im Setup ausgeführt wird und Servo - detach() - Arduino Reference um das brummen loszuwerden.

Die Servo.h stellt den Servo auf 90°, wenn die attach-Anweisung ausgeführt wird. Um die Anfangsstellung zu ändern musst Du VOR dem attach ein write auf die gewünschte Stellung ausführen.
Du könntest auch meine MobaTools verwenden. Die Servo-Aufrufe sind weitgehend kompatibel zur Servo.h. Allerdings kann sich die Lib selbst um das langsame Bewegen des Servo kümmern, es gibt keine 'Standard' Startstellung - das erste write() bestimmt wohin es geht, und das Abschalten des Impulses gegen das 'Brummen' kann die Lib auch selbst übernehmen. Also eigentlich alles was Du brauchst, ist in der Lib integriert :wink:

Danke für die MobaTools leider komme ich auch damit nicht weiter, ich steige einfach nicht dahinter, es hat sich leider nichts geändert, das was ich ändere funktioniert nicht oder ArduinoIDE lässt mich das gar nicht erst hochladen

So und nu?
Gibt es Fehlermeldungen?
Geht nicht ist keine Aussage - Es geht immer. Manchmal nur nicht so wie man will.

Hallo ron
probier mal "Y" vielleicht funktioniert es dann auch nicht.

Noch so ein Allgemeinplatz
"poste halt die Fehlermeldungen!"

merkste was? Allgemeinplätze helfen nicht weiter.
Du must mehr Informationen zur Verfügung stellen
das Verhalten des Programms genau beschreiben
Das vollständige Programm hier posten

Ebenso die Fehlermeldungen posten:
Das geht so:
Wenn du in der Arduino-IDE upload anklickst dann werden am unteren Bildschirmrand Meldungen geschrieben.
In das Meldungsfenster klicken
Strg-A drücken um alles zu markieren
Strg-C drücken um das markierte in die Zwischenablage zu kopieren
zum Posting wechseln
Den </>-Button klicken
dann Strg-V drücken

vgs

Und was hast Du da probiert? Welchen Sketch? Nur mit der Aussage 'Es geht nicht' kann dir niemand helfen.

Mojn's Franz-Peter,
sag mal, ich hab mir ne Handvoll Gedanken gemacht, aber brauch mal Nachhilfe.
Beim umschalten von .detach() nach .attach() bleibt der Servo in seiner Position? Oder wird der dann in (irgendeine) Position gefahren?
Das mit seinen zwei Zuständen ist ja nu kein Hexenwerk....
Bis zum Setup:

#include <Servo.h>

Servo myservo;
const byte servoPin = 5;
const byte anschlag = 4;
const byte endPos[] = {14, 90};  // Ziel wenn Taster offen / Taster zu
byte lastPos = 0;
void setup()
{
  pinMode(anschlag, INPUT_PULLUP);
  myservo.attach(servoPin);
  myservo.write(endPos[digitalRead(anschlag)]);
  lastPos = myservo.read();
  myservo.detach();
}

Was jetzt folgt, ist davon abhängig, wie .read() funktioniert.. Muss ich die letzte Position merken, oder kann ich nach eineḿ attach() (ohne Änderung der Position) mit read() die Position jederzeit aus jeder (veränderten) Position auslesen?

Nein, die servo.Lib fährt den mit einem attach immer in die Standardpositio, und das sind 90°. Will man das ändern, sollte man VOR dem attach() einen servo.write(Anfangsposition) ausführen.

Mit read() bekommst Du immer genau das zurück, was Du mit dem letzten write geschrieben hast. Wenn Du mit attach/detach arbeitest, kannst Du dir das im setup sparen. Du musst dann ja eh im loop beim Start der Bewegung ein attach ausführen

1 Like

OK. Dann muss ich mir den Wert merken.
Es wird... :slight_smile:
Im setup dann:

void setup()
{
  pinMode(anschlag, INPUT_PULLUP);
  myservo.write(endPos[digitalRead(anschlag)]);
  myservo.attach(servoPin);

Mit MobaTools ist es glaub ich einfacher ( ich weis ja nicht was er gemacht hat ...) :wink:
Langsame Bewegung und Abschalten ist alles drin;

#include <MobaTools.h>

MoToServo myservo;  // create servo object to control a servo 
int pos ;    // variable to store the current servo position

const byte button = 4;  // The button will be on Pin 4
const byte POS_A = 14;   // Ziel wenn Taster offen
const byte POS_B = 90; // Ziel wenn Taster zu

void setup()
{
  myservo.attach(5, true);  // attaches the servo on pin 5 to the servo ( mit auto OFF )
  myservo.setSpeed(50);
  pinMode(button, INPUT_PULLUP);  // button connects to GND ( LOW when pressed )
}

void loop()
{
   if (digitalRead(button) == HIGH) {
        if ( myservo.read() != POS_A ) myservo.write( POS_A); 
  } else {
        if ( myservo.read() != POS_B ) myservo.write( POS_B); 
  }
}

Spielverderber :wink: Ich will das zu Fuss machen... - Na mal schaun. Wie ich den Servo ab- und wieder eingeschalten bekomme.... :wink:

Nur zu :sunglasses:, da lernt er noch was - wenn er denn will ...

Das geht schon mit detach/attach. Du dürftest dann beim Button aber eine Flankenerkennung brauchen. Ich weis nicht was die Servo-Lib macht, wenn man da ständig 'attach' ausführt ....

1 Like

Ich will nicht. Ich will nur Logik. Ich mach das ja, wie alles andere auch, trocken. Ohne Hardware - Danke und beste Grüße!

Na ja, dass ist ja dann genau das was er ( @ron85 ) lernen kann :sunglasses:

Ich würde das attach/detach komplett in den loop verschieben. Du musst eh VOR jeder Bewegung ein attach machen.
Sonst musst Du gegebenenfalls dann doch nach dem attach im Setup- mit etwas Zeitverzögerung - wieder ein detach machen. Sonst brummts ja doch wieder... Und die Zeitverzögerung brauchst Du, weil das Servo auch im 'Eilgang' nicht so schnell ist wie der Arduino.

Da hab ich schon drüber nachgedacht....

Ach.. Ich bin davon ausgegangen, das da eine Pause eingebaut ist und das detach erst ausgeführt wird, wenn die Position erreicht ist.
Ok - dann ist das ja doch noch kniffliger.. :roll_eyes:

Die Lib weis nichts von einer 'echten' Servoposition. Die gibt nur Inpulse aus, Wenn Du direkt nach dem attach wieder detach machst, ist das dann höchstens 1 Impuls. Da zuckt das Servo zwar, aber das reicht nicht um es zur Zielposition zu bringen - zumindest nicht, wenn da ein relevanter Abstand von der aktuellen Servostellung zur Zielposition ist..

GRR.
Das würde bedeuten ich muss der lib auch noch via blinkwithoutDelay Zeit geben oder läuft da ein yield() was ich (nur zum austesten) mit delay ausnutzen kann?

ne andere Lösung wäre MOS-FET schaltet dem Servo den Strom ab.
Müsste man ausprobieren was das Servo beim Wiedereinschalten der Versorgungsspannung macht.
vgs