Usando Arduino como DAQ en Labview

Desde hace tiempo estaba buscando alguna forma de hacer o conseguir de manera barata una tarjeta de adquisición de datos que jubilen las improductivas PCLAB-812pg. Estas tarjetas de adquisición de datos las tenemos de dotación en el instituto y solo tienen un "pequeño" problema… el bus ISA, que hace que solo se puedan usar en ordenadores más que obsoletos y de los que cada vez quedan menos.

Hace algún tiempo Angel Perles (gran profesor y mejor director de proyecto) me mando el siguiente enlace por si me interesaba, y vaya si me ha interesado.

NI LabVIEW Interface for Arduino Toolkit – Utilice E/S Arduino con LabVIEW – National Instruments

Por cierto, Angel es el autor de cheapDAQ, del que ya hablaré más adelante.

Bueno, pues resulta que los amigos de NI nos han hecho un traje a medida. Han creado componentes para Labview (VI) y el firmware necesario para convertir una placa de arduino en una tarjeta de adquisición de datos y poder manejarla por USB desde labview. Las características de la DAQ resultante no es que sea como para tirar cohetes (200hz), pero es mejor que lo que teníamos (nada).

Pues nada os explico como he conseguido que funcione. Al lío!

Requisitos:

  • Un arduino (Obvio) basado en el ATMEGA328 o superior (en el ATMEGA168 no cabe el firmware). Vale un Duemilanove, pero en nuestro caso será un Arduino UNO.
  • El IDE de Arduino (versión 1)
  • Labview 2009 o superior (vale la versión trial)
  • Kit de drivers VISA.
  • VIPM (VI package manager).
  • Labview Interface for Arduino (en adelante LIFA)

Lo primero que necesitamos instalar es Labview. Podemos descargar la versión de evaluación del siguiente enlace, aunque para hacerlo primero tendremos que registrarnos.

http://www.ni.com/trylabview/

Una vez unstalado Labview, procedemos a instalar el pack de drivers de VISA, que podemos descargarlo desde la siguiente página. Yo he instalado la versión 5.1.1, pero funciona con la versión 5.0.3 y ya han sacado la 5.1.2.

NI-VISA 5.1.1

Después instalamos el gestor de paquetes VI (VIPM). Podemos descargar la versión de la comunidad (free) de la siguiente página. Este programa será el que descargue e instale los VI de Arduino en Labview.

JKI VI Package Manager.

Una vez instalado todo esto, ejecutamos el gestor de VI (VIPM) y buscamos "Arduino". Solo tenemos que seleccionar el paquete de la lista e instalarlo. Los paquetes de componentes del LIFA se pueden descargar e instalar manualmente, pero esta forma es mucho más fácil. Cuando termine, habremos completado la parte de instalación del Labview, nos queda la parte del Arduino.

VIPM- Busqueda de LIFA

El IDE de arduino lo descargamos directamente de la página de GoogleCode. En la página de Arduino en Español, los enlaces a las últimas versiones no están actualizados, se quedaron en la versión 0019. Yo he utilizado la versión 1.0. En el siguiente enlace está la lista de las últimas versiones del IDE.

http://code.google.com/p/arduino/downloads/list

Una vez descargado lo descomprimimos y nos creamos un enlace en el menú de programas o el escritorio si lo prefieres. Con esto ya está todo instalado y solo tenemos que cargar el firmware del LIFA al Arduino para que se pueda comunicar con Labview.

Dispositivo desconocidoLo primero es conectar la placa de arduino al USB. Si es la primera vez que lo haces, deberás instalar los drivers de windows (si es que todavía usas este SO). No te preocupes que el IDE de arduino ya los trae, solo hay que decirle al sistema en que carpeta se encuentran. Conectamos el Arduino y nos aparece el típico globo que avisa de que no se han encontrado los drivers del nuevo dispositivo, hacemos clic en el y nos da la opción de buscar los drivers. Si no aparece, podemos ir directamente al administrador de dispositivos haciendo clic derecho sobre "Equipo" (Mi PC en XP) y seleccionando Administrar en el menú emergente. Una vez abierto el administrador de dispositivos nos encontraremos con el arduino desconocido.

Hacemos clic con el botón derecho sobre el dispositivo desconocido y elegimos la opción "Actualizar software de controlador". En la siguiente ventana  elegimos la opción "Buscar software de controlador en el equipo". Ahora se nos pedirá que indiquemos en que carpeta están los drivers de arduino. Tendremos que seleccionar la carpeta "drivers" que hay dentro del directorio de Arduino.

Ruta de los drivers de arduino

y aceptamos la instalación del driver, tras lo cual, nuestro arduino estará reconocido en el sistema como un puerto serie. El número de puerto serie lo necesitaremos en los siguientes pasos.

Instalación del driverArduino reconocido como dispositivo

Directorio del sketch de arduinoYa tenemos arduino conectado al usb y reconocido por el sistema, ahora toca programar el arduino con el sketch que comunica la placa con labview. El sketch de arduino se instala con LIFA, por lo que tenemos que ir a la carpeta donde se ha instalado.  La ruta es un poco larga, así que mejor lo miráis en el pantallazo de la derecha. En el directorio LVIFA_Base, se encuentra el archivo LVIFA_Base.pde que es el sketch que debemos abrir. Se nos abrirán además todas las librerías. Cuando lo tenemos todo abierto lo programamos en la placa de arduino. Primero seleccionamos el tipo de placa que estamos utilizando, que en nuestro caso es una arduino UNO. Se selecciona desde el menú tools, en la opción Board.

Sellecionamos Arduino UNO en el menú Tools, opción Board

Selección del puerto serieAhora elegimos el puerto serie (COM) que utiliza el sistema para comunicarse con la placa de arduino. En mi caso es el COM14, pero el sistema nos puede haber asignado cualquier otro. Lo puedes averiguar en el Administrador de dispositivos. El puerto se selecciona en la opción "Serial Port" del menú Tools.

Y ya podemos programar la placa con el botón de la flecha de la parte superior.

Programar

Eso es todo. Con esto ya tenemos lista la placa de arduino para comunicarse con Labview y en Labview tenemos montones de VI que nos van a permitir hacer facilmente aplicaciones para controlar procesos usando arduino como tarjeta de adquisición de datos.

Carpeta de ejemplos de LIFASi abrimos labview podemos usar alguno de los ejemplos que vienen con LIFA. Como ejemplo vamos a ver el hace uso de una entrada analógica. Los ejemplos de LIFA para Labview se instalan por defecto en la carpeta de ejemplos de Labview, y el ejemplo que buscamos es Arduino Analog Read Pin.

Este ejemplo consiste en leer una entrada analógica de Arduino y mostrar la tensión de entrada en un indicador. Primero montamos un circuito que nos varíe la tensión en una entrada con un potenciómetro por ejemplo. El propio ejemplo nos da una esquema para hacerlo:

Esquema para el ejemplo

Front Panel del ejemplo

Una vez montado el  circuito y  abierto el ejemplo tendremos que modificar en el VI  (Arduino Init) los datos referentes a la placa de arduino: Puerto de comunicación y  modelo de Arduino. En la ventana del front end del ejemplo, seleccionamos "Show Block Diagram" del menú Window.

En el diagrama de bloques haremos doble clic sobre el VI de inicialización de Arduino. Este es el encargado de iniciar la comunicación con la placa, por lo que es aquí donde hay que configurar el modelo de placa de Arduino que utilizamos y el puerto serie.

Diagrama de bloques del ejemplo

En la ventana que nos aparece al hacer doble clic, seleccionamos el modelo de Arduino y el puerto serie que utiliza. Se muestra que opciones hay que modificar en la siguiente imagen.

Configuración del VI de arduino

Con eso lo tenemos listo; cerramos las dos ultimas ventanas, y en la ventana del front end ejecutamos la aplicación de Labview. Si la placa está conectada y hemos configurado correctamente la aplicación; al modificar la tensión de la entrada con el potenciómetro, se mueve el indicador de la aplicación. En el siguiente vídeo se puede ver el funcionamiento.

Por último os dejo aquí los enlaces a las páginas de las que he sacado toda esta información:

Espero que os sea tan útil como nos va a ser a nosotros.

Salu2!

Related Posts

Esquema

Arduino DAQ shield...

P1000716

Arduino DAQ Shield: Archi...

Arduino DAQShield: Gerber...

About Bastian

Comments

  1. Sergio MT on 11 mayo, 2012 at 14:18 said:

    Gracias, muy bueno!!

  2. Geovanny Mx on 19 mayo, 2012 at 23:01 said:

    Muy buen aporte la verda estoy por realizar un proyecto me estaba dando dolor de cabeza lo q necesitaba era lo de la conf. del arduino y finalizar con la seleccion del puerto con VI pero creeme si hubiese visto primero tu pag no hubiese batallado tanto antes

  3. DISCULPA AMIGO PERO AL ARDUINO NO SE LE CORRE NINGUN PROGRAMA? 

    • Si!. El Arduino debe de ejecutar el programa que lo comunica con labview por usb. Lo explico a mitad del post, cuando digo:

      “…ahora toca programar el arduino con el sketch que comunica la placa con labview. El sketch de arduino se instala con LIFA, por lo que tenemos que ir a la carpeta donde se ha instalado. La ruta es un poco larga, así que mejor lo miráis en el pantallazo de la derecha. En el directorio LVIFA_Base, se encuentra el archivo LVIFA_Base.pde que es el sketch que debemos abrir. Se nos abrirán además todas las librerías. Cuando lo tenemos todo abierto lo programamos en la placa de arduino…”

    • Thanks for the compiled tuariotl!Just another data point: This still works with Arduino 0021 (the latest pack)Also, those who would want to use this with Uno and MEGA, please check out:Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/boards.txtThis file contains all the values for the MCU, upload speed and the protocol.

      [WORDPRESS HASHCASH] The poster sent us ’0 which is not a hashcash value.

  4. Victor on 14 agosto, 2012 at 18:01 said:

    ayuda, me sale esto:
     
     
     
    LVIFA_Base.cpp: In function 'void processCommand(unsigned char*)':
    LVIFA_Base.pde:-1: error: 'BYTE' was not declared in this scope
     
    Desde Arduino 1.0, la palabra clave 'BYTE' ya no está soportada en 
    Serial.print(var, BYTE). Por favor utiliza Serial.write() en su lugar.
     
    LVIFA_Base.pde:-1: error: 'class TwoWire' has no member named 'send'
     
    Desde Arduino 1.0, la función Wire.send() ha sido renombrada Wire.write() para mantener la consistencia con otras librerías.
     
    LVIFA_Base.pde:-1: error: 'class TwoWire' has no member named 'receive'
     
    Desde Arduino 1.0, la función  Wire.receive() ha sido renombrada Wire.read() para mantener la consistencia con otras librerías.
     
    LVIFA_Base.cpp: In function 'void spi_sendReceive(unsigned char*)':
    LVIFA_Base.pde:-1: error: 'BYTE' was not declared in this scope
     
    Desde Arduino 1.0, la palabra clave 'BYTE' ya no está soportada en 
    Serial.print(var, BYTE). Por favor utiliza Serial.write() en su lugar.
     
    LVIFA_Base.pde:-1: error: 'BYTE' was not declared in this scope
     
    Desde Arduino 1.0, la palabra clave 'BYTE' ya no está soportada en 
    Serial.print(var, BYTE). Por favor utiliza Serial.write() en su lugar.

  5. Carlos on 18 agosto, 2012 at 2:41 said:

    Hola, tengo un problema al tratar de compilar el archivo LVIFA_Base en el arduino. Me sale esto:
    AFmotor\AFMotor.cpp.o: In function `AFMotorController':
    C:\Users\Admin\Documents\Programas\arduino-1.0-windows(1)\arduino-1.0\libraries\AFmotor/AFMotor.cpp:25: multiple definition of `AFMotorController::AFMotorController()'
    AFMotor.cpp.o:C:\Users\Admin\AppData\Local\Temp\build4009067262730563549.tmp/AFMotor.cpp:24: first defined here
    AFmotor\AFMotor.cpp.o: In function `AFMotorController':
    C:\Users\Admin\Documents\Programas\arduino-1.0-windows(1)\arduino-1.0\libraries\AFmotor/AFMotor.cpp:25: multiple definition of `AFMotorController::AFMotorController()'
    AFMotor.cpp.o:C:\Users\Admin\AppData\Local\Temp\build4009067262730563549.tmp/AFMotor.cpp:24: first defined here
    AFmotor\AFMotor.cpp.o: In function `AF_DCMotor::setSpeed(unsigned char)':
    C:\Users\Admin\Documents\Programas\arduino-1.0-windows(1)\arduino-1.0\libraries\AFmotor/AFMotor.cpp:299: multiple definition of `AF_DCMotor::setSpeed(unsigned char)'
    AFMotor.cpp.o:C:\Users\Admin\AppData\Local\Temp\build4009067262730563549.tmp/AFMotor.cpp:298: first defined here
    AFmotor\AFMotor.cpp.o: In function `AF_Stepper::setSpeed(unsigned int)':
    C:\Users\Admin\Documents\Programas\arduino-1.0-windows(1)\arduino-1.0\libraries\AFmotor/AFMotor.cpp:360: multiple definition of `AF_Stepper::setSpeed(unsigned int)'
    AFMotor.cpp.o:C:\Users\Admin\AppData\Local\Temp\build4009067262730563549.tmp/AFMotor.cpp:359: first defined here
    AFmotor\AFMotor.cpp.o: In function `AFMotorController::latch_tx()':
    C:\Users\Admin\Documents\Programas\arduino-1.0-windows(1)\arduino-1.0\libraries\AFmotor/AFMotor.cpp:49: multiple definition of `AFMotorController::latch_tx()'
    AFMotor.cpp.o:C:\Users\Admin\AppData\Local\Temp\build4009067262730563549.tmp/AFMotor.cpp:48: first defined here
    AFmotor\AFMotor.cpp.o: In function `AF_Stepper::onestep(unsigned char, unsigned char)':
    C:\Users\Admin\Documents\Programas\arduino-1.0-windows(1)\arduino-1.0\libraries\AFmotor/AFMotor.cpp:414: multiple definition of `AF_Stepper::onestep(unsigned char, unsigned char)'
    AFMotor.cpp.o:C:\Users\Admin\AppData\Local\Temp\build4009067262730563549.tmp/AFMotor.cpp:413: first defined here
    AFmotor\AFMotor.cpp.o:(.data.microstepcurve+0×0): multiple definition of `microstepcurve'
    AFMotor.cpp.o:(.data.microstepcurve+0×0): first defined here
    AFmotor\AFMotor.cpp.o: In function `AF_Stepper::step(unsigned int, unsigned char, unsigned char)':
    C:\Users\Admin\Documents\Programas\arduino-1.0-windows(1)\arduino-1.0\libraries\AFmotor/AFMotor.cpp:377: multiple definition of `AF_Stepper::step(unsigned int, unsigned char, unsigned char)'
    AFMotor.cpp.o:C:\Users\Admin\AppData\Local\Temp\build4009067262730563549.tmp/AFMotor.cpp:376: first defined here
    AFmotor\AFMotor.cpp.o: In function `AF_Stepper::release()':
    C:\Users\Admin\Documents\Programas\arduino-1.0-windows(1)\arduino-1.0\libraries\AFmotor/AFMotor.cpp:366: multiple definition of `AF_Stepper::release()'
    AFMotor.cpp.o:C:\Users\Admin\AppData\Local\Temp\build4009067262730563549.tmp/AFMotor.cpp:365: first defined here
    AFmotor\AFMotor.cpp.o: In function `AF_DCMotor::run(unsigned char)':
    C:\Users\Admin\Documents\Programas\arduino-1.0-windows(1)\arduino-1.0\libraries\AFmotor/AFMotor.cpp:265: multiple definition of `AF_DCMotor::run(unsigned char)'
    AFMotor.cpp.o:C:\Users\Admin\AppData\Local\Temp\build4009067262730563549.tmp/AFMotor.cpp:264: first defined here
    AFmotor\AFMotor.cpp.o: In function `AFMotorController::enable()':
    C:\Users\Admin\Documents\Programas\arduino-1.0-windows(1)\arduino-1.0\libraries\AFmotor/AFMotor.cpp:27: multiple definition of `AFMotorController::enable()'
    AFMotor.cpp.o:C:\Users\Admin\AppData\Local\Temp\build4009067262730563549.tmp/AFMotor.cpp:26: first defined here
    AFmotor\AFMotor.cpp.o: In function `AF_DCMotor':
    C:\Users\Admin\Documents\Programas\arduino-1.0-windows(1)\arduino-1.0\libraries\AFmotor/AFMotor.cpp:235: multiple definition of `AF_DCMotor::AF_DCMotor(unsigned char, unsigned char)'
    AFMotor.cpp.o:C:\Users\Admin\AppData\Local\Temp\build4009067262730563549.tmp/AFMotor.cpp:234: first defined here
    AFmotor\AFMotor.cpp.o: In function `AF_DCMotor':
    C:\Users\Admin\Documents\Programas\arduino-1.0-windows(1)\arduino-1.0\libraries\AFmotor/AFMotor.cpp:235: multiple definition of `AF_DCMotor::AF_DCMotor(unsigned char, unsigned char)'
     

  6. Carlos Tapia Ayala on 30 agosto, 2012 at 16:19 said:

    Muy buen aporte estimados, pero me preguntaba si se puede el proceso pero de manera inversa, es decir, tomar un control numerico, desde labview, y enviarlo hacia arduino, y en arduino almacenar ese dato en una variable y comenzar a jugar con esa informacion obtenida.. espero su respuesta y ayda….

    • Por poder, se puede hacer, pero esto no te sirve. Tienes que hacer en labview un proceso que controle el CNC y envie al puerto serie (el que utiliza arduino) el dato que necesitas. Luego debes programar el aurduino para que procese la información obtenida por el puerto serie..

  7. Carlos Tapia Ayala on 31 agosto, 2012 at 18:28 said:

    Muchas Gracias Bastian, por tu respuesta.
    ENtonces, no puedo utilizar unos de tantos puertos pwm que tiene el arduino, para poder leer ese valor, que envio desde labview ??

  8. Carlos Tapia Ayala on 31 agosto, 2012 at 18:35 said:

    Ademas, me olvide mencionarlo, desde arduino puede enviar :
    una senal digital,
    una senal analogica
    y recibir en labview
     
    y desde labview, puedo enviar una senal digital, y recibirlo en arduino, me parece que si podria hacer recibir una senal analogica o utilizando un control number desde labview, para recibirlo en arduino. me parece que la clave es en pwm.
    A decir verdad, ya hecho esa prueba, pero cuando la recibo en el arduino, no sabria como tomarla. me parece que algun comando me hace falta para leerla.  EN el labview, le indico que el puerto3 (pwm), envia un control number
    y en el arduino, de tipo la recibo ??? analogica ?, digital ???, y como hago para leer esa senal que esta enviada a traves del pin pwm ??, porque segun lo que yo se existe la programacion DigitalWrite para pwm y analogRead para senales digitales ??……..porfa estimado ayudame..
     
     
     
     

  9. Hola Bastian soy nuevo,mi pregunta es para la instalación de drivers en labview por que instale el paquete Visa y me da error de drivers error 5005 a que se debe?. Un saludo ,gracias

  10. hector on 25 noviembre, 2012 at 5:45 said:

    buen dia  a todos espero y me puedan ayudar
     el problema es que yo tengo un arduino duemilanove y al intentar correr el programa para  labview no me lo permite me dise que la memoria es insuficiente que puedo aser para poder comunicar mi arduino duemilanove con labview

  11. raulsb on 28 noviembre, 2012 at 2:42 said:

     
    que tal amigo, lo que pasa es que no me aparece la libreria LIFA_BASE por lo tanto cuando ya quiero hacer el ultimo paso me marca este error
     
    core.a(main.cpp.o): In function `main':
    C:\Users\Lenovo\Documents\arduino-1.0.2-windows (1)\arduino-1.0.2\hardware\arduino\cores\arduino/main.cpp:5: undefined reference to `setup'
    C:\Users\Lenovo\Documents\arduino-1.0.2-windows (1)\arduino-1.0.2\hardware\arduino\cores\arduino/main.cpp:15: undefined reference to `loop'

Deja un comentario

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

*


*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

UA-4057182-4