jueves, 10 de marzo de 2016

Comunicación serie entre dos Arduinos


En este POST vamos a conectar dos Arduinos UNO Rev.3 a través de un puerto serie denominado “mySerial” que he creado mediante software, gracias a la librería  , en los pines digitales 10 (Recepción à RX) y 11 (Emisión à TX) de cada uno de los Arduinos. Es necesario realizar dos montajes, el del “Arduino Emisor”, que va a ser el que tiene conectado el pulsador (pin digital 4) y está alimentado a través del puerto USB de nuestro PC, y el del ”Arduino Receptor” que es el que tiene conectado el LED (pin digital 5) y que está alimentado directamente a través del pin Vin mediante los +5V que entrega el “Arduino Emisor”. Las masas (GND) de ambos Arduinos deben estar conectadas entre sí.
Diagrama de conexión serie RX/TX entre los Arduinos

Para realizar una comunicación serie unidireccional satisfactoria entre los dos Arduinos, simplemente tenemos que conectar el pin 11 (TX) del “Arduino Emisor” al pin 10 (RX) del “Arduino Receptor”, para posteriormente cargar los correspondientes programas. Si todo está correcto veremos que el LED conectado al “Arduino Receptor” permanecerá encendido mientras estemos presionamos el pulsador conectado al “Arduino Emisor”. Es un ejemplo muy sencillo al cual vosotros podéis ir añadiendo mayor número de componentes y que se ejecuten muchas más funciones (podéis intentar realizar una comunicación bidireccional entre los dos Arduinos). Para mayor información consultar los comentarios del código del programa.

Lista de Materiales:


·         2 Arduinos UNO Rev.3.

·         Cable USB tipo A-B.

·         Pulsador.

·         LED de 3mm (de cualquier color).

·         Resistencias de 220Ω y 10KΩ.

·         Protoboard.

·         Cables de conexión.


Código del programa:

·         Emisor serie (TX) :




·         Receptor serie (RX) :




Video:

41 comentarios:

  1. gracias!! funciono muy bien con arduino leonardo como receptor tambien. solo que no funciona conectando 5v del emisor al Vin de leonardo, asique lo conecte irecto a los 5v del legonardo.

    ResponderEliminar
  2. Una pregunta... A que distancia maxima se puede usar la comunicacion serial entre Arduinos. Tienes alguna pagina que proveea la informacion tecnica de Serial, I2C y SPI?

    ResponderEliminar
    Respuestas
    1. Perdon Ingeniero, pero esa respuesta no es muy profesional, buscar en google es lo tipico, creo , muchos hemos llegado a Usted de esa manera !, espero no le ofenda mi comentario.

      Eliminar
    2. comprate un diccionario gilipollas

      Eliminar
  3. Hola me podrías ayudar estoy realizando una simulación en Proteus con los dos condigos TX y RX pero en el receptor no menciona no ingresa al If(mySerial.available())

    ResponderEliminar
    Respuestas
    1. Lo siento, yo no trabajo con Proteus!!!

      Eliminar
    2. Para proteus, hay que cambiar un poco el código, se conecta emisor rx con recetor tx y emisor tx con emisor rx:


      para el receptor queda asi:


      const int LED = 5; // Pin digital para el LED
      char estado;


      void setup()
      {
      Serial.begin(9600); // Comienzo de la comunicación serie
      pinMode(LED, OUTPUT); // Pin digital 5 como salida
      }

      void loop()
      {
      // Si por el puerto serie llegan datos (RX)
      if (Serial.available())
      {
      // Almaceno el carácter que llega por el puerto serie (RX)
      estado = Serial.read();

      // Si es una 'H'
      if (estado == 'H')
      {
      // Enciendo el LED (nivel ALTO)
      digitalWrite(LED, HIGH);
      }

      // Si es una 'L'
      if (estado == 'L')
      {
      // Apago el LED (nivel BAJO)
      digitalWrite(LED, LOW);
      }
      }
      }


      y para el emisor queda asi:

      const int Pulsador = 4; // Pin digital para el pulsador
      int estadoPulsador = 0; // Variable para ver el estado del pulsador

      void setup()
      {
      Serial.begin(9600); // Comienzo de la comunicación serie
      pinMode(Pulsador, INPUT); // Pin digital 4 como entrada
      }

      void loop()
      {
      // Lee y almacena el estado del pulsador
      estadoPulsador = digitalRead(Pulsador);

      // Si el pulsador está presionado
      if (estadoPulsador == HIGH)
      {
      Serial.write('H'); // Enviamos 'H' por el puerto serie (TX)
      }
      else
      {
      Serial.write('L'); // Enviamos 'L' por el puerto serie (TX)
      }
      }

      Eliminar
  4. Una pregunta, con dos arduinos mega tambien se puede verdad , solo que en la configuracion se utilizaran los pines RX y TX correspondientes a los que vengan en dicho arduino.

    ResponderEliminar
    Respuestas
    1. Eso es, aunque puedes utilizar cualquier pin para la comunicación serie si utilizas la librería SoftwareSerial.h. Saludos

      Eliminar
  5. y si quiero q el esclavo le responda al maestro como haria

    ResponderEliminar
  6. De la misma manera pero cambiando el rol de cada dispositivo. Tendrias que conectar RX1 a TX2 y RX2 a TX1. De esta manera los dos arduinos podrían leer y escribir con serial.read y serial.write respectivamente (o en su defecto el software serial que estes utilizando)

    ResponderEliminar
  7. Estimado, creo que usted me puede ayudar, estoy empezando en el mundo arduino y quiero transmitir 2 variables de temperatura y humedad inalambricamente, a traves de unos modulos de tx/rx HAC UM 96, que se conectan mediante puerto serial, el tema es que puedo enviar solo 1 dato a la vez EJ: si envio 56, el arduino receptor me indica que recibio solo 5 y el 6 lo representa con un simbolo.

    Me puedes ayudar con eso? creo que tengo que almacenar los datos obtenidos por el sensor, en una cadena, enviar 1 a la vez y recibirlos pero no tengo claridad como realizar,

    GRacias por tu ayuda

    ResponderEliminar
  8. hola muy bueno tu proyecto, pero quisiera saber si el esclavo le puede mandar una función al maestro y de el maestro a un modulo bluetooth para que se conecte con un celular andriod ??

    ResponderEliminar
  9. Hola si me funciono el proyecto pero como le puedo hacer para poner otro led

    ResponderEliminar
  10. Buenos dias, se podria usar otros pines digitales para esta transmision?

    ResponderEliminar
  11. si. Los que configures tu mediante softwareSerial

    ResponderEliminar
  12. Una duda...
    En la parte:

    mySerial.write('H'); // Enviamos 'H' por el puerto serie (TX)

    Estas convirtiendo la letra H en información en bytes, y en el ardudino receptor identifica esa información de bytes como H. Por lo tanto Yo puedo poner más letras para indicar más acciones.
    Estoy en lo correcto?
    Tiene algún tipo de sintaxis lo que va dentro de "mySerial.write()" (cierta cantidad de letras, numero signos)?

    ResponderEliminar
  13. muy buena explicacion! me agrado lo probare, gracias!

    ResponderEliminar
  14. Por supuesto que si, un maestro enviando a varios esclavos.

    ResponderEliminar
  15. Con cualquier pin funciona? es que lo estoy conectando con el arduino nano y no funciona

    ResponderEliminar
    Respuestas
    1. Funciona con cualquier pin que definas con "SoftwareSerial". Te recomiendo no utilizar los pines TX-RX que el arduino Nano trae por defecto. Saludos

      Eliminar
  16. Hola. Si después de probar el proyecto con arduino, quisiera usar simplemente los atmega328p en un pcb, la comunicación serie se puede hacer simplemente conectando los pines rx y tx, o necesito algo más para que funcione? Muchas gracias por la ayuda

    ResponderEliminar
  17. Para que funcione el micro le tienes que instalar un circuito previo con el cristal oscilador y unos filtros RC, ademas de cargarle el bootloader antes que el programa propio...

    ResponderEliminar
  18. se puede programar un attiny85 con este puerto serial y abrir comunicacion con un arduino?

    ResponderEliminar
  19. Hola muy buen tutorial, me gustaria saber si es posible conectar varios arduinos en serie. ejemplo 5 arduinos

    ResponderEliminar
  20. Hola excelente explicación...una pregunta, las letras H y L son las únicas que se pueden enviar o se puede definir una letra para cada función a realizar?

    ResponderEliminar
  21. Muchas gracias por tu trabajo, nos ha venido fenomenal y hemos logrado nuestro objetivo. Gracias por tu ayuda!

    ResponderEliminar
  22. hola, me enviaron a hacer un proyecto similar, pero me indicaron que la conexion entre 2 arduinos se debe hacer con un CI MAX232, pero estuve leyendo acerca de eso y tengo algunas dudas, me puedes ayudar con esta inquitud, entre 2 arduinos se debe conectar el CI MAX232?...muchas gracias

    ResponderEliminar
    Respuestas
    1. Yo nunca lo he realizo pero te paso unos links donde viene todo. Parece simple, montas un max232 en cada arduino, unes los max232 entre si y comunicas los arduinos por comunicación serie normal tx y rx como si te fueras a comunicar con el monitor del IDE de Arduino.

      https://arduinodiy.wordpress.com/2012/03/19/serial-connection-for-your-arduino-atmega/

      https://aprendiendoarduino.wordpress.com/tag/rs232/

      Eliminar
    2. revisare los link, agrezco mucho tu ayuda y pronta respuesta

      Eliminar
  23. hola. muy buen proyecto, solo una pregunta, si quiero poner mas pulsadores para poner mas leds de salidas, hago el mismo procedimiento y puedo poner cualquier letra como valor? gracias

    ResponderEliminar
    Respuestas
    1. Esa seria la idea, pero para que te enciendan y se queden prendidos solamente tienes que enviar la letra una sola vez, porque en mi programa la 'L' se estaria enviando siempre que no estes presionando el pulsador y te creara conflicto con el otro que pongas....

      Eliminar
  24. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  25. Hola, disculpa quiero usar un protocolo de comunicacion rs232 con pid, ya tengo el PID y funciona correctamente solo que no se como implementar el protocolo de comunicacion

    ResponderEliminar
  26. Muy buenos días ingeniero. Te comento, voy a probar con los STM32 NUCLEO. Porque quiero comunicarlos con los módulos XBee PRO S2. Me gustaría poder hacerte unas consultas... mi mail carlos.porras.tobar@gmail.com; muy agradecido de antemano.

    ResponderEliminar
  27. Hola me puede ayudar con una programacion

    ResponderEliminar