4.- SERVOS

4.- LOS SERVOS


ÍNDICE:

0.-TEORÍA: SERVOS
1.- MOVIMIENTO SIMPLE 
2.- EL LIMPIAPARABRISAS
3.- SERVO  CONTROLADO POR EL TECLADO USANDO MBLOCK.
4.- SERVO CONTROLADO POR EL MONITOR SERIE.
5.- SERVO  CONTROLADO POR  UN POTENCIÓMETRO. 
6.- BRAZO ROBOTIZADO SENCILLO


 

0.-TEORÍA: LOS SERVOS

Los servos están formados interiormente  por un  motor, unos  engranajes para reducir la velocidad y aumentar el par de fuerza, un  potenciómetro que determina la posición en todo momento del eje y una pequeña placa con la electrónica de control necesaria para posicionar el eje en función de la señal recibida.



Los servos de modelismo tienen un motor y unos engranajes cuya salida se puede mover en un arco de 180 º y contienen la electrónica necesaria para ello. Todo lo que se necesita es un pulso enviado cada 20ms:
  1. Si se recibe un pulso de <1msg, indica que vaya a la posición  0º. Si establecemos los 90º como posición neutra con esta franja de pulsos se moverá en sentido antihorario.
  2. Si se recibe un pulso de >=2msg. indica que vaya a la posición  de 180º. En este caso se moverá en sentido horario.
  3. Y para el resto de posiciones intermedias, habrá que mandar pulsos intermedios. Por ejemplo, 1,5ms irá a la posición de 90º que podemos establecer como  posición neutra (como si marcase las 12horas de un reloj)









LA VELOCIDAD DE GIRO DEL SERVO:
Cada ciclo de un servo es de 20ms. Esto significa que cada 20ms el servo  lee su señal de entrada y,  dependiendo de lo que dure el valor HIGH LÓGICO (ancho del pulso) calcula la posición a la que debe ir. 
Así, restando los 2ms del pulso, tendrá unos 20-2=18 ms para alcalzar esa posición deseada, y por tanto, puede cambiar de posición 1000/20=50 veces por segundo.






1.- MOVIMIENTO SIMPLE DE UN SERVO


CABLEADO DE CONEXIÓN:
  1. Cable NEGRO o MARRÓN se conectará a un pin GND .
  2. Cable ROJO será conectado al pin 5V.
  3. Cable BLANCO o NARANJA del sevo lo conectaremos al PIN_9_PWM
Cuando necesitamos contectar más de dos servos a nuestro arduino, es conveniente utilizar pilas externas para alimentar a los servos, utilizando la misma masa entre ellos  con nuestro arduino (GND).







EXPLICACIÓN DEL CÓDIGO UTILIZADO:
Para mover de manera sencilla el servo marcando  simplemente los grados a los que queremos que gire, se podrá utilizar una  librería introduciendo primero  la instrucción: #include,  posteriormente creamos el objeto con le nombre que daremos a nuestro servo que  queramos controlar. Éste lo conectaremos en un pin PWM y dentro del loop usaremos  la instrucción de posicionamiento servo.write(posición)dejamos un pequeño delay para permitir que el servo alcance la posición antes de darle la siguiente orden. Usaremos al variable de entrada pos para poder modificar la directamente la posición del servo sobre dicha variable.


CÓDIGO: 

#include <Servo.h> 
Servo miservo;         
int pos = 0; 

void setup(){
 miservo.attach(9); 

void loop() {
pos=0; 
miservo.write(pos); 
delay(2000);             //dejamos tiempo para posicionarse        
pos=180; 
miservo.write(pos);  
delay(2000);            
 }








ACTIVIDADES:

1.- Utiliza el programa M_BLOC para programar el sevo.





2.- Mejora el código anterior incorporando un for que nos permita realizar una  secuencia de movimientos repetidos. De esta forma, se ejecuta durante varias veces veces la secuencia que irá incrementándose en 20º en cada iteracción del bucle.

#include <Servo.h> 
Servo miservo;     
int pos = 0;    
void setup(){ 
  miservo.attach(9);  
}
void loop() { 
for (pos=0; pos<=180; pos+=20)  {
  miservo.write(pos); 
  delay(1000);      
} 
}

ACTIVIDADES:
2.- Modifica el código para que haga distintos giros marcados por tí mismo.
3.- Diseña el código de apertura de una barrera de aparcamiento de coches.








2.- LIMPIAPARABRISAS DE UN COCHE.

En esta práctica realizaremos la simulación de un limpiaparabrisas de un coche, diseñando un código, a través de la función "servoPulse", que nos servirá para mover el servo de 10º a 170 º. Todo ello, sin necesidad de utiliar la librerías de servos que existen.


CÓDIGO:

#include <Servo.h>      
#define pinServo 9    
Servo miservo;          
int pos=0;                   
void setup() {
    miservo.attach(pinServo);        //declaramos la salida del sevo
}
void loop() {
    for (pos=0; pos<=170; pos=pos+1); {
       miservo.write(pos);                     //movemos el servo en un sentido
       delay(800); 
    }
    for (pos=170; pos>=10; pos=pos-1); {
       miservo.write(pos);                   //movemos el servo en el otro sentido
       delay(500); 
    }
}
  


ACTIVIDAD:
1.- Modifica el programa para que el LIMPIAPARABRISAS se mueva más lentamente  cuando se mueva en un sentido y más rapidamente en el otro. 






EJEMPLO DEL  CÓDIGO SIN USAR LIBRERÍA DEL SERVO.
int servoPin = 9;         // servo conectado al pin digital 9 PWM
int miAngulo;            // ángulo del servo de 0-180
int anchoPulso;       // anchura del pulso para la función servoPulse
void setup() {
      pinMode(servoPin, OUTPUT);           // configura pin9 como salida
}
void servoPulso(int servoPin, int miAngulo) {       //definimos esta nueva función
    anchoPulso = (miAngulo * 10) + 600;         // determina retardo del ancho de pulso
    digitalWrite(servoPin, HIGH);                             // mueve el servo
    delayMicroseconds(anchoPulso);                    // pausa
    digitalWrite(servoPin, LOW);                            // detiene el servo
    delay(20);                                                           // retardo de refresco
}
void loop() {                      // el servo inicia su recorrido en 10º y gira hasta 170º
    for (miAngulo=10; miAngulo<=170; miAngulo++) {
    servoPulso(servoPin, miAngulo);
    }
    for (miAngulo=170; miAngulo>=10; miAngulo--) {      //el servo vuelve a 10º
    servoPulso(servoPin, miAngulo);
    }
}
     

Hemos usado como unidad del ancho de pulso los microsegundos porque si lo hicieramos en milisegundos tendríamos que haber utilizado una variable del tipo flotante.









4.- SERVO CONTROLADO TECLADO  CON M_BLOCK.


CÓDIGO DE BLOQUES PARA CONTROLAR CON LAS  TECLAS DE FUNCIÓN EL  SERVO:





4.- SERVO CONTROLADO POR EL MONITOR SERIE.



CÓDIGO CON LA FUNCIÓN "IF":
#include <Servo.h>
Servo miservo;
int pos=0;
int TECLA=0; 
void setup() {
  Serial.begin(9600);
  miservo.attach(9);
  pos=0; 
}
void loop() {
    miservo.write(pos);
    delay(50);
    Serial.println(pos);
    if (Serial.available() > 0) {  //esto da algo de error
       delay(100);
       TECLA=Serial.read();
       if (TECLA==49){  //es decir,  "1" 
          pos=0;
          }
       if (TECLA==50){  //es decir,  "2" 
          pos=90;
          }
       if (TECLA==51){  //es decir,  "2" 
          pos=180;
          }
       }
}


CÓDIGO CON LA FUNCIÓN "SWITCH CASE":
#include <Servo.h>
Servo miservo;
int pos=0;
int TECLA=0; 
void setup() {
  Serial.begin(9600);
  miservo.attach(9);
  pos=0; 
}
void loop() {
    miservo.write(pos);
    delay(50);
    Serial.println(pos);
    if (Serial.available() > 0) {  //esto da algo de error
       delay(100);
       TECLA=Serial.read();
       switch (TECLA) {
        case 49:
             pos=45;
        break;
        case 50:
            pos=90;
        break;
        case 51:
            pos=135;
        break;
        defautl:
            pos=0;
       }
       }
}


3.- SERVO CONTROLADO POR UN POTENCIÓMETRO.


#include <Servo.h>
Servo servo;
int pot = 3;  //entrada analógica del potenciometro
void setup() {
  Serial.begin(9600);
  servo.attach(9); 
}
void loop() {
  int valorpot= analogRead(pot);
  val=map(valorpot,0,1023.0.180;
  Serial.print(val);
  servo.write(val);
  delay(100);
}



ACTIVIDAD:
1.- Mueve un servo según una  determinada entrada analógica. Mediante un joystick o un dispositivo que cuente con un  potenciómetro podemos controlar el movimiento de un servo. 
Para este ejemplo utilizaremos el ejemplo que viene incluido en la IDE de Arduino (knob) que se encuentra en Archivo>Ejemplos>Servo
Lo que hace este programa es variar la posición del servo en función de la posición del potenciómetro que leemos de manera analógica. Sólo nos queda mapear la lectura para que se mueva de 0º a 180º. 


4.- BRAZO ROTO.