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.
Muy interesante el video, si no fuera mucha molestia podrías dejar el diagrama de conexionado. Se agradece mucho.
Gracias, he editado la entrada para añadir el esquema de conexionado. Si tienes alguna duda, ya sabes no dudes en preguntar!
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
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
Muchas gracias me queda muy claro lo que tengo que hacer, lo probaré y luego te comento como me fue.
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
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.
Claro eso intento hacer en la opción Commport, pero al escribirle el número 19 me indica que no es un puerto válido
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
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.
Olvidé comentarte que VB6, en mi caso soporta hasta el COM 16.
Amigo me ha funcionado, me faltaba deshabilitar el timer, que inicialmente debe estar en ese estado, muchas gracias!!
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
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
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.
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.
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.
Qusiera saber si conoces algún método de comunicar VB con arduino sin la utilización del timmer
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.
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?
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?
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!!
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.
hola…!!! regata solo tengo una duda sabes como puedo conectar mi arduino a BV como tarjeta de adquisición de datos…???
Hola Maria San!! Perdón por el retraso me estoy poniendo al tanto con los comentarios, ando muy liado con los estudios. Te dejo un link de donde puedes descargarte todos los iconos que tengo para visual basic. Espero que te sirvan de ayuda!! http://www.mediafire.com/?yf7cayuau3ykozv
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.
Eres Grandioso, Regata… Que prosperes en tús Estudios.
Muchas gracias Christy!! Es un placer enseñar lo que uno sabe a los demás!! Un saludo y gracias por visitarnos!!
Saludos, soy nuevo programando arduino, pero quisiera saber si conoces la manera de establecer la comunicacion pero via USB
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!
Hola buenas, soy nuevo en esto, por favor me podrían pasar el código lo necesito porfa, les agradezco de antemano
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!!
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 @-@
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!!
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
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.
hola yo intente hacer esto y no me funciona y es porq tengo visual 2008 como le puedo hacer ahi
hola, quisiera hacer eso en visual studio 2013, pero está todo diferente, me podrias ayudar??
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!!
Hola! Regata los 20 ms se deben configurar en las propiedades del timer???
llevado a la practica jejeje se tiene que configurar en las propiedades del timer jejeje gracias
Me podrias ayudar en leer datos analogos y asi representarlos en la label ????
Hola regata ayudame necesito encender unos led y apagarlos cuando el usuario pueda como hago?
por medio del programa de java en puerto serial
Gracias
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.
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
Buen día amigo, felicitaciones por tu proyecto, tengo una duda, el arduino se conecta al computador por medio del cable usb pero en realidad es tratado como un puerto serial comm? o hay que conectarlo a un puerto db9? quedo a la espera de tu apoyo, gracias.
pero te falto la interfaz, — que es el timer
Lo siento Ariel, el timer es un temporizador que se usa en VB 6.0, tiene forma de reloj, aparece en el lateral como un objeto a añadir como una etiqueta label, un botón, etc…
Como se podría hacer que en lugar de un botón fuera leyendo un keypad 4×4, gracias
hola actualmente tengo visual studio 2017, quiero hacer lo mismo del boton, que al apretar el pulsador de mi arduino, se active un sonido en visual studio, en arduino tengo los codigos ok, pero en visual studio no me funciona, me podrias ayudar muchas gracias
Hola me gustaria hacer lo mismo que dice Alex gracias