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.

9 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