ESP32Servo: write.servo hat Problem mit analogWrite

Hallo,

Ich habe ein Fahrendes Projekt, es ist ca 400kg schwer und ich versuche es gerade zum laufen zu bringen. Für die Lenkung habe ich am Anfang einfaches rechts/links Lenken programmiert, jetzt wollte ich es auf einen Servo umprogrammieren.

void Motors (String rechtsVorne,String linksVorne,String hinten,String lenken,String fahren, String stopp){

    lenkenServo = map(lenken.toInt(),        0,50,0,60);
    servo1.write(lenkenServo);
    Serial.println(lenkenServo);

   if (fahren.toInt() > 28){                
    analogWrite(PWMFahren, map(fahren.toInt(),      28, 50,50,255));        
    digitalWrite(RFahren, LOW);           
    digitalWrite(VFahren, HIGH);          
  } else if(fahren.toInt() < 22){        
    analogWrite(PWMFahren, map(fahren.toInt(),      22, 0,50,255));  
    digitalWrite(RFahren, HIGH);           
    digitalWrite(VFahren, LOW);            
  } else {                                      
    analogWrite(PWMFahren, 0);             
    digitalWrite(RFahren, LOW);            
    digitalWrite(VFahren, LOW);            
  }

der Servo wird angesteuert, solange ich die analogWrite Funktion für den Antrieb nicht benutze, sobald ich diese Funktion wieder nutzen will kann ich zwar die Geschwindigkeit regulieren aber der Servo wird nicht mehr angesteuert. Laut Fehlermeldung und bisherigen Recherchen hängt es damit zusammen das beide Funktionen sich den gleichen internen Timer teilen. Ich habe auch versucht sie im Timer zu trennen, ein delay zwischen den beiden zu machen und sie in verschiedene Voids oder Funktionen zu geben mit dem gleichen Ergebnis.
Ich denke Timer trennen (Der ESP32-WROOM-DA hat ja mehrere) ist die sinnvollste Lösung, allerdings weiß ich nicht wie.

Falls mir jemand mit meinem 2. Problem auch helfen will (bei dem ich ehrlich gesagt noch nicht viel Energie reingesteckt habe): Der Tisch soll sich selbst in die Waage bringen, hierfür nutze ich ein MPU6050 Gyro und 3 starke Linearmotoren. Die vorderen beiden Liegen auf der Y Achse des Gyro, der Hintere eine mittig auf der X Achse. Hier war die Idee erst die Y Achse grob aufzurichten, dann das gleiche mit der X Achse machen und danach mit PWM eine langsame Feinjustierung in der gleichen Reihenfolge zu machen.

Für den ESP32 weiß ich nicht, aber für den Arduino UNO blockiert die Servo-Bibliothek 2 PWM Ausgänge, weil sie den gleichen Timer verwendet.

Da ich den ESP nicht kenne weiß ich nicht ob es dort auch so ist.
Lies die Beschreibung der Servo- Bibliothek für den ESP32 durch.

Grüße Uwe

Moin @trabillard,

anstelle von "analogWrite()" verwendet man auf dem ESP32 die Funktion "ledcWrite()" und es benötigt ein wenig "Vorgeplänkel" im setup(). Siehe z.B. hier:

https://www.upesy.com/blogs/tutorials/how-to-use-pwm-on-esp32-with-examples

Die Servo-Library muss ebenfalls den ESP32 unterstützen; hier bieten sich m.E. die mobaTools an:

https://github.com/MicroBahner/MobaTools

Diese Lib ist nicht nur umfassend, sie wird auch hervorragend betreut. Zudem ist ihr Entwickler hier im Forum aktiv und unterstützt bestens bei Problemen! Auf der verlinkten github-Seite findest Du entsprechend auch eine Anleitung in Deutsch.

Hoffe, es hilft Dir weiter ...
ec2021

1 Like

Danke ec2021,

Mit ledc funktioniert es!
Ich habe diese Funktion schonmal verwendet aber nie verstanden, dank der Beschreibung weiß ich jetzt wie das geht und warum gewisse Zeilen so geschrieben sind wie sie sein sollen

Das freut mich!

Falls das für Dich damit erledigt ist, kannst Du meinen Post gerne als "Lösung" markieren (zum einen für die übrigen Forum-Mitglieder, zum anderen für meine "Lösungsbilanz" :wink: )

Gruß
ec2021