#include <Servo.h>Servo servo ;int pos = 0 ;int dutyCycle = 0 ;const int servoPin = 8 ;const int ledPin = 11 ;const int fadeDelay = 10 ;const int servoDelay = 15 ; // Snelheid van servo in beide richtingenconst int servoLowerDegree = 100 ;const int servoUpperDegree = 140 ;int servoLowerUs ;int servoUpperUs ;enum states{ fadeIn, moveServoIn, fadeOut, moveServoOut} ;uint8_t state = fadeIn ;void setup(){ servo.attach(servoPin); // attaches the servo on pin 8 to the servo object pinMode( ledPin, OUTPUT ) ; servoLowerUs = map( servoLowerDegree, 0, 180, 1000, 2000 ) ; // Dit schaalt de gewenste graden om naar de corresponderende tijd in uS servoUpperUs = map( servoUpperDegree, 0, 180, 1000, 2000 ) ;}void loop(){ int i ; switch( state ) { case fadeOut: for( i = 255 ; i > 0 ; i -- ) { analogWrite(ledPin, i); delay(fadeDelay) ; } state = moveServoIn ; break ; case moveServoIn: for( i = servoLowerUs ; i < servoUpperUs ; i ++ ) { servo.writeMicroseconds(i) ; delay(servoDelay) ; // delayMicroseconds(servoDelay) ; } state = fadeIn ; break ; case fadeIn: for( i = 0 ; i < 255 ; i ++ ) // 1 stapje per keer is beter, kleinere stapgrootte { analogWrite(ledPin, i); delay(fadeDelay) ; // delayMicroseconds() ; // dit kan ook, dit is een delay in uS zoals de naam al zegt.. } state = moveServoOut ; break ; case moveServoOut: for( i = servoUpperUs ; i > servoLowerUs ; i -- ) { servo.writeMicroseconds(i) ; delay(servoDelay) ; // delayMicroseconds(servoDelay) ; } state = fadeOut ; break ; }}
#4Servo.write pakt alleen gehele getallen en geen floats. Behalve servo.write bestaat er ook servo.writeMicroseconds(). Deze geeft je een veel grotere resolutie, maar je moet niet het aantal graden invullen maar het aantal us dat de puls moet duren.Bas
vond zelf de stappen met de servo ook al wat grof.
Ik heb ze zelf wel voor seinarmen gebruikt en ik was daar wel tevreden over.https://youtu.be/gLNPEMmPiQg
Nadeel is dat ze geen vast nulpunt hebben
#include <Servo.h>Servo servo ;int pos = 0 ;int dutyCycle = 0 ;long prevTime ;const int continuButton = 7 ;const int servoPin = 8 ;const int ledPin = 11 ;const int fadeDelay = 10 ;const int servoDelay = 15 ; // Snelheid van servo in beide richtingenconst int servoLowerDegree = 100 ;const int servoUpperDegree = 140 ;int servoLowerUs ;int servoUpperUs ;const int pauseTime = 500 ;enum states{ pause, fadeIn, moveServoIn, fadeOut, moveServoOut} ;uint8_t state = pause ;void setup(){ servo.attach(servoPin); // attaches the servo on pin 8 to the servo object pinMode( ledPin, OUTPUT ) ; pinMode( continuButton, INPUT_PULLUP ) ; servoLowerUs = map( servoLowerDegree, 0, 180, 1000, 2000 ) ; // Dit schaalt de gewenste graden om naar de corresponderende tijd in uS servoUpperUs = map( servoUpperDegree, 0, 180, 1000, 2000 ) ;}void loop(){ int i ; switch( state ) { case pause: if( millis() - prevTime >= pauseTime // if the time expires || digitalRead( continuButton ) == LOW ) // OR the button is pressed. Continu { state = fadeOut ; } break ; case fadeOut: for( i = 255 ; i > 0 ; i -- ) { analogWrite(ledPin, i); delay(fadeDelay) ; } state = moveServoIn ; break ; case moveServoIn: for( i = servoLowerUs ; i < servoUpperUs ; i ++ ) { servo.writeMicroseconds(i) ; delay(servoDelay) ; // delayMicroseconds(servoDelay) ; } state = fadeIn ; break ; case fadeIn: for( i = 0 ; i < 255 ; i ++ ) // 1 stapje per keer is beter, kleinere stapgrootte { analogWrite(ledPin, i); delay(fadeDelay) ; // delayMicroseconds() ; // dit kan ook, dit is een delay in uS zoals de naam al zegt.. } state = moveServoOut ; break ; case moveServoOut: for( i = servoUpperUs ; i > servoLowerUs ; i -- ) { servo.writeMicroseconds(i) ; delay(servoDelay) ; // delayMicroseconds(servoDelay) ; } state = pause ; prevTime = millis() ; // store current time for pause delay break ; }}[code]Bovenstaande code compileert maar is ongetest.Mvg,Bas