Control de velocidad de un servomotor con el IDE Arduíno.

Intuitivamente vemos que la velocidad de giro vendra dada por la rapidez con la que se desplaza entre un punto y otro de una imaginaria semicircunferencia a la que es capaz de barrer. En el ejemplo mas sencillo, si barre de 0 a 180º en 1 segundo , diremos que se mueve a 180 º/seg . y eso se traduce en introducir un delay() entre una posición y otra. Pero tratandose de un servomotor limitado a un movimiento entre 0 -180, raramente nos interesará calcular con exactitud este dato,sobre todo porque si tratamos de aumentarla,nos encontraremos con las limitaciones mecanicas internas del dispositivo. Todo lo que sea disminuir la duración de un barrido de 2 segundos se traducirá en la dificultad de establecer la longitud esperada del barrido, viendo como se acorta su longitud. Esto se puede comprobar con la funcion “for” estableciendo delay(10);.

Para el ejemplo he cogido una placa arduino nano y la libreria <Servo.h>. Cuidado con esto,porque si utilizamos la familia de placas esp8266 los resultados van a variar cuando se utilicen valores de delay() por debajo de 5.

Si bajamos de 10 a 1 veremos como aumenta la velocidad y se acorta la longitud de barrido.He comprobado que el valor minimo del delay() cuando se barre de grado en grado es de 5 mseg si queremos que el barrido sea completo.

El tiempo de barrido viene determinado por el producto (delay()*num grados barridos), asi en el ejemplo con un delay(5), T=2*180*5=1800 mseg=1.8 seg

#include <Servo.h>

  int pos;
Servo servo_11;  // create servo object to control a servo



void setup() {
  servo_11.attach(11);  // attaches the servo on pin 11
pos=0;
}

void loop() {


  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    servo_11.write(pos);              // tell servo to go to position in variable 'pos'
    delay(10);                       // waits 15ms for every swept degree
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
   servo_11.write(pos);              // tell servo to go to position in variable 'pos'
    delay(10);                       // waits 15ms for every swept degree
  }
}

Control manual del movimiento con potenciometro de 10K:

Pasra controlar manualmente el barrido,conectaremos un potenciometro de 10K entre GND y Vcc y su punto medio a la entrada analogica A0. Tendremos que adaptar la lectura de 0 a 1023 entre 0 y 180 con la función o módulo map.

#include <Servo.h>

 Servo servo_11;  // create servo object to control a servo



void setup() {
  servo_11.attach(11);  // attaches the servo on pin 11

}

void loop() {
  int pos=analogRead(A0);
 pos=map(pos,0,1023,0,180);

  
    servo_11.write(pos);              
    delay(10);                       
  
}

Utilizando un miniJoystick

#include <Servo.h>
int pos;

 Servo servo_11;  // create servo object to control a servo



void setup() {
  servo_11.attach(11);  // attaches the servo on pin 11
servo_11.write(180);
}

void loop() {
  
int val=analogRead(A0);

  if(val>=900){
     pos= (pos + 1);
    servo_11.write(pos);
    delay(5);
  }
  
    if (pos > 180) {
      pos = 180;
  }
  if(val<=0){
     pos= (pos - 1);
    servo_11.write(pos);
    delay(5);
  }
  
    if (pos < 0) {
      pos = 0;
    }
  
               
  
}

Las dos posibilidades de mover el joystick en cada eje se traducen en las condicionales de 0 V y 5 V (AO<=0 y A0=>900). Y en cada una de ellas el bucle de repetición al mantener el joystick mantenido en una u otra posicion va a ser que se sume o reste 1 en cada intervalo de tiempo. Si partimos de”pos=0″ ira girando ascendiendo o descendiendo en el barrido de giro a la velocidad definida por el retardo en ms que indiquemos. en el ejemplo, 5 mseg.

Podemos establecer el área donde va a trabajar el servo introduciendo unas condicionales de restricción de giro. Siempre en el bucle de sumar diremos que “si pos es mayor de 180 “se establezca en 180 y en el bucle de resta que “si es menor de 0 “se establezca en 0.

Aquí,el control de velocidad no estará determinado por delay(), aunquel o quitemos no notaremos apenas efecto,.Todo dependerá de valor de la suma y la resta . Si en vez de ir de grado en grado ponemos un incremento modulo 2,o 3… la velocidad se ira disparando hasta tal punto que tengamos que volver a introducir el delay().

EJEMPLO UTILIZANDO UN TEMPORIZADOR CON LA FUNCION MILLIS()

#include <Servo.h>

unsigned long t1 = 0;

unsigned long pausa = 20000;//T+Intervalo deseado=10+10=20 seg=20000 mseg



 
  int pos;
Servo servo_11;  // create servo object to control a servo



void setup() {
  servo_11.attach(11);  // attaches the servo on pin 11
pos=0;
servo_11.write(pos);
}

void loop() {
unsigned long diff = millis() - t1;
 if (diff >= pausa) {
  t1=millis();

  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    servo_11.write(pos);              // tell servo to go to position in variable 'pos'
    delay(28);                       // waits 28ms for every swept degree
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
   servo_11.write(pos);              // tell servo to go to position in variable 'pos'
    delay(28);                       // waits 28ms for every swept degree
  }
}
}

En el siguiente sketch resolvemos el siguiente problema: que un servo barra 180 grados de ida y vuelta cada 10 segundos.

¿Por que se utiliza una pausa de 20 segundos?

¿Por que un delay de 28?

Hay que comprender que la primera pausa sera de 20 segundos y a partir de ahi se movera cada 10 segundos, ya que el tiempo invertido en barrer el sector de ida y vuelta es aprox de 10 segundos, y asi lo que querido poniendo el delay en 28, de forma que

T=2*180*28=10080 mseg

Pausa=T+Intervalo deseado=10+10=20 seg=20000 mseg

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Translate »