Arduino posee como principal característica la habilidad de comunicarse con nuestra computadora a través del puerto serie. Esto se conoce como comunicación serial. Debido a que el uso de este puerto ha quedado un poco en desuso a favor de la tecnología USB, Arduino cuenta con un convertidor de Serial a USB que permite a nuestra placa ser reconocida por nuestra computadora como un dispositivo conectado a un puerto COM aún cuando la conexión física sea mediante USB.
Arduino IDE nos proporciona una herramienta que nos permite enviar y visualizar los datos que se manejan a través del puerto Serie. Dicha herramienta se conoce como Monitor Serial y se puede encontrar en el menú de herramientas, en la opción «Monitor Serial». Es la forma más simple que existe para establecer la comunicación serial con Arduino.
A través de esta ventana se puede enviar o recibir información utilizando el puerto serie. Nótese que para poder abrir esta ventana es necesario que tengamos nuestra placa Arduino conectada a nuestra PC mediante USB.
Para iniciar la comunicación serial con Arduino utilizando el Monitor Serial debemos establecer algunos comandos en el Arduino IDE y luego subirlos al microcontrolador.
El código es el siguiente:
1 2 3 4 5 6 7 8 |
void setup(){ Serial.begin(9600); } void loop(){ Serial.println('1'); delay(1000); } |
En la función setup inicializamos la comunicación serial con la sentencia Serial.begin(9600).
El 9600 indica el baud rate, o la cantidad de baudios que manejará el puerto serie. Se define baudio como una unidad de medida, usada en telecomunicaciones, que representa el número de símbolos por segundo en un medio de transmisión ya sea analógico o digital.
Para nuestros propósitos utilizaremos comúnmente una velocidad de símbolo de 9600.
Siempre que vayamos a comunicarnos con Arduino vía puerto serie se necesita invocar la sentencia Serial.begin(9600).
Ahora, en la función loop nos encontramos con una sentencia interesante: Serial.println(‘1’).
Cuando usamos println le estamos diciendo al microcontrolador que tendrá que imprimir un caracter a través del puero serie. Hay otros métodos como Serial.print o Serial.write que nos sirven para imprimir o escribir en el puerto serie, sin embargo el método Serial.println agrega un salto de línea cada vez que se envía un dato, lo que es provechoso para nosotros en algunos casos, especialmente cuando utilizamos el monitor serial.
En el método Serial.println se debe establecer lo que se quiere imprimir entre paréntesis y con comillas. En este caso vamos a imprimir el caracter ‘1’. He colocado un delay de 1 segundo para que la impresión en el Monitor Serial sea pausada y se produzca de segundo en segundo.
Si subimos el código a nuestra placa, podremos observar el comportamiento de nuestro algoritmo a través del monitor serial.
Como podemos observar, en el monitor serial empieza a aparecer el ‘1’ que le indicamos a nuestro microcontrolador que debía imprimir. En la placa, el LED con la inscripción TX parpadea a medida que aperecen los caracteres en el monitor serial. El LED TX indica cuándo el Arduino está haciendo un envío de datos a través del puerto serie.
De esta manera podemos obtener información desde el micricontrolador. Esto es aprovechado por nosotros para obtener datos desde un sensor o algún dispositivo de conmutación. Todas estas experiencias las estaremos realizando en futuras publicaciones.
Ahora que sabemos como enviar datos desde Arduino a través del puerto Serie, podemos pasar al siguiente paso que es hacer que Arduino reciba datos seriales y los interprete. Dichos datos los enviaremos a través del monitor serial utilizando el teclado de nuestra computadora.
El código será el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
int input; void setup(){ Serial.begin(9600); } void loop(){ if (Serial.available()>0){ input=Serial.read(); Serial.println(input); } } |
La función setup permanece igual. Al principio del código se declara una variable tipo int llamada input. En ella se guardará los valores que obtendremos a través del puerto serie.
En la función loop es donde está la parte importante. La línea que dice Serial.available()>0 es sumamente importante ya que limita la ejecución del código solamente cuando haya datos disponibles en el puerto serie. Está metida dentro de una estructura selectiva (if). Cuando haya datos disponibles para leer en el puerto serie, el método Serial.available() tendrá un número mayor a cero (>0) por lo que cumplirá con la condición establecida en la estructura selectiva y el programa procederá a ejecutar los comandos que estén dentro de las llaves ({}) del if.
Cuando entre en la estructura selectiva, a la variable input se le asignará un valor que se lea desde el puerto serie mediante el método Serial.read(). Siempre que necesitamos leer algo lo hacemos mediante este método.
Luego de asignarle a input un valor, haremos que el microcontrolador nos devuelva por el puerto serie el mismo valor que le enviamos desde la computadora. Para ello imprimimos el valor de input mediante el método Serial.println(input).
Veamos como funciona el código cuando lo subimos a la placa.
Abrimos el monitor serial y en la ventana de comandos escribimos 1 y le damos clic en enviar. Luego enviamos 2, 3, 4 y 5.
Nos aparecerá lo siguiente:
49
50
51
52
53
Lo podemos apreciar en esta imagen:
Se preguntarán, si he tecleado el 1 y me aparece el 49, con el 2 me aparece el 50, con el 3 el 51 y así sucesivamente… ¿que está sucediendo?
Simplemente es la forma como estamos imprimiendo los caracteres con el método Serial.println().
Cuando imprimíamos el ‘1’ en el ejemplo anterior, aparecía el 1 en el monitor serial. Ahora estamos imprimiendo un valor entero a través de la variable input.
Cuando se intenta imprimir un entero (1,2,3,4,5…), el método Serial.println() imprimirá dicho entero en formato ASCII.
El ASCII es muy utilizado en programación y telecomunicaciones. Existen tablas que permiten traducir caracteres de ASCII a valores alfanuméricos y viceversa.
En esta tabla se muestra los valores ASCII que representa cada caracter del alfabeto. A los números del 0 al 9 les corresponde los valores del 48 (0) al 57 (9).
Si se desea que los números que aparezcan en el monitor serial aparezcan tal y como lo introducimos por teclado, podemos agregar la línea
input=input-48;
Esta sentencia le quitará 48 a cualquier número ASCII, lo que hará que nos aparezcan números del 0 al 9.
Es cuestión de cada persona empezar a teclear valores en el monitor serial y ver cual es el resultado.
En mi próximo post estaré explicando como aprovechar este algoritmo que les he presentado hoy para encender o apagar un LED utilizando el teclado de nuestra computadora.
Hola buen día, tengo un error al utilizar Serial.
Al compilar me salen errores por ejemplo, undefined referente to ‘Serial’
me gustaria amprender como le hago en mi arduino leer una targeta rfid mandar la informacion a una pc windows comparar la informacion y regresar falso o verdadero
Lo que estás pidiendo es algo que tu mismo puedes buscar. Posiblemente no vas a encontrar un lugar en el que te expliquen todo, pero sí podrás aprender a hacer cosas que al final te permitirán lograr tu objetivo
Hola Daniel, tu pudiste lograr tu inconveniente? si es asi me podrias ayudar a mi?
hola necesitaría la forma de saber como deshacer el Serial.begin(9600); ose que después de un tiempo deje de trasmitir por el serial
Con qué propósito?
BUENAS NOCHES…. estoy haciendo un proyecto donde utilizo a arduino como cliente web, este descarga la pagina html en el monitor serial, en donde aparece la palabra ACEPTADO, podria obtener o leer esta informacion i guardarla en una variable para hacer que posteriormente haga encender un led y si no existe esta palabra hacer que el led no encienda..
si es posible que codigo deberia utilizar..
Esa es la forma correcta de proceder. El código te toca investigarlo a ti
Hola quiero enviar informacion desde mi ESP al Arduino , me puede guiar o darme una web donde pueda encontrar sobre eso, generalmente veo ejemplo que envian informacion o comandos AT desde el Arduino al ESP pero lo que quiero es a la inversa, me serviria tu ayuda, Muchas Gracias
Verifica este post: https://panamahitek.com/conecta-arduino-mundo-esp8266/
NO ENTENDIO NADA Y ESTOY HACKEANDO
???
hola como puedo enviar datos de sensores analógicos de un arduino a otro y poder leerlos y usarlos para activar unos reveladores, me podría ayudar por favor?
Usa I2C
como puedo yo hacer para mandar una cadena String de java a un LCD conectado a Arduino??
Hay un post sobre eso, aunque para aquellos días no existía la librería Arduino para Java. https://panamahitek.com/arduino-java-enviando-mensajes-a-pantalla-lcd-desde-java-con-arduino/
gracias por compartir tus conocimientos, saludos desde Argentina!!!
y si lo que necesito es obtener un numero decimal. Que función debería utilizar? muchas gracias
Existen varias maneras de hacerlo, actualmente no existe un método que permita imprimir números decimales. Sin embargo en esta entrada: http://sheepdogguides.com/arduino/aht2printfloat.htm puedes encontrar una solución.
Básicamente creas tu propia función que te permite establecer cuántos decimales utilizar después del punto. En la función lo que haces es obtener primeramente el valor entero del número en decimal y obtener el número decimal restando el valor entero menos el número ingresado y concatenar el resultado para así retornarlo.
Saludos,
Muchas gracias!! 🙂
Quisiera saber si es posible y en ese caso cómo debería hacer para imprimir una o dos tablas de valores con una sola fila de títulos en cada una y que los valores de cada ciclo de operación aparezcan encolumnados en celdas abajo de los títulos. Actualmente cuando trato de imprimir sin usar tablas, los títulos se repiten cada vez que imprime y los valores se desplazan fuera de sus títulos respectivos en función de la cantidad de dígitos que pueden ir aumentando sucesivamente (cuando se trata de contar «millis») y se complica el seguimiento de los datos. Agradeceré alguna… Read more »
Sería más fácil que pudiese mostrarnos una imagen de cómo queda los datos y cómo quiere visualizarlos.
Saludos,
Muchas Gracias, este dato es muy interesante, no hallaba el como hacer para que el monitor serial me reflejara el número que yo le ingresaba y no su código ASCII….
ya que estuve varios días buscando solución alguna y no hallaba nada.
Muy bien explicado, Saludos desde El salvador.
Gracias por tus comentarios
Me alegra.
Mi duda es cómo (o si hay forma de) utilizar una interrupción por puerto serie en la plataforma Arduino. He utilizado una rutina basada en una condición con Serial.available pero en lo personal no me agrada utilizar polling para este tipo de comunicación.
Mi duda es cómo (o si hay forma de) utilizar una interrupción por puerto serie en la plataforma Arduino. He utilizado una rutina basada en una condición con Serial.available pero en lo personal no me agrada utilizar polling para este tipo de comunicación.
funciona, y ahora si quiero leer e imprimir del 10 en adelante….
Tienes que leer dos datos, Primero la decena y luego la unidad
Hola, es un sensor de humedad ahh y era 57600 jejeje es este http://www.elecfreaks.com/wiki/index.php?title=Octopus_Soil_Moisture_Sensor_Brick#Introduction y gracias por la pronta respuesta.. yo lo hice correr y que muestra la salida por el monitor serial, pero configurandolo en 57600 baudios, por eso preguntaba si se podia tener uno en 9600 y otro en 57600 :D..Saludos
Excelente, pero tengo una duda, si yo tengo un sensor que trabaja en 5700 baudios y otro en 9600 ¿Como podria hacer que arduino trabaje con ambos e imprima sus valores ?
Que sensor tienes que utiliza 5600 baudios?