// programa ejemplo basico movimiento barrido 0-180 de un servomotor
double frecuencia=50; // señal de 50 Hz
const int periodo_ms=1000/frecuencia; // 20 mseg
const uint8_t channel_0 = 0; // canal HW para controlar el servo
const uint8_t resolucion = 16; // variacion del PWM - 2^16 "pasos"
const uint8_t pin_PWM_0 = 14; // pin a conectar la señal del servo
//para poner 2 elevado a 16: (1<<16) el 1 lo desplaza 16 veces a la izquierda:
// seria 2 elevado a 16. Es un dezplazamiento de bit
float ang_0;
float t_barrido; // segundos
int t_retardo; // en mseg
float incre;
const int LED_pin = 27;
void setup() {
pinMode(LED_pin, OUTPUT);
Serial.begin(115200);
ledcSetup( channel_0, frecuencia, resolucion);
ledcAttachPin( pin_PWM_0, channel_0);
delay(1000);
// valores iniciales
t_barrido=10; // en segundos
incre=5; // valor en grados del incremento para ir de 0 a 180º
//Se pide el tiempo de barrido por el puerto serie:
Serial.println("Indique el tiempo de barrido (en segundos):");
while(!Serial.available());
t_barrido=Serial.parseFloat();
Serial.println(t_barrido);
delay(100); while(Serial.available()) Serial.read(); // quita el retorno de carro para seguir leyendo
//Se pide el incremento por el puerto serie:
Serial.println("Indique el incremento en grados:");
while(!Serial.available());
incre=Serial.parseFloat();
Serial.println(incre);
t_retardo = t_barrido*1000/(180/incre); // los mseg a esperar para cada salto de angulo
}
void posicion_servo(float angulo){
// ecuacion recta tiempos 0.5 a 2.4 para 0 - 180 grados
float ton = 0.5 + 1.9*angulo/180.0;
uint32_t duty_0=((ton/periodo_ms)*((1<<resolucion)-1)); // valor de 0 a 2^16-1
ledcWrite(channel_0, duty_0);
Serial.printf("ang: %3.0f - t_on: %2.2f\n", ang_0, ton);
}
void loop() {
static int val_led = LOW;
val_led = val_led?LOW:HIGH;
digitalWrite(LED_pin, val_led);
//Bucle for, desde el ángulo 0, hasta el ángulo 180:
for(ang_0=0;ang_0<=180;ang_0+=incre){
posicion_servo(ang_0);
delay(t_retardo);
}
// y sentido contrario
for(ang_0=180;ang_0>=0;ang_0-=incre){
posicion_servo(ang_0);
delay(t_retardo);
}
}