Crea, comparte, aprende y disfruta
Comunicación 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:
Ahora que sabemos usar esta conexión podemos crear un pequeño programa que envíe los comandos al pulsar un botón, por ejemplo.
Deja una respuesta