Felix Maocho

Para quien le interese lo que a nosotros nos interesa

Curso de Arduino – Transmisión de Comunicaciones asíncronas

Por Félix Maocho
3/5/2017
.

Objetivo de este capítulo

Establecer una transmisión/recepción de datos entre la Tarjeta Arduino y el PC
Aprender a abrir la ventana de comunicaciones asíncronas del Pc y elegir una velocidad de transmisión. Aprender a seleccionar igual velocidad de emisión en la Tarjeta Arduino
Aprender algunos mandatos básicos para la transmisión de mensajes desde la tarjeta Arduino. Aprender la forma de transmitir mensajes mediante un ejemplo
Aprender algunos mandatos básicos para la recepción de mensajes. Aprender la forma de recibir mensajes mediante un ejemplo

Material necesario

  • Tarjeta Arduino y cable de conexión al PC

Conocimientos previos necesarios

  • Saber que son los pines TX y RX y el manejo de pines digitales y analógicos.

En el capítulo anterior explica lo que considero que es imprescindible que un programador de Arduino conozca sobre comunicaciones asíncronas, En este capítulo, nos centramos en realizar emisiones y recepciones de mensajes . Para ello debemos empezar por conocer los mandatos mas utilizados en los sketch en las comunicaciones asíncronas.

Como indicamos, las comunicaciones asíncronas vale igual para comunicar entre si, dos Tarjetas Arduino, como para comunicar la Tarjeta con otro tipo de aparatos, capaces de recibir y enviar comunicaciones asíncronas.

Por qué utilizamos el Pc en la comunicacióon asíncrona

Uno de los aparatos que todos tenemos, capaz de conectarse con la Tarjeta Arduino,  es el PC. Aunque él lo hace por el cable USB en vez de los pines TX y RX ( pines “0” y “!” ). Absolutamente todo es igual en ambos casos, salvo el “puerto” de salida y cable,, que utilizamos para hace5r la comunicación, pues indiferentemente que utilicemos el puerto USB o el “puerto asíncrono” formado por los pines “0” y “1” la señal que emitimos/recibimos, parte/llega de la misma UART, que son los circuitos encargados de el decodificado/descodificado  de la señal y su entrega al sketch. El sketch no se diferenciar en nada independientemente del puerto que físicamente mande/recibael mensaje.

Por ello podemos probar esta comunicación, entre dos Tarjetas Arduino, pero precisaríamos tenerla, lo que su pone un gasto que de momento sólo nos valdría para esta prueba. Tan solo las tendríamos que conectar como indica este esquema, le puerto RX con el TX  y viceversa y las dos masas.

Arduino-ArduinoSerial

Como no las tenemos, no podemos probar los pines TX y RX, pero si podemos probar la la comunicación asíncronas a través del cable USB, con el PC.

Cómo se comunica una tarjeta con su PC

USB son las iniciales de Universal Serial Bus, que indica que permite comunicaciones seriales, Además por este cable es por donde cargamos los programas en la tarjeta, señal evidente que la comunicación entre Pc y Tarjeta es posible.

El mecanismo de enviar y recibir información entre dos equipos, es decir la comunicación asíncrona, la podemos probar e incluso ver en el PC pues vía cable USB la recibiremos en nuestro PC, la comunicacional que podremos ver en la pantalla del PC. Por ello, vamos a explicar la forma como se envía y trasmite información desde estos dos aparatos.

Preparar el PC

Comenzaremos por preparar nuestro Pc para enviar y recibir información por el puerto USB. En el programas que Utilizamos a para escribir los programas de Arduino y subirlos a la tarjeta hay una opción que dice “Monitorización de Puerto Serie”, que posibilita la visualización de datos procedentes de la tarjeta.

Dependiendo de la “relise” que tenga el programa puede variar un poco su aspecto pero habitualmente el comando es la situada la última a la derecha de los diferentes programas que existen. Por ejemplo en una “relise” muy antigua la “0011 Alpha”, (que es muy poco probable que utilices), aparece con un dibujito y el sitio donde se reciben y envían los datos esta al pie de la pantalla un sitio para escribir donde se va a escribir al lado del botón que dice “send” (enviar) que se pulsa una vez hemos escrito el mensaje que queremos enviar y en la parte inferior la pantalla donde se reciben los datos enviados desde la tarjeta.

Sin embargo en otras “relise” mas modernas, por ejemplo la “1,5.4”, (lo más probable que tu utilices una con una numeración superiór) el aspecto es como sigue;

Al al pinchar en la especie de lupa que viene marcada como “Monitor Serie”, hace que aparezca una nueva pantalla como la que viene a continuacion, que hace mas o menos lo mismo que la antigua, lo que queremos enviar lo escribimos en la primera linea y cuando acabemos pulsamos “Send” o “enviar” según el idioma que hayamos configurado por defecto.

No obstante para que aparezca esta pantalla previamente a poner el programa Arduino en marcha debemos conectar la tarjeta Arduino (u otro aparato receptor/emisor asíncrono al PC, pues si no nos dará un error.

(Observen que yo utilizo la “relise” 1.5.7  y no es la última, pero que lo referente a las comunicaciones asíncronas es igual que en la anterior)

Board at COM3 is not aviable (La tarjeta en COM3 no está disponible)

que nos avisa que la Tarjeta Arduino no esta conectada al puerto COM3. COM3 es en nuestro caso el puerto de comunicaciones que se eligió automáticamente al instalar el programa Arduino en mi PC. En otros PC puede haberse destinado otro puerto COM. Si la enchufamos hasta oír el ruido típico de haber enchufado un equipo por USB y esperamos un poquito mas para que la máquina asigne el COM3 a esa salida USB, llegaremos sin problemas a esa pantalla

Enviar y recibir mensajes en desde el PC

Como ven es muy fácil utilizar las comunicaciones asíncronas en el PC. Basta escribir algo en la linea superior y dar a “enviar· para que automáticamente pase a la tarjeta, mientras que en la pantalla recibimos todo lo que la tarjeta quiera mandar.

Hay en Internet otras pantallas mas cómodas y sofisticadas para seguir las comunicaciones asíncronas como HyperTerminal (para Windows) -Enlace o ZTerm (para Mac)-XXXX- Linux-Enlace, etc. , pero a mi juicio, pese a su sencillez, (o quizá debido a ello), este monitor estándar, es más que suficiente para comenzar, y con toda seguridad pasará una larga temporada sin que notes que “se te queda pequeña”.

En esta pantalla, en la esquina inferior izquierda veremos la velocidad en que trabaja el PC. en nuestro caso 57600 Baudios y hay formas sencillas de poderlo modificar, en este caso basta desplegar el menú de las velocidades y elegir la que queramos, pero por defecto, la velocidad que viene es 9600 baudios y mi consejo es utilizarla, si no hay razón de mayor peso que aconseje lo contrario. En cualquier caso, la velocidad seleccionada, debe coincidir con el valor que hemos definido en el programa y a través del comando Serial.begin(), que veremos más adelante..

Transmitir información asíncrona entre la Tarjeta y el PC

Comenzaremos pre indicar los mandatos que se utilizan en comunicaciones, Hay tres tipos de datos los utilizados en la preparación de las comunicaciones , los utilizados en la transmisión de datos y los utilizados en la recepción de los datos:

Mandato para empezar la transmisión

Mandato Serial.begin

Configura en la tarjeta el puerto serie y fija la velocidad en baudios que decidamos que será en función de la capacidad de los aparatos que pensemos conectar y, muy importante, la misma en los dos aparatos conectados.  Lo podemos traducir por Serial.empezar. Su sintaxis es

Serial.begin(velocidad)

Donde

Serial.beguin es el nombre del mandatos. Este mandato se utiliza en la funciona “setup” puesto que es un mandato de configuración del equipo y una vez declarado no se puede modificar posteriormente en el sketch

velocidad, es el numero en baudios o bytes por segundo de la transmisión, que puede ser una de las velocidades soportadas por los aparatos, (al menos teóricamente). La comunicación asíncrona debe ser declarada igual en el aparato receptor y el emisor, este mandato es la que los sincroniza. Los valores que Arduino soporta son 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, y 115200 baudios/segundo. La velocidad típica y por defecto de un PC son 9600 baudios. por lo que pondremos a Arduino a trabajar también a 9600, aunque otras velocidades pueden ser soportadas si ponemos tarjeta y Pc a la misma velocidad

Al invocar al mandato Serial.begín, también y simultáneamente hacemos que se ponga en funcionaniento una libreria que tiene todos los mandatos que se utilizan en las transmisiones que se caracterizan por iniciar todos con la palabra “Serial.” en mayúscula y con un punto separado de la palabra significativa del mant dato, Hay bastantes funciones pero solo indicare las imprescindibles para los ejemplos que vamos a tratar.

Mandatos básicos para la Trasmisión de datos

Mandatos Serial.print y Serial,println

Son dos mandatos semejantes en todo, que cargan unos caracteres situados entre paréntesis en la UART, dispositivo especializado en transformarlos en octetos y transmitirlos como impulsos eléctricos que en al Tarjeta Arduino UNO son emitidos simultáneamente por el pin TX, y el cable de emision del USB, Ppor tanto utilizar el pin 1 como igital no es compatible como la comunicación serial, razón por la cual debemos evitar en la medida de lo posible no utilizar estos pines salvo que lo precisemos y estemos seguros que no vamos a necesitar la comunicación serial, La diferencia entre Serial.print y Serial,println es parecida a la que hay escribiendo entre el “punto” y el “punto y aparte”

La única diferencia entre Serial.print y Serial,println es que el segundo al acabar de transmitir su mensaje, añade automáticamente un carácter de linea nueva (ln), con lo que el receptor sabe que el resto de lo que se le comunique, se debe escribir al comienzo de la siguiente linea, o lo que es equivalente, a enviar un código de “car return” (/r) (retorno de carro, nombre que se conserva de las viejas máquinas de escribirI mas “avanza línea” (/l), o sea, ponerse al principio de ls siguiente línea, Algo que facilita la lectura y comprensión del mensaje recibido.

Su sintaxis es

Serial.print(mensaje, tipo ) o Serial.prinln(mensaje, tipo)

Donde

Serial.print y Serial.println, son los nombres de los mandatos que mandan el mensaje acompañado de un mandato de línea nueva (ln) o lo que es lo mismo, retorno del carro y cambio de linea

mensaje, es el mensaje que queremos comunicar. Según el contenido que tenga el mensaje, la unidad UART, actuará de diferente forma:

Si se envían caracteres entre comillas (“…”), por ejemplo “Contador: “, enviara la el texto «Contador: » incluido el espacio en blanco, tal como se le indicó, pero no envía las comillas de inicio y fin.
Si no hay comillas, asume que es una variable o parámetros definido previamente, y en ese caso enviara el contenido de la variable o parámetro que en ese momento de la ejecución del programa tenga la variable. Si se envía un texto sin comillas, si es un número, lo considera como tal, si son letras lo considera una variable con valor, y emite el valor que en ese momento tuviera la variable

Si se envía un número con varios decimales, por defecto envía sólo los dos primeros decimales

O sea, si en el sketch hay una linea que dice “nun = 78; ” siendo num una variable definida , si se envía escribe el mandato como:

Serial.print ( “Hola mundo”) enviá → Hola mundo
Serial.print ( “60347877”) enviá → 60347877
Serial.print ( “Num”) envía → num
Serial print (9) envía → 78
Serial print (num) envía → 78
Serial.print (3,1416) envía → 3,14

Hay que eludir incluir al carácter “ dentro del mensaje, para no confundir a la UART. Se pueden utilizar como comillas, por ejemplo los caracteres « » u otros cualquiera y en todo caso, sustituirlos posteriormente mediante programación por por comillas si se considera imprescindible.

tipo, es un parámetro opcional, (o sea que se puede poner o no como queramos), que solo puede añadir cuando se envían números, para indicar su naturaleza. Los valores permitidos son, un numero entero, (numero de decimales redondeados), BIN (binario o de base 2), OCT (octal o base 8), DEC (decimal o en base 10), HEX (hexadecimal, o base 16). Para los números de punto flotante, este parámetro especifica el número de decimales a utilizar.

Por ejemplo, observen la diverencia entre los dos mensajes siguientes:

Serial.print (3,1416) envía → 3,14
Serial.print (3,1416,3) envía → 3,142
Serial.print (3,1416,4) envía → 3,1416

Los otros paramentos son menos usados y tiene la ventaja de utilizar la UART para codificar de diferentes formas distintos números sin necesidad de programación adicional así por ejemplo si mandamos el numero 78 o una variable que adquiere ese valor según lo que indique el segundo parámetro, recibiremos los siguientes valores, recibiremos los siguentes valores:

Serial.print (78, BIN) envía → 1001110 (2^7+2^3+2^2*2^1 = 64+8+4+2
Serial.print (78, OCT) envía → 116 (1(8^2)+1(8^1)+6(8^0))= 64+8+6
Serial.print (78, DEC) da envía → 78 (7(10^1)+8(10^0)) = 70+8
Serial.print (78, HEX) da envía → “4E (4(16^1)+14(16^0))= 64+14

Con estos dos únicos mandatos ya podemos mandatr mensajes a pantalla de comunicaciones asincronas del PC. Vemos un ejemplos. Vamos a enviar a la pantalla del Pc un contador de los loops que hace el sketc

Amalisis Funcional.

El ejercicio tiene el objeto de ver un ejemplo de uso de las funciones con el suso de las funciones Serial.print y Serial.println. Serial.print llevará como mensaje un texto “”loop N- ” y a continuacion y por lo tanto seguido el numero que hace el loop saltando de linea una vez escrito
En el Àrea de declaracion de variables definimoos una varia “x” que llevara el contador de los loops
Seleccionar como velocidad 9600 baudios. Escribir el numero de loops realizados al comienzo del loop y retardar un poco el loop para que tenga un ritmo tranquilo la emisión.

/*Sketch 9.1 Transmisión de datos de la Tarjeta Rrduio al PC
* Mandar un contador con el número de loop que se ejecuta
“ hacer un delay de retardo
* Repetir el ciclo*/
// Área de declaracion de variables y parámetros
int x =1; // contador de loops
// Funcion setup
void setup () {
Serial.begin(9600) ; // empezar la trasmisión, velocidad igual a pantalla del PC
}
void loop() {
Serial.print(“loop N- “); // prints a labelnea
Serial.println(x); // escribe j y salta anueva linea
x=x+1;
delay (2000); // linea de retardo para pruebas ************************
}

Como siempre compilamos y corregimos errores. Esta vez no lo podemos hacer en el simulador UnoArduSin por que la función de transmisión si bien la soporta sin problemas a la hora de compilara no la contempla, (o al menos yo h no he sabido como se hace), por lo que compilamos directamente en nuestro programa Arduino.

Para que no tengamos errores siempre que compilemos algún sketch con conumicaciones asíncronas, debemos tener físicamente conectada la Tarjeta Arduino con el PC mediante el cable USB, en otro caso dará errores del puerto COM.

Y el resultado de este sketch lo tenemos aquí

Tódo parece perfecto y fenomenal pero no lo es tanto, Como esto lo i hicieron, (como casi todo ), en USA, la uart pasa bien los caracteres que usan los USA pero no los que usamos los demás como la Ñ ,las vocales acentuadas etc.  Os voy a poner unos ejemplos de estas cosas para que veais como se emite y que se recibe.

el programa es muy parecido al anterior , solo que los textos tendrán algún acento que otro  y una “ñ” y el Nº para que vean como se recibe. A parte en el 10 loop empezara a escribir los numeros de acuerdo con lo que hemos indicado de t referente a los tipos:

/*Sketch 9.2 Transmision de datos con problemas y diferentes tipos
* Mandar un contador con el número de loop que se ejecuta
*pero con acentos y otras cosas molestas en la transmision
“ hacer un delay de retardo
* Repetir el ciclo*/
// Área de declaracion de variables y parámetros
int x =1; // contador de loops
// Funcion setup
void setup () {
Serial.begin(9600) ; // empezar la trasmisión, velocidad igual a pantalla del PC
}
void loop() {
if (11>x) {
Serial.print(“Año 2017 “) ;
Serial.print(“loop número “);
Serial.print(“Nº _” );
Serial.println(x); // escribe j y salta anueva linea
}
else {
Serial.print(“Loop N- “);
Serial.print(x);
Serial.print(” “);
Serial.print(x, BIN);
Serial.print(” “);
Serial.print(x, OCT);
Serial.print(” “);
Serial.print(x, DEC);
Serial.print(” “);
Serial.print(x, HEX);
Serial.println(” “); // escribe j y salta anueva linea
}
x=x+1;
delay (2000); // linea de retardo para pruebas ************************
}

Los mensajes que transmiten son:

Vomo onservaran tanto la “ñ” de “Año”  como la “ú” de “Número” como la “º” de “Nº”, son substituidas por extraños caracteres,

Igualmente  la (x) se emite correctamente, pero sale un tanto confuso y poco practico. En efecto en binario o base 2 (BIN)  11=1(2^3)+1(2^2)+0(2^1)+1 (2^0)=8+2+1  y en base 8 (OCT) 11=1(8^1)+3(8^0)= 8+3 , así como en base 10 (DEC) 11=1(10^1) +1(10^0) y en base 16, o hexadecimal (HEX) vale B(16^0^0=11

Como ven las comunicaciones asíncronas, no son tan sencillas como las había explicado hasta ahora, Puede que en la carrera de telecomunicaciones, estudiadas en profundidad, den para todo un trimestre de estudio, no es ese el propósito de esta capítulo, sino solo indicar la capacidad de las comunicaciones asíncronas de la Tarjeta Arduino y lo básico para mandar mensajes.

Eso es conocer  Serial.print y Serial.pirntln, con eso y con un poco de gracia para eliminar las trampas que nos podamos encontrar. es más que suficiente. Hay soluciones para mejorar estas comunicaciones pero superan el objetivo de este capítulo, les enseño sólo lo suficiente o para que puedan mandar fuera de la Tarjeta Arduino, por ejemplo la lectura de un sensor, como un termómetro o la distancia a un obstáculo. Creo que ello lo podrán conseguir sin gran esfuerzo, con estos conocimientos, eludiendo poner caracteres que den problemas. Pero si de repente ven que sale algo inesperado, lo mas cómodo el cambiar el carácter o la palabra que de problema por otra que no los de.

Por hoy ya vamos bastante cargados de trabajo

Repaso

Como repaso final te diré lo que has aprendido hoy

  • Preparar el PC para recibir/trasmitir cominucaciones asñíncronas a la Tarjeta Arduino por el cable USB.
  • Seleccionar la velocidad en baudios con que trabajara el PC.
  • Mandato Serial.beguin para empezar la Transmision
  • Mandatos Serial.print y Serial, println
  • Hacer un programa para mandar i mensajes de la Tarjeta al PC
  • Limitaciones en el envío de mensajes de caracteres acentuados y similares
  • Signif¡cado del parametro  “tipò” en Serial.print y Serial, println
  • Ressultade de enviar núneros con el tipo BIN, OCT, DEC, y HEXA.
  • Como mandar, un número con decimales,
  •  las comunicaciones asincronas y cual elegir

Ejercicios para resolver

Dejo un par de ejercicios para que intente resolverlos, en breve tendrá la solución en otro capítulo

=================================================================
Puede encontrar resuelto este ejercicio en:
1º Ejercicio de comunicaciones – Informar por donde pasa el loop
=================================================================

1º Ejercicio -Informar al PC por donde está pasando el loop en cada vuelta

En funcióon del valor de un numero aleatorio hay dos caminos posibles  el A que recorre si el numero aleatorio es par y el B si el número aleatorio es impar. Se trata de informar a la pantalla del PC el número de loop que se esta ejecutando y si se pasa por el punto A o por el B

El mandato random(max), devuelve de forma aleatoria un valor entre 0 y (max-1) de modo que la linea

aleatorio = random(2)

Nos devolverá aleatoriamente dos posibles valores, “0” ó “1”,

  • Si es “o” enviar  un mensaje que diga;   “loop numero  X – Pasa por Punto A”
  • Si es “1” enviar  un mensaje que diga;   “loop numero  X – Pasa por Punto B”

2º Ejercicio – Voltímetro 

Mediante un potenciómetro vamos a poder variar manualmente  el voltaje de una linea.,

Ese voltaje se puede detectar en una de las entradas analógicas con valores que varían entre 1023 para los 5 voltios y o para cero voltios,

Comunicar a la pantalla el voltaje de esa linea con dos decimales de precisión, con una frecuencia aproximada de un segundo.

Próximamente  presentare una solución a estos problemas.

Félix Maocho

indice

Anuncios

3 mayo 2017 - Posted by | Curso de Arduino, Robotica | , ,

Aún no hay comentarios.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: