Envio de información de Arduino a VB6.0 y de VB6.0 a Arduino


Este post es para entender el funcionamiento de la comunicación de Arduino con Visual Basic 6.0 y viceversa. He realizado un pequeño programa que nos permite la comunicación desde Arduino a Visual Basic 6.0 mediante puerto serie y de Visual Basic 6.0 a Arduino.

Para comprobar la comunicación desde Arduino a Visual Basic 6.0 vamos a controlarla mediante un pulsador conectado al pin 12 de nuestro Arduino y para comprobar el envío desde Visual Basic 6.0 a Arduino disponemos de un led conectado al pin 13.

El programa en Visual Basic 6.0 también es bastante sencillo, cuenta con dos botones, dos labels, un control de puerto serie y un temporazidor (Timer), para realizar cada 20 ms, en este caso, una acción automáticamente. Aquí una imagen de la aplicación:

Aquí tenéis el código hecho en Visual Basic 6.0:

Option Explicit

Dim dato As String 'Variable para guarda el dato recibido por el puerto serie

'Botón de conectar
Private Sub cmdConectar_Click()
Serie.PortOpen = True   'Abrimos el puerto serie
cmdConectar.Enabled = False 'Deshabilitamos botón de conectar
cmdDesconectar.Enabled = True 'Habilitamos botón de conectar
Timer1.Enabled = True 'Habilitar temporizador
End Sub

'Botón de desconectar
Private Sub cmdDesconectar_Click()
Serie.PortOpen = False  'Cerramos el puerto serie
cmdConectar.Enabled = True 'Habilitamos botón de conectar
cmdDesconectar.Enabled = False 'Deshabilitamos botón de desconectar
Timer1.Enabled = False 'Deshabilitamos temporizador
End Sub

'Función que se realiza automáticamente cada 20 ms
Private Sub Timer1_Timer()
dato = Left(Serie.Input, 1) 'Cortamos el dato que nos llega por puerto serie
'para solamente tener un único caracter
pulsador.Caption = dato 'Asigamos ese dato a nuestra label para mostrar el estado
'del pulsador
Serie.Output = pulsador.Caption 'Enviamos al arduino nuestro dato recibido por puerto serie
End Sub

El código arduino es bastante básico pero que sirve perfectamente para entender la comunicación serie entre VB y Arduino:

//Programa de comunicación bilateral Arduino-Visual Basic 6.0
//Mediante un pulsador enviamos información a visual y desde visual
//dependiendo del estado de ese pulsador mandamos una orden a arduino
//para encender un lez o apagarlo.
//Programa realizado por Regata

int boton=12; //pulsador conectado en pin 12
int led=13;   //led conectado en pin 13

void setup()
{
Serial.begin(9600); //Configuración de puerto serie
pinMode(led,OUTPUT); //Indicamos led como salida
//NOTA: no hace falta indicar el pulsador como entrada
}

void loop()
{
Serial.print(digitalRead(boton),DEC); //Enviamos por puerto serie el
//estado del pulsador hacia VB
if (Serial.available())  //Comprobamos si hay datos desde VB hacia Arduino
{
byte dato; //Variable donde guardaremos el dato recibido por puerto serie
dato=Serial.read();  //Guardamos el dato recibido
switch(dato)
{
case '0': //Apagamos el led si recibimos '0' por puerto serie
digitalWrite(led,LOW);
break;
case '1': //Encendemos el led si recibimos '1' por puerto serie
digitalWrite(led,HIGH);
break;
}
}
delay(30);
}

Aquí tenéis el esquema de conexión:

Y por último os dejo un video del funcionamiento:

Si te ha servido de ayuda esta entrada, puedes realizar un donativo para agradecer el tiempo que dedico al blog y ayudar a hacer más entradas.

donativo_paypal

46 pensamientos en “Envio de información de Arduino a VB6.0 y de VB6.0 a Arduino”

  1. Gracias, he editado la entrada para añadir el esquema de conexionado. Si tienes alguna duda, ya sabes no dudes en preguntar!

  2. Regata de antemano te agradeso tu pronta respuesta.

    Por otro lado, intenté correr este código y en arduino pude compilarlo y cargarlo del todo bien. El problema que tuve fue al intentar ejecutar el código de VB, pues me arroja un error de la variable “Serie”, pues me dice que no está definida.. al parecer hay que definirla previamente? Agradecería tu ayuda, soy algo novato

  3. Bueno supongo que te refieres a las instrucciones donde aparece el témino Serie, como por ejemplo Serie.PortOpen y demás. Eso es debido o bien a que no cambiaste el nombre del componente MSComm de tu formulario a Serie (yo le cambio siempre el que trae por defecto por Serie) o bien no has añadido dicho componente a tu formulario para poder trabajar a través del puerto serie de tu ordenador. Bien para añadirlo te vas a la barra donde aparecen los labels y demás componentes y les das con el botón derecho Añadir componentes, después buscas y marcas Microsoft Comm Control 6.0 y das a Aceptar, ahora deberías ver en la barra de componentes uno con forma de teléfono, ese es el que debes de añadir a tu formulario, y debes también cambiarle el nombre que trae por defecto por Serie, así te debería de funcionar perfectamente el código. Espero que te funcione. Un saludo

  4. Me surgió otro problema ahora tras hacer lo que me indicaste. Al intentar correr el programa en VB6 me arroja el error siguiente error:

    “Error ‘8018’: en tiempo de ejecución:
    La operación es válida cuando el puerto está abierto”

    Mi arduino lo tengo conectado al COM19..

    podrías ayudarme?
    Saludos

  5. Pues debe ser que no tienes puesto en el componente MSComm que tu puerto COM es el número 19, vete al componente y en propiedades le indicas cuál es el puerto COM de tu Arduino.

  6. Supongo que visual basic no reconoce puertos COM tan altos, intenta cambiar el número del COM de tu Arduino en Sistema/Admnistrador de dispositivos y asignale un puerto COM menor de 10. Intentaré buscar a ver si te puedo ayudar en algo más. Un saludo

  7. Regata agradezco tu paciencia para ayudarme.

    Cambie el arduino al puerto COM 15 (el que estaba en uso) y lo configuré en VB6 también. El error ‘8018’ persiste y me arroja que el problema está en esta linea de la programación:

    dato = Left(Serie.Input, 1)

    estaré haciendo lago mal?

    Gracias por tu apoyo.

  8. Fabian me alegro que te haya funcionado, ahora ya sabes a seguir probando la comunicación con tu Arduino, y si te interesa aprende processing, ya que es muy sencillo y sirve para hacer programas multiplataforma. Estate atento a los videotutoriales de 0xDA_Bit!!! Un saludo

  9. Abusaré un poco de tu confianza pues tengo otra duda, adicional al proyecto y quizás tu podrías darme alguna orientación.
    En efecto, una vez que ya tenemos el dato del pulsador recibido por el puerto com, existirá alguna forma de almacenar la hora y el dato recibido en una tabla? Es decir, que en VB nos indique que hemos recibido un dato desde el exterior?

    De antemano gracias

  10. Pues puedes crearte un fichero con forma de base de datos separando los campos por un separador tipo ‘;’ o el que más te guste a tí. Para ello tienes que saber que dato vas a recibir por el puerto serie para ir discriminando el resto de datos mediante el programa de VB. Para ir mostrando los datos tendrás que trabajar con cadenas de texto y ficheros en VB, así que te recomiendo el Libro de Ordo de Visual Basic, que es gratuito y lo podrás encontrar por internet. Después para ir guardando también la fecha y hora en la que fue recibido el dato, creas una variable para emplear justo después de la línea donde compruebas el dato para introducir en el fichero, quedando algo así Fecha = Now ó Fecha = Date + Time , he leído que Now te da ya la fecha y hora del sistema juntos, y Date y Time dan la fecha y hora respectivamente pero por separado. Tendrás que pensar un poco pero no es nada díficil. Si tienes dudas pregunta e intentaré ayudarte.

  11. Estimado, te cuento que el libro que me recomendaste me ha sido de gran ayuda, mas bien he entendido bastante respecto a la creación d archivos con VB.
    Ahora, la consulta que esta vez tengo viene dada por el código inicial en VB que nos dejaste. Si bien se realiza la comunicación serie entre el PC y arduino, según el programa el PC va preguntando cada 20 mseg si se ha pulsado o no el botón, no obstante, he notado que la pregunta se hace a una velocidad tan rápida que no se nota el cambio, el cuál de igual forma se produce.

    En el caso en que al recibir un ‘1’ o un ‘0’ deseara mantener dicho valor (en VB) sin que cambiara cada 20mseg sino que se mantuviese al modificarse el estado del pulsador, ¿Se podría hacer? ¿Quizás deberíamos cargar ese valor en una variable?

    De antemano agradezco tu ayuda.

  12. Efectivamente es como dices tú, para poder mantener el valor habría que crearse una variable y con if comprobar cuando quieres que se modifique dicho valor. Puedes andar comprobando igual el dato presente en el puerto serie, pero al hacer con if puedes controlar tú el valor que quieras que se mantenga. Si tienes dudas ponme lo que quieres hacer y te intentaré ayudar con el código.

  13. Lo siento Fabian por tardar tanto en contestar pero donde estoy estudiando ahora no dispongo de conexión a internet desde mi piso.

    En cuanto a lo de comunicar Arduino con VB la recepción siempre la he hecho mediante un timer que lea cada cierto tiempo lo que está presente en el buffer del puerto serie del Arduino, para enviar puedes emplear un commandbutton, y supongo que para recibir también, lo que no sé es cuanto tiempo permanece presente el dato en el buffer del puerto serie para realizar la lectura correctamente.

  14. Hola! yo tengo visual basic 2010 express y no reconoce los comandos: Serie.PortOpen, Serie.Input ni Serie.Output? sabes si ha variado esto de una versión a otra y con qué reemplazarlo en el código de VB?

  15. Buenas Regata, actualmente estoy desarrollando algún trabajo con Arduino y Visual Basic, y me ha llamado la atención los iconos que utilizas para conectar y desconectar, ¿los puedes suber al blog? ¿o el programa en Visual Basic?

  16. Hola Maria!!

    Mira los iconos los he encontrado buscando en google, tal que así pack de iconos para visual basic. Ahora mismo no los tengo en el PC debido a que se me rompió el disco duro y he perdido todo lo que tenía en él. Si no los das encontrado intentaré descargarlos de nuevo y pasartelos.

    Un saludo!!

  17. Gracias por responder Regata. La verdad que lo primero que intente fue buscarlos por internet, buscando como imagenes, iconos,… para visual basic, donde los resultados proporcionaron algunos parecidos, pero no los mismos, y la verdad que me han llamado mucho la atención. Si los puedes conseguir de nuevo te lo agradeceria. Mientras tanto, a ver si continuo con el programa y finalizo la parte de comunicación serie con Arduino.

  18. hola…!!! regata solo tengo una duda sabes como puedo conectar mi arduino a BV como tarjeta de adquisición de datos…???

  19. Hola christopher!! Bueno para conectar tu Arduino a VB como tarjeta de adquisición de datos, vas a tener que conectarla mediante una conexión serie y realizar el programa que sirva para captar los valores que te interese, posteriormente tendrás que programar la comunicación entre la tarjeta arduino y vb. Si puedes concretar algo más en tu consulta te lo agradecería.

  20. Muchas gracias Christy!! Es un placer enseñar lo que uno sabe a los demás!! Un saludo y gracias por visitarnos!!

  21. Saludos, soy nuevo programando arduino, pero quisiera saber si conoces la manera de establecer la comunicacion pero via USB

  22. Hola jose!!

    Primero de todo necesitas saber que la mayoría de los arduinos no presentan USB nativo, sino que se realiza una comunicación serie vía USB a través de un chip FTDI. Por tanto la comunicación que vas a realizar es como si se tratara de un puerto serie normal, y el tratamiento de los datos que envíes y recibas igual.

    El arduino leonardo si que presenta USB nativo, pero no he establecido comunicación nunca a través del USB.

    Un saludo!

  23. Hola buenas, soy nuevo en esto, por favor me podrían pasar el código lo necesito porfa, les agradezco de antemano

  24. Hola Nilton!!

    El código creo que está por los comentarios, si no es así lo siento pero desde que realicé este ejemplo han cerrado megaupload y es donde lo tenía guardado y por lo tanto lo he perdido, en mi pc tampoco tengo ninguna copia del mismo, pero básicamente por los comentarios se ha ido comentando como se ha realizado la programación y demás.

    Un saludo!!

  25. necesito ayuda con una programacion, tengo que hacer q enciendan 8 leds programado en el visual basic y que esta informacion vaya al arduino el q hara q encienda los led, pero todo debe funcionar desde el visual, estoy volando @-@

  26. Hola Juan!! No creo que sea muy difícil hacer lo que comentas, en los comentarios puedes ver algo de ayuda como hacer esto, y con pocos conocimientos de VB es muy sencillo de hacer. Un saludo!!

  27. hola regata buenas tardes tendria que conocer los valores de 4 sensores con arduino y controlarlos con vb si me pudieras ayudar estaria muy agradecido gracias

  28. Hola, Regata. Una buena lección.
    Soy un programador novato. Programación en Visual Basic 6.0.
    Regata, usted que la profesional. Tengo una pregunta para usted. Quiero construir un coche robot. Y para crear un programa en VB 6.0 para controlar el coche a través de Bluetooth. ¿Me pueden ayudar?
    Gracias.

  29. hola, quisiera hacer eso en visual studio 2013, pero está todo diferente, me podrias ayudar??

  30. Disculpa como puedo manejar mi cada pin de entrada del arduino x visual basic 2010 o el 6.0!! esque deseo conectar algunos led’s desde el arduino y que por el codigo vaya seleccionando cada pin para que lo prenda, pero en el codigo de arriba solo abre un puerto(sin numero) y lo cierra!! como manejaria cada pin?? grax x tu probta respuesta!!

  31. Hola regata ayudame necesito encender unos led y apagarlos cuando el usuario pueda como hago?

  32. Hola:

    ¿Puedes hacer un ejemplo que se pueda encender y apagar un Led con Arduino y Visual Basic 6?

    Para que te hagas una idea. Se basa en dos partes. VB 6 tiene que ser capaz de encender y apagar un Led, si es posible, no usar librerías de terceros, solo los que te viene en el propio compilador.

    La segunda parte que te indique la interfaz que al pulsar el botón en un cuadro de texto de diga, “Led 8 apagado”.

    Este ejemplo es de Java, para que hagas así la interfaz pero en Visual Basic 6.

    Un cordial saludo.

  33. Disculpame que te moleste hay forma de hacer lo mismo pero en lugar de puerto serie por la shield ethernet. Si se podria en vb6 seria fantastico.
    Desde ya muchas gracias

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