USB Con Arduino

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 10

COMUNICACIÓN DE ARDUINO CON

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.

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 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 DEL ARDUINO CON UN


ORDENADOR
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, 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 EL 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 }
ENVIAR INFORMACIÓN AL 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
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".
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.

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
}

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());
}

También podría gustarte