Facultad: Ingeniería Escuela: Electrónica Asignatura: Interfaces y Periféricos Tema: Arduino y Comunicación Serial con Visual Basic Objetivos Específicos. Utilizar el puerto USB como dispositivo de comunicación externo. 2. Realizar programas de Visual Basic que se comuniquen con Arduino. 3. Realizar Sketches de Arduino que reciban órdenes y envíen datos a la PC. 4. Realizar aplicaciones de manejo de hardware externo combinando las plataformas. Material y Equipo No Cantidad Descripción 2 3 4 5 6 7 8 9 0 4 4 varios Una computadora con sistema operativo Windows y con el programa Arduino IDE instalados Cable USB (tipo A hacia tipo B) Tarjeta Arduino UNO R2 o R3 Resistencias de 4.7kΩ LEDs Potenciómetro de 5KΩ Breadboard Pinza Cortadora Cables UTP Introducción Teórica Visual Basic y Puerto Serie La interfaz serie asíncrona es el principal dispositivo de comunicación de sistema a sistema. Asíncrono significa que no hay presente una señal de sincronización o de reloj. Cada carácter está enmarcado entre señales de inicio y parada. Un solo bit 0, denominado bit de inicio, precede a cada carácter para indicar al sistema que los siguientes 8 bits constituyen un byte de datos. Uno o dos bits en alto siguen al carácter para señalar que dicho carácter ha sido enviado. Trama en una transmisión asíncrona:
2 Interfaces y Periféricos, Guía 3 Figura. Trama Asíncrona El puerto serie en una computadora está compuesto por varias entradas/salidas. Dispuestas en un conector del tipo DB9 o DB25, tal como se muestra en la siguiente figura: Figura 2. a) Conector DB25, b) Conector DB9 La distribución de las señales en cada uno de sus pines es la siguiente: Señal GND o SG TxD RxD RTS CTS DSR DCD o CD DTR Descripción 0 Voltios Salida para transmisión de datos Entrada para recepción de datos (Request To Send) Salida que indica una petición de envío (Clear To Send) Dispuesto para enviar, entrada por donde le indica el otro dispositivo que ya puede enviar los datos. (Data Set Ready) Dispositivo de datos preparado, entrada por donde le indica el otro dispositivo que ya está listo. Entrada para la detección de portadora (Data Terminal Ready) Salida, terminal de datos listo
3 Microsoft Comm Control 6.0 Es el control que permite la comunicación de una aplicación hecha en Visual Basic 6 con el puerto serie. No está en la caja de herramientas por defecto, debe introducirse mediante el menú Proyecto y luego Componentes. En el formulario solamente se ve en tiempo de diseño. Para habilitar la herramienta del puerto serie en Visual Basic realice lo siguiente: Seleccione la opción Proyecto>>Componentes, al aparecer el listado de componentes seleccionar: Microsoft comm control 6.0, dé clic en aceptar, lo que provocará que la barra de herramientas cambie como se muestra en la figura 3. Figura 3. MSCOMM Control Propiedades Entre las propiedades del MSCOMM Control hay algunas que pueden establecerse en tiempo de diseño o en tiempo de ejecución, y otras que solamente se pueden establecer o consultar en tiempo de ejecución. A continuación se enuncian algunas propiedades de este control
4 Interfaces y Periféricos, Guía 3 Propiedades que se establecen en tiempo de diseño o ejecución CommPort Indica el número del puerto serie a utilizar, admite valores del al 255, Generalmente las PC tienen dos puertos seriales: Com y Com2, si se le coloca un número de puerto inexistente dará error Settings InBufferSize OutBufferSize Indica 4 parámetros en orden: velocidad, paridad, número de bits y bits de parada que se usarán en la comunicación Mediante esta propiedad se establece el tamaño del buffer de entrada. Puede conocerse el número de caracteres presentes en el buffer de entrada consultando el valor de la propiedad InBufferCount Mediante esta propiedad se controla el tamaño del buffer de salida. Puede conocerse el número de caracteres presentes en el buffer de salida (los que aún están transmitirse), consultando el valor de la propiedad OutBufferCount Propiedades que se establecen sólo en tiempo de ejecución PortOpen InBufferCount OutBufferCount Output Input Abre el puerto de comunicación. Puede tener los valores True (para abrirlo) y False (para cerrarlo) Permite averiguar cuántos caracteres se tienen en el buffer de entrada Permite conocer cuántos caracteres quedan por transmitir en el buffer de salida Envía caracteres al buffer de salida Lee el buffer de recepción El control Microsoft Comm Control 6.0 tiene por defecto el nombre MSComm. Para establecer o consultar una propiedad se debe utilizar la siguiente sintaxis MSComm.Propiedad Por ejemplo, para abrir el puerto se coloca MSComm.Portopen=True Para leer el puerto Buffer=MSComm.Input Para escribir en el puerto MSComm.Output=dato De igual forma con las demás propiedades Manejo de Periféricos Analógicos Mediante Arduino. La plataforma Arduino, basada en microcontrolador AVR, hereda la capacidad intrínseca de dicho microcontrolador para manejar periféricos analógicos mediante técnicas de conversión específicas. Dichas técnicas consisten en la conversión analógica a digital (ADC) y modulación por ancho de pulso (PWM). Cada una permite interactuar con periféricos analógicos que proveen información de entrada (ADC) o que aceptan información de salida (PWM) Conversión analógica a digital. El microcontrolador cuenta con un ADC integrado en el mismo chip, que permite tomar
5 lecturas analógicas de voltaje de un dispositivo que genere tensiones entre 0 y 5V. La configuración de dicho módulo es automática, bastando solamente con invocar la función de lectura de datos, la cual se detalla a continuación: analogread(numero_pin): Realiza la lectura sobre el pin analógico que se le especifique (Sólo se permiten los pines A0 al A5). El valor que devuelve es un número entero proporcional al voltaje de entrada, de tal forma que si se introducen 0V devuelve un valor de 0 y si se introducen 5V devuelve un valor de 023, con todos los voltajes intermedios se producen valores distribuidos linealmente a lo largo de este intervalo. Nótese que no es necesario configurar previamente un pin analógico para poderlo usar con esta función. Advertencia: El rango válido para los voltajes de entrada es solamente de 0 a 5V. Si introduce voltajes negativos, o bien, voltajes positivos arriba de 5V, podrá dañar de manera permanente el dispositivo. Modulación por ancho de pulso (PWM). El Microcontrolador AVR cuenta también con dispositivos temporizadores que permiten generar señales externas, las cuales emplean la modulación por ancho de pulso para manejar cargas que sean compatibles con este esquema. Vale aclarar que la técnica en sí, es completamente diferente de la conversión digital a analógica (DAC), puesto que no se generan tensiones analógicas constantes (por ejemplo entre 0 y 5V) en ningún momento, sino que más bien la carga es encendida y apagada rápidamente, produciendo un efecto equivalente a proveer un nivel de potencia intermedio, que puede variar entre completamente apagado y completamente encendido. Además, de manera similar al ADC, los módulos temporizadores son inicializados de manera automática, bastando con invocar la función que se detalla a continuación: analogwrite(numero_pin, ciclo_de_trabajo): Genera una señal PWM sobre un pin digital que tenga esa capacidad (denotado con ~). El rango válido para el ciclo de trabajo va desde 0 (completamente apagado) hasta 255 (completamente encendido). Nótese que no todas las cargas son compatibles con la modulación PWM, por lo que se recomienda que se informe antes de emplearla con algún dispositivo en particular. La técnica funciona bien con algunas cargas como LEDs y motores DC pequeños, mas no con cargas como relés o motores DC sin escobillas (como los ventiladores para chasís de computadora). Procedimiento Parte. Lectura de entradas analógicas.. Proceda a ensamblar el circuito junto con el Arduino. Si cuenta con con un potenciómetro que permita conectar cables directamente a él, puede conectarlo directamente al Arduino sin una breadboard. Recuerde que no es necesaria una fuente de suministro externa.
6 Interfaces y Periféricos, Guía 3 Figura 4. Diagrama de circuito parte. 2. Abra Visual Basic y genere el siguiente formulario, a continuación introduzca el siguiente código fuente en el mismo: Figura 5. Formulario para parte. Private Sub Form Load() Timer.Interval =400 MSComm.CommPort = 4 'Ajustar al puerto real de su arduino en su PC MSComm.Settings = 9600,n,8, MSComm.InputMode = cominputmodetext MSComm.PortOpen = True Private Sub Timer_Timer() Dim valor As Integer Dim voltage As Single 'Verifica si existen datos en el buffer del puerto If MSComm.InBufferCount <> 0 Then 'Si existen datos los retira
7 valor = MSComm.Input 'Calcula el nivel de tensión que obtuvo el ADC voltaje = valor/023*5 'Actualiza la ventana con la información recibida Text.Text = valor Text2.Text = Round(voltaje,2) End If Listado. Programa de Visual Basic para parte. 3. A continuación abra el Arduino IDE e introduzca el siguiente sketch. void setup() { //Inicializa el puerto serie Serial.begin(9600); void loop() { int lectura; lectura = analogread(0); //Toma lectura del ADC Serial.print(lectura); //Envía el dato leído delay(500); //Genera un retardo breve Listado 2 Sketch para la parte. 4. Conecte el cable USB y descargue el sketch al Arduino. Ejecute el programa en Visual Basic y observe el valor que se presenta en la ventana. 5. Varíe el potenciómetro y observe cómo cambia el valor visualizado en pantalla. 6. Modifique el formulario para que muestre una barra de desplazamiento horizontal (o el control de su elección) que represente la posición relativa del potenciómetro. Notifique a su docente cuando termine el programa para que le sea evaluado. Parte 2. Control de salidas mediante PWM 7. Desconecte la tarjeta Arduino del puerto USB y proceda a armar el siguiente circuito (una vez más, el circuito no requiere de fuente externa). Figura 6. Diagrama de circuito de la parte 2
8 Interfaces y Periféricos, Guía 3 8. A continuación genere un nuevo proyecto en Visual Basic. Siga el siguiente modelo para crear el formulario e introduzca el código mostrado en el listado 3. Figura 7. Formulario de programa de la parte 2 Private Sub Form_Load() MSComm.CommPort = 4 'Ajustar al puerto real de su PC asignado a Arduino MSComm.Settings = 9600,n,8, MSComm.InputMode = cominputmodebinary MSComm.PortOpen = True VScroll.Min = 0 VScroll.Max = 5 VScroll2.Min = 0 VScroll2.Max = 5 VScroll3.Min = 0 VScroll3.Max = 5 VScroll4.Min = 0 VScroll4.Max = 5 Private Sub VScroll_Change() 'Define un vector de un dato, el dato a enviar Dim dato_enviado(0) As Byte 'Coloca el dato en el vector dato_enviado(0) = VScroll.Value + 0*6 'Envía el dato MSComm.Output = dato_enviado Label.Caption = VScroll.Value Private Sub VScroll2_Change() 'Define un vector de un dato, el dato a enviar
9 Dim dato_enviado(0) As Byte 'Coloca el dato en el vector dato_enviado(0) = VScroll2.Value + *6 'Envía el dato MSComm.Output = dato_enviado Label2.Caption = VScroll2.Value Private Sub VScroll3_Change() 'Define un vector de un dato, el dato a enviar Dim dato_enviado(0) As Byte 'Coloca el dato en el vector dato_enviado(0) = VScroll3.Value + 2*6 'Envía el dato MSComm.Output = dato_enviado Label3.Caption = VScroll3.Value Private Sub VScroll4_Change() 'Define un vector de un dato, el dato a enviar Dim dato_enviado(0) As Byte 'Coloca el dato en el vector dato_enviado(0) = VScroll4.Value + 3*6 'Envía el dato MSComm.Output = dato_enviado Label4.Caption = VScroll4.Value Listado 3. Programa en Visual Basic de la parte 2 9. Haga un nuevo Sketch en el Arduino IDE y escriba el siguiente programa: void setup(){ //Inicializa el puerto serie Serial.Begin(9600); void loop(){ int dato; int num_led; int brillo; //Realiza el proceso sólo si se reciben datos if(serial.available()){ //Toma el byte del puerto dato = Serial.read(); //Extrae los cuatro bits más significativos para el número del led num_led = dato>>4; //Extrae los cuatro bits menos significativos para el valor del brillo
0 Interfaces y Periféricos, Guía 3 brillo = dato & 0x0F; //Ajusta el brillo según el led seleccionado switch(num_led){ case 0: analogwrite(9,brillo << 4); break; case : analogwrite(6,brillo << 4); break; case 2: analogwrite(5,brillo << 4); break; case 3: analogwrite(3,brillo << 4); break; Listado 4. Sketch de Arduino para la parte 2 0. Conecte el cable USB a Arduino y descargue el Sketch. Ejecute el programa de Visual Basic y deslice las barras de desplazamiento. Observe lo que sucede con los LEDs al variar las barras.. Modifique el programa de Visual Basic para generar el efecto de parpadeo atenuado en uno de los LEDs (el brillo aumenta y disminuye suavemente entre los extremos de encendido y apagado), mediante un timer que varíe el brillo automáticamente cada 0.5s. Notifique a su docente cuando lo termine para que le sea evaluado. 2.Desconecte la tarjeta Arduino de su PC y desarme el circuito. Luego apague su computadora y deje en orden su puesto de trabajo. Análisis de Resultados. De qué manera se realiza la lectura de los datos en la primera parte? Cómo se consigue sincronizar ambos extremos? 2. Qué proceso se realiza para combinar el valor de brillo de cada LED con su posición relativa al transmitir? De qué manera realiza el programa en Arduino la separación de esta información? Investigación Complementaria. Determine cómo se puede hacer para agregar entradas y salidas adicionales en los programas de la primera y segunda parte. Bibliografía Referencia en línea del lenguaje: http://arduino.cc/en/reference/homepage Massimo Banzi, Getting started with Arduino O'Reilly Media / Make Publisher, Marzo 2009, ISBN: 978-0-596-555-3
Hoja de cotejo: 3 Guía 3: Arduino y Comunicación Serial con Visual Basic Alumno: Maquina No: Docente: GL: Fecha: EVALUACION % -4 5-7 8-0 Nota CONOCIMIENTO 25% Conocimiento deficiente de los fundamentos teóricos Conocimiento y explicación incompleta de los fundamentos teóricos Conocimiento completo y explicación clara de los fundamentos teóricos APLICACIÓN DEL CONOCIMIENTO 70% No Terminó completamente el programa y comentó mal el código (30%) No realizó el circuito correctamente (40%) Terminó completamente el programa pero los comentarios no estaban del todo correctos El circuito funcionó Terminó completamente el programa con sus comentarios correctos El circuito funcionó ACTITUD 2.5 % Es un observador pasivo. Participa ocasionalmente o lo hace constantemente pero sin coordinarse con su compañero. Participa propositiva e integralmente en toda la práctica. 2.5 % Es ordenado; pero no hace un uso adecuado de los recursos Hace un uso adecuado de los recursos, respeta las pautas de seguridad; pero es desordenado. Hace un manejo responsable y adecuado de los recursos conforme a pautas de seguridad e higiene. TOTAL 00 %