Está en la página 1de 11

COMUNICACIÓN CON ARDUINO MEDIANTE

PUERTO SERIE

Laboratorio de Robótica Educativa


Francisco José Mir Vera Ing. Ricardo Silva Teseira
fjmirvera@gmail.com rsilvateseira@gmail.com

Ing. Jorge Buabud


jbuabud@gmail.com

Año 2021
Laboratorio de Robótica Educativa - UTNFRT
Comunicación con Arduino mediante puerto serie

Contenido
¿Qué es puerto serie? .................................................................................................................... 3
Arduino y puerto serie..................................................................................................................... 4
Conexión de Arduino con una PC .................................................................................................. 5
Códigos de ejemplo ........................................................................................................................ 6
Recibir información desde Arduino ........................................................................................... 6
Enviar información a Arduino ...................................................................................................... 7
Enviar valores numericos............................................................................................................ 7
Arduino seria plotter........................................................................................................................ 8
SoftwareSerial library .................................................................................................................... 10
Limitaciones ............................................................................................................................... 10

Año 2021 – Pág. 2 de 11


Laboratorio de Robótica Educativa - UTNFRT
Comunicación con Arduino mediante puerto serie

Los puertos serie son la forma principal de comunicar una placa Arduino con un ordenador.
Gracias al puerto serie podemos, por ejemplo, mover el ratón o simular la escritura de un usuario
en el teclado, enviar correos con alertas, controlar un robot realizando los cálculos en el
ordenador, encender o apagar un dispositivo desde una página Web a través de Internet, o desde
una aplicación móvil a través de Bluetooth.

Existen un sin fin de posibilidades en las que se requiere el empleo del puerto serie. Por
tanto el puerto serie es un componente fundamental de una gran cantidad de proyectos de
Arduino, y es uno de los elementos básicos que debemos aprender para poder sacar todo el
potencial de Arduino.

En esta clase aprenderemos el funcionamiento básico de los puertos serie en Arduino. Al final
se adjuntan varios códigos de ejemplo, pero antes conviene explicar brevemente algo de teoría
sobre qué es un puerto serie, y algunos términos que necesitaremos para entender
correctamente el funcionamiento del puerto serie.

¿QUÉ ES EL PUERTO SERIE?


Un puerto es el nombre genérico con que denominamos a los interfaces, físicos o virtuales,
que permiten la comunicación entre dos ordenadores o dispositivos.

Un puerto serie envía la información mediante una secuencia de bits. Para ello se necesitan
al menos dos conectores para realizar la comunicación de datos, RX (recepción) y TX (transmisión).
No obstante, pueden existir otros conductores para referencia de tensión, sincronismo de reloj,
etc.

Por el contrario, un puerto paralelo envía la información mediante múltiples canales de


forma simultánea. Para ello necesita un número superior de conductores de comunicación, que
varían en función del tipo de puerto. Igualmente existe la posibilidad de conductores adicionales
además de los de comunicación.

Año 2021 – Pág. 3 de 11


Laboratorio de Robótica Educativa - UTNFRT
Comunicación con Arduino mediante puerto serie

Históricamente ambos tipos de puertos han convivido en los ordenadores, empleándose los
puertos paralelos en aquellas aplicaciones que requerían la transmisión de mayores volúmenes
de datos. Sin embargo, a medida que los procesadores se hicieron más rápidos los puertos de
serie fueron desplazando progresivamente a los puertos paralelos en la mayoría de aplicaciones.

Un ordenador convencional dispone de varios puertos de serie. Los más conocidos son el
popular USB (universal serial port) y el ya casi olvidado RS-232 (el de los antiguos ratones). Sin
embargo, dentro del ámbito de la informática y automatización existen una gran cantidad
adicional de tipos de puertos serie, como por ejemplo el RS-485, I2C, SPI, Serial Ata, Pcie Express,
Ethernet o FireWire, entre otros.

En ocasiones veréis referirse a los puertos de serie como UART. La UART (universally
asynchronous receiver/transmitter) es una unidad que incorporan ciertos procesadores,
encargada de realiza la conversión de los datos a una secuencia de bits y transmitirlos o recibirlos
a una velocidad determinada.

Por otro lado, también podéis oír el término TTL (transistor-transistor logic). Esto significa que
la comunicación se realiza mediante variaciones en la señal entre 0V y Vcc (donde Vcc suele ser
3.3V o 5V). Por el contrario, otros sistemas de transmisión emplean variaciones de voltaje de -Vcc
a +Vcc (por ejemplo, los puertos RS-232 típicamente varían entre -13V a 13V).

Antes de conectar dos sistemas debemos comprobar que los voltajes empleados son
compatibles. En caso de no serlo, necesitaremos un subsistema que adapte los niveles de la señal, o
podemos dañar alguno de los dispositivos.

ARDUINO Y EL PUERTO SERIE


Prácticamente todas las placas Arduino disponen al menos de una unidad UART. Las placas
Arduino UNO y Mini Pro disponen de una unidad UART que operan a nivel TTL 0V / 5V, por lo que
son directamente compatibles con la conexión USB. Por su parte, Arduino Mega y Arduino Due
disponen de 4 unidades UART TTL 0V / 5V.

Los puertos serie están físicamente unidos a distintos pines de la placa Arduino.
Lógicamente, mientras usamos los puertos de serie no podemos usar como entradas o salidas
digitales los pines asociados con el puerto serie en uso.

En Arduino UNO y Mini Pro los pines empleados son 0 (RX) y 1 (TX). En el caso de Arduino
Mega y Arduino Due, que tienen cuatro puertos de serie, el puerto serie 0 está conectado a los
pines 0 (RX) y 1 (TX), el puerto serie 1 a los pines 19 (RX) y 18 (TX) el puerto serie 2 a los pines 17
(RX) y 16 (TX), y el puerto serie 3 a los pines 15 (RX) y 14 (TX).

Muchos modelos de placas Arduino disponen de un conector USB o Micro USB conectado a
uno de los puertos de serie, lo que simplifica el proceso de conexión con un ordenador. Sin

Año 2021 – Pág. 4 de 11


Laboratorio de Robótica Educativa - UTNFRT
Comunicación con Arduino mediante puerto serie

embargo algunas placas, como por ejemplo la Mini Pro, prescinden de este conector por lo que la
única forma de conectarse a las mismas es directamente a través de los pines correspondientes.

No debemos acostumbrarnos a usar el puerto serie si realmente no necesitamos comunicar


con el ordenador. Las librerías empleadas para el uso de puerto serie ocupan un tamaño
considerable, y sólo debemos emplearlas si realmente las necesitamos. Además, supone inhabilitar
de forma innecesaria los pines digitales asociados.

CONEXIÓN DE ARDUINO CON UN PC


Para realizar la conexión mediante puerto serie únicamente es necesario conectar nuestra
placa Arduino empleando el mismo puerto que empleamos para programarlo. A
continuación abrimos el IDE Standard de Arduino y hacemos click en el "Monitor Serial" como se
indica en la imagen.

El monitor de puerto serie es una pequeña utilidad integrada dentro de IDE Standard que nos
permite enviar y recibir fácilmente información a través del puerto serie. Su uso es muy sencillo,
Año 2021 – Pág. 5 de 11
Laboratorio de Robótica Educativa - UTNFRT
Comunicación con Arduino mediante puerto serie

y dispone de dos zonas, una que muestra los datos recibidos, y otra para enviarlos. Estas zonas
se muestran en la siguiente imagen.

CÓDIGOS DE EJEMPLO

RECIBIR INFORMACIÓN DESDE ARDUINO


En este primer código vamos a recibir el valor de un contador enviado desde la placa Arduino.
Este valor se incrementa cada segundo. Podemos observar como se reciben los valores desde del
monitor serial.

1 int cont=0;
2
3 void setup(){
4 //iniciamos el puerto serie
5 Serial.begin(9600);
6 }
7
8 void loop(){
9 //Imprimimos el valor del contador
10 Serial.print("Contador: ");
11 Serial.println(cont);
12
13 //incrementamos el contador y esperamos un segundo
14 cont++;
15 delay(1000);
16 }

Año 2021 – Pág. 6 de 11


Laboratorio de Robótica Educativa - UTNFRT
Comunicación con Arduino mediante puerto serie

ENVIAR INFORMACIÓN A ARDUINO


En este ejemplo empleamos el puerto serie para encender o apagar el LED integrado en la
placa Arduino. Para ello enviamos un carácter a la placa Arduino, empleando el monitor serial. En
caso de enviar 'a' la placa Arduino apaga el LED, y en caso de enviar 'b' lo enciende.

1 int option;
2 int led = 13;
3
4 void setup(){
5 Serial.begin(9600);
6 pinMode(led, OUTPUT);
7 }
8
9 void loop(){
10 //si existe datos disponibles los leemos
11 if (Serial.available()>0){
12 //leemos la opcion enviada
13 option=Serial.read();
14 if(option=='a') {
15 digitalWrite(led, LOW);
16 Serial.println("OFF");
17 }
18 if(option=='b') {
19 digitalWrite(led, HIGH);
20 Serial.println("ON");
21 }
22 }
23 }

ENVIAR VALORES NUMÉRICOS


Por último, en este ejemplo enviamos un número entre 1 a 9 a través del monitor serial, y la
placa Arduino hace parpadear el LED integrado el número de veces indicado. El código es similar
al anterior, pero se hace notar que al enviarse los datos caracteres ASCII, debemos restar el valor
'0' al dato recibido para recuperar el valor numérico enviado.

1 int option;
2 int led = 13;
3
4 void setup(){
5 Serial.begin(9600);
6 pinMode(led, OUTPUT);
7 }
8
9 void loop(){
10 //si existe información pendiente
11 if (Serial.available()>0){
12 //leeemos la opcion

Año 2021 – Pág. 7 de 11


Laboratorio de Robótica Educativa - UTNFRT
Comunicación con Arduino mediante puerto serie

13 char option = Serial.read();


14 //si la opcion esta entre '1' y '9'
15 if (option >= '1' && option <= '9')
16 {
17 //restamos el valor '0' para obtener el numeroenviado
18 option -= '0';
19 for(int i=0;i<option;i++){
20 digitalWrite(led, HIGH);
21 delay(100);
22 digitalWrite(led, LOW);
23 delay(200);
24 }
25 }
26 }
27 }

A partir de la versión 1.6.6 del IDE de Arduino se agrega una ventana para hacer gráficos con
los valores recibidos por el puerto serie, llamada "Serial Plotter", para visualizar información
enviada desde Arduino por el puerto serie.

ARDUINO SERIAL PLOTTER


Cómo decíamos, el nuevo IDE de Arduino incorpora una extensión al tradicional monitor
serial, que permite mostrar en una gráfica en tiempo real los valores recibidos por puerto serie.

Encontramos la opción "Serial Plotter" en el menú "Herramientas", justo al lado del tradicional
"Serial Monitor".

Año 2021 – Pág. 8 de 11


Laboratorio de Robótica Educativa - UTNFRT
Comunicación con Arduino mediante puerto serie

Vamos a mostrar su uso con un simple ejemplo. Para ello, comenzamos conectando Arduino
por USB.

Cargamos el siguiente código en Arduino. Simplemente genera números aleatorios entre 1 y


3 con dos decimales, y los envía por el puerto serie cada 100 ms.

1 void setup() {
2 Serial.begin(9600);
3 }
4
5 void loop() {
6
7 float value;
8 value = random(100,300)/100.0;
9
10 Serial.println(value);
11
12 delay(100);
13 }
El resultado que obtendréis es similar al de la siguiente imagen.

Por supuesto, en una aplicación real el valor mostrado sería una variable supervisada como,
por ejemplo, la medición realizada mediante algún sensor.

Hasta aquí los ejemplos. No obstante, el puerto serie no es la única forma de comunicación
en Arduino. Otros sistemas importantes de comunicación entre dispositivos son el bus SPI y el bus
I2C.

Año 2021 – Pág. 9 de 11


Laboratorio de Robótica Educativa - UTNFRT
Comunicación con Arduino mediante puerto serie

SoftwareSerial LIBRARY
El hardware Arduino tiene soporte incorporado para comunicación en serie en los
pines 0 y 1 (que también va a la computadora a través de la conexión USB). El
soporte serial nativo ocurre a través de una pieza de hardware (integrada en el
chip) llamada UART. Este hardware permite que el chip Atmega reciba
comunicación en serie incluso mientras trabaja en otras tareas, siempre que haya
espacio en el búfer en serie de 64 bytes.

La biblioteca SoftwareSerial se ha desarrollado para permitir la comunicación en


serie en otros pines digitales del Arduino, utilizando software para replicar la
funcionalidad (de ahí el nombre "SoftwareSerial"). Es posible tener múltiples
puertos serie de software con velocidades de hasta 115200 bps. Un parámetro
habilita la señalización invertida para dispositivos que requieren ese protocolo.

LIMITACIONES
La biblioteca tiene las siguientes limitaciones conocidas:
Si utiliza múltiples puertos serie de software, solo uno puede recibir datos a la vez.
No todos los pines en el Mega y Mega 2560 admiten interrupciones de cambio, por lo
que solo se puede usar lo siguiente para RX: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8
(62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).
No todos los pines en el soporte de Leonardo y Micro cambian las interrupciones, por
lo que solo se puede usar lo siguiente para RX: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16
(MOSI).
En Arduino o Genuino 101, la velocidad máxima actual de RX es 57600bps
En Arduino o Genuino 101 RX no funciona en el Pin 13

En el siguiente ejemplo, los pines digitales 10 y 11 en sus placas Arduino o Genuino se


usan como líneas seriales virtuales RX y TX. El pin RX virtual está configurado para
escuchar cualquier cosa que ingrese a través de la línea serial principal, y luego hacer
eco de esos datos en la línea TX virtual. Por el contrario, todo lo recibido en el RX virtual
se envía a través del hardware TX.

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for Native USB only
}

Año 2021 – Pág. 10 de 11


Laboratorio de Robótica Educativa - UTNFRT
Comunicación con Arduino mediante puerto serie

Serial.println("Goodnight moon!");
// set the data rate for the SoftwareSerial port
mySerial.begin(38400);
mySerial.println("Hello, world?");
}

void loop() // run over and over


{
if (mySerial.available())
Serial.write(mySerial.read());
if (Serial.available())
mySerial.write(Serial.read());
}

Año 2021 – Pág. 11 de 11

También podría gustarte