Páginas

miércoles, 14 de mayo de 2014

"Control Arduino with VB.NET"

Buenas a tod@s, 

Espero con esta nueva entrada poder contribuir con mi granito de arena a ayudar a todos aquellos que os habéis animado en el mundo de la electrónica a intentar hacer alguna aplicación con "Visual Basic .NET y Arduino". Sin más preambulos aquí esta todo lo que necesitáis.

Os presento la aplicación "Control Arduino with Visual Basic .NET by RS232-USB" realizada en "VB .NET para controlar Arduino" Uno, cuyo microcontrolador es el ATMega328P-PU. Con ella podréis manejar a vuestro gusto cualquiera de los puertos de I/O de la tarjeta, tanto los pines digitales, como los PWM así como también los analógicos.

Esta es la fachada de como ha quedado la aplicación:


"VB.NET Arduino"


Aquí os muestro la tarjeta que he usado para el control y las pruebas:



Y un pequeño esquema con el montaje:



En este par de vídeos os muestro como manejar la aplicación de "VB .NET para controlar Arduino"







En esta imagen os muestro las alternativas de configuración software que se puede hacer de los pines I/O del Arduino (aunque no todos los pines soportan la configuración PWM). Lo mejor es usar el datasheet del microcontrolador ATMega328P-PU, para aclarar cualquier duda sobre las posibles configuración de cada pin de I/O.


De todos modos en el código tanto del Arduino como en el de la aplicación de Visual Basic .NET os he dejado explicado los comandos de las tramas de comunicación enviadas y lo que significa cada valor. Como podeis observar es un protocolo que me he inventado y que no tiene porque ser de esta manera, cada uno puede hacerse el suyo acorde a sus necesidades o a su gusto.

  // SALIDA PWM  / PWM OUTPUT
// In this case, for do any actions with PWM the received command must be:
// Example: P03_OUT_125
// Where
 //       inDatoVB[0] = P --> PWM PIN
//       inDatoVB[1] = Number of the pin (tens)
//       inDatoVB[2] = Number of the pin (units)
//       inDatoVB[3] = Always Character '_'
//       inDatoVB[4] = Character 'O' -->
//       inDatoVB[5] = Character 'U' -->   Type of PIN OUTPUT
//       inDatoVB[6] = Character 'T' -->
//       inDatoVB[7] = Always Character '_'
//       inDatoVB[8] = Units value -->
//       inDatoVB[9] = Tens value -->      value XXX To PWM
//       inDatoVB[10] = Hundreds value -->


  //SALIDA DIGITAL / DIGITAL OUTPUT
// In this case, for do any actions with DIGITAL OUT the received command must be:
// Example: D03_OUT_XX0
// Where:
 //       inDatoVB[0] = D --> DIGITAL PIN
//       inDatoVB[1] = Number of the pin (tens)
//       inDatoVB[2] = Number of the pin (units)
//       inDatoVB[3] = Always Character '_'
//       inDatoVB[4] = Character 'O' -->
//       inDatoVB[5] = Character 'U' -->   Type of PIN OUTPUT
//       inDatoVB[6] = Character 'T' -->
//       inDatoVB[7] = Always Character '_'
//       inDatoVB[8] = Always Character 'X'
//       inDatoVB[9] = Always Character 'X'
//       inDatoVB[10] = State of the out PIN --> Value 0 or 1


  //ENTRADA DIGITAL  / DIGITAL INPUT
// In this case, for do any actions with DIGITAL IN the received command must be:
// Example: D03_IN__XXX
// Where:
 //       inDatoVB[0] = D --> DIGITAL PIN
//       inDatoVB[1] = Number of the pin (tens)
//       inDatoVB[2] = Number of the pin (units)
//       inDatoVB[3] = Always Character '_'
//       inDatoVB[4] = Character 'I' -->
//       inDatoVB[5] = Character 'N' -->   Type of PIN INPUT
//       inDatoVB[6] = Always Character '_'
//       inDatoVB[7] = Always Character '_'
//       inDatoVB[8] = Always Character 'X'
//       inDatoVB[9] = Always Character 'X'
//       inDatoVB[10] = Always Character 'X'


  // ENTRADA ANALOGICA / ANALOG INPUT
// In this case, for do any actions with ANALOG INPUT the received command must be:
// Example: A03_IN__XXX
// Where:
 //       inDatoVB[0] = A --> ANALOG PIN
//       inDatoVB[1] = Number of the pin (tens)
//       inDatoVB[2] = Number of the pin (units)
//       inDatoVB[3] = Always Character '_'
//       inDatoVB[4] = Character 'I' -->
//       inDatoVB[5] = Character 'N' -->   Type of PIN INPUT
//       inDatoVB[6] = Always Character '_'
//       inDatoVB[7] = Always Character '_'
//       inDatoVB[8] = Always Character 'X'
//       inDatoVB[9] = Always Character 'X'
//       inDatoVB[10] = Always Character 'X'


En esta otra imagen, podéis observar los comandos que se envían vía serie al Arduino para que el Software en Visual Basic .NET los interprete y en consecuencia actúe sobre los pines I/O.  Como podeis comprobar los comandos que se encuentran de color verde son los comandos que he construido desde la aplicación de VB.NET para enviar al arduino y que anteriormente os he explicado unas lineas más arriba.




Esta es la estructura de como he dejado las regiones del código de la aplicación:





Pues bien, aquí os dejo todo el código de la aplicación realizada con Visual Basic .NET:

Código de la Aplicación "Control Arduino with VB .NET"  
 (Incluye el código .ino para Arduino y todo el código Visual Basic .NET más la libreria .dll del Led)

Por cierto, la libreria .dll del led a la que me refiero es la que se encuentra en otra página de este mismo blog. 


(Precisamente, esto fue, lo que me hizo retrasar la publicación completa de esta entrada, pues hasta que no finalice el control LED .dll no decidí publicarlo, pues quería hacer uso de la misma como ejemplo de uso de este mismo control)


Y el código fuente que habría que volcar en el Arduino. Lleva algunos comentarios así como la explicación del protocolo que me he generado:


Código fuente para la tarjeta de Arduino. 



Pantallazo de como es programado con éxito el fichero de configuración para el Arduino.



Finalmente os dejo también un par de vídeos donde se ven como se maneja la aplicación software junto con la placa board de pruebas. En ellos veréis el  funcionamiento completo de control sobre todos los pines I/O.






Espero que os guste y que a partir de este ejemplo podáis hacer vosotros vuestras aplicaciones de control con Arduino personalizadas para vuestras aplicaciones. ....¡Ánimo!...

Ya estoy en marcha con nuevos ejemplos ....!!

Un saludo y hasta pronto.

----------------------------------------------------------------------------------------------------------------------------------------------------------------
Por favor, si te ha gustado el blog, te ha ayudado o has visto algún proyecto interesante del que te has podido descargar alguna documentación por favor deja algún comentario. Gracias.
----------------------------------------------------------------------------------------------------------------------------------------------------------------


Aclaraciones para algunos de los comentarios que me han pedido por email:


-------------------------------------------------------------------------------------------------------------------------

PREGUNTA DE:

Jacobo Rodriguez Herrera jotarodriguez_@hotmail.com




Buenas tardes Rubén,

Me dirijo a ti pues he estoy intentando lanzar al mundo Arduino pero sin exito y me empiezo a desanimar un poco.
A ver si me puedes echar un cable ya que he visto tus videos y blog y eres todo un experto, enhorabuena!

Tengo un arduino uno, y una pequeña aplicación en VB con un contador, lo que prentendo es : que al cerrar un interruptor en el arduino, me cuente +1 en el contador. 
es decir , por cada 1, sumar 1 en el contador de VB
lo que me ocurre actualmente... 
* tengo el contacto cerrado, y el contador en visual basic me corre hacia delante. cuando lo abro para, y si cierro continua corriendo este contaje.
ejemp: cierro. un segundo. el contador se pone a 300, abro, para el contador, cierro dos segundos , se pone a 900

Espero que me puedas echar un cable por favor.!! no logro encontrar nada que me pueda servir en internet.
Gracias!

RESPUESTA:

Hola Jacobo,
No termino de entender exactamente lo que necesitas. Te digo y te intento dar alguna solición si lo he entendido bien. Si usas un contador para contar el numero de veces que pulsas o mejor dicho que abres y cierras un interruptor, ¿por que usas un contador de tiempo? Y no una simple variable que almacenes ese número de veces y luego lo muestres en un textbox. Pues es lógico que si usas un timer cada vez que lo habilitas te estará contando y no podrás usarlo para contar el número de veces que abres o cierras el pulsador, en todo caso para medir el tiempo que esta abierto o cerrado. Esto es importante. Ahora, que lo necesites así por algo en concreto ... eso ya es otra cosa.
Por lo demás para hacerlo como yo te digo sería de la siguiente manera explicado con palabras (luego paso a código):  Incluir en la rutina de sondeo del Timer para el pin donde este conectado el interruptor (que esta rutina si que deberá estar hecha con un timer de VB)  una variable de tipo booleana o bien de tipo integer que te recuerde el estado del interruptor la primera vez que cambie de valor y sumar uno a la variable que tengas definida como contador y cambiarla de estado la primera vez que cambie de estado el interruptor. Sería algo así, te lo describo sobre este mismo proyecto que hice para controlar todos los pines de Arduino y así podrás incluirlo y borrar aquello que no te sea necesario.

Te lo he codificado para todos los pines Digitales, pues no se que pin exactamente estaras usando, por eso veras que las variables que almacenan el número de estados de ON y OFF del interruptor son arrays.


SOLUCION 1: Modificar el fichero frmMain.vb


En el fichero "frmMain.vb" busca esta parte del código e introduce lo que te marco con un rectángulo rojo. Se corresponde con el Timer que actualiza el color del estado del Led del Pin 2. Ahi si incluyes este código hará lo que necesitas:






SOLUCION 2: Modificar el fichero CommManager.vb

Se definen en el fichero de Modulo_1 las variables globales a usar:


En el fichero "CommManager.vb" busca esta parte del código e introduce lo que te marco con un rectángulo rojo:


Y eso es todo. Te tendría que funcionar correctamente. Cada vez que cambies el estado del pin donde hayas conectado tu interruptor (que en esta caso yo lo he hecho para el PIN 2) tendrás en la posición correspondiente de las variables de arrays (Contador_On y Contador_Off) definidos, el número de veces que has pasado el pin a nivel "On" o a nivel "Off" respectivamente.

Por último solo te falta recuperar de algún modo en la parte gráfica el valor de las veces que el interruptor cambia de estado de On y Off, pero eso simplemente puedes hacerlo con un control textbox o un tipo label por ejemplo.

De todos modos si necesitases cualquier aclaración, por favor no dudes en decírmelo.  Además lo dejo de manera pública por si a alguien más tuviera una necesidad igual a la tuya.

Un saludo.
-------------------------------------------------------------------------------------------------------------------------



7 comentarios:

  1. Buenas Ruben un trabajo excelente ,pero gustaria consultarte una cosilla sobre un proyecto que quiero componer ,se trata de crear con vb un formulario en el que un trackbar pueda dimear una salida pwm .hasta hay bien ya lo he logrado pero con limitacion es decir solo se ejecuta el cambio de estado de brillo del led cuando dejo e mover el trackbar .so lo muevo a 25 se enciende de golpe a 25 .me gustaria que fuese progesivo desde o .255.por otro lado si inserto otra salida mas en el formulario no se la forma de enlazar vb con arduino para que me responda por ese nuevo pin .tengo en mente crear lo mismo que vas a ver en el proyecto pero para 14 salidas pwm .me gustaria controlarlas independientemente .
    este es mi proyecto al completo
    https://www.dropbox.com/s/v33akm2nmiaxpnv/APP%2016CHANEL.rar
    Si me pudiese ayudar te lo agradezco .con solo implantaras un pin en ambos achivos yo haria el resto .gracias nuevamente

    ResponderEliminar
    Respuestas
    1. Hola Miguel.
      Respondiendo a las dudas que tienes en el email, te cuento:
      La no actualización del trackbar se puede deber a que el evento que has usado de ese control no haya sido el de "ValueChanged" o "Scroll" para enviar los datos al puerto serie.
      Para que te responda a mas de un pin tendrías que crear un pequeño protocolo de comunicaciones y junto con un timer actualizarlo en función del estado y configuración de esos pines para transmitírselo al arduino vía puerto serie. De este modo junto con el programa .ino del arduino que interpreta los datos recibidos, podrías saber que pin es el que quieres controlar. Tienes un ejemplo de esto en esta otra entrada del blog:

      http://proyectoselectronicacreativa.blogspot.com.es/2013/12/control-matrix-8x8-with-visual-basic-net.html

      Enlace al código:
      https://drive.google.com/file/d/0By2_W81NKkeAT0hTYmJPUHhIZ2c/edit?usp=sharing

      Espero que te haya aclarado algunas de tus dudas.

      En cuanto pueda echo un vistazo a tu enlace y te intento mostrar un ejemplo.

      Un saludo.

      Eliminar
    2. Hola Miguel,
      Finalmente he dejado todo el código fuente de la aplicación que he desarrollado, tanto el .ino de Arduino como el código de VB .NET. Échalo un vistazo porque te vale perfectamente como ejemplo de cómo controlar los PWM que me comentaste hace algunas semanas en tu email y en el que me decías que te enviase un ejemplo. Finalmente eché un vistazo a tu código y creo que es mejor que mires todo lo que he colgado. Descargalo, prueba y modifica lo que necesites acorde a tus necesidades. Te valdría perfectamente, con solo eliminar lo referente a los pines que no son PWM, eso sí, el Arduino solo dispone de 6 salidas PWM, si tú necesitas 14 tendrías que ir a otro micro o recurrir a otro tipo de alternativa. Ya me contaras los resultados.

      Espero haber solucionado del todo tus dudas.

      Un saludo.

      Eliminar
  2. Hola Ruben, muchas gracias por tu aporte esta super buenisimo este proyecto nos ayudaras a muchos de los que estamos interesados en las tecnologias Arduino y Vb.NET. Con respecto a los codicos de comunicacion los puedes montar en la web y asi ayudarnos a todos los que queremos controlar arduinos con VB. Muchisimas gracias...

    ResponderEliminar
    Respuestas
    1. Hola Henry,
      Hoy mismo los he publicado, dado que ya llevaba tiempo esperando para poder hacerlo. Por fin hoy he podido sacar un rato y dejar todo más o menos a punto. Espero que con el aporte que hago, sirva para que muchos de nosotros aprendamos, experimentemos y sigamos divirtiéndonos con lo que nos gusta. En la página podrás descargarte tanto el código .ino de Arduino como todo el código fuente de la aplicación hecha en Visual Basic .NET.
      Espero que os ayude para hacer aplicaciones de VB .NET con Arduino. Por favor, dejar comentarios si os descargáis documentación, código o cualquier cosa que hayáis visto de vuestro interés, eso motiva y ayuda a seguir haciendo cosas de manera desinteresada.

      Gracias.

      Un saludo.

      Eliminar
  3. Muy bueno tu proyecto podrias aser un tuto de arduino con pulzadores conectados al arduino que cada vez que yo pulce el pulzador en visual basic te emita una voz que diga activado me seria de gran ayuda lo nececito para mi proyecto mi coreo es mecatronico12345@gmail.com te lo agradeceria mucho

    ResponderEliminar
  4. Hola Ricardo, gracias por tu comentario.
    Me anoto la petición que me haces e intentaré hacer un pequeño programa de ejemplo de lo que me comentas. Cuando lo tenga lo colgaré en el blog como el resto de cosas, para que todo el mundo también pueda disponer de ello.

    Aún así puedes echar un vistazo a más entradas del blog pues alguna te podría servir, eso sí, teniendo que hacer algunas modificaciones para hacer lo que te propones.

    Un saludo.

    ResponderEliminar

Deja tu comentario