En este post vamos a establecer comunicación entre dos Arduinos UNO Rev.3 a través de un puerto serie virtual denominado “mySerial” que he creado mediante software, 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í.
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)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
/* TITULO: Comunicación serie entre dos Arduinos - Emisor_serie_TX AUTOR: MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia - TWITTER: https://twitter.com/MarianoCampoGa - CORREO: [email protected] DESCRIPCIÓN DEL PROGRAMA Programa que envía un caracter "H" (presionado) o "L" (no presionado), a través del puerto serie "mySerial" creado por software, en función del estado en el que se encuentre el pulsador. ESQUEMA DE CONEXION +-----+ +----[PWR]-------------------| USB |--+ | +-----+ | | GND/RST2 [ ][ ] | | MOSI2/SCK2 [ ][ ] A5/SCL[ ] | | 5V/MISO2 [ ][ ] A4/SDA[ ] | | AREF[ ] | | GND[ ] | | [ ]N/C SCK/13[ ] | | [ ]IOREF MISO/12[ ] | | [ ]RST MOSI/11[ ]~| Pin RX del "Arduino Receptor" | [ ]3V3 +---+ 10[ ]~| | [ ]5v -| A |- 9[ ]~| | [ ]GND -| R |- 8[ ] | | [ ]GND -| D |- | | [ ]Vin -| U |- 7[ ] | | -| I |- 6[ ]~| | [ ]A0 -| N |- 5[ ]~| | [ ]A1 -| O |- 4[ ] | PA | [ ]A2 +---+ INT1/3[ ]~| | [ ]A3 INT0/2[ ] | | [ ]A4/SDA RST SCK MISO TX>1[ ] | | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | | [ ] [ ] [ ] | | UNO_R3 GND MOSI 5V ____________/ \_______________________/ NOTAS: - Los pulsadores suelen tener dos pines, que vamos a denominar PA y PB (si es de 4 sólo usamos 2 de ellos) - Conexión PULL-DOWN del pulsador. - PB conectado a VCC. - PA conectado a GND a través de una R=10K ohms. - Las masas de los dos Arduinos tienen que estar unidas entre sí. */ // Incluimos la librería #include <SoftwareSerial.h> const int Pulsador = 4; // Pin digital para el pulsador int estadoPulsador = 0; // Variable para ver el estado del pulsador // Declaro un nuevo puerto para la comunicación serie SoftwareSerial mySerial(10, 11); // RX, TX void setup() { mySerial.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) { mySerial.write('H'); // Enviamos 'H' por el puerto serie (TX) } else { mySerial.write('L'); // Enviamos 'L' por el puerto serie (TX) } } |
Receptor serie (RX)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
/* TITULO: Comunicación serie entre dos Arduinos - Receptor_serie_RX AUTOR: MARIANO DEL CAMPO GARCÍA (@2016) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia - TWITTER: https://twitter.com/MarianoCampoGa - CORREO: [email protected] DESCRIPCIÓN DEL PROGRAMA Programa que recibe un carácter a través del puerto serie "mySerial" creado por software: - Si el carácter recibido es "H" se enciende el LED (pulsador presionado). - Si el carácter recibido es "L" se apaga el LED (pulsador no presionado). ESQUEMA DE CONEXION +-----+ +----[PWR]-------------------| USB |--+ | +-----+ | | GND/RST2 [ ][ ] | | MOSI2/SCK2 [ ][ ] A5/SCL[ ] | | 5V/MISO2 [ ][ ] A4/SDA[ ] | | AREF[ ] | | GND[ ] | | [ ]N/C SCK/13[ ] | | [ ]IOREF MISO/12[ ] | | [ ]RST MOSI/11[ ]~| | [ ]3V3 +---+ 10[ ]~| Pin TX del "Arduino Emisor" | [ ]5v -| A |- 9[ ]~| | [ ]GND -| R |- 8[ ] | | [ ]GND -| D |- | +5V | [ ]Vin -| U |- 7[ ] | | -| I |- 6[ ]~| | [ ]A0 -| N |- 5[ ]~| LED(+) | [ ]A1 -| O |- 4[ ] | | [ ]A2 +---+ INT1/3[ ]~| | [ ]A3 INT0/2[ ] | | [ ]A4/SDA RST SCK MISO TX>1[ ] | | [ ]A5/SCL [ ] [ ] [ ] RX<0[ ] | | [ ] [ ] [ ] | | UNO_R3 GND MOSI 5V ____________/ \_______________________/ NOTAS: - Cátodo(-) del LED (pata más corta) a GND a través de una R=220 omhs. - Este Arduino se alimenta conectando el pin "Vin" a los +5V del "Arduino Emisor". - Las masas de los dos Arduinos tienen que estar unidas entre sí. */ // Incluimos la librería #include <SoftwareSerial.h> const int LED = 5; // Pin digital para el LED char estado; // Declaro un nuevo puerto para la comunicación serie SoftwareSerial mySerial(10, 11); // RX, TX void setup() { mySerial.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 (mySerial.available()) { // Almaceno el carácter que llega por el puerto serie (RX) estado = mySerial.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); } } } |