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.

httpv://www.youtube.com/watch?v=BhIa7FT4Gm0

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!

26 comments for “Usando Arduino como DAQ en Labview

  1. Sergio MT
    mayo 11, 2012 at 2:18 pm

    Gracias, muy bueno!!

  2. Geovanny Mx
    mayo 19, 2012 at 11:01 pm

    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. junio 20, 2012 at 7:30 am

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

    • junio 23, 2012 at 3:02 pm

      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…”

    • agosto 19, 2012 at 1:20 am

      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
    agosto 14, 2012 at 6:01 pm

    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.

    • agosto 15, 2012 at 7:12 am

      Tiene pinta de que estás compilando una versión antigua del LIFA… te has descargado la versión correcta/última?

  5. Carlos
    agosto 18, 2012 at 2:41 am

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

  6. Carlos Tapia Ayala
    agosto 30, 2012 at 4:19 pm

    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….

    • agosto 31, 2012 at 1:02 pm

      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
    agosto 31, 2012 at 6:28 pm

    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
    agosto 31, 2012 at 6:35 pm

    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. Jorge
    septiembre 26, 2012 at 5:16 pm

    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
    noviembre 25, 2012 at 5:45 am

    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
    noviembre 28, 2012 at 2:42 am

     
    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:UsersLenovoDocumentsarduino-1.0.2-windows (1)arduino-1.0.2hardwarearduinocoresarduino/main.cpp:5: undefined reference to `setup'
    C:UsersLenovoDocumentsarduino-1.0.2-windows (1)arduino-1.0.2hardwarearduinocoresarduino/main.cpp:15: undefined reference to `loop'

  12. Mario
    marzo 12, 2013 at 2:33 pm

    Hola, he querido desargar el Lifa desde VIPM pero me sle un error que no encuentranla ubicacion del repositorio o algo asi…a alguien le ha pasado esto? Saludos!!!

  13. Joel
    abril 28, 2013 at 10:21 pm

    Hola me sale error a la hora de querer instalar vipm-2012, tengo labview 2010.
    VIMP 2012 windows setup requiere a version 2011 (or compatible) Labview run-time engine- To correct this problem, please contact the vendor of vimp 2012. or download labview run-time engine from the national instruments web site. 
    Ya lo he descargado y lo tengo instalado y aun así no me deja ejecutar el VIMP
     

  14. Joel
    abril 29, 2013 at 4:17 am

    Hola tengo problemas al compilar el sketch de ejemplo
     
    LIFA_Base.cpp.o: In function `loop':
    C:UsersJoelDesktoparduino-1.0.4-windowsarduino-1.0.4/LIFA_Base.ino:59: undefined reference to `checkForCommand()'
    C:UsersJoelDesktoparduino-1.0.4-windowsarduino-1.0.4/LIFA_Base.ino:65: undefined reference to `sampleContinously()'
    LIFA_Base.cpp.o: In function `setup':
    C:UsersJoelDesktoparduino-1.0.4-windowsarduino-1.0.4/LIFA_Base.ino:39: undefined reference to `syncLV()'
     

  15. ee
    mayo 3, 2013 at 1:49 am

    Buen dia tengo el problema que no me puedo comunicar desde labview con el arduino uno que tengo, ya hice todo lo que indicas pero hay una diferencia que en el archivo LVIFA_Base.pde no me aparece solo esta una carpeta con el nombre LIFA_Base y use un programa LIFA_Base.ino pues no tengo otro que aparezca. El problema que al correr un programa aunque sea uno de prueba sencillo como encender un led me manda el error 5001 me podrias ayudar y decirme en que estoy mal el equipo que uso es a 64 bits, tengo todo en 64bits menos el software de Arduino y el VIPM no se si esto me afecta puedes ayudarme me urge gracias

  16. Ezreal
    mayo 28, 2013 at 5:47 am

    Buenísimo, muchas gracias por el aporte todo claro y preciso.

  17. Joshua
    junio 20, 2013 at 7:48 pm

    Olles yo tengo una duda sobre la conexion con el arduino mega 

    como hacer para que funcionen todos los pines ya que solo puedo controlar hasta el pin 13 como si tuviera un arduino one, y ya le configure en el bloque de apertura escritura y leer los puse en mega 2650 y aun asi no puedo

  18. JOrge
    julio 13, 2013 at 12:23 pm

    yo tengo una msp 430 launchpad y l progamo con un soft llamado energia quees muy similar a la ide de arduino que posibilidades tengo de que este proyectio sea compatible con mi launchpad si todo archivo que tengamos en arduino lo podemos montar en la launchpad si modificar el programam y funciona

     

    • julio 22, 2013 at 2:04 pm

      NO creo que te funcione el mismo programa para la launchpad. El problema es que aunque la programación sea compatible entre energia y arduino, el hardware no lo es con lo cual no creo que te funcione sin modificar el programa. Por cierto, yo estoy usando energia pero  con la Stellaris (Cortex-M4) y tiene buena pinta.

      Salu2!

  19. taka
    julio 21, 2013 at 11:04 pm

    Para los que tienen problemas con este error:

    LIFA_Base.cpp.o: In function `loop':
    C:UsersJoelDesktoparduino-1.0.4-windowsarduino-1.0.4/LIFA_Base.ino:59: undefined reference to `checkForCommand()'
    C:UsersJoelDesktoparduino-1.0.4-windowsarduino-1.0.4/LIFA_Base.ino:65: undefined reference to `sampleContinously()'
    LIFA_Base.cpp.o: In function `setup':
    C:UsersJoelDesktoparduino-1.0.4-windowsarduino-1.0.4/LIFA_Base.ino:39: undefined reference to `syncLV()'

    Solo tienen que copiar el archivo que se encuentra dentro de una carpeta que se encuentra en la carpeta de  LIFA_BASE me parece que se llama lab view interface bueno es la única carpeta que se encuentra. Ese archivo lo copian y lo pegan afuera de la misma cárpete ejecuten LIFA_Base.ino y lo abren con arduino y compilan el error debería desaparecer por lo menos me funciono a mi.

    • julio 22, 2013 at 2:04 pm

      Gracias por la info!

       

      Salu2!

  20. kike
    agosto 28, 2013 at 1:45 pm

    Buen dia amigos, alguien me puede ayudar quiero construir usar una cnc con arduino pero con un software que funcione en windows que no sea en linux porfa y gracias de antemano.

Comments are closed.