Saltar al contenido

Comunicación Serial con Arduino

Hola controleros y controleras, en el día de hoy vamos a aprender a usar la comunicación serial con Arduino, la cual nos será de mucha utilidad para poder monitorear nuestros proyectos e incluso poder hacer un debug en Arduino (corrección de errores de nuestro código).

Antes de comenzar, te hago la invitación a que visites el CURSO GRATIS DE ARDUINO

Y te invito a que te suscribas al canal de YouTube si deseas seguir aprendiendo más sobre programación en Arduino.

¿Qué es la comunicación serial en Arduino y cómo se utiliza?

La comunicación serial en Arduino es una forma de comunicación entre dispositivos en la que se envían y reciben datos un bit a la vez a través de un canal de comunicación. En Arduino, la comunicación serial se utiliza para enviar y recibir datos entre la placa Arduino y un ordenador o cualquier otro dispositivo externo.

Los puertos de comunicación serial nos proporcionan la forma más efectiva de comunicar nuestra paca de Arduino con nuestro ordenador, y como podrás notarlo a través de esta comunicación podremos mandar diferentes órdenes a nuestro Arduino para automatizar procesos o incluso recibir informaciones importantes para mostrarlas en la pantalla de nuestro computador.

La comunicación serial entre dos dispositivos únicamente utiliza 3 líneas las cuales son:

  1. Línea de recepción de datos (RX)
  2. Línea de transmisión de datos (TX)
  3. Línea común (GND)
Comuicacion serial

El GND, el RX y TX del Arduino son facilmente identificables en la placa. Aquí te cuento cuantos puertos seriales y los pines que tiene el Arduino UNO, mini pro, MEGA y Due.

  1. Arduino UNO y Mini Pro: Pines 0 (RX) y 1 (TX);
  2. Arduino Mega y Arduino Due:  son cuatro puertos de serie.
    1. puerto serie 0: pines 0 (RX) y 1 (TX)
    1. puerto serie 1: pines 19 (RX) y 18 (TX)
    1. puerto serie 2: pines 17 (RX) y 16 (TX)
    1. puerto serie 3: pines 15 (RX) y 14 (TX)

¿Que es TX y RX en Arduino?

El TX y RX del Arduino son los dos pines que emplea el dispositivo para realizar la comunicación por medio del protocolo serial. Los datos, por lo tanto son transmitido en la linea o pin TX y son recibidos por la linea o pin RX.

Comunicación UART Arduino

La comunicación serial entre dos dispositivos se realiza a través del intercambio de una secuencia de bits, donde se transmite bit a bit, uno por vez, donde, aunque es lenta la comunicación, tiene la ventaja de poder ser transmitida a mayores distancias y utilizar menos líneas de comunicación.

señal asincrona

En sistemas embebidos es común referirse a los puertos series como UART (universally asynchronous receiver/transmitter) la cual simplemente es una unidad que nos indica la conversión de los datos a una secuencia de bits donde posteriormente son transmitidos o recibidos a una velocidad determinada.

La comunicación serial también se da mediante variaciones de voltaje, donde dispositivos TTL (transistor transistor logic) realizan la comunicación mediante variaciones de señal entre 0 y 5v o entre 0 y 3.3v.

Por último, también es conocida como comunicación serial RS232 el cual es un protocolo muy común utilizado industrialmente por diversos dispositivos y equipos. La comunicación serial de Arduino RS232 puede ser utilizada para adquisición de datos, control, depuración de código, etc.

Puerto Serie del Arduino

Las placas de Arduino poseen unidades UART que operan a nivel TTL  0 / 5v, lo que las vuelve compatibles con la conexión USB.

Como ya vimos los pines de los puerto seriales, podemos notar también que la mayoría de Arduinos disponen de um conector USB que nos permite una conexión serie instantánea con nuestro ordenador.

Comunicación Serial con Arduino

Puedes encontrar productos interesantes en la tienda china de Aliexpress

Quizas te interese algunos productos de Arduino en Amazon a un mu buen precio.

Comunicación Serial Arduino PC

Para utilizar la comunicación serial en Arduino, primero se debe abrir la comunicación serial mediante el comando Serial.begin(). Este comando establece la velocidad de transmisión en baudios y se utiliza para indicar a la placa Arduino que está lista para enviar y recibir datos. Por ejemplo, el comando Serial.begin(9600) establece la velocidad de transmisión en 9600 baudios.

Para verificar que los datos están siendo transmitidos correctamente, se puede utilizar el Monitor Serial de Arduino. Este es una herramienta incluida en el software de Arduino.

Una vez conectamos nuestro Arduino a nuestro computador a través del cable USB, dentro del IDE de arduino podemos acceder al Monitor Serial

Monitor Serial Arduino

El monitor serie de Arduino es una interfaz grafica integrada al IDE Standard que nos permite recibir o transmitir datos utilizando el protocolo de comunicación serial, por lo tanto dicho monitor serial dispone de ambas zonas (recepción y transmisión)

Una vez que se ha abierto la comunicación serial, se pueden enviar y recibir datos mediante los pines RX (recepción) y TX (transmisión) de la placa Arduino. Estos pines se utilizan para transmitir y recibir datos a través del canal de comunicación serial.

Pasos para trabajar con la comunicación serial con Arduino

Definir dentro del void setup del Arduino la comunicación serial mediante la siguiente instrucción

Serial.begin(velocidad);

Donde velocidad puede tomar los siguientes valores: 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 o 115200.

La unidad de medida de las velocidades son el Baudio correspondiente al número de cambios en una señal por segundo.

Cuando realizamos una comunicación serial con Arduino será necesario establecer los Baudios del Arduino y los Baudios del dispositivo al que nos vamos a comunicar (Ambos dispositivos deben tener la misma velocidad en baudios).

  1. Dentro del void loop, se pueden imprimir o mostrar los datos en el Monitor Serial mediante la instrucción:
Serial.print(dato);

2. También puede mostrar el dato con un enter al final

Serial.println(dato);

3. Para leer datos desde el puerto serial se usa:

dato = Serial.read();

4. Para escribir en el puerto serie de Arduino, datos en forma de bytes se usa:

Serial.write(dato);

5. Para conocer si existen datos pendientes en el bus de comunicación serial usamos:

Serial.available()

Esta instrucción retorna un TRUE si es verdad o un FALSE si es falso.

6. Para deshabilitar el puerto serial y de esa forma poder usar los pines TX y RX como pines digitales, usamos:

Serial.end()

7. Si deseamos preguntar si el puerto serial está listo para efectuar la comunicación:

if (Serial)

Devuelve true si el puerto serial el cual se ha especificado está disponible.

8. Para leer los datos del buffer y buscar un string especifico usamos el comando:

Serial.find(string);

9. Si se desea configurar el máximo de milisegundos que desea esperarse mientras llega un dato por el puerto serial (por defecto es 1000ms), se usa:

Serial.setTimeout(time);

10. Para saber cuando los datos están disponibles y poder utilizar Serial.read() para capturar estos datos usamos la siguiente instrucción que actualmente no es compatible con Esplora, Leonardo o Micro

serialEvent();

11. Para esperae a que se complete la transmisión de los datos seriales salientes.

Serial.flush();

12. Para devolver el siguiente byte (carácter) de los datos en serie entrantes sin eliminarlos del búfer interno se usa:

Serial.peek();

13. Para leer caracteres del buffer serie y guardarlos en un string hasta que se produzca un timeout usamos:

Serial.readString();

Arduino Mega o Due con más de 1 puerto serial

En el caso de trabajar con una placa que poseea más de 1 puerto serial como es el caso del Arduino Mega o el Due, las instrucciones a usar son exactamente las mismas, con exepeción de que el puerto serial por defecto (el que esta conectado al USB o puerto serial 0) se conoce como Serial, el puerto serial 1, 2 y 3 se conocen como Serial1, Serial2 y Serial3 respectivamente.

Por lo tanto para imprimir o leer datos puede hacerse de la siguiente forma:

Serial1.print(dato); //Imprime en el puerto serie 1
dato = Serial3.read(); //lee el puerto serie 3
Serial2.write(dato); //Escribe el dato en puerto serie 2

Ejemplos y Códigos en Arduino

Veamos como usar el monitor serial de Arduino utilizando el protocolo de comunicación serial

Recibir datos serial desde el Arduino

Recibir el valor de una variable contador enviado desde la placa Arduino a través del puerto de comunicación serial y mostrarlos en el monitor serial.

//Creamos un contador
int contador=0;
 
void setup(){
  //Configuramos el puerto serial
  Serial.begin(9600);
}
 
void loop(){
  //Imprimimos el valor del contador en el monitor serial
  Serial.print("Contador: ");
  Serial.println(contador);  
  //incrementamos el contador y esperamos medio segundo
  contador++;
  delay(500);
}

Enviar datos serial al Arduino

Vamos enviar un número desde el computador y mostrarlo en un display 7 segmentos integrado a la placa de Arduino, adicionalmente conectar un LED al PIN 13 el cual debe ser prendido o apagado a través de la comunicación serial.

Comunicación Serial con Arduino

Con este ejemplo muy práctico vamos a aprender a ingresar datos por monitor serial al Arduino, el cual es una aplicación bastante común con este dispositivo embebido.

//Display 7 Segmentos Catodo Común
int display7c[10]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};

//Display 7 Segmentos Anodo Común
int display7a[10]= {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18};

//Pines del Display
byte a=2;
byte b=3;
byte c=4;
byte d=5;
byte e=6;
byte f=7;
byte g=8;

int dato=0;
byte led = 13;

//Función Display 7 Segmentos
void display7seg(int bits,int a,int b,int c,int d,int e,int f,int g){

  //Mostra o numero bits no display 7 segmentos
  digitalWrite(a,bitRead(bits,0));
  digitalWrite(b,bitRead(bits,1));
  digitalWrite(c,bitRead(bits,2));
  digitalWrite(d,bitRead(bits,3));
  digitalWrite(e,bitRead(bits,4));
  digitalWrite(f,bitRead(bits,5));
  digitalWrite(g,bitRead(bits,6));
}

void setup(){
   //Configura los 8 Pines digitales como SALIDAS
  for(int i=a;i<=g;i++){
    pinMode(i,OUTPUT);
  }
  Serial.begin(9600);
  pinMode(led, OUTPUT); 
  //Inicializa el display 7 segmentos
  display7seg(display7c[dato],a,b,c,d,e,f,g);
}
 
void loop(){
  //si existe datos disponibles en el bus serial
  if (Serial.available()){
    //leemos el dato enviado
    dato=Serial.read();
    if(dato=='p') { //letra   p - Prender
      digitalWrite(led, HIGH);
      Serial.println("LED ON");
    }
    if(dato=='a') { //letra a - Apagar
      digitalWrite(led, LOW);
      Serial.println("LED OFF");
    }

    if(dato>='0' && dato<='9') { //letra a - Apagar
      display7seg(display7c[dato-48],a,b,c,d,e,f,g);
      Serial.print("DATO: ");
      Serial.println(dato-48);
    }
  }
}

Perfecto controleros y controleras, eso es todo por el día de hoy, espero hayan aprendido a como utilizar la comunicación serial del Arduino.

Recuerda que si deseas apoyar mi trabajo, puedes invitarme a un café y seguirme ayudando a mantener los servidores de este sitio web, es muy barato el café y contribuyes con el tiempo y esfuerzo invertidos en las clases elaboradas en el canal y pagina web: 👉Invitar a un Café a Sergio ☕️

Espero que esten muy bien y nos vemos en la próxima.

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Comentarios (11)

Cómo puedo simular entradas seriales. Estoy usando Proteus con Arduino y quiero simular la entrada serial tecleando desde mi laptop. Todo en simulación.

Responder

Jesus, puedes hacer uso de la herramienta Virtual Terminal del proteus, con ella puedes simular las comunicaciones seriales con tu arduino y puedes digitar los comandos directamente desde tu laptop. El virtual terminal se encuentra en el lado izquierdo en la sección de «Instruments», debes conectarlo al RX y TX del arduino de forma cruzada.

Responder

Muy buen articuo!!
Necesito mandar coordenadas por los puertos seriales, como se podría realizar eso ??

Responder

necesito conectar 15 circuitos RFID, e identificar por cual de ellos entro la lectura, con arduino mega he logrado conectar 4, pin 19, 17, 15 y pin 13, cuando conecto por el pin 11 no me da lectura por los 5 puertos, solo por 4, pines 19,17,15 y 13 o 11 dependiendo la posición de la programación en el código fuente de estos últimos dos (solo toma el ultimo independientemente como los ubique en el código fuente), la pregunta es puedo crear de alguna manera mas puertos seriales en un arduino mega? o me tocaría utilizar 3 arduinos para suplir esta necesidad?. de antemano gracias por su colaboración, sugerencias u observaciones.

Responder

Excelente tutorial! saludos desde República Dominicana

Responder

Gracias Emmanuel, saludos!

Responder

Muy buena la presentacion y los detalles, pero te hago una consulta que no le encuentro respuesta todavia, pues vengo de la epoca del pic y siempre programe en assembler. como hago para que el arduino devuelva a la pc por puerto serie un numero xx sin sumarle 30h? pues lo que me esta haciendo en las pruebas que realizo es devolverme el equivalente en ascii pero no el numero que envio, por ejemplo si envio desde el arduino a la pc el nro. «1» o el «2», desde la pc veo el 31 o el 32 que son los valores ascii en hexa correspondientes a lo que envie?? todo viene al caso pues estoy jugando con un protocolo y necesito trabajar con valores que se consideran de control en ascii y el arduino al transmitirlos los altera. desde ya gracias.-

Responder

Por el puerto serial el va a mandar siempre el ASCII, para hacer protocolos de comunicación es siempre mejor enviar directamente los datos en hexadecimal.

byte arrayBytes [] = {0x01, 0x02};
Serial.write(arrayBytes, 2);
Responder

mil gracias.

Responder

Muy bueno y claro de entender

Responder

Gracias Salomón, me alegra que te haya gustado el contenido. Saludos!

Responder