Comunicación de Arduino con puerto serie


arduino serial port

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 entrada aprenderemos el funcionamiento básico de los puertos serie en Arduino. Al final de la entrada 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.

Puedes consultar el resto de tutoriales sobre el puerto de serie en Arduino, (recibir números, textos, arrays separados por coma, bytes, y muchos más) en la categoría puerto serie Arduino

Anuncio:

¿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.

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 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.

arduino-serial-monitor-IDE

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.

arduino-serial-monitor

Pese a su sencillez este monitor de puerto serie es suficiente para los ejemplos de esta entrada, y resulta muy útil para realizar test o experimentos rápidos.

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.

int cont=0;

void setup(){
  //iniciamos el puerto serie
  Serial.begin(9600);
}

void loop(){
  //Imprimimos el valor del contador
  Serial.print("Contador: ");
  Serial.println(cont);
  
  //incrementamos el contador y esperamos un segundo
  cont++;
  delay(1000);
}

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.

int option;
int led = 13;

void setup(){
  Serial.begin(9600);
  pinMode(led, OUTPUT); 
}

void loop(){
  //si existe datos disponibles los leemos
  if (Serial.available()>0){
    //leemos la opcion enviada
    option=Serial.read();
    if(option=='a') {
      digitalWrite(led, LOW);
      Serial.println("OFF");
    }
    if(option=='b') {
      digitalWrite(led, HIGH);
      Serial.println("ON");
    }
  }
}

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 Ardunino 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.

int option;
int led = 13;

void setup(){
  Serial.begin(9600);
  pinMode(led, OUTPUT); 
}

void loop(){
  //si existe información pendiente
  if (Serial.available()>0){
    //leeemos la opcion
    char option = Serial.read();
    //si la opcion esta entre '1' y '9'
    if (option >= '1' && option <= '9')
    {
      //restamos el valor '0' para obtener el numeroenviado
      option -= '0';
      for(int i=0;i<option;i++){
         digitalWrite(led, HIGH);
         delay(100);
         digitalWrite(led, LOW);
         delay(200);
      }
    }
  }
}

Hasta aquí los ejemplos básicos. 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.

En próximas entradas veremos ejemplos más complicados para realizar interfaces completas, y cómo poder transmitir o recibir datos mediante Java, C# (comunicar Arduino con C# y el puerto serie), Python (controlar Arduino con Python y PySerial), a través del entorno Processing, o directamente desde la consola en Windows o Linux.

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección
Tutoriales de Arduino
Actualización 10/11/2015:
El nuevo Arduino IDE v1.6.6 incorpora una herramienta para hacer gráficas con los valores recibidos por el puerto serie, llamada “Serial Plotter”. Podéis ver más sobre su uso en la entrada Hacer gráficas fácilmente con Arduino IDE V1.6.6.

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github.



4.5 12 votes
Article Rating

Anuncio:

Previous Sustituir lente de la cámara en un Galaxy S2
Next Nueva sección, calculadoras de electrónica
33 Comments
oldest
newest
Inline Feedbacks
View all comments
Moises Serrano
8 years ago

muyyyy buen tutorial, sigue asi.

Rodrigo Gomez Gamboa
8 years ago

Muy buen tutorial. Justo lo que buscaba, bueno ademas de poder pasar los datos a internet, dime como puedo lograr eso, me puede orientar? (o como lo busco en la red). Muchas Gracias

domoteka
8 years ago

Gran tutorial

daniel
7 years ago

muy buen tutorial….una pregunta como puedo enviarle un caracter desde matlab o un entero a arduino

Eigenbrotler
7 years ago

Excelente Tutorial, de gran ayuda, Gracias!

Jesus Tellez
6 years ago

Muy buen tutorial sirve para aclarar dudas. gracias!

luisllamas
6 years ago
Reply to  Jesus Tellez

Me alegro de que te haya gustado

luisllamas
6 years ago

Si al usar el puerto de serie te aparecen caracteres raros, lo más seguro es que la velocidad de transmisión no sea la misma

luisllamas
6 years ago

Hola, en esta entrada https://www.luisllamas.es/2015/11/encender-un-led-con-arduino/ tienes el tutorial para encender LED, y en esta https://www.luisllamas.es/arduino-buzzer-activo/ el tutorial sobre Buzzer pasivos.
¡Seguro que puedes combinarlos sin ninguna dificultad! Un saludo

luisllamas
5 years ago

Claro, hay muchas formas de transmitir información de forma inalámbrica, cada una con sus ventajas y desventajas. Consulta la categoría https://www.luisllamas.es/tag/comunicacion/ para ver distintas alternativas

luisllamas
5 years ago

Claro, de muchas formas. La más sencilla, enviarlos como texto y usar un separador (como una coma). Una mejor, mandarlos como una secuencia de bytes. Y una aún mejor, si lo mandas dentro de una estructura.
Consulta el resto de entradas de puerto serie, seguro que encuentras lo que necesitas https://www.luisllamas.es/tag/puerto-serie/

luisllamas
5 years ago

Tienes enlaces a redes sociales arriba, y en la página de inicio.

jaime
5 years ago

gracias aprendí algo que sirve en mi carrera

Izan
5 years ago

Hola, se puede detectar mas de un caracter? y que diferencia hay ente “” y ”?
Excelente página.

Miguel
5 years ago

muchas gracias, justo lo que estaba buscando (llevaba ya un par de horas) ahora solo me falta implementarlo¡¡

Roy
5 years ago

Estimado tengo un problema, tengo conectado por serial un nodeMcu a un arduino, el nodeMcu no funciona si se enciende con el arduino al mismo tiempo, debo prender primero el arduino y despues el nodeCmu. El arduino envía la información de los sensores al nodeCmu y el nodeCmu la muestra como webserver. ¿Existe una funcion para retrasar el encendido del nodeCmu? ¿existirá alguna solución?

Hector Porras
4 years ago

y como pudiera mandar ese dato con un botón?

Ariel
4 years ago
Reply to  Hector Porras

Tengo un problema. Cuando hago funcionar un dc motor pierdo la comunicacion con la pc. Alguien sabe porque?

Antonio Miguel Hierro Pérez
4 years ago

Hola Luis, buen tuto. Tengo un arduino uno y quiero conectarle el HC-05 de bluetooth al puerto softwareserial (10,11) y el LCD16X2 Con keypad. La razón es que el serial nativo lo quiero para monitorear y el problema es que en principio me entran en conflicto. Tienes alguna idea o solución ?
Gracias, un saludo !!

Gege
4 years ago

Muy buena entrada!

Monitor Serie | Aprendiendo Arduino
4 years ago
Miguel
3 years ago

¿Es posible tener un dispositivo y un arduino conectados simultáneamente por USB en la computadora y comunicar el arduino con el dispositivo?
Por ejemplo, conectar un mando de juegos USB y un arduino a la PC y que el arduino pueda recibir información del mando.
De ser posible ¿cuál sería el procedimiento?

Saber Más Iniciación Arduino 2019 | Aprendiendo Arduino
3 years ago
ARDUINO – WEB DIDACTICA DE AUTOMATIZACIÓN
3 years ago

[…] buscar información en internet de Monitor Serie para la impresión en pantalla de datos con la instrucción […]

MONITOR SERIE – WEB DIDACTICA DE AUTOMATIZACIÓN
3 years ago

[…] buscar información en internet de Monitor Serie para la impresión en pantalla de datos con la instrucción […]

Monitor serie – WEB DIDACTICA DE AUTOMATIZACIÓN
3 years ago
Comunicando Lazarus con Arduino (1) – TeisRobotics
2 years ago

[…] Llamas tiene en su Blog un excelente artículo sobre la comunicación serie en […]

Arduino COM Plotter – G4r1
2 years ago

[…] Comunicación de Arduino con puerto serie […]

Sintonizar PID con Arduino I – G4r1
2 years ago

[…] Comunicación de Arduino con puerto serie […]

SCT-013: Sensor de Corriente Eléctrica no Invasivo – ByteFruit
2 years ago

[…] ver los resultados en el monitor del puerto serie, graficarlo con el serial plotter, o recogerlo en un proyecto mayor para mostrarlo en una […]

Monitor serie – CIFP MEDINA DEL CAMPO
1 year ago
Comunicación PYTHON - ARDUINO con Pyserial | Mediapipe - OpenCV » omes-va.com
1 year ago