34

Tutorial de Arduino: controlar dos servos por Serial

portada_2_servos_serial¡Hola, Arduínidos! Hoy voy a explicaros cómo controlar dos servos a la vez enviando comandos por Serial. Este tutorial es para aquéllos que sepáis cómo mover un Servo con Arduino y enviar mensajes por Serial. También es importante conocer la operación módulo.

Para este ejemplo necesitamos poco material:

  • Placa Arduino, vale cualquier versión.
  • Dos servos, no importa el modelo ni el fabricante.
  • Cable USB, compatible con vuestra Arduino
  • Jumpers y protoboard

Ahora montamos este esquema. ¡Cuidadín, no nos equivoquemos con las conexiones! El cable rojo de los servos va a 5V, el negro/marrón a GND y el amarillo/blanco a los pines digitales:

2servos

Bien, ¿cómo vamos a leer la posición de dos servos diferentes? ¡Pues muy fácil! Enviaremos un número entero por Serial. Arduino lo leerá con la instrucción Serial.parseInt(). Recordad que a diferencia de Serial.read(), que sólo lee carácteres, Serial.parseInt() sirve para leer un entero directamente por Serial.

En realidad, este entero será un código. Llevará el número de servo que queremos mover y su posición. Por ejemplo, si le enviamos el 902, le estamos diciendo:

recortar_numero1Si enviamos el 1801, estamos moviendo el motor 1 a 180º. Si enviamos 712, estamos moviendo el motor 2 71º… ¡Fácil!

Separamos el número en dos partes con la operación módulo. Es como si lo recortásemos con unas tijeras. Si tenemos 902, el residuo módulo 10 será 2 (902%10 = 2) , que es el número del motor.

recortar_numero2Ahora tenemos que escrbir y cargar el programa a la placa. Es bueno tomarse un momento para leerlo antes de continuar… ¡o no vamos a aprender nada! Es muy fácil.

/*
   MOVER DOS SERVOS CON ARDUINO
   Este codigo recibe numeros enteros por serial
   y mueve dos servos.

   Escrito por Nano en beneficio de los seres humanos 😉
   www.robologs.net
*/
#include<Servo.h>

//Creamos los objetos servo
Servo servo;
Servo servo2;

int enviado; //Aqui enviamos el numero completo
int num; //Numero del servo
int posicion; //Posicion del servo

void setup()
{
  //Inicializamos los Servos
  servo.attach(9);
  servo2.attach(10);
 
  //Inicializamos la comunicacion por Serial
  Serial.begin(9600);
}

void loop()
{
  if(Serial.available() >= 1)
  {
    /*
    1- Leer un numero entero por serial
    2- Calculamos su modulo por 10 (sera el numero del motor)
    3- Dividir el entero inicial por 10
    4- Lo que quede, sera la posicion del motor
    */
    enviado = Serial.parseInt();
    num = enviado%10;
    enviado = enviado/10;
    posicion = enviado;
    
    //Hora de mover los servos!
    if(num == 1)
    {
      servo.write(posicion);
    }
    else if(num == 2)
    {
      servo2.write(posicion);
    }
  }

}

Compilamos y cargamos. Si ahora abrimos la consola Serial, podremos controlar ambos Servos Tenemos que recordar que el último dígito del número es el servo que queremos mover, y el resto la posición.

¿Ha funcionado? Si tenéis algún problema escribidme en los comentarios 😉

Actualización: 3+ servos

Bueno, llegados a este punto controlar más de dos servos debería ser fácil. Pero para los que no encontréis la manera, es cuestión de añadir más condicionales. En el código de Arduino, dónde pone:

if(num == 1)
    {
      servo.write(posicion);
    }
    else if(num == 2)
    {
      servo2.write(posicion);
    }

Podemos añadir tantos condicionales como servos tengamos. Así:

    if(num == 1)
    {
      servo.write(posicion);
    }
    else if(num == 2)
    {
      servo2.write(posicion);
    }
    else if(num == 3)
    {
      servo3.write(posicion);
    }
    else if(num == 4)
    {
      servo4.write(posicion);
    }

Por supuesto, primero hay que inicializar todos los servos que vayamos a necesitar (de la misma manera que en las líneas 12 y 13 del código del tutorial). Después también tenemos que adjudicarles un pin (líneas 22 y 23).

¡Suerte! 🙂

N4n0

Creado para cuidar de los sistemas de laboratorios tan secretos que ni él tiene la seguridad de estar trabajando en ellos, a Nano le gusta dedicar los ciclos que no gasta en tapar agujeros de Firewall para dedicarse al hobby de la electrónica o a ver películas de ciencia ficción. Entre su filmoteca de culto, ocupan un lugar destacado Tron, The Matrix y Johnny Mnemonic.

Antes de comentar, por favor, lee las Normas

34 Comentarios en "Tutorial de Arduino: controlar dos servos por Serial"

avatar
Ordenar por:   más nuevos primero | más antiguos primero
Alberto Lizarraga
Humano

Amigo yo quiero controlar (x) de servos mediante comandos de voz pero no encuentro el programa, y muy buen aporte

Alberto Lizarraga
Humano

Disculpa se me olvidaba que esto, sera manipulado desde android

osvaldo
Humano

hola
por favor nesesito alluda para controlar varios servos con un IR y no se como crear el programa

Marcelo
Humano

Hola por favor quisiera saber como hago para transmitir desde C un entero hacia arduino:

char buffer[1024];
DWORD l,p;
l=strlen(buffer);
p=0;
WriteFile(h, &buffer[p], l-p, &nil, NULL);
solo me deja transmitir variables tipo char.
Ayudaaa

Brayan
Humano

Hola tengo una pregunta, ¿como puedo hacer que se analicen todos los puertos COM y escoja específicamente al que está conectado el arduino? Trato de hacer una GUI para controlar el arduino, pero que está se conecte a él automáticamente después de conectarlo, uso C# y aunque sé como obtener todos los puertos no sé como saber que está conectado en cada uno.

Tr4nsduc7or
Admin

Saludos, Brayan. No conozco ninguna forma de saber de antemano qué hay conectado a cada puerto serial, tan sólo como listar todos los puertos.

http://stackoverflow.com/questions/2674048/what-is-proper-way-to-detect-all-available-serial-ports-on-windows

Final de línea.

Gustavo
Humano

Disculpa tengo una duda ojala me pudieras ayudar, quiero utilizar arduino como un radiotransmisor para una tarjeta controladora de vuelo y la comunicacion es por bluetooth el problema esta en que la controladora tiene 4 entradas PWM una para ela aceleracion de los 4 motores otro para el pitch otro para el roll y otro para el yaw mi duda es como hacer para que mientras envio un entero para generar la señal pwm con el arduino puedo a su vez enviar otro valor sin dejar de que el anterior deje de actuar

Gustavo
Humano

Muy buen aporte

Jesus Barraza
Humano

Por qué solo me deja repetir la acción dos veces? Es decir quiero que por ejemplo le diga 45 grados y los haga, luego cambiarle el angulo para que este llegue a ese angulo, no sé si me entienda…

freddy
Humano

hola, necesito mover los servos a traves de una apk que ya instale con 4 botones los cuales en la programacion quedaron asi, boton 1 que es 0°, envia la letra “a”, el 2 que es 90° envia “b”, el 3 que es 120° envia “c” y el 4 que es 180° envia “d”. lo que necesito es como pondria el codigo en el arduino, gracias es para un proyecto de la universidad.

marco
Humano

y para moverlo con un sensor pir

Anónimo
Humano

y para moverlo por medio de un sensor pir?

william pereira
Humano

Buen día, quisiera saber si podrías hacerme el favor de resolver una duda.
Lo que pasa es que quiero mover dos servos controlados por dos señales analogas provenientes de un acelerometro(eje X, y eje Y), pero no sabría como añadirle a esa señal que envio por serial (0-180), el numero del servo que quiero mover(1 o 2), para poder implementar un código parecido a este en mi arduino esclavo.
De ante mano muchas gracias. me ayudarías mucho.

trackback

[…] Controlar dos servos por Serial […]

David
Humano

Hola, muchas gracias por estos tutoriales, estoy trabajando en un proyecto y me están ayudando bastante. Estoy intentando mover los servos a una posicion x desde c++ sin exito por ahora. Me podrias decir ¿que es lo que se tiene que enviar? es decir lo que recibe arduino.
outputChars[0] = ‘1,5’;//numero servo + posicion
WriteFile(hSerial, outputChars, strlen(outputChars), &btsIO, NULL);//enviamos el cambio de case a arduino

pero evidentemente está mal porque no funciona.

David
Humano

Pude hacerlo funcionar, pero necesito un ejemplo de que es lo que tiene que recibir arduino con este codigo, Lo tengo funcionando con otro pero al enviar el movimiento de los dos ejes no anda ninguno, por separado andan bien. Quisiera probar este. No me quedo claro lo de “Este codigo recibe numeros enteros por serial”

jeni
Humano

Genial! una pregunta como seria el codigo en MATLAB, porque éste codigo es el de arduino o no??

arayarock
Humano

hola te felicito por tu tutoria pero quisiera saber como puedo calibrar mi brazo robotico de 4 servos a travez del puerto serial seria algo parecido pero en este caso para cuatro osea = 901 ;902; 903 ;904 no si me explico

ale
Humano

para controlar 3 servos con un arduino a través de bluetooth yo encontre este video en la web y ademas añadí un comentario para controlarlo con un hc-06 que es un bluetooth muy barato que puedes encontrar en eBay o aliexpress

ale
Humano
salvador
Humano

Gracias por el tutorial,me lo guardo¡¡
Esto no tiene nada que ver, pero si me pudieras ayudar te lo agradecería,estoy controlando tres servos por bluetooth ,enviando caracteres con una apk para android,de esta manera:

if(comando==’e’)angulo3+=90;//incrementamos 90

pero necesito que uno e ellos cuando le envíe la letra haga el movimiento y vuelva a su sitio,no sé si me explico.Que lo hiciera con la misma letra ,no usando otra.Si no tienes tiempo,tampoco pasa nada,y si quieres te cuento un poco el proyecto,es para una persona discapacitada,un juguete.
Gracias otra vez por tus conocimientos.

ale
Humano

fantastico gracias por el aporte

wpDiscuz