Índice
¿Qué es la comunicación en serie con Arduino? ¿Cómo se utiliza la biblioteca en el IDE de Arduino?
Hay diferentes tipos de comunicaciones en serie. Cuando usas una placa Arduino en un proyecto puedes elegir los pines Seriales estándar como Rx Tx del software Arduino, desde la UART dentro de la placa Arduino, por lo que se llama Serial TTL. En ese caso, utilizarás la librería Hardwareserial.h, pero algunos pines adicionales pueden funcionar como Rx o Tx. Por ejemplo, los pines de comunicación SPI pueden funcionar como MISO, MOSI y Select (SC), pero también son pines que pueden funcionar como entrada o salida digital, o si lo necesitas, podrías usar esos pines como Rx, Tx usando la librería softwareserial.h.
Las comunicaciones en serie permiten conectar dos dispositivos distintos para enviar y recibir datos entre ellos.
El puerto Serial TTL se puede transformar a un estandar Industrial cómo son RS232 y RS485. Cuándo utilizas RS232, la funcionalidad es bastante similar a cuando trabajas directamente con el puerto Serial TTL aúnque trabajas a un rango de voltaje estandarizado ya que Serial TTL para una placa Arduino Uno, Mega o Leonardo trabaja a 5V. En cambio si utilizas el puerto RS485 puedes configurar una red de comunicaciones entre dispositivos dónde defines un equipo que trabaje como MAESTRO (Master) conectado a varios dispositivos configurados como ESCLAVOS (Slave). En este caso el numero de dispositivos que puedes conectar es de entre 2 a 32 dispositivos (comunmente llamados Nodos). La máxima distáncia entre estos dispositivos será de hasta 1220m siempre y cuando el cableado esté bien echo y cumpliendo con los requisitos EMC y el ruido eléctrico haya sido minimizado.
En resumen, si estás utilizando el puerto serie UART del Arduino o del PLC basado en Arduino para proyectos industriales. El uso de otros pines que funcionen como TTL Serial puede ayudarte con el éxito del desarrollo de tu proyecto. Por lo tanto, ese puerto serie adicional debe ser programado utilizando la biblioteca softwareserial.h.
Si no puedes utilizar la Librería HardwareSerial, porque necesitas utilizar un protocolo de comunicación que necesite de la comunicación originaria de la UART física de la placa en lugar de utilizar un puerto seria virtual. En estos casos necesitarás convertir el estándar RS232 o RS485 del dispositivo a Puerto Serie TTL. (Este ejemplo lo mostraremos en otro post)
Este post explica la ventaja de la biblioteca SoftwareSerial para simular un puerto serie mediante software (TTL serie virtual) con el IDE de Arduino.
Puertos serie en Arduino y PLCs industriales Arduino utilizando Industrial shields
Arduino Uno incluye 1 puerto serie TTL en los pines 0 y 1. Funciona desde la UART, pero es posible usarlo como TTL con otros pines. Por ejemplo, todos los pines digitales pueden funcionar como Tx, pero los pines de comunicación SPI pueden funcionar como Rx, por lo que podrías añadir al menos 3 puertos SoftwareSerial adicionales. Consulta en las especificaciones técnicas de Arduino UNO que Rx y Tx se comparten con el puerto USB, por lo que, si necesitas usar Rx y Tx de la UART, no se puede usar el puerto USB. Otras características afectan al uso de Arduino UNO, por lo que recomendamos usar Arduino Leonardo y Arduino Mega si necesitas utilizar ambos puertos, USB y Serial TTL.
Como se observa en las carecteristicas técnicas de Arduino MEGA, Esta incluye 4 puertos Serie TTL independientes. Utilizando la placa Arduino Leonardo, tiene unicamente un único puerto Serie TTL si bien este está separado del puerto USB de la placa.
De todos modos, en ningún caso recomendamos el uso del puerto USB para enviar y recibir datos ya que este ha estado diseñado para la carga del programa. Cuando se utiliza el puerto USB de la placa Arduino para enviar datos, ya sea por envio de muchos datos o por altas velocidades, el chip se desprograma y puede dar problemas de comunicación dificiles de arreglar en un proyecto industrial por lo que recomendamos el uso de RS232 en lugar de USB para estos casos.
Uso de un controlador industrial Arduino
Con un Arduino Industrial Shield, la configuración estándar ya está hecha. Por tanto, puedes conectarte directamente a los puertos de comunicación RS232 y RS485, pero solo uno de ellos puede funcionar con serie por hardware, así que el otro debe configurarse como SoftwareSerial. Debes configurar los jumpers internos para definir qué puerto debe funcionar como serie por hardware y cuál como SoftwareSerial, porque el PLC permite configurar cuál de ellos puede funcionar como serie por hardware.
Ejemplo de uso
Requisitos
- PLC Ethernet o de 20 E/S: PLC Ethernet PLC de 20 E/S
- Librería SoftwareSerial: Biblioteca de software en serie
Configuración
Por el Arduino LEONARDO
Todos los pines se pueden usar para Tx en el Arduino LEONARDO, mientras que para Rx se pueden usar los siguientes:
Pin 14 de Leonardo (SO)
Pin 15 de Leonardo (SCK)
Pin 16 de Leonardo (SI)
Recomendamos usar uno de los pines con Rx habilitado para Tx.
Por el Arduino MEGA
En el Arduino MEGA, todos los pines pueden ser usados para Tx, mientras que para Rx se pueden usar los siguientes:
Pin 50 del Arduino Mega 2560 (SO)
Pin 51 del Arduino Mega (SI)
Pin 52 del Arduino Mega (SCK)
Recomendamos usar uno de los pines Rx habilitados para Tx. Usando una placa Arduino (este ejemplo se ha realizado utilizando Arduino Leonardo, Arduino Uno y Arduino Mega. Si necesitas utilizar otras placas Arduino, puedes consultar las especificaciones técnicas de esa placa).
Software
Rx es el pin digital 14 (SO), conectado a TX del otro dispositivo.
Tx es el pin digital 15 (SI), conectado aRX del otro dispositivo.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(14, 15); // RX (MISO), TX (SCK)
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println("Goodnight moon!");
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
mySerial.println("Hello, world?");
}
void loop() // run over and over
{
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}Este otro código envía instrucciones a través del serial del software:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(14, 15); // Rx (MISO), Tx (SCK)
void setup() {
// put your setup code here, to run once:
mySerial.begin(9600);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
delay(500);
mySerial.println("Instruction 1");
Serial.println("1st instruction sended");
delay(500);
mySerial.println("Instruction 2");
Serial.println("2nd instruction sended");
}