Hallo MobaTools-Kenner,
Hallo @MicroBahner,
ich habe eben zum ersten mal die MoToServo-Befehle ausprobiert.
Inklusive
myServo.setMinimumPulse(1000);
myServo.setMaximumPulse(2000);
myServo.setSpeed(xxx);
aber irgendwie verstehe ich nicht wie man aus den Angaben der Doku die Winkelgeschwindigkeit bzw. die Zeitdauer wie lange das Drehen um X Grad dauert, berechnet.
Ich habe dann einmal ganz praktische Zeitmeßversuche gemacht und mit LibreOffice den funktionalen Zusammenhang dargestellt und eine Näherungsfunktion von LibreOffice berechnen lassen. Ist für kleine Geschwindigkeiten extrem nicht linear.
Da wäre ich mit den Angaben aus der Doku MobaTools 2.4.3 nie draufgekommen.
Die Angaben aus der Doku hören sich nach linearem Zusammenhang an.
Zitat
*Bewegungsgeschwindigkeit des Servos vorgeben. 'Speed' ist der Wert um den sich die *
*Impulslänge ( als Mittelwert ) alle 20ms verändert, wenn sich das Servo bewegt. *
*Auf AVR und STM32 wird Speed in 0,5µs Einheiten angegeben ( Kompatibilität zu älteren *
Versionen) . Auf den ESP Prozessoren sind es 0,125µs Einheiten.
@MicroBahner kommst zu den gleichen Messergebnissen?
Hier ist der Code den ich zum Zeitmessen benutzt habe
// MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START *
// Take it for granted at the moment scroll down to void setup
// start of macros dbg and dbgi
#define dbg(myFixedText, variableName) \
Serial.print( F(#myFixedText " " #variableName"=") ); \
Serial.println(variableName);
// usage: dbg("1:my fixed text",myVariable);
// myVariable can be any variable or expression that is defined in scope
#define dbgi(myFixedText, variableName,timeInterval) \
do { \
static unsigned long intervalStartTime; \
if ( millis() - intervalStartTime >= timeInterval ){ \
intervalStartTime = millis(); \
Serial.print( F(#myFixedText " " #variableName"=") ); \
Serial.println(variableName); \
} \
} while (false);
// usage: dbgi("2:my fixed text",myVariable,1000);
// myVariable can be any variable or expression that is defined in scope
// third parameter is the time in milliseconds that must pass by until the next time a
// Serial.print is executed
// end of macros dbg and dbgi
// MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END *
#include <MobaTools.h>
const byte servoPin = 14; // GPIO 17 is labeled TX2
const byte homeAngle = 0;
const byte DistandAngle = 180;
byte actualTargetAngle;
const byte Speed = 100;
MoToServo myServo;
unsigned long StartMillis;
unsigned long StopMillis;
boolean StartTaken = false;
void setup() {
Serial.begin(115200);
Serial.println( F("Setup-Start") );
setupServo();
}
void setupServo() {
myServo.attach(servoPin);
myServo.setMinimumPulse(1000);
myServo.setMaximumPulse(2000);
myServo.setSpeed(Speed);
actualTargetAngle = homeAngle;
myServo.write(actualTargetAngle);
}
void RunServo() {
if (myServo.read() == actualTargetAngle) {
if (actualTargetAngle == homeAngle) {
if (!StartTaken) {
StartMillis = millis();
StartTaken = true;
}
actualTargetAngle = DistandAngle;
}
else {
actualTargetAngle = homeAngle;
StopMillis = millis();
Serial.print("Dauer ");
Serial.println(StopMillis- StartMillis);
StartTaken = false;
}
}
myServo.write(actualTargetAngle);
dbgi("s:", myServo.read(), 1000);
dbgi("a:", actualTargetAngle, 1000);
}
void loop() {
RunServo();
}
vgs
