78

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

Nota: este esquema funcionará con la mayoría de servos que utilizamos los aficionados. Sin embargo, para servos que consumen más potencia, lo mejor es conectar el cable rojo de los servos al pin VCC de Arduino o, directamente, al positivo de la batería.

 

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!

Para separar el número en dos partes utilizaremos la operación módulo. Será como si lo recortásemos con unas tijeras. Por ejemplo, si tenemos 902 el residuo módulo 10 será 2 (902%10 = 2), que es el número del motor. Después, el ángulo se extrae haciendo una división normal.

recortar_numero2

 

Este será el código que tendremos que cargar en nuestra placa Arduino. Es bueno tomarse un momento para leerlo y entenderlo antes de copiarlo… ¡o no vamos a aprender nada!

/*
   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)
  {

    enviado = Serial.parseInt(); //Leer entero por serial
    num = enviado%10; // Extraer el num del motor
    enviado = enviado/10; //Dividir el entero entre 10
    posicion = enviado; //Guardar el angulo
    
    //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);
    }

¡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.

guest
78 Comments
más nuevos primero
más antiguos primero
Inline Feedbacks
Ver todos los comentarios
Adrian E
Adrian E
2 meses

Buenas tardes soy nuevo en estos temas me gustaría saber como hacer que los servomotores giren por ejemplo a 45 grados esten un determinado tiempo (por ejemplo 1 mín) en 45 grados y después de ese lapso de tiempo regrese a 0 grados.

DUBINSON SARMIENTO
DUBINSON SARMIENTO
3 meses

Muy buenas tardes, soy nuevo en el manejo de arduino, he estado haciendo un proyecto y debo mover varios servos de manera independiente y en ángulos distintos, si alguien tiene un código que pueda usar como modelo para crear el mio se lo agradecería.

noeflores
noeflores
6 meses

buenas tardes tengo un problema no puedo agregar dos servmotores solo puedo hacer que funcione 1 con este codigo

#include

// Declaramos la variable para controlar el servo
Servo servoMotor;

void setup() {
// Iniciamos el monitor serie para mostrar el resultado
Serial.begin(9600);

// Iniciamos el servo para que empieze a trabajar con el pin 5
servoMotor.attach(5);
}

void loop() {

// Dezplasamos a la posicion 0°
servoMotor.write(0);
// Esperamos 1 segundo
delay(1000);

// Dsplasamos la posicion 0°
servoMotor.write(90);
// Esperamos 1 segundo
delay(1000);

// Esperamos a la posicion 180°
servoMotor.write(180);
// Esperamos 1 segundo
delay(1000);
}

Jorge Andrés
Jorge Andrés
7 meses

Oye muchas gracias por tan valioso aporte, me estaba enloqueciendo tratando de lograr una comunicación serial con Matlab justamente para controlar un par de servos.
Básicamente mi dolor de cabeza era por usar Serial.read() en vez de Serial.parseInt().
Enhorabuena. Sigue así.

jorge
jorge
9 meses

Hola nano, son excelentes tus aportaciones, espero consultarte pronto..

Martin
Martin
1 año

Disculpa soy principiante en esto
como hiciste el código de python
me ayudarias mucho

Alejandro
Alejandro
1 año

No funciona con más de 9 servos, es decir el numero 10 no es considerado por el num == 10, alguna solución ?

Alejandro
Alejandro
1 año

No funciona al sobrepasar el numero 9, alguna solución ?

Isaac Zamudio
Isaac Zamudio
2 años

Como puedo hacer el movimiento de 3 o 4 servís para un robot scara pero con la matlab “S-Function” y pues comunicación con arduino…

Jaime
Jaime
2 años

hay alguna manera de controlar el angulo desde el puerto serial sin el uso de librerias?

Modesto
Modesto
2 años

Ayuda por favor. Tengo dos servos conectados al Arduino y me funcionan desde 0º a 90º pero primero lo hace el servo1 y cuando finaliza comienza el servo2 y quisiera que se movieran los dos a la vez es para una barrera paso nivel.

Por otra parte no se interpretar bien el código de mover dos servos con Arduino, en mi caso que quiero ponerlos para que giren a 90º que números y en que lugar debo de ponerlos con el serial.begin..

Por último puedo mandar y como mi código para que pudieran retificarlo.

Modesto
Modesto
2 años
En respuesta a  N4n0

Mande correo

alberto
alberto
2 años

disculpa como se programaria 3 servos usando el IRremote

Diego
Diego
2 años

Hola, y como haces una codificacion?

Karen
Karen
2 años

Disculpa quiero que el servo se mueva cuando detecte una distancia menor a 20 cm con un sensor ultrasonico, como puedo hacerlo?

Arnau
Arnau
2 años

Soy un seguidor de tu blog y creo que haces un trabajo excelente. Muchas felicidades! Tengo una duda, en el siguiente programa se trata de controlar por bluetooth las rejillas del aire acondicionado de casa mediante servos (5 servos). Al enviar las ordenes por bluetooth a vez arduino se vuelve un poco loco y se cuelga. ¿Podrias ver si es correcto el código? Llevo mucho tiempo intentado y no lo consigo. Muchas gracias. #include // Incluye la libreria Servo Servo servo1; // Crea el objeto servo1 con las caracteristicas de Servo Servo servo2; // Crea el objeto servo2 con las… Leer más »

Alumno
Alumno
2 años

hola N4N0 queremos utlizar tu programación para que el servo de 360 haga mover una puerta de garaje, como lo hacemos?

maiaa
maiaa
3 años

que versión de arduino usas

matias
matias
3 años
En respuesta a  maiaa

[este comentario fue borrado por faltar el respeto]

Ernesto Me
Ernesto Me
3 años

Hola
Una pregunta, ¿no afecta al arduino el que estén conectados 2 o 3 servos directamente a los 5V que da el arduino?

matias
matias
3 años
En respuesta a  Ernesto Me

[este comentario fue borrado por faltar el respeto]

Julio
Julio
3 años

hola amigo sabes como controlar un servomotor por voz? mediante un modulo bluetooth?

miguel
3 años

buen dia no me funciono

Albert
Albert
3 años

Genial, justo lo que buscaba.
Aparte le he añadido un quinto condicional “9”.
Si lee1009 en vez de mover el servo 9…hace un dalay de 100*10…ya tenemos una pausa.

john florian
john florian
3 años

Lo que en realidad necesito es controlar de esa misma forma como controlas los servos la salida PWM de un arduino atraves de otro arduino via monitor serial. Es mas una comunicacion entre maestro y esclavo entre arduino controlando varias salidas pwm, es para un proyecto que estoy realizando.

Cr@ckLinux
Cr@ckLinux
1 año
En respuesta a  john florian

Eso lo puedes hacer via I2C, para establecer la comunicacion entre 2 o mas arduinos de forma que uno sea maestro y el resto esclavos

john florian
john florian
3 años

no se por que no me funciona el codigo con el servo, OMG

john florian
john florian
3 años
En respuesta a  john florian

Ya logre que me funcionara, no tenia al los mismos baudios el monitor serial pero ya si funciono.

oswaldo
oswaldo
3 años

hola amigo estoy haciendo un trabajo para la universidad pero estoy empezando en esto de arduino y me esta costando un poco el proyecto es barreras de tren pero este tiene que funcionar con semáforo el cual cuando el tren viene la luz verde del semaforo se apaga y el led rojo enciende pero las barreras tienen que bajar el problema es que no logro hacer que los dos servos se muevan en el momento que la luz roja encienda ayudame con este codigo muchas gracias.

dani martinez heredia
dani martinez heredia
3 años

Hola, estoy intentando controlar unos servos y dos led’s, los servos se mueven bien, muy bien, pero los led’s no consigo que funcionen. #include Servo servo; Servo servo2; int led1 = 9; int led2 = 10; int enviado; int num; int posicion; void setup() { servo.attach(5); servo2.attach(6); pinMode ( 9, OUTPUT); pinMode ( 10, OUTPUT); Serial.begin(9600); } void loop() { if(Serial.available() >= 0) { enviado = Serial.parseInt(); num = enviado%10; enviado = enviado/10; posicion = enviado; if(num == 1) { servo.write(posicion); } else if(num == 2) { servo2.write(posicion); } else if(num == 3) { analogWrite(led1, posicion); } else if(num ==… Leer más »

Tr4nsduc7or
Admin
3 años
En respuesta a  dani martinez heredia

Hola, Dani.

El código parece estar bien, seguramente será problema de circuito. ¿Has mirado que no tengas la polaridad de los LEDs invertida, y que tengas suficiente energía para alimentar todo el circuito?

Final de línea.

Alberto Lizarraga
Alberto Lizarraga
4 años

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

Alberto Lizarraga
Alberto Lizarraga
4 años
En respuesta a  Alberto Lizarraga

Disculpa se me olvidaba que esto, sera manipulado desde android

osvaldo
osvaldo
4 años

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

Marcelo
4 años

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
Brayan
4 años

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
4 años
En respuesta a  Brayan

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
Gustavo
4 años

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
Gustavo
4 años

Muy buen aporte

Jesus Barraza
Jesus Barraza
4 años

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
freddy
4 años

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
marco
4 años

y para moverlo con un sensor pir

Anónimo
Anónimo
4 años

y para moverlo por medio de un sensor pir?

william pereira
william pereira
4 años

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
4 años

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
4 años
En respuesta a  David

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
jeni
5 años

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

arayarock
arayarock
5 años

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
ale
5 años

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
ale
5 años
En respuesta a  ale

la dirección es https://youtu.be/uJgeMjLmII8

salvador
salvador
5 años

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.

niquito
niquito
4 años
En respuesta a  N4n0

Necesito este codigo pero como declaro las variables de cada cosa? soy nuevo en esto ayuda!”

ale
ale
5 años

fantastico gracias por el aporte

carlos nicolas
carlos nicolas
2 años
En respuesta a  ale

hola, tengo 2 servos y quisiera que se muevan a horas indicadas me ayudas con el codigo por favor