viernes, 26 de octubre de 2012

Control de Servo Motor con Arduino

Ahora mostraré como poner en funcionamiento un servo motor con la tarjeta Arduino. Este tutorial está basado en el sketch de ejemplo que trae la interfaz de desarrollo.

Para esto necesitamos lo siguiente:


  • Tarjeta Arduino
  • 3 Cables de protoboard, yo utilizo uno rojo para el positivo +5v, uno café para el GND y uno azul para la conexión de datos.
  • 1 servo motor




Primero debemos hacer las conexiones adecuadas para hacer que el ejemplo funcione.
Basándonos en los colores de cables de la foto:

El cable rojo lo conectas al rojo del motor,
El cable café lo conectas al café del motor,
El cable azul lo conectas al naranjo,


Después conectas estos cables así:

El cable rojo a los +5v de la tarjeta
El cable café al GND de la tarjeta
El cable azul al pin 9



Ahora, conecta la tarjeta al conector USB y abre el IDE de desarrollo de Arduino.
En el menú anda a Archivo->Ejemplos->Servo y abre Sweep
Por último Carga el programa y listo!




El programa:

En si lo que hace este ejemplo es hacer girar el servo motor 180º hacia un lado y después 180º hace el lado contrario.
Para eso hace uso del pin 9 como salida y así enviar los datos al servomotor.

El programa viene convenientemente comentado para entender el funcionamiento de las lineas programadas.

14 comentarios:

  1. Muy buen trabajo!! ayuda a los que aprendemos. Gracias por compartirlo.Un abrazo

    ResponderEliminar
  2. Hola, tengo un arduino uno y un servomotor Tower Pro SG92R y cuando conecto se para lentamente, suena como si se moviera pero no lo hace.

    Muchas gracias!

    ResponderEliminar
  3. Respuestas
    1. #include
      //Creamos una variable servo para poder usar las funciones con ella.
      Servo servoma ;


      void setup()
      {
      //Definimos el pin al que ira conectado el servo.
      servoma.attach(9);

      servoma.write(90);

      }
      void loop() {
      //Lo llevamos a un extremo
      servo.write(80); //Le damos tiempo a llegar a esa posicion
      delay(500); //Lo volvemos a centrar
      servo.write(90); //Le damos tiempo a llegar a esa posicion
      delay(500); //Lo llevamos al otro extremo
      servo.write(180);
      }
      mucho depende de la programacion o el uso que le vallas a dar pero esta es una muy general espero que te sirva ... :D

      Eliminar
  4. hola! soy novato y trasteando con el proyecto evilgenius 25 (laser servocontrolado) he intentado que repita el skech un numero determinado de veces sin exito.
    podríais decirme como modificarlo para que repita la secuencia que le introduzco en el monitor serial?
    aqui esta el skech
    #include

    int laserPin = 4;
    Servo servoV;
    Servo servoH;

    int x = 90;
    int y = 90;
    int minX = 10;
    int maxX = 170;
    int minY = 50;
    int maxY = 130;

    void setup()
    {
    servoH.attach(3);
    servoV.attach(2);
    pinMode(laserPin, OUTPUT);
    Serial.begin(9600);
    }

    void loop()
    {
    char ch;
    if (Serial.available())
    {
    ch = Serial.read();
    if (ch == '0')
    {
    digitalWrite(laserPin, LOW);
    }
    else if (ch == '1')
    {
    digitalWrite(laserPin, HIGH);
    }
    else if (ch == '-')
    {
    delay(100);
    }
    else if (ch == 'c')
    {
    x = 90;
    y = 90;
    }
    else if (ch == 'l' || ch == 'r' || ch == 'u' || ch == 'd')
    {
    moveLaser(ch, 1);
    }
    else if (ch == 'L' || ch == 'R' || ch == 'U' || ch == 'D')
    {
    moveLaser(ch, 5);
    }
    }
    servoH.write(x);
    servoV.write(y);

    }

    void moveLaser(char dir, int amount)
    {
    if ((dir == 'r' || dir == 'R') && x > minX)
    {
    x = x - amount;
    }
    else if ((dir == 'l' || dir == 'L') && x < maxX)
    {
    x = x + amount;
    }
    else if ((dir == 'u' || dir == 'U') && y < maxY)
    {
    y = y + amount;
    }
    else if ((dir == 'd' || dir == 'D') && x > minY)
    {
    y = y - amount;
    }
    }

    Gracias de antemano y saludos!

    ResponderEliminar
  5. #include
    #include
    Servo myServo;

    void setup()
    {
    pinMode(13,OUTPUT);//Seleccionamos el pin 13 como salida
    Serial.begin(9600);//Inicializamos el valor de transmisión.
    }

    void loop()
    {
    while (Serial.available())//Declaramos un sentencia, Mientras el puerto Serial este disponible se empieza el ciclo
    {
    char dato= Serial.read(); //Declaramos una variable de tipo carácter y Seo lee la variale enviada desde el Bluetooth.
    digitalWrite(13,LOW); //Indicamos que en el puerto 13 la señal será baja por lo que el LED estará apagado.
    switch(dato)
    {
    case 'A': //Si en el caso de ser A la varible enviada, entonces:
    {
    digitalWrite(13,HIGH);//La señal será alta, encenderá el LED.
    Serial.println("servo90");//Se mostrará un mensaje.
    myServo.write(90)
    break;//El caso se detiene.
    }
    case 'B': //Si en el caso de ser A la variable enviada, entonceS:
    {
    digitalWrite(13,LOW);//la señal será baja por lo que el LED estará apagado.
    Serial.println("servo0");//Se mostrará un mensaje.
    myServo.write(90)
    break;
    }
    }
    }
    }

    sale un error de expected ';' before '}' token ayudaaaaaa

    ResponderEliminar
  6. Prueba con esto


    #include

    Servo myServo;

    void setup()
    {
    pinMode(13,OUTPUT);//Seleccionamos el pin 13 como salida
    Serial.begin(9600);//Inicializamos el valor de transmisión.
    }

    void loop()
    {
    while (Serial.available())//Declaramos un sentencia, Mientras el puerto Serial este disponible se empieza el ciclo
    {
    char dato= Serial.read(); //Declaramos una variable de tipo carácter y Seo lee la variale enviada desde el Bluetooth.
    digitalWrite(13,LOW); //Indicamos que en el puerto 13 la señal será baja por lo que el LED estará apagado.
    switch(dato)
    {
    case 'A': //Si en el caso de ser A la varible enviada, entonces:
    {
    digitalWrite(13,HIGH);//La señal será alta, encenderá el LED.
    Serial.println("servo90");//Se mostrará un mensaje.
    myServo.write(90);
    break;//El caso se detiene.
    }
    case 'B': //Si en el caso de ser A la variable enviada, entonceS:
    {
    digitalWrite(13,LOW);//la señal será baja por lo que el LED estará apagado.
    Serial.println("servo0");//Se mostrará un mensaje.
    myServo.write(90);
    break;
    }
    }
    }
    }

    ResponderEliminar
  7. Julio solicito tu apoyo. tengo un carro robot que he llegado a desarrollar haciendo modificaciones a un proyecto que encontré en protoboard con 2 ruedas, lo pude acoplar a 4 con control remoto via bluetooh y sensor ultrasonido, el detalle es que quiero agregarle un servo SG90 y cuando le he agregado el código solo funciona el servo y el carro se inmoviliza y no me lo deja controlar por bluetooh, podrías aportarme tus ayuda. Gracias.

    Aquí mi código (Tengo disponibles las salidas digitales 4,7,8,11,12 y13)

    PD. Nose mucho de programación solo lo básico y arduino es un proyecto que hice para la universidad. El código modificado que adjunto me tomó varios días adaptarlo para que el carro funcione

    ResponderEliminar
  8. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  9. 1ra Parte del código

    #include // Incluye la libreria Servo
    Servo servo1; // Crea el objeto servo1 con las caracteristicas de Servo

    int izqA = 5;
    int izqB = 6;
    int derA = 9;
    int derB = 10;
    int vel = 250; // Velocidad de los motores (0-250)
    int veldis = 150; // Velocidad de los motores (0-150), bajar velocidad
    int estado = 'g'; // inicia detenido

    int pecho = 2; // define el pin 2 como (pecho) para el Ultrasonido
    int ptrig = 3; // define el pin 3 como (ptrig) para el Ultrasonido
    int duracion, distancia; // para Calcular distancia

    void setup() {

    servo1.attach(11,600,1500); // Asocia el servo1 al pin 3, define el min y max del ancho del pulso
    Serial.begin(9600); // inicia el puerto serial para comunicacion con el Bluetooth

    pinMode(derA, OUTPUT);
    pinMode(derB, OUTPUT);
    pinMode(izqA, OUTPUT);
    pinMode(izqB, OUTPUT);

    pinMode(pecho, INPUT); // define el pin 2 como entrada (pecho)
    pinMode(ptrig,OUTPUT); // define el pin 3 como salida (ptrig)
    pinMode(13,OUTPUT);
    }

    ResponderEliminar
  10. 2da parte del código

    void loop() {
    servo1.write(0); // Gira el servo a 0 grados
    delay(700); // Espera 700 mili segundos a que el servo llegue a la posicion

    servo1.write(90); // Gira el servo a 90 grados
    delay(700);

    servo1.write(180); //Gira el servo a 180 grados
    delay(700);

    if(Serial.available()>0){ // lee el bluetooth y almacena en estado
    estado = Serial.read();
    }
    if(estado=='a'){ // Boton desplazar al Frente

    //Giro de llantas derechas

    analogWrite(izqB, 0);
    analogWrite(derB, 0);
    analogWrite(derA, 0);
    analogWrite(izqA, vel);
    delay(10);

    // Giro de llantas izquierdas
    analogWrite(derA, 0);
    analogWrite(izqA, 0);
    analogWrite(izqB, 0);
    analogWrite(derB, vel);
    delay(10);

    }

    ResponderEliminar
  11. 3ra parte del código

    if(estado=='b'){ // Boton desplazar Izquierda

    analogWrite(izqB, 0);
    analogWrite(derB, 0);
    analogWrite(derA, 0);
    analogWrite(izqA, veldis); //Giro de llantas derechas
    delay(20);
    }

    if(estado=='c'){ // Boton Parar
    analogWrite(derB, 0);
    analogWrite(izqB, 0);
    analogWrite(derA, 0);
    analogWrite(izqA, 0);
    }

    if(estado=='d'){ // Boton desplazar Derecha
    analogWrite(derA, 0);
    analogWrite(izqA, 0);
    analogWrite(izqB, 0);
    analogWrite(derB, veldis); // Giro de llantas izquierdas
    delay(20);
    }

    if(estado=='e'){ // Boton modo Reversa

    //Giro de llantas derechas

    analogWrite(izqB, vel);
    analogWrite(derB, 0);
    analogWrite(derA, 0);
    analogWrite(izqA, 0);
    delay(0.02);

    // Giro de llantas izquierdas
    analogWrite(derA, vel);
    analogWrite(izqA, 0);
    analogWrite(izqB, 0);
    analogWrite(derB, 0);
    delay(0.02);
    }

    if (estado =='f'){ // Boton ON, se mueve sensando distancia

    digitalWrite(ptrig, HIGH); // genera el pulso de trigger por 10us
    delay(0.01);
    digitalWrite(ptrig, LOW);

    duracion = pulseIn(pecho, HIGH); // Lee el tiempo del Echo
    distancia = (duracion/2) / 29; // calcula la distancia en centimetros
    delay(10);

    if (distancia <= 30 && distancia >=2){ // si la distancia es menor de 30cm
    digitalWrite(13,LOW); // Enciende LED

    analogWrite(derB, 0); // Parar los motores por 200 mili segundos
    analogWrite(izqB, 0);
    analogWrite(derA, 0);
    analogWrite(izqA, 0);
    delay (200);

    analogWrite(izqB, vel); // Reversa durante 500 mili segundos
    analogWrite(derB, 0);
    analogWrite(derA, 0);
    analogWrite(izqA, 0);
    delay(0.10);

    analogWrite(derA, vel);
    analogWrite(izqA, 0);
    analogWrite(izqB, 0);
    analogWrite(derB, 0);
    delay(0.10);

    analogWrite(derA, 0); // Girar durante 1100 milisegundos
    analogWrite(izqA, 0);
    analogWrite(izqB, vel);
    analogWrite(derB, vel);
    delay(150);

    digitalWrite(13,LOW);
    }

    else{ // Si no hay obstaculos se desplaza al frente
    analogWrite(izqB, 0);
    analogWrite(derB, 0);
    analogWrite(derA, 0);
    analogWrite(izqA, veldis);
    delay(25);

    analogWrite(derA, 0);
    analogWrite(izqA, 0);
    analogWrite(izqB, 0);
    analogWrite(derB, veldis);
    delay(25);

    }

    }
    if(estado=='g'){ // Boton OFF, detiene los motores no hace nada
    analogWrite(derB, 0);
    analogWrite(izqB, 0);
    analogWrite(derA, 0);
    analogWrite(izqA, 0);
    }
    }

    ResponderEliminar