Blog de indusele

arduino

Qué hacer ante un error “avrdude stk500_getsync() not in sync resp=0x00” en Arduino

Escrito por indusele 02-08-2015 en arduino. Comentarios (0)

Actualmente me encuentro preparando nuevos contenidos para el blog, lo que me ha llevado a experimentar con una placa RFID-RC522 para poner en práctica lo que hemos visto hasta ahora de RFID y de Arduino en post anteriores. En una de las primeras pruebas me encontré que al compilar aparecía un error que hasta ahora no había visto: “avrdude stk500_getsync() not in sync resp=0x00”.

Investigando en foros comprobé que es un error usual que puede deberse a falta de comunicación. Algunos usuarios llegaron a asustarse llegando a desesperarse porque su placa “no reacciona”, porque tuvieron que volver a instalar el compilador con todos los drivers de forma manual o porque algún usuario le indicaba que este error podía deberse a que su ATmega16 podría haberse roto con lo que tendrían que comprar otra placa…

Como siempre, antes de desesperarme, empecé a revisar lo más básico y ese fue el problema así que si os encontráis con este error probar mi solución antes de desinstalar o resetear nada.

Leí en algún lado que el error podía deberse a un cambio de identificación en el puerto así que lo primero que comprobé fue que éste correspondiera con el que había configurado al instalar la consola de Arduino: CORRECTO. No sé muy bien la razón pero aproveché a comprobar la configuración de la placa y ahí estaba el error. Resulta que estaba intentando cargar el código en una placa Arduino UNO y mi placa es una Arduino MEGA 2560 con lo que la comunicación no se podía establecer. Cambié la configuración y no hubo ningún problema más. Os dejo un vídeo con los pasos:

Siempre se mete la pata en lo más básico. Estoy segura de que no se me olvidará comprobar la configuración de la consola cada vez que la abra.

“El único hombre que no se equivoca es el que nunca hace nada.” Goethe

Pero, ¿cómo se produce la comunicación entre Arduino y Labview?

Escrito por indusele 19-01-2015 en arduino. Comentarios (0)

Después de ver un ejemplo básico de encendido de un LED en Arduino a través de un scada realizado en Labview, hoy voy a explicar en qué se basa la comunicación entre estos dos programas ya que , pese a ser algo muy teórico, puede ser de gran ayuda en aplicaciones más complejas:

Comunicación serie de Arduino

La comunicación serial se suele emplear para comunicar Arduino con un ordenador u otros dispositivos. Todas las placas Arduino tienen al menor un puerto serie también nombrado como UART el cual comunica los pines digitales 0(RX) y 1(TX) con el ordenador a través de USB. UART significa “Universal Asynchronous Receiver-Transmitter” y es un controlador de puertos y dispositivos en serie. Normalmente se encuentra integrado en la placa base y sirve para manejar las interrupciones de los dispositivos conectados al puerto serie y convertir los datos en formato paralelo en formato serie para que puedan ser transmitidos a través de los puertos y viceversa. Los UART son programables y debe configurarse la velocidad, la paridad, la longitud y los bits de parada. El UART viene incluido en el hardware de Arduino integrado en el chip, el cual permite la comunicación incluso mientras se trabaja en otras tareas, siempre que haya un espacio en el buffer de serie de 64 bytes:

“Para entender el uso del buffer normalmente se usa el ejemplo de la sala de espera del médico. Esta sala de espera es el buffer, que tiene una capacidad de 64 pacientes. Cada paciente es 1 byte. El médico va atendiendo cada paciente uno por uno por orden de llegada. La enfermera que deja entrar a los pacientes a la sala de espera son los baudios (la velocidad de recibir datos), cuando más grande sea la velocidad, más gente entra en la sala. Si la sala está completa con 64 pacientes y llegan más, estos serán rechazados (drop o loss).” (Diymakers, 2014)

El puerto es el nombre genérico para definir las interfaces, físicos o virtuales, que permiten la comunicación entre dos ordenadores o dispositivos. El puerto serie (o puerto serial) es una interfaz de comunicaciones de datos digitales donde la información es transmitida bit a bit, es decir, envía un único bit a la vez en lugar de varios bits simultáneos como ocurre con la transmisión en paralelo que envía varios bits simultáneamente. Esta secuencia de bits es la forma de enviar la información a través de los dispositivos.

La transferencia de datos a través de los puertos de serie se emplea con frecuencia asociándose sobre todo al estándar RS-232; no obstante, últimamente se ha optado por la comunicación USB la cual manda los datos como un flujo en serie debido a que es más rápida la transmisión. En el caso de Arduino MEGA se caracteriza por usar un microcontrolador ATmega16U2 que está programado como un convertidor de USB a serie, lo que significa que no utiliza el chip controlador de USB a serial FTDI debido a que la conversión se realiza a través de programación.

Hay que tener en cuenta, además, que Arduino MEGA tiene tres puertos adicionales además del RX(0) Y TX0(1):

Serial1 en los pines 19(RX) y 18(TX)

Serial2 en los pines 17(RX) y 16(TX)

Serial3 en los pines 15(RX) y 14(TX)

Además, para usar estos pines para comunicarse con un ordenador, se necesitará un adaptador adicional de USB a serie por no estar conectado al adaptador de la MEGA.

La biblioteca SoftwareSerial permite la comunicación en serie en cualquiera de los pines digitales del MEGA 2560. Este recurso de software permite la comunicación con múltiples puertos con velocidades de transmisión de hasta 115200 bps aunque tiene un par de limitaciones:

·  Durante el uso de múltiples puertos, sólo se puede recibir un dato y no varios a la vez.

·  No todos los pines soportan interrupciones, sólo se pueden emplear para RX: 0, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).

¿Qué comandos debo emplear para la comunicación serie?

En las próximas semanas incluiré un ejemplo básico de encendido y apagado de un led a través de Labview y basado en toda la teoría que hemos visto hoy. ¡Hasta pronto!

“El hombre vulgar, cuando emprende una cosa, la echa a perder por tener prisa en terminarla.” Lao Tse

¿Es posible comunicar Arduino y Labview?

Escrito por indusele 14-11-2014 en arduino. Comentarios (0)

Por supuesto, y esto nos permite aprovechar todas las ventajas de las que hemos hablado tanto de Arduino como de Labview. Hoy vamos a ver cómo conseguirlo.

En primer lugar nos tenemos que ocupar de la instalación del programa en nuestro ordenador desde la página web de National Instruments. En segundo lugar, se conectó el Arduino al ordenador a través del cable USB por el que se cargará el programa o sketches que realizamos para nuestra aplicación particular.

El siguiente paso es la instalación de la toolkit gratuita de Arduino, NI LabVIEW Interface for Arduino Toolkit la cual se puede adquirir también en la web de National Instruments. Esta toolkit permite establecer una interfaz con el microcontrolador Arduino usando Labview o, explicado de forma más simplificada, adquirir los datos del microcontrolador Arduino y procesarlos en el entorno de programación gráfica de Labview. Una vez instalada, se debe instalar un Firmware en Arduino el cual está dentro de una carpeta en el directorio donde se han instalado los componentes del toolkit, la cual se llama LVIFA_Base y se encuentra dentro de vi.lib y en la ruta de Archivos de Programa. Cargamos el firmware \ LabViewvi.libLabVIEW Interface for ArduinoFirmwareLVIFA_Base en nuestro Arduino como si fuera un programa y abrimos uno de los archivos que están dentro de la carpeta LVIFA_base. El último paso es compilar, cargar en Arduino y ajustar la velocidad del puerto serie de nuestro Arduino ya que  en Labview por defecto se trabaja a 115200; se cambian por lo tanto los 9600 que muestra el puerto serie en el administrador de tareas por los 115200 que muestra Labview para un correcto funcionamiento y buscamos qué puerto COM utiliza Arduino para después usar esta información en Labview. A continuación se presentan un tutorial paso a paso del proceso seguido:

Descarga de VI Package Manager

Se trata de un administrador de herramientas que gestionará la instalación del toolkit de Arduino. En la web se permite la descarga de forma gratuita y para la última versión. Aunque en un principio pueda parecer que el hecho de emplear una versión 2014 para Labview 2013 sea un motivo de errores esto no es así. No obstante, tal y como se informa junto al link de descarga, es necesaria una versión de 2011 como mínimo (requisito con el que se cumple).

Instalación de Labview Interface for Arduino

Al abrir el VI Package Manager se busca “Arduino” para localizar la toolkit tal y como se observa en el vídeo resumen (al final del post). Tenemos que acceder a la ventana de instalación de la toolkit.

Por otro lado y para evitar problemas es importante hacer una serie de modificaciones previas en Labview. Debería aparecer una configuración como la que se ilustra excepto en el valor destacado en naranja ya que se trata de la dirección IP del ordenador desde el que se trabaja, por lo que será distinto. Después de esto ya se puede realizar la instalación tal y como se indicó al inicio de este apartado.

Cómo conseguir que Arduino y Labview “se entiendan” o hablen el mismo lenguaje.

Simplemente se tienen que descargar una serie de códigos que deben ejecutarse en el compilador de Arduino y que se puede ver en el resumen del ejemplo que he realizado como comprobación; si se han seguido los pasos anteriores y se ha efectuado correctamente las instalaciones pertinentes Arduino aparecerá en la paleta de funciones del Labview. No obstante, los ejemplos que nos encontraremos están desarrollados para Arduino UNO. Para un Arduino MEGA se debe colocar un elemento adicional: un control de VISA y un control de la propia placa. VISA es una herramienta específica de Arduino que funciona como una especie de OPC. El OPC es un estándar de comunicación en el campo del control y supervisión basado en tecnología Microsoft y que ofrece una interfaz común que permite que distintos equipos individuales puedan compartir datos a través de una arquitectura cliente-servidor. Esto significa que puedo compartir datos entre elementos de distintas marcas comerciales (la mayoría han incluido OPC en sus productos) solucionando el problema de la adaptación de drivers. Se puede descargar VISA de forma gratuita aquí.

Podéis ver el siguiente vídeo resumen con los pasos seguidos:


¡Ya lo tenemos instalado! En los próximos días os explicaré alguna cosilla más y subiré un ejemplo sencillo de control mediante Scada desde Labview usando la placa Arduino que hemos adquirido (en mi caso, la MEGA).

Como veis, a veces tenemos que plantearnos si se pueden usar varias herramientas de forma conjunta puesto que las ventajas que nos pueden dar pueden marcar la diferencia en nuestras aplicaciones; como dice el refrán, “La abeja de todas las flores se aprovecha”.

EJEMPLO 4. Control de intensidad lumínica de un LED por contro PWM

Escrito por indusele 16-10-2014 en arduino. Comentarios (0)

Hoy vamos aprender un par de cosas muy básicas; empecemos por explicar qué es el control de PWM, el cual se suele utilizar bastante. Control por PWM es lo mismo que decir modulación por ancho de pulso. Básicamente consiste en modificar el ciclo de trabajo de una señal periódica variando el ancho de su parte positiva. Esto es posible debido a que el ciclo de trabajo es el cociente del ancho de pulso entre el periodo de la función. Para ello se requiere dividir el circuito en dos partes distintas con un nexo de unión que será el comparador.

Estos métodos se basan fundamentalmente en la comparación del contenido de un registro contador que cuenta los ciclos del sistema con valores de tres registros de continua (el primero con la consigna de la frecuencia de la señal de modulación, el segundo con la consigna del intervalo de tiempo a nivel alto de la señal de control y el tercero con la consigna de tiempo muerto entre la activación y desactivación). Esto significa que tendremos una salida y dos entradas. Según lo que hemos visto, una de las entradas es la que da la frecuencia a la señal del modulador y la otra entrada será la que determina la salida dado que es la que está vinculada con un oscilador de tipo de dientes de sierra.

Puede tener varios objetivos, como tener el control de la energía que se proporciona a una carga (nuestro caso) o llevar a cabo la transmisión de datos. Pasemos a la práctica. Hoy tenemos que hacer un montaje muy simple (al cual tenéis acceso, como siempre, desde este enlace) y un código muy sencillo:

Como he dicho, este ejemplo sirve además para conocer cómo funciona un bucle for. For, literalmente, significa ‘para’; esto nos da una pista de que un bucle for se ejecuta para una condición dada. Por lo tanto, siempre que se esté cumpliendo la condición impuesta entre paréntesis se ejecutarán las instrucciones descritas entre llaves.

Normalmente, el bucle for se emplea para instrucciones que han de repetirse, contadores… En este caso como deseamos que el LED se encienda de forma progresiva lo que hacemos es definir un contador i que se va incrementando uno a uno (eso quiere decir i++, es análogo a poner i=i+1). Esto significa que si tenemos una “energía lumínica total” igual a 255 se irá incrementando uno a uno hasta alcanzar el máximo. El delay no es necesario, simplemente nos permite visualizar ese aumento de intensidad porque de otro modo sería inmediato y nuestro ojo no podría apreciarlo.

Una vez alcanzado el máximo, se ejecuta otro bucle for que parte de un valor inicial máximo (i=255) para alcanzar uno a uno (como decrece, i—que es lo mismo que i=i-1) hasta que se apague (el valor mínimo será i=0). Normalmente en estas condiciones se pone < ó > en lugar de = porque se considera que se empieza a contar desde el valor 0 al valor 1.

El bucle for es bastante usual, como ya he comentado, y forma parte de los tres bucles básicos que son el if (el cual ya lo empleamos en el EJEMPLO 2 y en el EJEMPLO 3) y el while que ya explicaremos. Sin embargo, creo que hay que prestar especial cuidado a la hora de comprender cómo se realiza el control PWM porque se empleará en muchas aplicaciones de Arduino. Por si no ha quedado claro os dejo un vídeo, ¡hasta pronto!


EJEMPLO 3. Encendido de un LED mediante un pulsador

Escrito por indusele 18-09-2014 en arduino. Comentarios (0)

Hemos trabajado ya con el LED haciéndolo parpadear a distintos tiempos. En este caso introduzco un nuevo elemento: el pulsador. Como el pulsador va a controlar el encendido y el apagado del LED, éste va a ser una entrada y el LED una salida definida tal y como vimos (recuadro verde).

A continuación voy a hacer una modificación del código ya que el primero está muy simplificado pero sólo permite el encendido mientras presiono el pulsador; el segundo permite mantener encendido el LED sin mantener la presión y en el último caso se introduce un delay de 10 milisegundos para evitar problemas de conmutación.

Todo esto se va a centrar en el uso del comando if (recuadrado en rojo).

Como veis es algo muy sencillo pero si tenéis problemas con el montaje os dejo un ejemplo, más adelante iremos complicando las cosas así que no dejéis de practicar.