Servos (T1:E2)

     Este proyecto tiene como finalidad mostrar el funcionamiento de un servo. Se puede apreciar claramente que estos tienen 3 cables, el verde va al negativo, el rojo al positivo y el naranja recibe la señal de Arduino. En el programa de televisión explicamos como funciona electrónicamente un servo, pero les repetimos que es un motor que tiene la cualidad de que podemos controlar la posición de su eje en grados, además llevan una caja con engranajes que les dan un gran torque o fuerza de giro.
     
    Al final de esta página, encontrarán el video del programa #2 de "RoboTongas", ahí junto al Ingeniero Informático Franco Catrín, explicamos visualmente el funcionamiento de un servo.-

     Para montar el Arduino usamos un pequeño protoboard y en la impresora 3D creamos una caja de soporte para el servo.




    Estos funcionan variando la  modulación de ancho de pulso (PWM) Los servos están provistos de tres cables, dos para alimentación Vcc y Gnd (generalmente 5 volt) y un tercero que aplica el tren de pulsos que un circuito interno de control diferencial gire al servo a la posición indicada. La frecuencia usada para mandar la secuencia de pulsos al servomotor es de 50 Hz esto significa que cada ciclo dura 20 ms, Las duraciones de cada pulso se interpretan como comandos de posicionamiento del motor, mientras que los espacios entre cada pulso son despreciados.


     Al girar el potenciómetro se genera un tren de pulsos que varía según la posición de este último. El tren de pulsos tiene una frecuencia entre 10 a 22 microsegundos, el ancho del pulso en estado inicial del servo que está en 0° es de 0,3 microsegundos, el máximo de giro del servo es 180° que es cuando el ancho del pulso es de 2,1 microsegundos. Estos valores varían según el servo, pero esta es la idea general. En Arduino existe una librería se servos que realiza los cálculo de los microsegundos, facilitando la programación. Existe otra manera de mover el servo sin la librería y que veremos en otro programa.


    Para este proyecto hemos generado dos códigos, el primero de ellos, que es el que está a continuación, realiza los movimientos en forma automática. Podemos decidir por las subrutinas a(), b() o c(), para ello debemos poner o sacar el símbolo que indica comentario (//) y solamente elegir una de ellas, en este caso está seleccionada la rutina de potenciómetro.
   
     La rutina a() hace que el servo de mueva de 0° a 90° y 180° indefinidamente. La rutina b() mueve el servo a través del potenciómetro y la rutina c() mueve el potenciómetro por grado de 0° a 180° y de 180° a 0°.

#include <Servo.h> //--------------------------------- LIBRERÍA SERVOS
Servo Motor; //--------------------------------------- LLAMAMOS MOTOR AL SERVO
int g; //---------------------------------VARIABLES PARA ALMACENAR VALORES
int i;
void setup() {
  Serial.begin (9600); //---------- iniciamos serial
  Serial.println ("     Estamos listos...");
  Serial.println("     ______________________________________________________");

  Motor.attach(8); //-----------------------------------------------------------PIN 8 ENTREGA SEÑAL AL SERVO
}
void loop() {
  // a(); //------------------------------ RUTINA 0° - 90° - 180° AUTOMÁTICA
   b(); //--------------------------------- RUTINA POTENCIÓMETRO
 //  c(); //----------------------------------------RUTINA POR GRADO DE 0° A 180° Y DE 180° A 0°
}

void a() {
  Motor.write(0); //------------------------------------- 0° EN PUERTO 8
  Serial.print("     Angulo = 0º");
  delay (1000);
  Motor.write(90); //------------------------------------ 90° EN PUERTO 8 
  Serial.print("      - Angulo = 90º");
  delay (1000);
  Motor.write(180);  //-----------------------------------180° EN PUERTO 8
  Serial.println("      - Angulo = 180º");
  delay (1000);
  Serial.println("     _______________________________________________________");
}
void b() {
  g = analogRead(A1); //------------------------- ALMACENAMOS EN "g" VALOR DE PUERTO ANALÓGICO A1 
  Serial.print ("Valor A1: ");
  Serial.print (g);
  g = map(g, 0, 1023, 0, 179); //-------------------- DETERMINAMOS QUE VALOR MENOR = 0 Y MAYOR = 180
  Motor.write(g); //----------------------------------- PONE VALORES EN PIN 8
  Serial.print (" / Grados: ");
  Serial.println (g);
}

void c() {
  for (i = 0; i < 180; i++) { //----------------------- DESDE 0° A 180°
    Motor.write(i); //--------------------------------- PONE VALORES EN PIN 8
    Serial.print("Angulo: ");
    Serial.print(i);
    Serial.println(" °");
    delay (10);
  } for (i = 180; i > 0; i--) { //----------------------- DESDE 180° A 0°
    Motor.write(i); //----------------------------------- PONE VALORES EN PIN 8
    Serial.print("Angulo: ");
    Serial.print(i);
    Serial.println(" °");
    delay (10);
  }
}

     En este otro caso, elegimos la rutina a través del teclado del PC con las teclas 1, 2 ó 3

#include <Servo.h> //--------------------------------- LIBRERÍA SERVOS
Servo Motor; //--------------------------------------- LLAMAMOS MOTOR AL SERVO

int g; //---------------------------------VARIABLES PARA ALMACENAR VALORES
int i;
int letra;

void setup() {
  Serial.begin (9600); // iniciamos serial
  Serial.println ("     Estamos listos...");
  Serial.println();
  Serial.println("1= rutina automática 0°, 90° y 180°");
  Serial.println("2= rutina automática de 0° a 180°");
  Serial.println("3= rutina con potenciómetro");
  Serial.println();
  Serial.println("______________________________________________________");

  Motor.attach(8); //-----------------------------------------------------------PIN 8 ENTREGA SEÑAL AL SERVO
}

void loop() {
  if (Serial.available() > 0) {
    letra = Serial.read();
    if (letra == '1') {
      Serial.println("         Ud. eligió rutina 0°, 90°, 180°");
      Serial.println("______________________________________________________");
      a();
    }
    if (letra == '2') {
      Serial.println("             Ud. eligió rutina 0° a 180°");
      Serial.println("______________________________________________________");
      b();
    }
    if (letra == '3') {
      Serial.println("            Ud. eligió rutina con Potenciómetro");
      Serial.println("______________________________________________________");
      c();
    }
  }
}


void a() {
  Motor.write(0);
  Serial.print("     Angulo = 0º "); letra = Serial.read(); Serial.print(letra);
  delay (1000);
  Motor.write(90);
  Serial.print("      - Angulo = 90º "); letra = Serial.read(); Serial.print(letra);
  delay (1000);
  Motor.write(180);
  Serial.print("      - Angulo = 180º "); letra = Serial.read(); Serial.print(letra);
  delay (1000);
  Motor.write(90);
  Serial.print("      - Angulo = 90º "); letra = Serial.read(); Serial.println(letra);
  delay (1000);
  if (Serial.read() == 10) {
    loop();
  }
  a();
}




void b() {
  for (i = 0; i < 180; i++) {
    Motor.write(i);
    Serial.print("Angulo 1: ");
    Serial.print(i);
    Serial.println(" °");
  }
  for (i = 180; i > 0; i--) {
    Motor.write(i);
    Serial.print("Angulo 2: ");
    Serial.print(i);
    Serial.println(" °");
    delay (10);
  }
  b();
}

void c() {
  letra = Serial.read();
  g = analogRead(A1);
  Serial.print ("Valor A1: ");
  Serial.print (g);
  g = map(g, 0, 1023, 0, 179);
  Motor.write(g);
  Serial.print (" / Grados: ");
  Serial.println (g);
  c();
}