Recibir datos seriales Arduino

Anteriormente vimos cómo enviar datos desde nuestro Arduino hacia la computadora, ahora toca el turno a enviar datos desde la computadora y recibirlos en el Arduino.

Para lograr esto no se requiere instalar nada adicional, de igual manera utilizaremos la ventana del «monitor serial», pero ahora usaremos el cuadro de captura superior y el botón «Enviar».

Todo lo que se escriba en este cuadro de texto y se envíe, será recibido en el Arduino como «texto», esto es que si nosotros escribimos un «15» en nuestra terminal y lo enviamos, al recibirse será un «1» y un «5», en bytes separados, no se recibirá un 15.

Esto es un concepto común en las terminales seriales, y es que se maneja todo como String (cadenas de caracteres), y cada caracter que se transmita será de un byte de tamaño, con el valor correspondiente en la tabla de caracteres ASCII.

Diferencia entre String y número

Cuando una persona se adentra en el mundo de la programación empieza a tratar con conceptos un tanto más confusos como podría llegar a ser distinguir entre los tipos de datos.

Cuando se transmite el caracter «r» por cualquier medio (una terminal serial, por Internet, en un mensaje de texto, guardarlo en una memoria) en realidad se está mandando un número. Los equipos digitales como las computadoras trabajan con números, binarios en específico, entonces al enviar una «r» se envía en realidad un 01110010 en binario, que en decimal es un 114 y si se trata como un caracter, corresponde a la «r» en minúscula.

Resultado de imagen para ASCII

A todo esto, si nosotros enviamos este caracter «r» por la terminal, en nuestro Arduino lo podemos recibir con el siguiente código:

void loop()
{
	byte Recibir;
	if(Serial.available())
	{
		Recibir = Serial.read();
		if(Recibir == 'r')
		{
			Serial.print("Recibí una r");
		}
	}
}

 

 

La condición if(Recibir == ‘r’) tendría el mismo resultado si la cambiamos por estas otras posibilidades:

if(Recibir == 114) // 114 es el valor correspondiente a la «r» en decimal

if(Recibir == 0b01110010) // 0b es para indicar que es un valor en binario y 01110010 es 114 en binario

if(Recibir == 0x72) // 0x es para indicar que es un valor hexadecimal y el 72 hexadecimal es igual a 114 decimal

 

Ejercicios:

6B: Ejercicio: Conectar dos LEDs uno en el puerto 13 y otro en el puerto 12.
Desde el monitor serial enviar «a» para encender/apagar el LED del puerto 13.
Desde el monitor serial enviar «b» para encender/apagar el LED del puerto 12.
De modo que al enviar «a» o «b» se encienda o apague el LED correspondiente, si está apagado encienda y si está encendido apague.

void loop() {
	byte Recibido;
	// Revisa si hay datos enviados desde la computadora:
	if (Serial.available())
	{
		// Lee el último byte:
		Recibido = Serial.read();
		if(Recibido == 'a')
		{
			if(digitalRead(ledPinA) == HIGH)
			{
				digitalWrite(ledPinA,LOW);
			}
			else
			{
				digitalWrite(ledPinA,HIGH);
			}
		}

		if(Recibido == 'b')
		{
			if(digitalRead(ledPinB) == HIGH)
			{
				digitalWrite(ledPinB,LOW);
			}
			else
			{
				digitalWrite(ledPinB,HIGH);
			}
		}
	}
}

(124)

Acerca de jfvilla

Juan Francisco Villa Medina es ingeniero en Sistemas Computacionales (graduado con mención honorífica), en 2013 obtuvo el grado de Maestro en Sistemas Computacionales (graduado con mención honorífica), en 2021 obtuvo el grado de Doctor en Ciencias por el Instituto Politécnico Nacional (IPN), es Profesor-Investigador en la Universidad Autónoma de Baja California Sur (UABCS). Trabaja también en el Centro de Investigaciones Biológicas del Noroeste (CIBNOR), donde es desarrollador de software y circuitos electrónicos enfocado en vehículos autónomos. Cuenta con diversas publicaciones científicas y ha sido asesor de estudiantes en diversos eventos de tecnología a nivel nacional. También es co-fundador de 7robot, una empresa de tecnología enfocada a la robótica y automatización.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.