¿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 Serial te permiten conectar dos dispositivos diferentes enviando y recibiendo 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)
En este post explicamos las ventajas de utilizar la libreria SoftwareSerial para simular un puerto Serie mediante el Arduino IDE (Puerto serie Virtual).
Puertos serie en Arduino y PLCs industriales Arduino utilizando Industrial shields
Arduino Uno incluye 1 puerto serial TTL desde pin 0 y pin 1. Este trabaja desde UART, pero existe la posibilidad de usar otros pines como Serial TTL. Por ejemplo, todos los pines digitales pueden funcionar como Tx, pero los pines de comunicación SPI también se pueden configurar como Rx, por lo que podrás agregar al menos 3 puertos SoftwareSerial adicionales. Mira en las especificaciones técnicas de Arduino UNO dónde se explica que el Rx y Tx de la UART comparten el puerto USB, por lo que si necesitas usar Rx y Tx desde UART, el puerto USB no se puede usar. También hay otras características que afectan el uso de Arduino UNO por lo que recomendamos el uso de Arduino Leonardo y Arduino Mega si necesitas usar ambos puertos, USB y Serial TTL.
IComo 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 chicp 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
Utilizando Una shield Industrial para Arduino como la de Industrial Shields, esta ya lleva incorporados los estandares industriales de comunicación como son RS485 y/o RS232. En el caso de los Ardbox, al utilizar Arduino Leonardo y disponer unicamente de un puerto Serie TTL, solo uno de estos tipos de comunicación se podrán utilizar con la libreria Hardwareserial.h por lo que el otro deberá utilizar la libreria softwareserial.h. En este caso la configuración del puerto para trabajar con cada una de las librerias se puede hacer mediante unos jumpers que lleva el equipo en su interior. En el caso de la famila Ethernet PLC este ya permite el uso de los dos puertos de comunicación simultanea al incorporar en su interior una placa Arduino MEGA y disponer de más puertos de comunicación TTL.
Ejemplo de uso
Requisitos
PLC Ethernet o 20 I/Os: Ethernet PLC 20 I/Os PLC
Librería SoftwareSerial: Biblioteca de software en serie
Configuration
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 habilitados para Rx para Tx.
Por el Arduino MEGA
En el Arduino MEGA, todos los pines pueden ser usados para Tx, mientras que para hile 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 (MOSI)
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");
}