Issuu on Google+


DISEÑANDO SISTEMAS EMBEBIDOS CON LIBRERÍAS DE MICROCHIP

Andrés Raúl Bruno Saravia Fernando Raúl Tagliaferri Sebastián Gregori Fiadino Alejandro Anibal Airoldi


Airoldi, Alejandro Anibal Diseñando sistemas embebidos con librerias de Microchip. - 1a ed. - Buenos Aires: mcelectronics, 2012. 496 p. + Internet : il. ; 23x18 cm. ISBN 978-987-26021-3-0 1. Electrónica. 2. Programación. I. Título CDD 621.3

Fecha de catalogación: Noviembre de 2012 © mcelectronics Hecho el depósito que marca la ley 11.723 Todos los derechos reservados. Ninguna parte de este libro, incluido el diseño de la portada, puede reproducirse, almacenarse o transmitirse de ninguna forma ni por ningún medio, sea este eléctrico, químico, mecánico, óptico, de grabación o de fotocopia, sin la previa autorización escrita por parte de mcelectronics. La infracción de los derechos mencionados puede ser constitutiva de delito contra la propiedad intelectual. La editorial no se pronuncia ni expresa implícitamente respecto a la exactitud de la información contenida en este libro, razón por la cual no puede asumir ningún tipo de responsabilidad en caso de error u omisión. Las marcas mencionadas son propiedad exclusiva de sus registradores legales.


A todos los que han colaborado en la redacci贸n y edici贸n de este libro. A los alumnos que a lo largo de estos a帽os contribuyeron con sus invaluables aportes. A nuestras familias y amigos por el apoyo incondicional.


DISEÑANDO SISTEMAS EMBEBIDOS CON LIBRERÍAS DE MICROCHIP SERVICIO DE AYUDA AL LECTOR Por favor no dude en escribirnos por consultas, sugerencias o para solicitar información adicional: soporte@mcelectronics.com.ar

PROGRAMAS Y RECURSOS DE MICROCHIP Para poder compilar los programas propuestos necesita el entorno de desarrollo MPLAB X, el compilador XC8 para PIC18 y el compilador XC30 para los dsPIC. Todas las herramientas se pueden obtener en forma gratuita desde la web de Microchip: www.microchip.com/mplabx CLASES ON-LINE EN VIVO No dude en tomar una de nuestras clases on-line para complementar la información de este libro. Puede optar por clases grupales o bien una clase individual a través de Internet con un ingeniero de aplicación. www.mcelectronics.com.ar/online COMPLEMENTOS Microchip Application Libraries www.microchip.com/mal MCP2200 Configuration Utility www.microchip.com/mcp2200 LABVIEW www.ni.com/labview MATLAB www.mathworks.com/products/matlab En el DVD puede encontrar los compiladores y el código fuente de todos los programas. Recomendamos visitar periódicamente la web de Microchip para descargar las últimas versiones.


PRÓLOGO AL CONTENIDO Con gran entusiasmo presentamos este nuevo libro. Hemos tomado en cuenta infinidad de comentarios y sugerencias de nuestros lectores al momento de redactar estos capítulos. A lo largo del texto le mostraremos como diseñar e implementar sistemas embebidos con microcontroladores PIC®. Una de las clases más solicitadas en nuestros cursos on-line es Aplicaciones GSM y GPS con PIC® y es por eso que en el capítulo 5 puede encontrar proyectos completos para realizar comunicaciones a través de la red celular. Además, el libro contiene ejemplos de Ethernet y WI-FI con micros de 8 bits, nociones básicas de programación, una introducción a la robótica y aplicaciones avanzadas con dsPIC®. Intentamos guiar al lector desde los proyectos más elementales hasta los más complejos en forma amena y sencilla. No deje de consultar el DVD incluido para profundizar sobre cuestiones teóricas que sin duda complementarán el aprendizaje.

Los editores.


SUMARIO MPLAB® X GUIA VISUAL

13

NUEVOS COMPILADORES DE MICROCHIP CREANDO UN PROYECTO EN MPLAB

15 16

PROGRAMANDO EN LENGUAJE C

27

CARACTERISTICAS DEL LENGUAJE ARCHIVOS DE CABECERA OPERADORES ARITMÉTICOS DECLARACIÓN DE VARIABLES FUNCION PRINTF() ESTRUCTURAS DE CONTROL Y COMPARACIÓN OPERACIONES A NIVEL DE BITS (BITWISE) CADENAS (STRINGS) FUNCIONES ÁMBITO DE LAS VARIABLES

29 30 32 34 35 38 45 46 49 51

PRÁCTICAS XC8

55

APRENDIENDO A UTILIZAR XC8 DE FORMA PRÁCTICA PROGRAMA 1: LED-PULSADOR PROGRAMA 2: PULSADOR TOUCH PROGRAMA 3: CONTADOR 7 SEGMENTOS PROGRAMA 4: MENSAJE EN UN DISPLAY LCD PROGRAMA 5: CONTADOR CON DISPLAY LCD PROGRAMA 6: CONTADOR CON TIMER 0 PROGRAMA 7: CONTADOR CON TIMER 1 PROGRAMA 8: RELOJ DE TIEMPO REAL CON TIMER 1 PROGRAMA 9: TERMÓMETRO CON PIC18F46K20 PROGRAMA 10: USANDO EL MÓDULO PWM PROGRAMA 11: TRABAJANDO CON LA USART CONVERSOR USART - USB MCP 2200

57 59 61 63 72 76 79 83 88 96 102 107 110


ETHERNET Y WI-FI CON PIC

115

TELEMETRÍA Y CONTROL REMOTO CON PIC MICROCHIP TCP/IP CONFIGURATION WIZARD COMPILANDO EL STACK ACCEDIENDO A LA PÁGINA WEB LOS ARCHIVOS PRINCIPALES DEL STACK FUNCIONES CALLBACK SISTEMA DE ARCHIVOS MPFS ENVÍO DE EMAILS ACCESO DESDE INTERNET ARQUITECTURA DEL PIC18F97J60 MODULO ETHERNET TELEMETRÍA MONITOREO DE LA TEMPERATURA POR ETHERNET CONTROL REMOTO ENCENDER UN LED Y UN RELÉ POR ETHERNET WI-FI CON PIC MÓDULO MRF24WB0MA CONFIGURACIÓN DEL STACK TCP/IP PARA WI-FI CONFIGURACIÓN DEL ROUTER CONTROL REMOTO DE UN MOTOR A TRAVÉS DE WI-FI

117 118 125 127 129 131 132 139 141 146 148 149 153 160 163 171 174 180 189 191

APLICACIONES GSM Y GPS

199

ESQUEMA GENERAL LAYOUT DE COMPONENTES EL MICROCONTROLADOR MÓDULO GSM Y GPS SIM908 CONEXIONES DEL MÓDULO GSM CONSIDERACIONES IMPORTANTES CÁLCULO DE LA LINEA DE TRANSMISIÓN COMANDOS AT BÁSICOS MÓDULO GPS TRAMA NMEA DEL MÓDULO GPS AMPLIFICADOR DE BAJO RUIDO ACELERÓMETRO ESQUEMÁTICO EJEMPLOS DE APLICACIÓN REGULACIONES

202 205 207 210 211 213 215 218 220 223 228 231 233 237 249


ROBÓTICA

253

ANATOMÍA DE LOS ROBOTS APLICACIONES DE LOS ROBOTS COMPONENTES DE UN ROBOT SISTEMAS DE LOCOMOCIÓN FUENTES DE ALIMENTACIÓN MICROCONTROLADORES APLICADOS A LA ROBÓTICA MOTORES DE CORRIENTE CONTINUA CONTROL DE VELOCIDAD POR PWM MOTORES PASO A PASO SERVOMOTORES SENSORES PARA ROBOTS PROYECTO SOFTWARE DE CONTROL

256 258 260 268 273 274 280 286 291 297 301 323 338

DISEÑO DE FILTROS Y CONTROL DISCRETO

343

MUESTREO PROCESAMIENTO DISCRETO DE SEÑALES CONTINUAS DISEÑO DE FILTROS FILTROS PASA ALTOS, PASA BANDA Y SUPRIME BANDA FILTROS IIR TRANSFORMACIÓN DE FILTROS ANALÓGICOS A DIGITAL IMPLEMENTACIÓN CON EL DSP CARACTERÍSTICAS Y TIPOS DE DSP IMPLEMENTACIÓN DE FILTROS FIR ANÁLISIS DE LA SEÑAL FILTRADA IMPLEMENTACIÓN DE FILTROS IIR PROGRAMA GENERAL

345 353 359 369 372 391 399 414 420 434 441 465

APENDICE INTRODUCCIÓN A LABVIEW BIBLIOGRAFÍA

473 489


ETHERNET Y WI-FI EMBEBIDO CON PIC速


TELEMETRÍA Y CONTROL REMOTO CON PIC En este capítulo aprenderemos a realizar algunas aplicaciones muy útiles para los sistemas de monitoreo y control a distancia utilizados en electrónica industrial mediante redes Ethernet. Las aplicaciones de monitoreo y control son muy utilizadas en la industria, donde se necesita tener suficiente información para realizar una determinada acción de control. Es por este motivo que veremos algunas aplicaciones simples donde se agrega comunicación a través de la red Ethernet. Esto permite que el control sea a distancia, permitiendo además la comunicación entre distintos dispositivos que actúan como sensores o actuadores. Los ejemplos serán explicados de manera detallada y con la profundidad adecuada. Veremos además, los módulos de entrenamiento comerciales que nos ayudarán a afianzar los conocimientos teóricos sobre este tema. Todo esto nos permitirá desarrollar aplicaciones de manera rápida y efectiva utilizando las herramientas de Microchip.

NETWORKING CON PIC Aprenderemos a utilizar las librerías de Microchip (Microchip Libraries for Applications) para crear un WebServer con PIC. Para comenzar a trabajar necesitamos tener instalado el MPLAB, el compilador C18 y el Microchip TCP/IP Stack (forma parte de las librerías de Microchip). Siempre es recomendable consultar la web de Microchip para descargar la última versión de las librerías: www.microchip.com/mal Para instalar el stack de Ethernet debemos ejecutar las Librerias de Microchip que se descargan desde la web mencionada anteriormente. En verdad estamos instalando una serie de librerías que Microchip provee para manejo de USB, mTouch (sensor capacitivo), TFT y Ethernet entre otras aplicaciones. El Microchip TCP/IP Stack está formado por un conjunto de capas que dan acceso a distintos protocolos: ARP, IP, ICMP, UDP, TCP, DHCP, SNMP, HTTP, FTP y TFTP. El Stack está totalmente programado en C, requiere aproximadamente 32K en memoria de programa y es portable a través de las distintas familias de Microchip. Es decir, funciona en micros de 8, 16 y 32 bits.


Figura 1: El stack está formado por varia capas, donde cada una brinda servicios a la capa superior. Junto con el TCP/IP Stack se instalan 2 aplicaciones sumamente útiles al momento de desarrollar una interface Ethernet con PIC: el Microchip TCP/IP Configuration Wizard y el MPFS. La primera nos permite modificar los parámetros del Stack en forma gráfica (sin tener que programar en C) y con la segunda compilamos la pagina web (interfaz de usuario) antes de cargarla en nuestro sistema embebido MICROCHIP TCP/IP CONFIGURATION WIZARD Podemos tener una buena idea de las posibilidades del Stack estudiando en detalle el Microchip TCP/IP Configuration Wizard. Si bien esta aplicación nos permite modificar parámetros de la red como la dirección IP y MAC; seleccionar entre protocolos como HTTP y FTP, no permite que el usuario agregue su propio código. Al momento de implementar un sistema necesariamente debemos programar las funciones en C con el MPLAB. Lo primero que debemos hacer es seleccionar la carpeta desde la cual vamos a trabajar, es decir, donde está instalado el Stack. El proyecto básico se encuentra en: C:\Microchip Solutions\TCPIP Demo App. Si bien hay varios ejemplos realizados con el stack, es conveniente empezar con este. Hay otros con soporte para WI-FI y librerías de encriptación SSL. Lo que estamos haciendo es decirle al asistente que archivos vamos a configurar. Hay que tener presente que el TCP/IP Configuration Wizard agrega o quita funciones del stack comentando código. Sabemos que el C18 no compila el código comentado ni las funciones asociadas, ahorrando así memoria de programa en el PIC.


Figura 2: Pantalla inicial del TCP/IP Configuration Wizard. El TCP/IP Configuration Wizard es una aplicación gráfica que permite modificar los parámetros del stack. Se ejecuta desde el menú Inicio > Programas > Microchip Solutions > TCPIP Configuration Wizard

AGREGANDO SERVICIOS AL STACK Podemos agregar soporte para distintos servicios: Servidor Web, Cliente de email, Telnet, FTP y SSL. Además soporte para el módulo WI-FI que veremos más adelante. En esta instancia vamos a agregar Servidor Web, que permite acceder a una página por medio de una dirección IP y Cliente de email mediante el cual podremos enviar un email automáticamente ante un determinado evento, por ejemplo, si sube la temperatura por encima de un umbral.


Figura 3: Opciones de Servidor Web y Cliente de email seleccionadas en el TCPIP Configuration Wizard. Como mencionamos anteriormente, cada servicio que deshabilitamos por medio del asistente es comentado en el Stack para que el C18 no lo compile. En la Figura 3, vemos que podemos seleccionar manualmente cada servicio. En esta instancia cabe mencionar que el Stack de Microchip está organizado en varios archivos, los encabezados que habilitan los servicios se encuentran en el archivo: TCPIPConfig.h (o bien TCPIP ETH97.h según el tipo de dispositivo) Vemos que no todas las funciones del Stack están disponibles a través del TCP/IP Configuration Wizard, por eso es importante acceder al archivo TCPIPConfig.h y comentar los servicios que no necesitamos, de esta forma estamos optimizando el uso de la memoria de programa. Por ejemplo, para deshabilitar el DNS, la instrucción debe quedar comentada por medio del operador // //#define STACK_USE_DNS


FUNCIONES ESPECIALES DEL STACK Por medio del TCP/IP Configuration Wizard podemos agregar funciones especiales. Por ejemplo, una aplicación sumamente útil es hacer un conversor RS232 – Ethernet: así todos los paquetes que ingresen por el conector de red serán retransmitidos por la UART del PIC y viceversa. De esta forma podemos darle conectividad Ethernet a sistemas que originalmente solo tenían comunicación RS232. Otra función interesante es medir el tiempo de viaje de un paquete entre el cliente y el host, lo que comúnmente denominamos PING. El stack nos devuelve el tiempo de viaje en milisegundos.

Figura 4: Habilitando las funciones especiales Serial to Ethernet Bridge y TCP Performance Test (PING). Vamos ahora a definir el nombre de Host, es decir un nombre con el cual identificar a nuestra placa en la red. Si tenemos habilitado el servicio de DNS podemos asociar un nombre a la placa que será más fácil de recordar que la dirección IP. Por otra parte, como la IP puede ser asignada por el servidor en forma dinámica, resulta conveniente definir un nombre de Host.


Figura 5: Dirección MAC por defecto del PIC y nombre de Host . Vinculado estrechamente al nombre de Host se encuentra la dirección MAC. Recordemos que por norma la MAC debe ser unívoca, por lo tanto, al momento de comercializar nuestro desarrollo es necesario adquirir un bloque de direcciones MAC a la IEEE. Existen memorias de Microchip que tienen pregrabada una MAC y que podemos vincular el microcontrolador a través de la interface SPI o I2C (25AA02E48 o 24AA02E48 respectivamente). Claro que para hacer pruebas podemos utilizar la MAC por defecto que trae el Stack.

CONFIGURACIÓN DEL WEBSERVER Vamos a definir el nombre de la página principal, es decir aquella que se va a mostrar por defecto, en este caso: index.htm


Figura 6: Configuración de la página por defecto, la cantidad de conexiones simultáneas y funciones adicionales. Un parámetro importante es la cantidad de conexiones que vamos a permitir. Esto hace referencia a la cantidad de usuarios que pueden monitorear el sistema simultáneamente. Cómo máximo pueden ser 32, pero debemos considerar parámetros como ancho de banda y estabilidad de la red antes de establecerlo, ya que una excesiva demanda puede deteriorar el rendimiento del sistema. UBICACIÓN DE LA PÁGINA WEB Podemos establecer diferentes ubicaciones para almacenar la página web que verá el usuario final de nuestro webserver. La misma puede estar en la memoria de programa del microcontrolador o en una memoria externa del tipo EEPROM. Si bien vemos en la Figura 7 otras opciones como memoria Flash y sistema FAT, las mencionadas anteriormente son las más representativas ya que determinan si la página está alojada en la memoria del micro o en una memoria externa.


Figura 7: Opciones de almacenamiento para la página web. En los ejemplos de este capítulo vamos a utilizar la memoria externa de Microchip: 25LC1024. Esta memoria es del tipo EEPROM, tiene una capacidad de 1Mbit y se conecta al PIC por SPI. Eligiendo una memoria externa disponemos de toda la memoria de programa del PIC para escribir nuestro código y alojar el Stack TCP/IP. Básicamente tenemos dos opciones para almacenar la página web: memoria externa o interna. Debemos decidir por una u otra considerando el costo adicional que significa una memoria EEPROM y por otro lado la consecuente reducción de espacio en memoria de programa.


COMPILANDO EL STACK Una vez configurados los parámetros básicos de nuestra aplicación a través del Microchip TCP/IP Configuraton Wizard, estamos en condiciones de compilar el Stack y cargarlo en el PIC.

Figura 8: La última pantalla del asistente: simplemente cliquear en finalizar para aceptar los cambios realizados. Necesitamos, entonces, compilar el Stack, para lo cual abrimos el proyecto C18PICDN2_ETH97.mcp desde el MPLAB y ejecutamos la compilación haciendo click en Build all. Dentro de la carpeta C:\Microchip Solutions\TCPIP\Demo App encontramos varios proyectos preparados para utilizar con micros de 8 a 32 bits. Es interesante destacar que los parámetros configurados con el asistente sirven para el transeiver del PIC18F97J60, esto se debe a que sólo se está modificando el archivo de cabecera TCPIPConfig.h (TCPIP ETH97.h). Seleccionamos el proyecto C18-PICDN2_ETH97.mcp ya que vamos a trabajar con un micro de la familia PIC18 (8bits), con un hardware compatible con la placa PICDem.net 2 de Microchip y con el PIC18F97J60.


Figura 9: Proyecto en el MPLAB listo para compilar.

Una vez compilado el proyecto, necesitamos un microcontrolador donde cargarlo. Vamos a utilizar una placa MCE WebServer WI-FI desarrollada por mcelectronics www.mcelectronics.com.ar/desarrollos Este placa es compatible con la Microchip PICDem.net 2.


ACCEDIENDO A LA PÁGINA WEB El Stack, por defecto, habilita el cliente DHCP, por tal motivo podemos conectar la placa a un router con DHCP habilitado (capacidad de asignar direcciones IP) y así obtener conectividad desde una computadora en la misma red.

Figura 10: Página inicial index.htm que se accede colocando la dirección IP asignada por el router. En este caso la IP asignada es 192.168.1.130, vemos sobre la izquierda de la página inicial un menú con las distintas opciones de la placa. Estas opciones son las que habilitamos a través del TCP/IP Configuration Wizard. Por ejemplo: envío de emails, servidor HTTP y servidor seguro, el cual nos permite acceder a una página protegida.


Lo que nos interesa en este momento es el recuadro de arriba a la derecha que nos muestra en tiempo real el estado de 8 LEDs y el valor de un potenciómetro que tiene la placa. Podríamos, por ejemplo, monitorear un led o controlar un relay desde la interface web. Este tipo de interacción, donde una variable reporta o modifica el estado de un puerto, se realiza mediante funciones callback que veremos más adelante. Es interesante destacar que la actualización de los datos es automática y no requiere refrescar la pantalla del navegador. En la sección Network Configuration, encontramos parámetros como la dirección IP, el default Gateway, la máscara de red, la MAC y el servidor DHCP. Todo esto podemos cambiarlo en tiempo de ejecución, por eso es importante protegerlo con contraseña, ya que una configuración incorrecta dará como resultado la pérdida de conexión. También tenemos la posibilidad de enviar emails desde un formulario web. Para esto se utiliza el protocolo SMTP. Simplemente hay que completar el formulario con el nombre del servidor SMTP, el nombre de usuario y la clave. Por último colocamos la dirección del destinatario y el cuerpo del mensaje. Por defecto se adjunta un archivo csv (se puede abrir con Excel) donde se muestra el estado de los LEDs, los pulsadores y el valor del potenciómetro. Más adelante vamos a ver el código de este ejemplo. Antes de pasar a la programación del stack, vamos a ver una última pantalla de la interface web. Se trata del envío de variables a través de los métodos GET y POST. Quién esté acostumbrado a programar en PHP sabrá la ventaja que conlleva utilizar este recurso. Por ejemplo, con el método GET podemos enviar una serie de variables junto con la URL. Es lo que habitualmente vemos como: http://192.168.1.130/forms.htm?led0=on&led1=off Luego de la dirección IP de nuestra placa está el nombre del formulario que vamos a actualizar, y a continuación del signo de interrogación está el nombre de cada variable y su valor separadas por &. Nótese que estamos actualizando el estado de dos variables (led0 y led1) de una sola vez. GET tiene una limitación y es el hecho de que la URL no puede contener más de 100 bytes. Si necesitamos enviar una mayor cantidad de variables, debemos utilizar el método POST que no tiene restricciones de longitud. Generalmente se suele utilizar POST para actualizar el texto de un LCD.


LOS ARCHIVOS PRINCIPALES DEL STACK Como mencionamos anteriormente, es necesario conocer el stack para poder agregar nuestras propias funciones y así lograr un sistema de telemetría y control remoto acorde a nuestras necesidades. Para esto vamos a desarrollar los archivos principales del stack. En la Figura 9 vemos la estructura general en el MPLAB.

Figura 11: Estructura de archivos del Stack. Se distingue la estructura dividida en archivos de cabecera (.h) y el código en los archivos (.c). Los archivos principales son los siguientes:


HardwareProfile.h En este archivo simplemente asociamos un puerto con un nombre fácil de recordar, por ejemplo si colocamos un LED en el puerto RF3 del PIC: #define LED_TRIS(TRISFbits.TRISF3) #define LED_IO (PORTFbits.RF3) TCPIPConfig.h o TCPIP ETH97.h (según la versión del stack) Como vimos, se utiliza para habilitar o deshabilitar funciones del stack como DNS, FTP, SNTP, SSL y UART dependiendo de las características de nuestra aplicación y la memoria disponible en el micro. MainDemo.c Es el programa principal, en el archivo MainDemo.c encontramos el mapeo de puertos, la configuración de los registros de la USART, los ADC y la inicialización de la placa. Por ejemplo ADCON0=0x0D; Para seleccionar AN3 como entrada analógica. CustomHTTPApp.c Por último, el cuarto archivo que necesitamos para una aplicación básica es CustomHTTPApp.c, en el cual se encuentran las funciones callback, es decir aquellas que interactúan con las variables dinámicas de la pagina web.


FUNCIONES CALLBACK Echemos un vistazo al archivo CustomHTTPApp.c donde se encuentran las funciones Callback. En este ejemplo vamos a mostrar el estado de un LED en la página web por medio de ON y OFF. La función Callback contiene el nombre y el valor de la variable dinámica ( led ) que va a ser mostrada en la web. Un error común es enviar directamente al buffer Ethernet el estado del led mediante la variable int LED_IO. Hay que tener en cuenta que SOLO SE PUEDEN ENVIAR STRINGS POR ETHERNET, por lo que, en numerosas ocasiones usamos itoa o ftoa para convertir los tipos de dato. Analicemos el código: ROM BYTE ESTADO_LED_UP[] = “ON"; ROM BYTE ESTADO_LED_DOWN[] = “OFF"; void HTTPPrint_led(void) { TCPPutROMString(sktHTTP, (LED_IO?ESTADO_LED_UP:ESTADO_LED_DOWN)); } En este caso, en lugar de usar los conversores de tipo, creamos dos variables auxiliares ESTADO_LED_UP y ESTADO_LED_DOWN para mostrar el estado del led mediante ON y OFF. La función void HTTPPrint_led(void) envía a la página web el valor de la variable dinámica led. Para chequear el estado del puerto RF3 (donde esta mapeado el led) utilizamos la sentencia condicional IF, aquí representada en una línea: LED_IO?ESTADO_LED_UP:ESTADO_LED_DOWN Recordar que anteriormente definimos LED_IO como el estado del puerto RF3. El IF chequea el estado de LED_IO, si el puerto está en 1, entonces la sentencia es verdadera y envía por HTTP, ESTADO_LED_UP, si en cambio está en cero, la sentencia es falsa y envía ESTADO_LED_DOWN. De esta forma tenemos un sistema básico que monitorea una variable y la envía por Ethernet. Ahora debemos diseñar una página web que reciba esta variable y la muestre en el explorador.

PROGRAMACIÓN DE LA PÁGINA WEB Microchip organiza los archivos del sitio web de tal forma de ahorrar espacio. Se trata de no repetir la información, por ejemplo, al pie de todas las páginas aparece la misma leyenda, entonces, utilizamos el archivo footer.inc que será llamado desde cada página, en lugar de escribir el texto nuevamente. Esto permite reducir sensiblemente el tamaño total del sitio.


Hay que incluir en el sitio web la variable dinámica led, para esto vamos a modificar status.xml e index.htm del proyecto básico. status.xml contiene todas las variables dinámicas que se actualizan (leds, temperatura y pulsadores). Agregamos la línea correspondiente a la nueva variable dinámica: <led>~led~</led> Entre <> se indica el nombre del divisor que se va a utilizar en el index para definir la posición de la variable. Index.html finalmente es el archivo que ve el usuario final. Donde aparezca <“led”> el webserver lo va a reemplazar con ON, OFF según el valor de LED_IO. <span id=”led">?</span>; Es importante destacar que este ejemplo utiliza AJAX para actualizar la información sin tener que apretar F5 en el explorador. Por lo tanto debemos agregar la siguiente sentencia al final del index: document.getElementById(’led').innerHTML = getXMLValue(xmlData, ’led'); Una varable se define dinamica en el codigo HTML si esta entre tildes, por ejemplo ~led~ Lo que hicimos hasta el momento fue crear una variable dinámica led en el código del Stack y enviarla a la web a través de una función callback, luego configuramos los archivos index.htm y status.xml para visaulizar el estado de la variable en la web.

SISTEMA DE ARCHIVOS MPFS Ahora necesitamos cargar la web en la memoria externa EEPROM. Antes de hacerlo debemos comprimir los archivos que componen el sitio mediante la aplicación MPFS (Microchip PIC File System). Esta aplicación se instala con el Stack y se encuentra en la ruta que venimos trabajando. MPFS es el sistema de archivos que utiliza el micro para leer la página web. Una vez que tenemos nuestro sitio terminado con los archivos html, ccs, xml, jpg o gif debemos convertirlos al sistema MPFS, para luego, poder cargarlos en el micro o en la memoria externa. Lo que hace internamente este conversor es juntar todos los archivos en uno solo, de hecho, podemos abrir el archivo resultante con el bloc de notas y veremos, ordenado secuencialmente, el contenido de cada archivo que compone el website.


La aplicación MPFS.exe convierte el conjunto de archivos que componen la página web a dos formatos posibles: .bin (para cargar el website en la memoria EEPROM externa) .c (para cargar el website en la memoria de programa del PIC) Como mencionamos anteriormente, al cargar la web en la memoria externa, tenemos disponible toda la memoria de programa del PIC para nuestra aplicación.

Figura 13: Pantalla principal del MPFS.exe con las opciones necesarias para compactar la web y cargarla en la memoria. El MPFS nos da la opción de transferir la web automáticamente a la memoria externa luego de compactarla. Para esto la placa debe estar conectada a la red y tener cargada la última versión del Stack.


Debemos tener en cuenta que cada variable que agreguemos en la web requiere su correspondiente variable en el Stack, por lo tanto es necesario recompilar el stack y cargarlo en el PIC antes de compactar la web y transferirla a la memoria. La secuencia correcta es la siguiente: 1-Modificar el Stack según las necesidades de telemetría requeridas. 2-Agregar las variables dinámicas correspondientes en status.xml y/o index.htm. 3-Compilar la web con MPFS. 4-Compilar el Stack con el MPLAB. 5-Cargar el .hex en el PIC. 6-Transferir la página web a la memoria externa. Tenemos dos alternativas para cargar la web en la memoria externa, una ya la vimos y es a través del MPFS. La segunda opción nos permite cargar la web remotamente a través del explorador web. Es un sistema de transferencia de archivos por medio de HTTP. Debemos ingresar a: http://192.168.1.130/mpfsupload

Figura 14: Servicio para cargar el website remotamente, debemos incluir el archivo .bin resultante de la compactación.


Las aplicaciones más seguras no permiten cargar la web de esta forma ya que cualquiera podría ingresar a la dirección mencionada, conociendo solo la IP y modificar nuestra web. En este caso podemos proteger el sistema de carga con contraseña o bien cargar la web en la memoria de programa del PIC. Debemos colocar la menor cantidad de imágenes posibles en la aplicación final, ya que la memoria 25LC1024 posee 1Mbit, es decir 128 Kbytes de espacio. Si nuestra web ocupa más, no se cargará correctamente. Es importante tener en cuenta que al agregar o quitar variables de nuestra web, se modifica el archivo HTTPPrint.h por lo que hay que volver a compilar el Stack antes de cargar la aplicación en el micro.


APÉNDICE INTRODUCCIÓN A LABVIEW


INTRODUCCIÓN A LABVIEW LabVIEW es un lenguaje y a la vez un entorno de programación gráfica en el que se pueden crear aplicaciones de una forma rápida y sencilla. A continuación ser hará una breve introducción al entorno de LabVIEW, menus, controles, funciones, y otros puntos relevante. ENTORNO LabVIEW es una herramienta de programación gráfica. Originalmente este programa estaba orientado a aplicaciones de control de instrumentos electrónicos usadas en el desarrollo de sistemas de instrumentación, lo que se conoce como instrumentación virtual. Por este motivo se da nombre a sus dos ventanas principales: un instrumento real tendrá un Panel Frontal donde estarán sus botones, pantallas, etc. y una circuitería interna. En LabVIEW estas partes reciben el nombre de Panel Frontal y Diagrama de Bloques respectivamente.  

Panel Frontal, es la parte que verá el usuario. Diagrama en Bloques, es donde se realizará la programación.

El Panel Frontal y el Diagrama en Bloques están conectados a través de los terminales (elementos que sirven como entradas o salidas de datos).

En la parte superior de estas ventanas se sitúa una barra con varias herramientas. En el Diagrama de Bloques esta barra tiene algunas opciones más.


  

El primer grupo de herramientas sirve para controlar la ejecución de un programa en LabVIEW. El primer botón indica si hay errores en el programa (fecha rota) y, cuando no los hay (flecha completa como en la imagen), ejecuta una vez el programa. El segundo botón ejecuta de forma continua el programa, como regla general este botón no debe usarse, en su lugar se empleará un bucle en el programa. El tercer botón aborta la ejecución y el cuarto permite realizar una pausa. El segundo grupo de botones sirve para ayudar a su depuración. El primer botón es Highlight Execution, una de las herramientas más útiles para depurar, ralentiza la ejecución permitiendo ver el camino que siguen los datos en el programa. El siguiente, Retain Wire Values permite que al colocar un probe se obtenga el valor anterior. Los tres siguientes se utilizan para ejecutar el programa paso a paso. El menú desplegable permite formatear textos, es recomendable usar los formatos predefinidos como Application Font o System Font. El tercer grupo se usa para alinear, distribuir, controlar el tamaño, agrupar y ordenar objetos. Abre la ayuda.

Para colocar funciones en el Diagrama de Bloques y terminales en el Panel Frontal se tienen las paletas, o menús flotantes, llamadas paleta de funciones y de controles respectivamente. Además también se tiene la paleta de herramientas que consta de diferentes útiles. Las paletas de funciones y controles se despliegan haciendo clic con el botón secundario del ratón sobre una zona vacía del Diagrama de Bloques o del Panel Frontal. También pueden dejarse fijas presionando el clip (

) de la esquina superior izquierda.


Otra ventana muy útil es la de ayuda contextual, puede abrirse en Help > Show Context Help. Esta ventana muestra información del objeto que esté situado bajo el cursor, ya sea una función, un VI, un control o un indicador. Además puede aparecer un enlace a la página de la ayuda relacionada con ese objeto.


MENU DE HERRAMIENTAS Mediante la paleta de herramientas se puede seleccionar el instrumento que se desea usar, esto hace cambiar el tipo de cursor del ratón.

Automatic Tool Selection. Si está activado sirve para que se seleccione la herramienta de forma automática dependiendo del elemento sobre el que sitúe el cursor. Operate Value. Sería el cursor disponible cuando el VI está ejecutándose, sirve principalmente para cambiar valores en los controles del Panel Frontal. Position/Size/Select. Como su nombre indica sirve para posicionar objetos, tanto en el Diagrama de Bloques como en el Panel Frontal. También sirve para cambiar el tamaño y seleccionar elementos. Edit Text. Cambia el cursor para poder escribir texto. Se puede usar, entre otras cosas, para escribir comentarios en el Diagrama de Bloques. Connect wire. Es la herramienta que sirve para cablear. Uniendo unos elementos con otros por cables, los datos fluirán a través de ellos. Si los cables aparecen en color gris y de forma discontinua significa que el cable está roto (hay un error): el tipo de datos es incompatible o los terminales no son los adecuados. Object Shortcut Menu. Despliega el menú contextual asociado a un elemento. Es equivalente a hacer clic con el botón secundario del ratón. Scroll Window. Sirve para mover el contenido de las ventanas del mismo modo que si se usarán las barras de desplazamiento laterales. Set/Clear Breakpoint. Crea o borra un punto de ruptura en un determinado elemento (función, VI, estructura o cable). Cuando la ejecución llega a ese punto se detiene. Probe Data. Crea un Probe en un cable. Un probe es una ventana flotante que muestra el valor que circula por el cable. Get Color. Obtiene el valor del color de un elemento. Set Color. Colorea un elemento. Tiene dos posibles colores, el principal y el de fondo, ambos pueden ser asignados de forma independiente. Uno de los colores disponibles está marcado mediante una T, se trata del color transparente.


CONTROLES El menú que aparece en el Panel Frontal es el menú de controles, en él se pueden seleccionar los terminales que servirán para interactuar con el usuario. Los terminales se dividen en controles e indicadores, aunque a veces se les suele llamar a todos genéricamente controles. Los controles propiamente dichos son las entradas de datos y los indicadores las salidas. Están clasificados según su estilo en varios submenús: Modern, System y Classic. Dentro de cada submenú hay otros menús que clasifican los controles por el tipo de datos. Los más usados son los que sirven para dibujar gráficas y los de la primera fila del submenú Modern, éstos de izquierda a derecha, corresponden a datos de tipo numérico, booleano, textos y tipos compuestos. Los indicadores para gráficas merecen un trato aparte debido a su importancia. En la paleta de gráficas hay de varios tipos, siendo los más importantes Waveform Chart y Waveform Graph.

Los indicadores Waveform Chart se diferencian de los Waveform Graph en que éstos últimos dibujan totalmente la gráfica cuando llegan nuevos datos, sin embargo los Waveform Chart anexan el nuevo dato a los existentes. El número de datos que se muestran puede ajustarse escribiendo sobre los números que aparecen en los ejes o dejar que LabVIEW los ajuste automáticamente (AutoScale). En los Waveform Chart también se puede ajustar el número máximo de puntos que se guardan a través de la opción Chart History Length del menú contextual. Mediante los menús contextuales de los elementos de las gráficas se pueden modificar muchos otros aspectos como el color, interpolación, elementos a mostrar, etc. Una práctica recomendable en todos los controles e indicadores es añadirles un texto que indique la función que realizan en la ventana que aparece al seleccionar en el menú contextual Description and Tip. Este texto se mostrará en la ventana de ayuda contextual cuando el usuario coloque el ratón sobre el terminal.


Sobre todos los controles e indicadores colocados en el Panel Frontal aparece un texto, por ejemplo Numeric, Boolean, Meter, Waveform Chart, etc. Este texto es la etiqueta o Label que sirve para identificar al elemento tanto en el Panel Frontal como en el Diagrama de Bloques, así como en variables, propiedades, referencias o métodos que dependan de ese control. También existe otro texto llamado Caption que sólo puede ser visible en el Panel Frontal. Aunque no es necesario, es conveniente que cada control tenga un Label diferente que describa su función, si es necesario en el Panel Frontal se puede usar Caption y tip para presentar una descripción más extensa. FUNCIONES Esta paleta es la que se muestra al trabajar sobre el Diagrama de Bloques, en ella se puede acceder a las diferentes funciones, subVIs y estructuras disponibles. Al igual que en el menú de controles, en este también hay varios submenús que se dividen dependiendo de la aplicación. Las funciones más usadas son las del submenú Programming. El primero de los submenús de Programming es Structures. Contiene elementos que son equivalentes a las instrucciones de control de los lenguajes convencionales, es decir, son los bucles como WHILE o FOR y la estructura condicional CASE además de otras.

Los siguientes menús de Programming se dividen según el tipo de datos. Están losdatos simples como los numéricos, booleanos y strings (texto), además de los compuestos como los clusters y arrays. Cada uno de estos menús tiene funciones para trabajar con esos datos.


CREACIÓN DE PROGRAMAS En LabVIEW la programación se realiza en el Diagrama de Bloques. Un programa habitualmente está formado por: 1. 2. 3.

Controles: sirven de entrada para los datos. Funciones, VIs y estructuras: realizan una o varias operaciones con esos datos. Indicadores: sirven de salida para los datos.

Los datos “circulan” por el programa mediante cables, que sirven para unir unos elementos con otros. Para realizar la conexión se utiliza la herramienta Connect Wire de la paleta de herramientas. Un cable tendrá una única fuente (control, constante o salida de otro elemento) y uno o varios destinos (indicador o entradas de otros elementos) de tipos compatibles. El cableado, en general, debe ser lo más corto posible manteniendo una claridad suficiente. Una opción útil que aparece en el menú contextual de los cables es Clean Up Wire que realiza un trazado automático de la ruta del cable. A continuación se muestra un ejemplo de un programa realizado en LabVIEW. Consta de dos entradas, una de tipo string y otra numérica. La función String Length obtiene el número de caracteres de la entrada de texto, esa cantidad es numérica y se suma a la otra entrada mediante la función Add. El programa tiene dos salidas, la primera de ellas es una copia duplicada de la entrada tipo string y la segunda es la suma de la longitud de la anterior más la entrada numérica.

Una vez creado el programa se deben introducir los datos iniciales en los controles del Panel Frontal, ejecutarlo presionando el botón Run y cuando acabe ver los resultados en los indicadores. A continuación se muestra la ejecución del programa anterior.


FLUJO DE EJECUCIÓN Al lenguaje de programación que usa LabVIEW también se le llama lenguaje G. La mayoría de los lenguajes se basan en una programación imperativa, la cual es simplemente una sucesión de operaciones. Sin embargo el lenguaje G no usa una programación imperativa sino una ejecución basada en el flujo de datos (dataflow). Un programa en LabVIEW consiste básicamente en una serie de funciones unidas mediante cables. Los datos “circulan” o “fluyen” por los cables. Una función sólo podrá ejecutarse cuando tenga disponibles todos los datos que le sirven como entradas. Esta forma de ejecutar un programa favorece el paralelismo y es más apropiada para sistemas multiprocesador y multihilo. A continuación se mostrarán una serie de imágenes para explicar el flujo de ejecución de LabVIEW mediante un ejemplo. El programa consiste en dos operaciones matemáticas: la suma de dos números y la multiplicación del resultado de ésta por otro número.


El primer paso de la ejecución llevará los datos de los controles Operador A, Operador B y Operador C a las entradas de las funciones Sumar y Multiplicar.

La función Sumar tiene disponibles los valores de sus dos entradas, sin embargo la función Multiplicar necesita el valor de otra entrada, por lo tanto en el siguiente paso se podrá ejecutar la función Sumar pero no Multiplicar. Cuando se ejecute el resultado de la suma, su valor pasará al indicador A+B que lo mostrará en el Panel Frontal y también circulará hasta la entrada que faltaba de la multiplicación, lo que permite que en el siguiente paso pueda ejecutarse.


Finalmente el resultado de la multiplicación pasa al indicador (A+B)*C y el programa finaliza.

EJEMPLO INTERFACE LABVIEW La interface diseñada en LabVIEW está orientada a poder cambiar los coeficientes del compensador como también de la ganancia, el offset, el dead zone y el tiempo de muestreo de un sistema a controlar, que en este ejemplo es un robot bípedo. También se muestra mediante un gráfico la señal error y la señal de los valores de salida para compensar el sistema. Debido al tiempo empleado en intercambiar información entre el dsPIC y el LabVIEW es mayor al tiempo de muestreo utilizado, no se puede mantener la conexión con la interface y observar el comportamiento real del robot. Por este motivo se agrego la posibilidad de conectarse y desconectarse de la interface cuando sea necesario. A continuación se pasa a explicar los bloques que componen la interface. En la primera etapa se pasa a configurar el puerto serie para comunicarse con el robot. En la configuración se especifica puerto, Baund Rate (910000), 8 bits de datos, no se utiliza paridad, 1 bit de stop y no se emplea flujo de control. Luego se pasa a inicializar las variables ALIGN, SYNCRO Y CONNECTED en false, y por último se inicializa un buffer de recepción de 20 bytes.


La siguiente etapa está comprendida dentro del loop principal y es la que permite establecer la conexión con el robot. Mientras que se esté desconectado no se transferirá información entre la interface y el robot. Si el botón “CONNECT” es presionado se habilita la etapa posterior, en la cual se limpia el buffer de recepción, se envía el comando “CN” y se espera a recibir como respuesta “OK”. Esta sección se repetirá tantas veces hasta que se establezca la conexión. De recibirse correctamente la respuesta “OK”, se considera que establecida la conexión.

A continuación se vuelve a limpiar el buffer de recepción, se envía el comando “ST” y se espera recibir “OK”. Esta etapa asegura que haya sincronización y alineamiento en la conexión establecida.


Asegurada la conexi贸n se pasa a transferir los valores especificados de ganancia, offset, dead zone y el tiempo de muestreo. Los tres primeros valores son adaptados al formato float de 4 bytes antes de ser enviados, mientas que la ganancia se adapta al formato int de 4 bytes. Esto permite reducir la cantidad de operaciones necesarias para cargar los valores en el programa que corre el dsPIC.


A continuaci贸n se transfieren los coeficientes del numerador y los del denominador del compensador. Para ello se ejecutan dos bucles for 5 veces, en donde se espera a recibir un byte que corresponde a la posici贸n del valor del arreglo que se va a transferir. Antes de transferirlo se lo adapta al formato float de 4 bytes.


En esta sección se reciben los valores anteriormente transferidos (TS, GAIN, OFFSET y DZONE), y se los muestra en pantalla, permitiéndonos verificar que se hayan cargado correctamente.

Luego se recibe la señal error, y el valor de salida para compensar el robot. Ambos valores son mostrados mediante un único gráfico.


Gráfico de la interface LabVIEW: Respuesta ante un escalón

En la última etapa se especifica si se mantiene la conexión, enviando el estado de la variable “CONNECT”. El programa cargado en el dsPIC interpreta que la conexión se mantendrá si recibe un 1, y confirma el estado de la conexión enviando el carácter “Y”. De recibir un 0, responde con el carácter “N”. De recibirse el carácter “N”, se establece en false la variable que determina el estado de la conexión (“CONNECTED”), quedando desconectado la interface del robot. A partir de este momento se puede retirar el cable USB.

RECURSOS ADICIONALES Puede encontrar este ejemplo completo como así también una clase de LabVIEW en el DVD que acompaña al libro.


NOTAS:


CAPÍTULO GRATIS

PARA ADQUIRIR EL LIBRO COMPLETO DE 496 PÁGINAS POR FAVOR INGRESE A WWW.MCELECTRONICS.COM.AR

Ninguna parte de este libro, incluido el diseño de la portada, puede reproducirse, almacenarse o transmitirse de ninguna forma ni por ningún medio, sea este eléctrico, químico, mecánico, óptico, de grabación o de fotocopia, sin la previa autorización escrita por parte de mcelectronics. La infracción de los derechos mencionados puede ser constitutiva de delito contra la propiedad intelectual. La editorial no se pronuncia ni expresa implícitamente respecto a la exactitud de la información contenida en este libro, razón por la cual no puede asumir ningún tipo de responsabilidad en caso de error u omisión. Las marcas mencionadas son propiedad exclusiva de sus registradores legales.


Diseñando sistemas embebidos con librerias de Microchip