Trastejant

Crea, comparte, aprende y disfruta

Comunicación Serial

Tutorial Pinguino: Conectividad serial

En este tutorial vamos a aprender a comunicarnos con nuestro Pingüino utilizando la conexión serial.
Lo primero que tenemos que saber es que realmente no vamos a utilizar comunicación serial, sino CDC. Un protocolo muy extendido cuya misión es emular este tipo de conexión via USB.

La forma más simple de este tipo de comunicación es empleando algún programa tipo hyperterminal(Windows), minicom(linux) o MacWise(MAC) que permite establecer una conexión con los puertos COM (serial) y recibir información y enviar comandos. Pero también podríamos programar aplicaciones mucho más sofisticadas que por debajo establezcan este tipo de conexión para controlar el Pingüino.

Las funciones más importantes para manejar estas conexiones son dos:

  •  byteRecibido = CDC.read(buffer);: Lee los datos recibidos. byteRecibido es una variable tipo char en la que se almacenará el ultimo dato recibido mientras que buffer es un array que actuará cómo buffer para la comunicación.
  • CDC.printf(“cadena a enviar”): Envia una cadena.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//creamos una variable para el dato que vamos a querer leer 
char dato; 
 
 //creamos una variable para la recepción de datos 
 unsigned char receivedbyte; 
 
 //Creamos un Array para el buffer de lectura 
 unsigned char buff[64]; 
 
 //definimos la pata 7 como Led 
 #define led 7
 
void setup(){ 
 
 //configuramos el pin 7 cómo una salida 
 pinMode(led, OUTPUT); 
 
 //Apagamos el led 
 digitalWrite(led7,LOW); 
 } 
 
void loop() { 
 //Mostramos un mensaje para saber que se ha establecido comunicación 
 CDC.printf("Listo\r\n"); 
 
 //creamos un bucle que se ejecutará mientras no recibamos nada. 
 while((receivedbyte = CDC.read(buff)) == 0); 
 
 //Cuando recibamos algo entraremos aquí 
 if(receivedbyte > 0){ 
 
 //almacenamos en la variable dato el primer valor del array buffer 
 dato = buff[0]; 
 
 //si mandamos un dos... 
 if(dato == '1'){ 
 //encendemos el Led 
 digitalWrite(led7,HIGH); 
 //Mostramos un mensaje de que lo hemos encendido 
 CDC.printf("Led ON\r\n"); 
 
 }else if(dato == '3'){ 
 //si hemos eviado un 0... 
 //apagamos el led 
 digitalWrite(led,LOW); 
 //lo indicamos con un mensaje 
 CDC.printf("Led apagado\r\n"); 
 } 
 
 } 
}

Un par de cosas más a comentar sobre el código. La primera es el tamaño del buffer, 64bits es el tamaño máximo del paquete que se puede enviar vía CDC.

Lo que se almacena en dato no es la tecla pulsada, sino su valor ASCII. En el caso del ejemplo es igual porque coincide el valor de las teclas con su valor en la tabla ASCII, pero es importante tenerlo en cuenta si vamos a utilizar letras o símbolos.

los caracteres que vemos después de cada mensaje mandado (\r\n) son caracteres de escapes equivalentes al retorno de carro (\r) y el salto de linea(\n) estas dos acciones se suceden de forma automática cuando pulsamos enter en un procesador de textos, por ejemplo. El cursos vuelve a la posición más a la izquierda (retorno de carro) y baja una linea (salto de linea.)

El circuito a controlar sería tan simple cómo la placa de Pingüino y un Led con su correspondiente resistencia:

Serial PinguinoAhora que sabemos usar esta conexión podemos crear un pequeño programa que envíe los comandos al pulsar un botón, por ejemplo.


También te puede interesar...

No hay temas relacionados

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.