Diseño e implementación de sistemas embebidos con PIC

Page 1


1


DISEÑO E IMPLEMENTACIÓN DE SISTEMAS EMBEBIDOS CON PIC®

TOMO II APLICACIONES AVANZADAS Y SISTEMAS DE CONTROL

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

2


Airoldi, Alejandro Anibal Diseño e implementación de sistemas embebidos con PIC: aplicaciones avanzadas y sistemas de control . - 1a ed. - Buenos Aires: mcelectronics, 2013. v. 2, 384 p. ; 23x18 cm ISBN 978-987-26021-7-8 1. Informática. 2. Software. I. Título. CDD 004

Fecha de catalogación: Octubre de 2013 © 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.

3


A nuestras familias y amigos por el apoyo incondicional.

4


5


DISEÑO E IMPLEMENTACIÓN DE SISTEMAS EMBEBIDOS CON PIC® 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, el compilador XC30 para los dsPIC y el XC32 para PIC32. 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.

6


7


SUMARIO MEDICIÓN DE ENERGÍA

11

INTRODUCCIÓN DIFERENTES TIPOS DE POTENCIAS MEDICION DE POTENCIA ELECTRICA TRANSFORMADOR DE INTENSIDAD SENSOR DE EFECTO HALL CIRCUITOS DE APLICACION MEDIDOR MCP3901 DE MICROCHIP MCP3905 MCP3909 MEDIDOR MONOFASICO CON PIC

13 15 21 25 26 27 36 39 44 47

ETHERNET Y WI-FI CON PIC

59

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

61 62 69 71 73 75 76 83 85 90 92 93 97 104 107

8


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

113 114 122 131 133

APENDICE CLOUD COMPUTING CON PIC32

141

ROBÓTICA

149

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

152 154 156 164 169 170 174 180 181 191 193 215 228

DISEÑO DE FILTROS Y CONTROL DISCRETO

235

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

241 245 249 259 262 281 288 301 307 321 328 349

9


APENDICE INTRODUCCIÓN A LABVIEW BIBLIOGRAFÍA

359 377

10


11


ETHERNET Y WI-FI EMBEBIDO CON PIC速

12


13


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.

14


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.

15


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.

16


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

17


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.

18


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

19


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.

20


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.

21


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.

22


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.

23


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.

24


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.

25


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:

26


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.

27


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.

28


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.

29


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.

30


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.

31


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.

32


CARGAR LA WEB EN LA MEMORIA INTERNA DEL PIC En aplicaciones que deben ser extremadamente económicas o bien donde la seguridad es una prioridad, podemos optar por almacenar la web en la memoria de programa del microcontrolador. Para esto ejecutamos el MPFS y seleccionamos la opción: C18/C32 Image desde el menú principal.

Figura 15: MPFS configurado para generar un archivo .c Esto generará un archivo .c que debemos agregar al stack para que sea compilado con el resto del código. Por defecto el nombre del archivo es MPFSImg2.c Para agregar la web, es decir el archivo MPFSImg2.c, debemos hacer 2 cosas: Primero comentamos la sentencia #define MPFS_USE_EEPROM dentro del archivo TCPIPConfig.h. De este modo estamos indicando que la web no estará en la memoria EEPROM externa.

33


En segundo lugar, incluimos el archivo MPFSImg2.c en el proyecto. Para lo cual hacemos click con el bot贸n derecho sobre Source Files y seleccionamos Add Files, como se ve en la Figura 16.

Figura 16: C贸mo agregar al proyecto el archivo MPFSImg2.c De esta forma estar铆amos prescindiendo de la memoria EEPROM externa con el consecuente ahorro de dinero y espacio f铆sico en la placa. Ya tenemos la web incluida en el Stack, ahora debemos compilar el proyecto completo y cargarlo en el PIC.

34


Una vez que compilamos, podemos notar que queda mucho menos espacio disponible en la memoria de programa. Una página promedio ocupa cerca del 25% de la memoria de un PIC18F97J60. Este es el PIC que está en la placa MCE WebServer WI-FI y que vamos a estudiar en detalle. Por lo tanto, en caso de necesitar almacenar la web de esta forma, es crítico reducir la cantidad de imágenes y minimizar su resolución lo más posible.

35


ENVÍO DE EMAILS Vamos a trabajar con el protocolo SMTP para enviar un email automáticamente desde el Stack. Esto es particularmente útil para reportar eventos. Para poder enviar emails desde el Stack TCPIP debemos habilitar el cliente SMTP, dejando de comentar la sentencia STACK_USE_SMTP_CLIENT en el archivo TCPIPConfig.h. Las funciones requeridas agregan aproximadamente 1K de código a la memoria de programa. El proceso se puede invocar en cualquier momento, por ejemplo si sube la temperatura, si se presiona un pulsador, etc. El mail de este ejemplo envía el estado de los pulsadores a la dirección que se especifique. Veamos un esquema que representa el funcionamiento del cliente SMTP:

Figura 19: Funciones del Stack TCPIP para envío de emails. Antes de intentar enviar un mail con la función SMTPSendMail() debemos verificar si no hay otro mail en proceso, para esto utilizamos en primer término SMTPBeginUsage() como indica el diagrama.

36


Si nuestro servidor de correo saliente requiere autorización, utilizamos SMTPClient.Server, SMTPClient.Username y SMTPClient.Password para setear los parámetros. Recordemos que esto lo hicimos cuando enviamos un email desde el formulario generado por el Stack. Por último incluimos los campos “De”, “Para”, “Asunto” y “Mensaje” antes de llamar a SMTPSendMail(). Mientras se intenta enviar el email, estaremos en el bucle de la función SMTPIsBusy(). En este punto si el email se envió correctamente SMTPEndUsage() devolverá 0, de lo contrario tenemos la opción de comenzar el proceso de nuevo o cancelar el envío. Un email puede no enviarse por fallas en la conexión o porque los datos de autentificación son incorrectos. Si ingresamos erróneamente la dirección del destinatario el stack enviará el email de todas formas. Ejemplo completo Veamos el proceso de envío, con un ejemplo concreto: En este caso utilizamos SMTPClient.Username y SMTPClient.Password para logearnos en el servidor seguro. En negrita están los parámetros como el destinatario, los datos del servidor y el asunto del mensaje. Las variables que indican el estado de los pulsadores se llaman: BUTTON?_IO donde (?) representa el numero de pulsador. Como dijimos podemos invocar este código dentro del programa principal. Por ejemplo podríamos hacer un IF que compare el valor de temperatura con un umbral y en caso de superarlo envíe un email de alerta a la dirección especificada por RAMStringTo[]. if(SMTPBeginUsage()) { static BYTE RAMStringTo[] = "soporte@mcelectronics.com.ar"; static BYTE RAMStringBody[] = "Mensaje generado por el MCE WebServer" VERSION " \r\n\r\nBotones: "; RAMStringBody[sizeof(RAMStringBody)-2] = '0' + BUTTON0_IO; RAMStringBody[sizeof(RAMStringBody)-3] = '0' + BUTTON1_IO; RAMStringBody[sizeof(RAMStringBody)-4] = '0' + BUTTON2_IO; RAMStringBody[sizeof(RAMStringBody)-5] = '0' + BUTTON3_IO; SMTPClient.Server.szROM = (ROM BYTE*)"mail.mcelectronics.com.ar"; SMTPClient.ROMPointers.Server = 1; SMTPClient.Username.szROM = (ROM BYTE*)"info@mcelectronics.com.ar"; SMTPClient.ROMPointers.Username = 1; SMTPClient.Password.szROM = (ROM BYTE*)"123456";

37


}

SMTPClient.ROMPointers.Password = 1; SMTPClient.To.szRAM = RAMStringTo; SMTPClient.From.szROM = (ROM BYTE*)"\"SMTP Service\" <info@mcelectronics.com.ar>"; SMTPClient.ROMPointers.From = 1; SMTPClient.Subject.szROM = (ROM BYTE*)"Mensaje de prueba"; SMTPClient.ROMPointers.Subject = 1; SMTPClient.Body.szRAM = RAMStringBody; SMTPSendMail(); MailState++;

ACCESO DESDE INTERNET ¿Qué sucede cuando queremos acceder a nuestro webserver desde Internet para monitorear el estado de un puerto o realizar control remoto ? Una de las preguntas más recurrentes es cómo acceder al WebServer con PIC a través de Internet. Si bien podemos acceder desde la red local mediante la dirección IP privada (ej: 192.168.1.101), esto no es posible desde Internet, a menos que contratemos una IP fija a nuestro ISP (no es la opción más económica). Para la mayoría de los usuarios la IP es dinámica, es decir, cambia dentro de un rango cuando nos conectamos a Internet. Para solucionarlo debemos asociar lo que se denomina DDNS (Dynamic DNS) o DNS dinámico el cual asocia un nombre de dominio a nuestra IP pública (ej: www.mcewebserver.com.ar), de esta forma siempre tendremos acceso al WebServer desde Internet.

Figura 20: Pantalla inicial de dyndns.org

38


Una opción es crear una cuenta en www.dyndns.org y configurar nuestro router para que actualice la base de datos de dyndns cada vez que la IP pública cambie. Para registrarnos en dyndns hacemos clic en Join NOW desde la pantalla inicial y luego seleccionamos la opción gratuita. En la figura 21 vemos los datos que debemos completar: nombre de host y dirección IP actual (ingresamos la dirección que nuestro ISP nos está asignando es este momento). El nombre de Host puede ser cualquiera mientras no haya sido previamente registrado en dyndns.

Figura 21: Proceso de registro en dyndns.org Para finalizar hacemos clic en Next y nos va a pedir un nombre de usuario y clave para acceder a nuestra cuenta. Debemos recordar estos datos ya que después los utilizaremos para configurar el router al cual va a estar conectado nuestro WebServer. Ya tenemos el Host creado en dyndns, en este caso el nombre es mcewebserver.dyndns.org. Las opciones pagas permiten reemplazar dyndns.org por nuestro nombre de dominio.

39


Figura 22: Opciones de configuración en dyndns.org En la Figura 22 vemos el Host creado recientemente y la dirección IP actual. Si hacemos clic cobre el nombre de Host podemos configurar el TTL (tiempo de vida). Este parámetro hace referencia al tiempo que el Host permanece vinculado a la IP en el Servidor antes de actualizar la información. Vamos a seleccionar un TTL de 4 horas. En este caso, dyndns chequeará nuestra IP cada 4 horas y actualizará su base de datos. Configuración del Router Una vez creado el Host debemos configurar nuestro router para que se conecte a dyndns y actualice la IP actual. Este ejemplo está hecho con un router Linksys, pero la funcionalidad DDNS (la cual permite conectarnos a servicios como dyndns) la tienen la mayoría de los modem-router que entregan los ISP. Simplemente hay que colocar el nombre de usuario y la clave que generamos en dyndns.org y el nombre del host, en este caso mcewebserver.dyndns.org.

Figura 23: Configuración del router para conectarse a dyndns.

40


Ahora tenemos acceso al router desde internet mediante un DNS, faltaría tener acceso al WebServer para lo que vamos a habilitar la función DMZ que expone todos los puertos de una determinada dirección IP a internet. Exponer todos los puertos de un dispositivo a Internet, conlleva un riesgo de seguridad. Debemos asegurarnos que estamos habilitando el servicio DMZ para la IP de nuestro WebServer y no de nuestra computadora. Ahora, entonces, habilitamos DMZ para la IP: 192.168.1.101 que es la asignada por el router al WebServer.

Figura 22: Servicio DMZ para la IP del MCEWebServer WI-FI Cada vez que accedamos desde Internet a http://mcewebserver.dyndns.org vamos a ser redirigidos a 192.168.1.101 en nuestra red local. Es importante deshabilitar DHCP en el MCE WebServer para que tenga siempre la misma IP local. Para deshabilitar DHCP en el WebServer, ingresamos a http://192.168.1.101 y vamos al menú Configuración en la barra de la de la izquierda. Deshabilitamos la opción recibir una IP automática y debemos ingresar una IP que se encuentre dentro del rango. Por ejemplo 192.168.1.110.

41


De esta forma nos aseguramos que la IP local no va a cambiar y no corremos el riesgo de exponer a Internet los puertos de otro dispositivo. Las versiones m谩s recientes del Stack incorporan la funci贸n DDNS, permitiendo que el mismo WebServer acceda a dyndns y actualice la IP en la base de datos, sin necesidad del router. Esta funci贸n requiere 2K adicionales en memoria de programa. Nosotros preferimos aprovechar ese espacio para agregar otras funcionalidades, ya que la gran mayor铆a de los routers posse el servicio de DDNS Es importante deshabilitar DHCP en el MCE WebServer para que tenga siempre la misma IP local. Si la IP local varia corremos el riesgo de exponer a Internet los puertos de otro equipo.

42


ARQUITECTURA DEL PIC18F97J60 El PIC18F97J60 posee un transceiver para conectarse a una red Ethernet, veamos cuales son las características de este microcontrolador.

Para poder alojar el Stack TCP/IP en un microcontrolador necesitamos como minimo 32K de memoria de programa. Es así como se desarrollo el PIC18F97J60 para que un sistema dedicado al monitoreo y control pueda tener una comunicación a la red Ethernet y evitar los incómodos controladores de red externo que consumían muchas líneas de datos para el flujo de información. Las características del PIC18F97J60 son las siguientes: -Rango de alimentación: 2,35V a 3,6V (3,1V a 3,6V utilizando el modulo Ethernet). -Cuenta con un regulador interno de 2,5V para alimentar al núcleo del procesador. -128KB de memoria de programa flash. -3KB de memoria de datos RAM. -Encapsulado SMD TQFP de 100 pines. -70 pines I/O digitales. -Controlador Ethernet compatible con la estándar IEEE 802.3. -Compatible para redes 10/100/1000BaseT. -MAC integrada. Estas características hacen del PIC18F97J60 un microcontrolador poderoso con capacidad de conexión a una red y, al mismo tiempo, conserva la arquitectura de los PIC18.

ALIMENTACIÓN El PIC18F97J60 debe ser alimentado con una fuente capaz de entregar entre 2,35V y 3,6V y si deseamos utilizar el modulo Ethernet debemos restringir el rango de alimentación entre los 3,1V y los 3,6V. Con estos valores el fabricante garantiza el funcionamiento correcto del dispositivo. Además, el núcleo de procesamiento de este microcontrolador trabaja a 2,5V. Si lo alimentamos a esa tensión no hay problemas, pero si lo alimentamos a 3,3V, por ejemplo, el PIC cuenta con un regulador interno que únicamente necesita un capacitor externo en el pin Vddcore/Vcap de 10μF con un bajo ESR (Resistancia Serie equivalente) como los que proporcionan los capacitores de tantalio.

43


Disposici贸n de los pines del microcontrolador PIC18F97J60 En el caso de alimentar el microcontrolador con 3,3V debemos colocar el pin ENVREG a un nivel alto para habilitar el regulador interno.

44


PUERTOS I/O Este microcontrolador cuenta con 9 puertos de entrada y salida digital, que están enumerados de la A a la H y el último J (No existe el puerto I), es decir PORTA, PORTB, etc. Todos los puertos son de 8 pines, excepto el PORTA de 6 pines solamente. Los puertos poseen diferentes drivers para manejar distintos niveles de potencia. Entonces, los puertos B y C pueden manejar cargas mayores como la de un LED. Por su parte, los puertos D, E y J pueden manejar cargas medias como la interfaz a memoria externa, y los puertos A, F, G y H manejan cargas mínimas y pueden utilizarse como indicadores de estados. Todos los puertos cuentan con los registros PORT, LAT y TRIS para su control y configuración. Los Puertos A y F pueden ser utilizados además como los canales de entrada al conversor A/D. MODULO ETHERNET La familia de PICs a la que pertenece este microcontrolador cuenta con controladores Ethernet incorporados que soportan el estándar IEEE 802.3 para una conexión 10-BaseT con par trenzado. Incluyen implementaciones completas para el control de acceso al medio (MAC) y el transceptor de la capa física (PHY). Además, este modulo cuenta con un buffer de 8K de memoria RAM para almacenar los paquetes de datos recibidos y los que serán transmitidos. La conexión física se realiza a través de 4 pines dedicados a la recepción y la información de datos, estos son: -TPIN+ -TPIN-TPOUT+ -TPOUTEn la figura 2 podemos ver el esquemático. Lo único que se necesita de manera externa son unos transformadores, pero en la actualidad encontramos conectores RJ45 que los incluyen en su interior.

Figura 2: Conexión del PIC a un conector RJ45 que posee bobinas en su interior.

45


TELEMETRÍA Podemos realizar tareas de monitoreo a distancia a través de una red Ethernet, esto permite controlar un sistema desde nuestros hogares. Veamos de qué se trata. En las tareas de automatización es importante realizar el monitoreo de variables para que el sistema pueda compensar las variaciones no deseadas de estas magnitudes y muchas veces es de utilidad que el monitoreo se realice a distancia. En las industrias químicas o en Domótica (Casas inteligentes), por ejemplo, el monitoreo de variables a distancia es muy beneficioso, porque permite tener un punto de control central de diferentes procesos y mantener así un flujo eficiente del procesamiento de datos. Una posibilidad en telemetría, es el envío de los datos necesarios para el monitoreo de un proceso por medio de una red Ethernet. Pero si nos preguntamos ¿Por qué Ethernet? Simplemente, porque en la actualidad es la red más utilizada y se encuentra presente en muchas oficinas y edificios industriales, porque está basada en estándares IEEE 802.3 que garantizan la fiabilidad de las conexiones de red y las transmisiones de datos. Además el uso de Internet nos permite alcanzar grandes distancia entre la estación de monitoreo y el operador. TELEMETRÍA DE VARIABLES ANALÓGICAS. Los sistemas embebidos o dedicados permiten el monitoreo a distancia de variables analógicas, como la temperatura, presión o caudal gracias a que poseen conversores A/D que digitalizan la señal. El sistema luego encapsula en paquetes de datos TCP/IP y la envía por la red Ethernet, que puede ser una LAN local o Internet través de un proveedor del servicio (ISP). El microcontrolador PIC18F97J60 es ideal para estas aplicaciones, ya que incorpora un Conversor A/D y soporta el Stack TCP/IP. VARIABLES DINÁMICAS Las variables dinámicas permiten que el servidor web tome datos del sistema, como puede ser el valor de un sensor o datos en la memoria de programa y combinada junto a una plantilla de una página web, mostrar los datos en la pantalla de una PC remota. La página web finalizada se transmite a través de una red o de Internet y los datos del sistema se muestra en la pantalla del usuario. Por ejemplo, la figura 4 muestra como el sistema toma el dato de una temperatura que combinado con la plantilla de una página web, muestra el valor en pantalla. Con estas variables podemos insertar cadenas de textos en las páginas web o también generar vistosos gráficos. Esto nos ayuda a diseñar el formato y los elementos necesarios de una página.

46


CÓMO INSERTAR UNA VARIABLE DINÁMICA Para insertar una variable dinámica en nuestro proyecto debemos realizar dos pasos. Primero, debemos colocar el nombre de esa variable dentro del código de nuestra página web en HTML. Luego, debemos implementar la función que tendrá el control sobre esa variable dinámica Para realizar el primer paso, debemos contar con una plantilla o una página web a la que le colocaremos una variable dinámica. Estas variables se identifican en el código HTML porque están escritas entre dos caracteres “tilde” (~). Entonces, si queremos agregar una variable dinámica llamada “VarDin” colocamos en el código HTML la expresión ~VarDin~. Cuando el servidor web se encuentra con esta variable dinámica, ejecuta un llamado a una función Callback. Esta función tiene que estar implementada en nuestro código en C, más precisamente en el archivo CustomHTTPApp.c que explicamos anteriormente. La función debe tener el siguiente formato (ver Código 01): Código 01 Void HTTPPrint_VarDin (void) { // Sentencias } Esta función será llamada cada vez que el servidor web se encuentre con la variable dinámica VarDin.

Figura 4: En la figura podemos ver cómo actúa una variable dinámica. El sistema se encarga de combinar el dato con la variable y enviar la página completa por la red.

47


CÓMO UTILIZAR UNA VARIABLE DINÁMICA Supóngase que tenemos la tarea de supervisar distintas máquinas expendedoras y nuestro trabajo es asegurarnos de que éstas no se queden sin el producto que vende. Este sería un trabajo arduo si tenemos que revisar las máquinas todos los días. Sería mucho más fácil si pudiésemos monitorear el estado de cada una de las maquinas desde la PC de nuestro escritorio. Esta supervisión se puede realizar utilizando variables dinámicas que nos muestren información, como por ejemplo, el nombre la máquina, su ubicación y la cantidad de productos que tiene almacenados a la espera de ser vendidos. Entonces, si queremos ver, por ejemplo, el nombre de la máquina o su identificación cuando navegamos por la página del servidor web, creamos una variable dinámica ~hostname~ en algún lugar de la plantilla de la pagina web alojada en el servidor (Vamos a suponer que un desarrollador de páginas web armó esta plantilla para nosotros). Para el ejemplo, colocamos lo siguiente dentro del archivo index.htm (ver Código 02) Código 02 <div id = “locations”> Maquina ~hostname~ </div> Donde se puede observar que después de la palabra máquina viene el nombre de la misma. Luego, escribimos la función que será llamada por el servidor cada vez que encuentre esta variable. Recordemos que la función se escribe dentro del archivo CustomHTTPApp.c (ver Código 03) Código 03 Void HTTPPrint_hostname (void) { TCPPutString (sktHTTP, Maquina_ Name); } Esta función se encarga de colocar el nombre de la estación dentro de la página web, reemplazando el valor de la variable dinámica y mostrándola en pantalla. Podemos ver en el nombre de la función como se debe acoplar luego de HTTPPrint_ el nombre de la variable dinámica que insertamos en la página web. Dentro de la función enviamos una cadena de caracteres sobre un segmento TCP con el nombre de la estación, que en esta oportunidad es almacenada en una variable que podemos definir al comienzo del código.

48


Las funciones Callback deben contener el nombre y el valor de la variable que se define. Además debemos tener en cuenta que los datos que enviamos desde el servidor Web deben estar codificados en código ASCII. Si pasamos esto por alto, visualizaremos errores en nuestra página. PARÁMETROS A LAS VARIABLES DINÁMICAS Podemos transmitir también parámetros junto con las variables dinámicas y mostrarlas en la página. Esto resultará muy útil cuando tengamos que enviar un vector o un array de datos a la página del servidor. Veamos cómo agregar los parámetros continuando con el ejemplo anterior. Supongamos que cada estación contiene unos siete productos para vender, la información que nos interesaría mostrar seria el nombre del producto y la cantidad que tiene del mismo. Entonces, en la página vamos a encontrarnos con siete bloques de código como el siguiente por cada producto (ver código 04) Código 04 <div class="productname">~name(0)~:</div> <div class="stock">~stock(0)~</div> </div> Vamos a incluir estos bloques por cada producto que contiene la máquina y aumentamos el índice del array a cada paso. Luego, tenemos que realizar las funciones Callback en el archivo CustomHTTPApp.c. La ventaja de esto es que en vez de escribir siete funciones para la variable name y otras siete para la variable stock, únicamente escribimos dos funciones y a los valores los pasamos como parámetros (Ver código 05). Código 05 void HTTPPrint_name(WORD item) { TCPPutString(sktHTTP, items[item].name); } void HTTPPrint_stock(WORD item) { BYTE digits[4]; uitoa(items[item].stock, digits); TCPPutString(sktHTTP, digits); } En cada función colocamos el parámetro de la variable entre paréntesis que tomará un valor de 16 bits llamado item. Luego, una estructura devolverá el nombre del producto en la primera

49


función. Para la segunda función, como queremos enviar un número, debemos convertirlo en una cadena de caracteres ASCII y luego enviarlas. Para realizar la conversión de los números enteros a código ASCII podemos utilizar las funciones itoa o uitoa (este último para valores sin signo). Estas funciones están definidas en la librería estándar de C en la biblioteca stdlib.h

MONITOREO DE LA TEMPERATURA POR ETHERNET Con todo lo visto hasta ahora aprenderemos a enviar el estado de un sensor a través de una red para poder visualizarlo en una página Web. A continuación realizaremos el monitoreo de una variable analógica. Veremos el esquemático y los pasos para asignar una variable dinámica en nuestra página y poder compilar el proyecto.

50


51


Éste es el esquemático de la práctica, donde básicamente tenemos el microcontrolador conectado a la red a través de un conector RJ45. Luego, tenemos el circuito de alimentación y el sensor de temperatura conectado en el pin RA3/AN3, el cual es el canal 3 del conversor AD. En este caso volvemos a utilizar el sensor de temperatura TC1047. <response> <led0>~led(0)~</led0> <led1>~led(1)~</led1> <led2>~led(2)~</led2> <led3>~led(3)~</led3> <led4>~led(4)~</led4> <led5>~led(5)~</led5> <led6>~led(6)~</led6> <led7>~led(7)~</led7> <btn0>~btn(0)~</btn0> <btn1>~btn(1)~</btn1> <btn2>~btn(2)~</btn2> <btn3>~btn(3)~</btn3> <temp0>~temp~</temp0> <relay1>~relay1~</relay1> <relay2>~relay2~</relay2> </response>

Vamos a comenzar insertando la variable dinámica, vamos a proceder como se explicó anteriormente, primero editamos el archivo status.xml. En el archivo vamos a declarar la variable dinámica temp con la siguiente sentencia: <temp0>~temp~</temp0>.

52


~inc:header.inc~ <div id="content"> <div id="status"> <div id="loading" style="display:none">Error:<br />Se perdio la conexion.</div> <div id="display"> <span style="float:right;font-size:9px;font-weight:normal;padding-top:8px;textindent:0px">(click to toggle)</span> <p>LEDs:<br /><span class="leds"> <a id="led7" onClick="newAJAXCommand('leds.cgi?led=7');">•</a> <a id="led6" onClick="newAJAXCommand('leds.cgi?led=6');">•</a> <a id="led5" onClick="newAJAXCommand('leds.cgi?led=5');">•</a> <a id="led4" onClick="newAJAXCommand('leds.cgi?led=4');">•</a> <a id="led3" onClick="newAJAXCommand('leds.cgi?led=3');">•</a> <a id="led2" onClick="newAJAXCommand('leds.cgi?led=2');">•</a> <a id="led1" onClick="newAJAXCommand('leds.cgi?led=1');">•</a> <a id="led0">•</a> </span></p> <p>Botones:<br /> <span id="btn3">?</span>   <span id="btn2">?</span>   <span id="btn1">?</span>   <span id="btn0">?</span></p> <p>Relays:<br /> <p>R1: <span id="relay1" style="font-weight:normal">?</span> R2: <span id="relay2" style="font-weight:normal">?</span>

</div>

<p>Temp: <span id="temp0" style="font-weight:normal">?</span> ºC </div>

Luego buscamos la plantilla de la página web index.html que provee la librería de microchip y colocamos la siguiente sentencia que se ve en la línea: <p>Temp: <span id= ”temp0” style = “font-weight:normal”>?</span>. Esta sentencia reemplazará a la variable dinámica y colocara el valor de la temperatura que arroje la función Callback.

53


void HTTPPrint_temp(void) { char AN0String[30]; float ADval; // Wait until A/D conversion is done ADCON0bits.GO = 1; while(ADCON0bits.GO); ADval = (float)ADRES/10.00; ftoa(ADval ,AN0String,2,'f'); }

TCPPutArray(sktHTTP,(void *)AN0String, strlen((char*)AN0String));

En el archivo CustomHTTPApp.c escribimos la función Callback que controlara la variable dinámica que definimos. En esta función realizamos la conversión a digital de la temperatura y la convertimos en ASCII para mandarla en la página mediante la función ftoa. Luego, mandamos los caracteres con la función TCPPutArray(). Luego, ejecutamos la utilidad que vimos anteriormente, TCP/IP Configurations Wizard y configuramos como lo realizamos en dicha oportunidad, luego compilamos el proyecto y lo grabamos al PIC, finalmente cargamos la página con el MPFS en la memoria externa del PIC.

54


Una vez finalizado podemos ver la p谩gina accediendo desde el Browser a la direcci贸n IP que tiene el servidor. Podemos ver como la temperatura se actualiza con cada llamada a la funci贸n que la controla.

55


SERVIDORES WEB DEDICADOS Los servidores Web dedicados nacen de la necesidad de implementar sistemas de control eficientes y de bajos recursos, veamos que significa. Actualmente muchas industrias tienen la tendencia de incorporar dispositivos embebidos o dedicados a tareas especificas y que a su vez se puedan comunicar con otros dispositivos para crear una estructura de supervisión mucho más efectiva. Los servidores Web dedicados son un ejemplo de esto. Funciones de un servidor web dedicado para control Los sistemas embebidos realizan en general tres tareas: -Toman una entrada que pueden ser de un sensor. -Realizan un proceso en tiempo real. -Obtienen una salida que puede ser una respuesta o el control de un actuador. La ventaja de un servidor web es que presenta una interfaz mucho más amigable y es posible realizar el control de una planta desde la PC central.

Alternativas comerciales Si necesitamos tener tiempos de desarrollos más rápidos o queremos evitar la complejidad del proceso de armado de un servidor web dedicado, en el mercado tenemos la alternativa de comprar módulos de entrenamiento. Estos módulos proveen las herramientas necesarias para ejercitarse en el manejo del Stack TCP/IP de Microchip. Estos módulos vienen con el hardware necesario para conectarse a una red Ethernet y vienen provistos de un firmware para poder comunicarse con el modulo a través de una página web. En el mercado encontramos el modulo de entrenamiento MCE WebServer WI-FI, que cuenta con un microcontrolador PIC18F97J60. Tiene cargado un programa demostrativo que permite utilizar el Stack TCP/IP de Microchip y realizar todas las demostraciones que estudiamos en este libro. Además cuenta con algunos periféricos como LEDs, display LCD y un sensor de temperatura para interactuar con el PIC. Para aplicaciones comerciales contamos con módulos que únicamente cuentan con el hardware necesario para realizar una conexión a la red. Como es el caso del módulo MCE Stick Ethernet, que cuenta simplemente con el PIC18F97J60, el circuito de alimentación interno, un conector para programación In-Circuit y un conector RJ45 para los cables de red. Con este modulo podemos agregar conectividad a nuestros desarrollos.

56


Control Remoto Hasta el momento vimos como monitorear parámetros a distancia, ahora veremos cómo controlar de manera remota esas variables. En muchas industrias es necesaria la utilización de algún equipo que permita realizar, por diferentes cuestiones, el control de la planta de manera remota. Ya sea porque el lugar no es accesible para el personal de planta o por cuestiones de seguridad. Existen muchos equipos que controlan la planta de manera remota y utilizan diferentes protocolos de comunicación. Actualmente, muchas industrias y en casi todas las nuevas líneas de producción se está implementando Ethernet industrial como red de comunicación básica, especialmente en aquellos casos en que todo el sistema se controla desde una computadora central. La conectividad y la sencillez de la instalación han convencido a los departamentos de ingeniería de producción de la conveniencia de reconvertir las líneas de producción existentes para que puedan utilizar Ethernet industrial. Ejemplo de control remoto Sobre este tema encontramos infinidades de aplicaciones, por ejemplo, los sistemas de alerta de incendio municipal. Éstos trabajan sobre Internet, ya que los puestos de control de incendio se encuentran distribuidos por toda la ciudad. Como todos los edificios cuentan con una red Ethernet, podemos utilizar el protocolo IP para las comunicaciones entre las estaciones y transportar los datos en los protocolos TCP o UDP para que un ordenador central realice las acciones de control. También encontramos muchos ejemplos en domótica, donde podemos enviar un e-mail y controlar, por ejemplo, el sistema de refrigeración y alarmas. Actualmente casi todas las nuevas líneas de producción están implementando Ethernet industrial.

57


MÉTODO GET PARA CONTROL REMOTO

Este es un método sencillo para enviar un comando hacia nuestro Servidor web embebido. Utiliza formularios web para enviar la información. Un formulario web lo podemos ver, por ejemplo, cuando iniciamos una búsqueda en Google, donde tenemos que rellenar un campo de información y, luego, apretamos “Búsqueda” para enviar la información. De esta manera, el formulario web nos permite crear una interface sencilla entre el usuario y el servidor remoto. Dado un formulario, el envío de datos se pude realizar mediante dos métodos: el método GET y el método POST. El método GET envía los datos anexados con la dirección URL de la página. Luego, estos datos son más simples de procesar en el microcontrolador, porque los datos quedan guardados directamente en el buffer del modulo. La desventaja es que tiene un límite máximo de caracteres a enviar. El método POST envía los datos en el cuerpo de la petición. Estos datos tienen un acceso más complicado, pero tiene la ventaja de que no está limitado en la cantidad de valores que podemos enviar. Formularios web Los formularios web pueden ser programados en distintos lenguajes HTML, pero son reconocidos cuando observamos la sentencia <form>. Dentro de estas etiquetas <form> encontramos los campos <input>. Cada etiqueta representa un elemento de entrada de la interfaz con el usuario (como un campo de texto, una casilla o un botón) y se le asigna un nombre de parámetro, que controla el campo que devuelve el explorador. Cuando las variables se envían al servidor se codifican como una serie de pares nombre/valor. Cada campo está separado por un símbolo (&) y los nombres están separados de los valores con un signo igual (=).

58


En un formulario web podemos enviar comandos para encender, por ejemplo, una lámpara o un relé. Los valores enviados por el método GET son más fáciles de procesar, comparado con el método POST. Pero debemos tener en cuenta que tenemos un límite máximo de datos para enviar que normalmente es de unos 100 bytes. Si la cantidad de datos es menor a este valor, utilizamos GET, si no tendremos que usar el POST. Veamos un pequeño ejemplo de un formulario web en código HTML. El encabezado de un formulario se escribe del siguiente modo (ver código 06) Código 06 <form method="get" action="luces.htm"> <input type="radio" name="luces" value="on" ~Val_lights(1)~ /> On <input type="radio" name="luces" value="off" ~Val_lights(0)~ /> Off </form> El Código 06 es una pequeña porción de código extraído de una página que nos servirá para ver cómo actúa el formulario. En la primera línea abrimos el cuerpo del formulario y le indicamos que se utilizará el método “get”. Luego, tenemos los campos de input, el parámetro “name” controla el nombre del campo, que en este ejemplo es luces. Luego, vemos los valores que toman las variables dinámicas que están definidas en el código. Por último, se cierra el cuerpo del formulario. Con esto seremos capaces de reconocer un formulario en el código HTML. Manejo de los datos con el método GET El método GET coloca los datos al final de la dirección con el formato que se ve en el Código 07: Código 07 /form.htm?luces=on&brillo=50 En la sentencia del Código 07 se indica que el valor del campo “luces” es “on” y el “brillo” se establece en un valor de “50”, por ejemplo. Luego los datos enviados por el método GET se decodifican automáticamente y se almacenan en la matriz curHTTP.data. Esta estructura está definida en el Stack TCP/IP. Luego, podemos realizar cualquier acción cuando se llama a la función HTTPExecuteGet(), que será llamada cada vez que se presenten datos desde el formulario.

59


ENCENDER UN LED Y UN RELÉ POR ETHERNET Hemos aprendido cómo enviar datos por medio del método GET para formularios web, ahora veamos como interactuar con nuestro servidor. Vamos a realizar de manera práctica el encendido de un LED y de un relé a través de un formulario web. Desde este formulario enviaremos los datos al servidor web que tenemos conectado a la PC por medio del conector de red o, si fuera necesario, a través de un router. Primero, realizaremos de manera sencilla el encendido de un LED por el método GET y, luego, extenderemos el ejercicio para encender de manera simultánea LEDs y relés. Con todas estas nociones estaremos preparados para realizar el control básico a distancia de cualquier sistema que lo requiera. Encendido de un LED por Ethernet Comenzaremos con un ejemplo sencillo de encender un LED por el método que estuvimos estudiando. Lo primero que debemos tener es una plantilla web con un formulario. Si contamos con la librería de Microchip, encontraremos una plantilla en la carpeta “WebVend App”. Allí hay una plantilla simple con un formulario para el encendido de un LED. Podremos reconocer en el código HTML el formulario, porque comenzará con el campo <form> y, luego, las etiquetas <input>. Veremos algo similar al Código 08: Código 08 <form method="get" action="lights.htm"> <!-- Estos dos campos son creados para seleccionar el On/Off --> <input type="radio" name="lights" value="on" ~lights_chk(1)~ /> On <input type="radio" name="lights" value="off" ~lights_chk(0)~ /> Off <!-- En el formulario hay un botón de seteo --> <input type="submit" class="btn" value="Set"/> </form> Una vez que reconocemos el campo del <form>, podemos ver como se define el método GET para enviar los datos. Esto lo podemos ver con la sentencia method = “get”.

60


Esta es una imagen de la plantilla que podemos encontrar en la librería de Microchip, donde está definido el formulario que acabamos de ver. A continuación vemos el campo de las etiquetas input, donde podemos ver el parámetro “name”. Este dato es muy importante porque será utilizado en la función Callback que llame el envío de los datos. En este caso, vemos que el parámetro toma el nombre de “lights”. Luego, podemos ver la definición de dos variables dinámicas: lights_chk(0) y lights_chk(1). Ambas variables están escritas entre los caracteres (~). Estas variables dinámicas están para ajustar un valor predeterminado cuando se carga el formulario. Además, dichas variables tienen su propia función Callback y la única función que cumplen es la de mantener un valor predeterminado al cargar el formulario. La última etiqueta de <input> genera un botón para enviar los datos del formulario. Como no tiene en su sentencia el parámetro “name”, no envía ninguna información adicional. Función Callback para encender el LED. Como mencionamos antes, los datos enviados por el método GET son procesados por la función HTTPExecuteGet(). Los datos que recibimos del formulario, automáticamente se decodificarán y se almacenarán en la estructura curHTTP.data. Luego, podemos obtener los datos recibidos con la función HTTPGetArg() y localizar rápidamente los valores asociados a los nombres de los parámetros. Entonces, la forma básica de una función que es llamada luego del envío de datos GET es la siguiente: primero inicia la búsqueda de los valores de entrada y luego realiza las acciones necesarias, según los valores hallados. Veamos en el Código 09 como se realiza esta función:

61


Código 09 HTTP_IO_RESULT HTTPExecuteGet(void) { BYTE *ptr, i, name[20]; // Busco el nombre del archivo MPFSGetFilename(curHTTP.file, name, 20); // Nos aseguramos que es el archivo deseado if(strcmppgm2ram((char*)name,(ROM char*)"lights.htm") != 0) return HTTP_IO_DONE; // Buscamos el valor del nuevo estado ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE *)"lights");

}

if(ptr) // nos aseguramos que el valor no sea nulo {// seteamos el nuevo estado if(strcmppgm2ram((char*)ptr, (ROM char*)"on")== 0) LED1_IO = TRUE; else LED1_IO = FALSE; } // Finalizamos return HTTP_IO_DONE;

Veamos un análisis del Código 09. Comenzamos definiendo la función HTTPExecuteGet() que devuelve un parámetro del tipo HTTP_IO_RESULT, que es un tipo de variable definido por el Stack TCP/IP de Microchip. Luego de definir las variables que vamos a utilizar en la función, el primer paso es la de comprobar el nombre del archivo, para eso podemos utilizar la función MPFSGetFilename(); para buscar el nombre del archivo. Si tenemos varios formularios nos será de utilidad saber cuál es el que generó el envío de datos, para eso es que realizamos el bloque condicional if. Simplemente, realizamos la comparación de las cadenas de caracteres con la función strcmppgm2ram() y, si son diferentes, salimos de la función. En nuestro caso, de todos modos, tenemos un solo formulario para atender.

62


El próximo paso es buscar el campo de datos. En nuestro ejemplo, sólo tenemos un dato, pero es bueno saber que si tenemos más de uno para recibir, los campos no siempre llegan en orden. Por eso realizamos la búsqueda de los datos con la función HTTPGetROMArg() que recibe como argumento la estructura que contiene los datos (curHTTP.data) y el nombre del formulario del cual provienen los datos. Lo que nos devuelve es un puntero a los datos almacenados que luego comparamos con la cadena de caracteres “ON”, si son iguales, se enciende el LED y, son diferentes, se apaga. Por último, retornamos con el valor HTTP_IO_DONE para indicar que terminamos y que no necesita ser llamado de nuevo. Manejo de varios LEDs y relés Vamos a agregar más comandos al ejemplo, esta vez, vamos a poder manejar tres LEDs y dos relés. Ahora, en la página tendremos un formulario más grande donde agregamos todos los comandos que necesitamos. Podremos encontrar una plantilla con la cual trabajar en el directorio [Demo App\WebPages2] con el nombre form.htm. La estructura del formulario donde agregamos dos relés y tres LEDs puede observarse en el siguiente código: Código 10 <form method="get" action="forms.htm"> <div class="examplebox"> <b>R2:</b> <select name="relay2"><option value="on"~ledSelected(9,TRUE)~>On</option><option value="off"~ledSelected(9,FALSE)~>Off</option></select>  <b>R1:</b> <select name="relay1"><option value="on"~ledSelected(8,TRUE)~>On</option><option value="off"~ledSelected(8,FALSE)~>Off</option></select>  <b>L3:</b> <select name="led3"><option value="1" ~ledSelected(3,TRUE)~>On</option><option value="0" ~ledSelected(3,FALSE)~>Off</option></select>  <b>L2:</b> <select name="led2"><option value="1" ~ledSelected(2,TRUE)~>On</option><option value="0" ~ledSelected(2,FALSE)~>Off</option></select>  <b>L1:</b> <select name="led1"><option value="1" ~ledSelected(1,TRUE)~>On</option><option value="0" ~ledSelected(1,FALSE)~>Off</option></select>  <br /><input type="submit" value="Enviar" style="margin-top:5px;"> </div> </form>

63


Lugo, tenemos el código de la función que será llamada para controlar el estado de los LEDs y de los relés. (Ver Código 11) Código 11 HTTP_IO_RESULT HTTPExecuteGet(void) { BYTE *ptr; BYTE filename[20]; // Cargamos el nombre del archivo // Asegurarse que filename[] tiene el tamaño adecuado MPFSGetFilename(curHTTP.file, filename, 20); // Si los datos provienen de form.htm if(!memcmppgm2ram(filename, "forms.htm", 9)) { // Revisamos el estado de cada LED ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE *)"led4"); if(ptr) LED4_IO = (*ptr == '1'); ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE *)"led3"); if(ptr) LED3_IO = (*ptr == '1'); ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE *)"led2"); if(ptr) LED2_IO = (*ptr == '1'); ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE *)"led1"); if(ptr) LED1_IO = (*ptr == '1'); //---------------------Control del relay-----------------------------ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE *)"relay1"); if(ptr) // nos aseguramos que el valor no sea nulo { if(strcmppgm2ram((char*)ptr,(ROM char*)"on") == 0) RELAY1_IO = 1; else RELAY1_IO = 0; }

64


ptr = HTTPGetROMArg(curHTTP.data, (ROM BYTE *)"relay2"); if(ptr) // nos aseguramos que el valor no sea nulo { if(strcmppgm2ram((char*)ptr,(ROM char*)"on") == 0) RELAY2_IO = 1; else RELAY2_IO = 0; } } // Finalizamos return HTTP_IO_DONE; }

Con este c贸digo estamos en condiciones de realizar control remoto a trav茅s de Ethernet, ya sea de un led, un relay o cualquier otro dispositivo conectado al microcontrolador.

65


WI-FI CON PIC En este capítulo aprenderemos a conectar nuestros desarrollos a una red inalámbrica WI-FI, por medio de los módulos de conectividad de Microchip. Estudiamos la importancia de las aplicaciones que poseen conectividad a la red Ethernet, pero ahora vamos un paso más para poder agregar esta vez conectividad inalámbrica a través de una de las redes con más crecimiento actualmente: WI-FI. Con las redes inalámbricas ganamos en prolijidad, porque nos evitamos de manejar esas marañas de cables que dificultan nuestro trabajo, en cambio con WI-FI podemos diseñar un entorno más amigable para el operador. Además veremos cómo añadir conectividad WI-FI a nuestros desarrollos, estudiando un módulo de la empresa Microchip. Además, veremos cuáles son las precauciones y las consideraciones más importantes al momento de diseñar una placa donde vaya insertado este dispositivo. MODULO WI-FI DE MICROCHIP Conoceremos todas las características de este módulo que nos servirá para agregar conectividad inalámbrica a nuestros desarrollos. Veamos de qué se trata.

Poder agregar conectividad inalámbrica a nuestros desarrollos ofrece muchas ventajas, como por ejemplo, la capacidad de interconectar varias estaciones sin tener que modificar la infraestructura edilicia, como ocurre con las redes cableadas. Además, las redes WI-FI se encuentran estandarizadas por la norma IEEE 802.11, lo que nos asegura la compatibilidad entre distintos dispositivos. Entre las desventajas que ofrece podemos nombrar la baja velocidad de transferencia, si la comparamos con las redes cableadas, y la falta de seguridad en el envío de datos, ya que pueden ser capturados durante la transmisión. Pero esto último se puede solucionar, en parte, trabajando con redes seguras que utilizan encriptación de datos. Estándar 802.11 El estándar 802.11 establece las especificaciones y normas de funcionamiento para las capas uno y dos del modelo OSI. Como características especiales, esta red trabaja en las zonas de frecuencia de los 2,4GHz para los estándares 802.11b y 802.11g, y en la frecuencia de los 5GHz en la norma 802.11a. Las velocidades más comunes de transmisión están en los 11Mbps y en los 54 Mbps. Básicamente, encontramos dos estructuras para la interconexión de los diferentes dispositivos. Una de ellas es llamada red WI-FI de infraestructura, donde existen dos elementos: uno o más puntos de acceso y las estaciones clientes, estos se conectan al servidor a través del punto de acceso. La otra estructura es la red Ad-Hoc donde las estaciones clientes se conectan entre si para intercambiar información.

66


WI-FI es una marca de la WI-FI Alliance, que es una organización comercial dedicada a certificar los dispositivos que cumplen con los estándares de la IEEE 802.11 para redes inalámbricas de área local. El objetivo de esta organización es fomentar el uso de las redes inalámbricas de una manera fácil y asegurar la compatibilidad entre los diferentes equipos. Módulo MRF24WB0MA Este módulo es fabricado por Microchip y, básicamente, agrega conectividad WI-FI en dispositivos embebidos. Trabaja bajo la estándar 802.11b que especifica una frecuencia de trabajo de 2,4GHz y alcanza velocidades de hasta 2Mbps. Si utilizamos este módulo para el envío de información sobre los sistemas embebidos en donde trabaja, es más que suficiente. Este módulo posee internamente todo lo necesario para la conexión a una red WI-FI, porque tiene una dirección MAC pregrabada y los componentes de RF necesarios para la utilización del medio físico, incluyendo la antena. Simplemente debemos tomar algunas consideraciones en el layout (Esquema de distribución de los componentes en el PCB), para poder integrar este módulo. Características del módulo MRF24WB0MA Veremos las características más interesantes sobre este módulo de conectividad. -Trabaja con la estándar 802.11b de WI-FI. -Dirección MAC pregrabada. -Posee los componentes de RF y amplificadores de banda base para establecer la comunicación. -Soporta protocolos de seguridad WEP, WPA y WPA2. -Bajo consumo de alimentación. -Se alimenta a través de una simple fuente de 3,3V. -Velocidades de 1 y 2Mbps. -Licencia gratuita de la pila (stack) TCP / IP para Internet. -Incluye Antena en el PCB. -Mínimas dimensiones: 21mm x 31mm. -36 pines de conexión. Todas estas características hacen al módulo ideal para integrar conectividad en diferentes ambientes de la electrónica, como por ejemplo: en los sistemas de monitoreo y control, en las industrias, en los sistemas de computación, para realizar dispositivos inalámbricos como teclado, mouse y videocámaras o en los dispositivos electrónicos de consumo.

67


Figura. Vemos el diagrama funcional del módulo MRF24WB0MA Alimentación del módulo El módulo se alimenta desde una simple fuente que entrega 3,3V, ya que internamente posee un regulador de tensión LDO (Low drop-out) que genera las tensiones internas que necesita el núcleo de procesamiento. En este módulo contamos con una entrada directa opcional para una fuente de 1,8V que alimentará el núcleo del dispositivo. Sin embargo, podemos no utilizarlo, gracias al regulador interno que mencionamos anteriormente. En la figura 4 podemos ver el diagrama de conexión del módulo MRF24WB0MA. Otro aspecto para destacar es el bajo consumo que posee el dispositivo, que en modo Sleep consume 250μA y en el modo hibernación llega a los 0,1μA. Esto permite que pueda ser alimentado desde una batería. Cuando transmite en su máxima potencia el núcleo llega a consumir 230mA de la fuente de alimentación.

68


Conexiones de alimentaciรณn del mรณdulo MRF24WB0MA. Comunicaciรณn con el mรณdulo MRF24WB0MA Este mรณdulo se caracteriza por la simplicidad en la programaciรณn, ya que se realiza a travรฉs de APIs (Aplication Programing Interface) y no requiere de un sistema operativo. En el manejo de la conexiรณn, el mรณdulo Wi-Fi controla la capa MAC y las capas de base y se conectan al microcontrolador que realizara el control del modulo (MCU Host) por medio de un puerto SPI. Los microcontroladores de 8/16/32 bits residentes en la placa de desarrollo se encargan del control de la pila de la red de TCP/IP y de correr las aplicaciones del sistema. Actualmente, los mรณdulos MRF24WB0MA incorporan soluciones WI-FI para microcontroladores PIC, porque se han integrado los Drivers Easy - FI (Estos permiten la utilizaciรณn del modulo WI-FI de manera facil) en el stack de TCP/IP de microchip, de forma tal que no hay necesidad de descargar un driver separado de WI-FI. Esta es una de las razones que vuelven tan atractivo la integraciรณn de este mรณdulo en los desarrollos con PIC.

69


El módulo de conectividad WI-FI permite la conexión con los microcontroladores a través de la comunicación SPI. Conexión del módulo por SPI En el módulo MRF24WB0MA hay dos interfaces SPI. Una está dedicada para las comunicaciones SPI en modo esclavo, en donde el dispositivo maestro controlará las acciones del módulo. El segundo es un puerto SPI maestro, donde el módulo interactúa con una memoria externa tipo ROM para obtener un listado de las tareas a realizar. Nosotros utilizaremos la interface SPI esclavo para la comunicación entre el microcontrolador y el módulo. En la figura tenemos un esquemático donde podemos ver la conexión entre los dispositivos. Interfaz SPI esclavo con interrupciones al Host Dijimos que la interfaz SPI esclavo se utiliza para la comunicación del módulo con el Maestro que, es este caso, es el microcontrolador. Pero en este modo de comunicación se utiliza el pin INT_NX como pin de interrupción. Entonces, cuando los datos están disponibles para el maestro, la línea INT_NX del módulo se pone a un nivel bajo. La línea INT_NX se pondrá en uno después de que los datos son transferidos al buffer del maestro. La velocidad máxima del reloj (CLK) es de 25MHz. Control del módulo por el puerto SPI Cuando enviamos los comandos de control al módulo, debemos tener en claro que este módulo trabaja en el formato big endian. Es decir, primero debemos enviar el bit más significativo y, luego, los bits menos significativos, como lo indica la comunicación por SPI. Los datos serán

70


recogidos por el módulo después de que se active la señal de Chip Select correspondiente y la señal de reloj tenga un flanco de subida. Debemos recordar que haciendo uso del pin Chip Select podemos conectar varios dispositivos en un mismo bus de comunicaciones. Esto nos permite tener por ejemplo el modulo de conectividad trabajando en el mismo bus que utiliza una memoria EEPROM. De todas maneras, el microcontrolador PIC18F97J60 cuenta con dos módulos SPI, por si queremos dedicar un puerto de comunicación únicamente para el modulo de conectividad. Cuando operamos con el módulo, nos encontramos con dos regiones o espacios de trabajo que podemos manipular. Una de las regiones es el espacio de acceso a los registros, que nos permite leer y modificar los registros internos del módulo. La otra región está dedicada a la interfaz FIFO (First In, First Out - primero en entrar, primero en salir). Veremos más adelante en detalle como trabajar en estas zonas.

Figura: Formato de las tramas para acceder al espacio de registros del módulo. Acceso al espacio de registros Desde el dispositivo maestro tenemos acceso al espacio de registro del módulo Wi-Fi, para ello, debemos enviar una trama de datos a través de la interfaz SPI y que podemos ver en la figura. Cada trama de datos que enviemos debe mantener el pin chip Select a nivel bajo para habilitar el módulo y la señal de clock funcionando. El primer Byte que enviamos contiene la siguiente información: -F: selecciona cuál es la zona a la que vamos a acceder, si es el espacio del FIFO o el espacio de registros. Si este bit esta en uno (1), le estamos indicando al módulo que el acceso es hacia el espacio FIFO. En cambio, si transmitimos un cero (0) indicamos que vamos a trabajar con el espacio de registros. -R: éste es el bit de lectura/escritura. Si el bit se pone a uno (1), indicamos que la operación es de lectura. En cambio, si colocamos un cero (0), la operación es de escritura. -ADDR0: ésta es la dirección inicial para el envío de datos. Este valor sólo se utiliza cuando accedemos al espacio de registro y es ignorado cuando accedemos al FIFO.

71


-WDATAn: son los bytes de escritura. Estos bytes sólo se utilizan durante la escritura, en la operación de lectura son ignorados. -RDATAn: son los bytes de lectura. Estos datos son siempre válidos, tanto en la lectura como en la escritura. -HOST_INTR: es un registro de interrupción de 8 bits.

Figura: Formato de las tramas de lectura hacia la interfaz FIFO Interfaz FIFO. En los esquemas anteriores vemos el formato de la trama de datos que debemos enviar a la interfaz FIFO para leer o escribir datos. Básicamente, vemos los mismos campos de control que en el acceso a los registros, salvo que en esta ocasión vemos un campo de comandos (FCMD) y el campo RSV al inicio de la trama. El campo FCMD especifica la tarea que queremos realizar con la pila y tiene un tamaño de 3 bits. Los comandos básicos que podemos enviar al módulo se pueden ver en el Código 01: Código 01 -FCMD[2:0] : 0x0 – RFIFO_CMD: comando de lectura 0x1 – WCONT: Continuar con la escritura 0x2 – WSTART0: Comenzar escritura de paquetes 0x3 – WSTART1: Comenzar escritura de paquetes 0x4 – WEND CMD: Fin de la escritura 0x5 – REND CMD: Fin de la lectura.

72


El campo RSV está reservado. Para más información de cómo comunicarse con el módulo, tendremos que consultar en las hojas de datos del dispositivo.

Figura: Formato de las tramas de escritura hacia la interfaz FIFO. Consideraciones importantes de layout Cuando colocamos dispositivos de RF en nuestros desarrollos se deben tomar importantes precauciones a la hora de diseñar e layout. Debido a que los sistemas RF trabajan en altas frecuencias, el diseño de las pistas de las placas influye en el funcionamiento del dispositivo. Este diseño influye en los sistemas RF debido a los efectos de reflexión que pueden existir en una línea y que depende de las discontinuidades y desadaptaciones de la impedancia que puede mostrar hacia el dispositivo. También se debe tener en cuenta que los dispositivos que se encuentran alrededor de un módulo RF pueden ocasionar interferencias en nuestra aplicaciones. Es por eso que debemos asegurarnos de que los dispositivos que emiten un campo magnético como bobinas y transformadores se encuentren alejados una cierta distancia del módulo. Entonces, cuando

73


trabajamos en el diseño de circuitos RF, necesitaremos contar con las herramientas y software adecuados al diseño de estos dispositivos. En el mercado encontramos muchas empresas que se dedican a solucionar los problemas de interferencia. También se debe tener en cuenta que todo equipo que emita radiación electromagnética está regulado por normas para evitar que interfieran con otros dispositivos y proteger al usuario del efecto nocivo de estas radiaciones. Debemos tener en cuenta todas estas consideraciones en el momento de insertar el módulo de conectividad WI-FI, ya que trabaja en zonas de altas frecuencias. Pero además tenemos la ventaja de que el módulo MRF24WB0MA incorpora en su PCB todos los componentes de RF y amplificadores de banda base para establecer la comunicación, lo que nos evita estar lidiando con el diseño tan complicado de la pistas de RF. Sólo debemos tomar algunas consideraciones que nos indica el fabricante para colocar el módulo sobre nuestro PCB.

Patrón de radiación del Modulo Wi-Fi

74


CONFIGURACIÓN DEL STACK TCP/IP PARA WI-FI Ahora que conocemos el módulo Wi-Fi, veremos cómo configurar el Stack de Microchip para agregar conectividad WI-FI a nuestro servidor web. Particularmente, las redes WI-FI han extendido su espacio de uso y hoy es posible encontrarlos en aplicaciones auxiliares como sensores, sistemas de seguridad integrados, electrodomésticos “inteligentes” y una gran variedad de aplicaciones relacionadas con dicho mundo. En estos esfuerzos de agregar conectividad en sus aplicaciones, Microchip ofrece para sus líneas de microcontroladores soluciones WI-FI dentro del Stack TCPIP.

Microchip Configuration Wizard para WI-FI Anteriormente vimos como utilizar esta herramienta para configurar los distintos aspectos y funciones que presenta el Stack de TCP/IP para los microcontroladores PIC. Ahora estudiaremos como configurarlo para que nuestras aplicaciones cuenten con conectividad WI-FI. Comenzamos ejecutando el programa Microchip Configuration Wizard y procedemos a configurar el Stack de TCP/IP. Primero, debemos indicar el directorio donde se encuentra el proyecto general. Si descargamos la librería de soluciones de Microchip, podemos buscar el directorio donde se instala por defecto la carpeta [Demo App]. En esta carpeta encontramos los archivos fuentes y las plantillas de las páginas web que utilizaremos. Las redes WI-FI han extendido su uso y hoy es posible encontrarlos en sistemas de seguridad integrados.

75


Figura: Ejecutamos el Microchip Configuration Wizard para configurar el Stack de TCPIP y lo realizaremos sobre el proyecto TCPIP Demo App.

Debemos seleccionar el transceiver MRF24WB, es decir el modulo WIFI y no el transceiver que trae integrado el PIC. Por lo tanto la ruta debe quedar: C:\Microchip Solutions\TCPIP\Demo App\Configs\TCPIP MRF24WB.h Ademas debemos seleccionar el archivo que contiene las opciones de configuración para WI-FI: C:\Microchip Solutions\TCPIP\Demo App\WF_Config.h A continuación, nos encontramos con la página donde podemos seleccionar las diferentes funciones que soporta el Stack. Allí debemos asegurarnos de que se encuentren seleccionadas las pestañas para las funciones de servidor web y el cliente de E-mail. Luego, en la opción de conectividad inalámbrica (Wireless) seleccionamos el módulo que venimos estudiando, el MRF24WB0MA.

76


Es importante observar que, a diferencia de lo que hacíamos con Ethernet, el microcontrolador sólo se encarga de transportar el paquete en los protocolos de niveles superiores y el módulo WIFI de las capas uno y dos del modelo OSI, es decir, que tiene el manejo de la capa de enlace y de la capa física. En la próxima pantalla de configuración, simplemente seleccionamos [TCP Performant Test], que es la utilidad que nos permite generar “pings” los cuales serán muy útiles a la hora de encontrar errores en las redes.

Asignación de la dirección MAC pregrabada En el siguiente cuadro de dialogo debemos indicar el nombre de host con la cual se identificará el servidor en la red donde se encuentre trabajando. Luego, tenemos que indicar la dirección MAC del dispositivo, recordemos que esta dirección debe ser única para nuestro equipo, si no se podrían generar conflictos en la red. En este aspecto debemos destacar cuáles son las fuentes donde el Stack puede tomar una dirección MAC. Básicamente, existen tres fuentes, una de ellas es la dirección MAC del módulo Wi-Fi, la cual es grabada desde fábrica y el fabricante nos garantiza que esa dirección es única. Recordemos que las direcciones MAC se encuentran organizadas de modo tal de evitar que en dos dispositivos tengan la misma dirección. Es así que la IEEE asigna a los fabricantes los primeros 3 octetos (24 bits) que componen la dirección MAC que son llamados OUI (Organizationally unique identifier).

77


Figura: Asignación de la dirección MAC que utilizará el dispositivo, recuerde que esta debe ser única en la red. La MAC que posee el módulo se la puede ver en la etiqueta que se encuentra en la parte superior de mismo. Cada OUI garantiza al fabricante la posibilidad de registrar 224 dispositivos. Por ejemplo, la OUI de las herramientas de Microchip es 00:04:A3 y es la que se muestra por defecto en el Configuration Wizard. Una segunda fuente desde la cual el Stack TCP/IP puede obtener una dirección MAC es desde una imagen de código programado. La tercera fuente es un valor que se almacena en una memoria EEPROM que contiene una dirección de la IEEE. En tiempo de ejecución, el Stack crea una estructura en memoria RAM donde se almacena la dirección MAC válida que se utilizará en el periodo de sesiones. El código entonces chequea si hay una estructura de datos validos en la EEPROM. Si existe, entonces se utilizan estos valores, ignorando los que se puedan encontrar programados dentro del código en tiempo de compilación. Ahora, si no se encuentran la dirección MAC en EEPROM, se utiliza la dirección que se coloca durante la configuración del Stack, es decir, la que se encuentra especificada en el Configuration Wizard.

78


Si el valor que colocamos en esa zona del cuadro de dialogo es 00:04:A3:00:00:00, le indicamos al Stack que la dirección MAC a utilizar es la que se encuentra grabada en el módulo de conectividad MRF24WB0MA. De lo contrario, se utilizara la MAC que le indiquemos en la configuración del Stack. Prioridad de las direcciones MAC del Stack TCP/IP En términos de prioridad de las direcciones que se utilizarán para el dispositivo, la dirección MAC que se encuentra grabada en la EEPROM, es la que tiene mayor prioridad y ningún otro valor tendrá precedencia sobre ella. La mayoría de los protocolos que trabajan en la capa 2 del modelo OSI usan una de las tres numeraciones manejadas por el IEEE: MAC-48, EUI-48, y EUI-64 las cuales han sido diseñadas para ser identificadores globalmente únicos. No todos los protocolos de comunicación usan direcciones MAC, y no todos los protocolos requieren identificadores globalmente únicos.

Conexión a una red Wi-Fi existente En el siguiente cuadro de dialogo del Configuration Wizard, tenemos las opciones para la conexión a la red inalámbrica. En el campo SSID (Service Set IDentifier) colocamos el nombre de la red a la que se conectará el servidor web. Si ya existe una red, debemos colocar, en ese campo, el nombre que identifica a la red. Este dato está disponible desde el Access Point de la red. Si no tenemos una red pre-existente, colocamos el nombre que queremos darle a esa red. En este lugar, también podemos indicar cuál es la estructura de la red a la cual se va a conectar. Habíamos visto que teníamos básicamente dos estructuras para la conexión, la red Ad-Hoc y la red de infraestructura. El módulo permite la conexión en ambos tipos de redes. Por defecto, el Stack viene configurado para conectarnos a una red de infraestructura. Si en realidad queremos conectarnos a una red Ad-Hoc debemos seleccionar Ad-HOC.

79


Figura: Cuadro de dialogo donde colocaremos el nombre de la red a la que se conectara la aplicación. Canal de radio frecuencia En la misma pantalla podemos seleccionar el canal de radiofrecuencia que utilizara el módulo. En la imagen vemos que por defecto se encuentran seleccionados tres canales: 1, 6 y 11. El módulo Wi-Fi realizará, entonces, el análisis sobre estos canales para detectar actividades de RF. Es importante saber que, a mayor cantidad de canales, más se demorará el módulo en conectarse. Opciones adicionales En la siguiente pantalla (no se muestra en el libro) tenemos opciones para variar la potencia de transmisión y para reportar determinados eventos relacionados con la conexión a la red.

80


Seguridad y encriptación de datos En el cuadro de dialogo “Wireless Security” podemos adicionar seguridad a la conexión que establecerá nuestra aplicación con el Access point. Podemos elegir entre una seguridad WEP o WPA. Seguridad WEP WEP (Wired Equivalent Privacy) es un mecanismo de encriptación para las redes inalámbricas. La mayoría de los Access Point aplican dos tipos de seguridad WEP. Existe la seguridad WEP de 64bits que utiliza una clave de 40 bits (WEP-40) y también podemos encontrarnos con seguridad WEP de 128 bits que, a su vez, utiliza una clave de 104 bits (WEP104). En la forma más básica, las claves WEP son valores hexadecimales de solamente 5 bytes para WEP-40 y de 13 bytes para WEP-104. Algunos Access Point tratan de incrementar el carácter aleatorio de la clave WEP mediante la adición de una capa adicional que convertirá una contraseña ASCII en una clave hexadecimal. El módulo Wi-Fi requerirá una clave hexadecimal, no importa que camino se utilice para generarla. Para habilitar la seguridad WEP entre la placa de aplicación y el Access point, habrá que configurar el Access Point para dicha seguridad, y la configuración del Stack de la placa de desarrollo con las claves WEP correcta.

81


Figura: Configuración para la seguridad WEP donde se definen las claves de 5 bytes. Estas deben ser las mismas que posee el router o Access Point.

Seguridad WPA/WPA2 WPA y WPA2 son modos de seguridad que implementan la especificación 802.11i. Estos modos de seguridad son más seguros que las redes de encriptación WEP. Utiliza el SSID y la contraseña de usuario para generar el PSK (Pre-Shared Key), donde las estaciones y el Access Point tienen previamente una clave compartida. El módulo Wi-Fi tiene dos maneras diferentes de calcular la PSK para su uso en WPA/WPA2. En una de ellas, el usuario final puede programar la clave en hexadecimal de 32 bytes en el código fuente o en el Configuration Wizard. En el otro modo, el módulo Wi-Fi puede calcular la clave hexadecimal de 32 bytes internamente. Debemos tener en cuenta que si el módulo Wi-Fi tiene que calcular la clave, esto puede añadir un tiempo extra de 30 a 45 segundos en el tiempo de conexión, para dar lugar a que el chip calcule el valor.

82


Figura: En la seguridad WPA podemos indicarle el valor de la clave o decirle al mรณdulo que lo calcule. El resto de las opciones son iguales que en el caso de estar utilizando el transceiver interno del PIC. Por ejemplo, cantidad de sockets simultรกneos y ubicaciรณn de la pรกgina web. Recordar compilar el proyecto una vez finalizada la configuraciรณn WI-FI con el asistente.

83


CONFIGURACIÓN DEL ROUTER Una vez que configuramos el Stack TCP/IP de nuestra aplicación, el siguiente paso es configurar el router para poder tener acceso a la red. Para que nuestra aplicación pueda conectarse a la red, debemos configurar el router de tal forma que exista una coherencia con la configuración de la aplicación, de lo contrario, no podremos conectarnos a la red. Es importante aclarar en esta situación particular que los términos Access Point y router las utilizaremos como sinónimos, debido a que estos dos elementos de la red se encuentran combinados en un solo equipo. Si contamos con una red hogareña con WI-FI, Debemos acceder al router y revisar algunas configuraciones que debemos tener en cuenta para establecer la comunicación con nuestra aplicación. Comenzamos accediendo a la página principal del router. Para ello, abrimos el navegador y colocamos la siguiente dirección: http://192.168.1.1. Esta dirección se utiliza por defecto en muchos routers hogareños, ya que se encuentra dentro del rango de direcciones privadas que especifica IP. Si el router del cual dispone no utiliza esta dirección para ingresar a su página principal, debe referirse al manual de usuario del dispositivo. Veremos que se abrirá el asistente de configuración web del router. Luego, colocamos el nombre de usuario y la contraseña. Configuraciones básicas La mayoría de las configuraciones básicas que vienen por defecto en el router nos sirve para nuestros ejemplos. Lo único que vamos a verificar es que el router esté configurado como un servidor DHCP. Para esto vamos al casillero de Local DHCP Server y lo colocamos en Enable para habilitarlo. Con esto vamos a permitir que el router realice la gestión y la asignación de las direcciones IP de todos los equipos que se encuentran conectados en la red. Configuración de la red inalámbrica A continuación, seleccionamos la solapa Wireless para configurar los aspectos de la red inalámbrica. Allí podemos colocar el nombre de la red en la solapa SSID. En este caso, colocamos el nombre mobile, que es el nombre de la red que estamos utilizando actualmente en esots ensayos. Tambien podemos elegir la velocidad de comunicación y el canal RF donde va a trabajar nuestro router. El modo de trabajo de la red lo vamos a dejar en Mixed. Configuración de la seguridad Una vez que configuramos los aspectos generales de la red, procedemos a configurar la seguridad de la misma. Cuando estudiamos la configuración del Snack, sabemos que podemos elegir entre dos modos de seguridad, WEP y WPA. Recordemos que WPA posee más seguridad que WEP, pero queda en nosotros elegir el nivel de seguridad que queremos para nuestras aplicaciones. En este caso, vamos a seleccionar la seguridad WEP. Para esto, tenemos que seleccionar la solapa Wireless Security y, en el modo de seguridad, debemos seleccionar WEP.

84


En el tipo de autenticación, lo dejamos en sistema abierto (Open System). Luego, seleccionamos qué tipo de seguridad WEP queremos. Habíamos visto que la seguridad WEP puede tener una encriptación de 64 bits, con claves de 40 bits o una encriptación de 128 bits con una clave de 124 bits. En este caso, vamos a seleccionar la seguridad WEP de 64 bits. En la parte inferior de la página de configuración de seguridad del router, vemos las claves generadas por el router para la autenticación de los equipos que se conectan a la red. Estas claves tienen un tamaño de 5 bytes. Vemos por la configuración del router, que la clave por defecto es la que se encuentra en el indice 1. Esa clave debe coincidir con la que se encuentra en el indice cero de la configuración del Stack de TCP/IP. Esta diferencia en el índice se debe a que en el router se comienza a contar desde el 1 (uno) y, en el Stack, a partir del 0 (cero). De todas maneras a lo que debemos prestar atención es que la clave que se encuentra escrita en el primer renglón sea igual a la que se configuro en el Stack.

Configuraciones de la parte de seguridad de la red inalámbrica, donde elegimos una seguridad WEP.

85


CONTROL REMOTO DE UN MOTOR A TRAVÉS DE WI-FI Vamos a ejercitarnos con los temas vistos en este capítulo realizando la práctica paso a paso del control un motor de manera remota por medio de una red WI-FI. Esto nos da la posibilidad de que el operador monitoree el estado de la planta desde una PC remota, que se puede encontrar en otra habitación, en otro edificio o en otra ciudad gracias a Internet. El control de un motor a distancia tiene muchas aplicaciones en el ambiente industrial, debido a que posee infinidades de aplicaciones. El circuito está compuesto por el PIC conectado al módulo MRF24WB0MA a través de la conexión SPI. Además, los pines de control que accionarán el relé que manejará el encendido del motor. Empezamos configurando el Stack de TCP/IP para conectarlo a la red WI-FI. En el directorio seleccionamos la carpeta [Demo App] y vamos a utilizar las funcionalidades de web server y la conexión mediante el módulo que ya estudiamos.

86


Luego, en cuadro de dirección MAC, dejamos la dirección que viene por defecto, para indicar que se utilizará la que viene grabada en el módulo. A continuación, debemos colocar el SSID de la red donde trabaja, en este caso colocamos mobile.

Así como colocamos el nombre de la red en el Stack, en el router debemos tener una red con el mismo SSID. Esto es importante, porque si los SSID son diferentes, no se tendra comunicación alguna entre el modulo y el router. A continuación vemos la captura de la pantalla del router.

87


Vamos a colocar seguridad en nuestra red inalรกmbrica. Por eso, en el router nos dirigimos hacia la zona de seguridad inalรกmbrica y seleccionamos Seguridad WEP en el formato de 64 bits. Esto nos entregarรก las claves de autenticaciรณn del router.

88


La clave que obtenemos del router la copiaremos en el Stack de TCP/IP. Si colocamos el 铆ndice en cero, vamos a copiar la clave que se encuentra en el primer rengl贸n del router en el primer rengl贸n que tenemos de la configuraci贸n del Stack, con esto nos aseguramos de mantener una cierta seguridad en la red.

En este caso colocamos en el asistente la misma clave que proporciona el router.

89


Este es el formulario Web para el control del relé al cual se conecta el motor. Vamos a utilizar lo que aprendimos del método GET para el manejo del relé. Para ello vamos a utilizar el mismo formulario web del capítulo anterior con las mismas funciones Callback para la excitación de los pines que controlan la bobina del relay.

Luego de compilar el proyecto, grabamos el código en el PIC y probamos el accionamiento del relé. Esto debe hacer funcionar el motor. Podemos colocar algunas aspas para poder apreciar el movimiento.

90


Módulos de entrenamiento Un desarrollador que tiene conocimientos de programación en microcontroladores PIC, puede desarrollar aplicaciones con conectividad WI-FI de manera rápida, aprovechando las ventajas que ofrecen los módulos de entrenamiento. Estos módulos nos permiten generar desarrollos de manera mucho más rápida, porque nos dan la posibilidad de ensayar y depurar código con un hardware que sabemos que funciona. Además contamos con la documentación necesaria para realizar aplicaciones con conectividad de manera eficiente. Placa de entrenamiento MCE WebServer WI-FI Esta placa de entrenamiento incorpora en el mismo PCB un microcontrolador PIC18F97J60 y el módulo de conectividad MRF24WB0MA. Esto lo hace ideal para ejercitar los temas que vimos hasta el momento.

MCE WebServer WI-FI

91


Además, la placa cuenta con varios periféricos para poder realizar un sistema integral de monitoreo y control a distancia y ofrece una interfaz de usuario con LCD incorporado. Posee una memoria EEPROM 25LC1024 externa para alojar una página Web y un MAC Address Chip que viene con una dirección MAC pregrabada. Esto nos asegura de que la aplicación cuenta con una dirección MAC única. En cuanto al software utiliza el Stack TCP/IP corriendo en el PIC, ya preparado para conectarse a una red WI-FI. Otra opción es el módulo de producción MCE Stick Ethernet que tiene los componentes mínimos necesarios para establecer una conexión. En este caso el pinout es compatible con un protoboard.

MCE MicroStick Ethernet La placa MCE Stick Ethernet no posee conexión WI-FI Para descargar el manual de usuario u obtener más información por favor visite el catálogo online: www.mcelectronics.com.ar/desarrollos

92


93


APÉNDICE CLOUD COMPUTING CON PIC32®

94


95


CLOUD COMPUTING CON PIC32 Ahora que conocemos como implementar un webserver con PIC, seria interesante tener la posibilidad de subir a un servidor remoto la información recolectada por diferentes sensores. Esto nos va a permitir tener datos históricos y graficar las mediciones. Vamos a trabajar con scripts en PHP, una base de datos MySQL y el stack TCP IP de Microchip. Si bien podríamos realizar este ejercicio completo con un PIC de 8 bits, en este caso vamos a emplear un PIC32 para demostrar la portabilidad del Stack a través de las diferentes plataformas de Microchip. Veamos de que manera podríamos conectar un PIC a Ethernet:

Conexión de un PIC18F97J60 (8 bits) con transeiver integrado. Este esquema es el que utilizamos en el capitulo anterior. En este caso tenemos una limitación de velocidad de 10Mbits debido al transeiver interno. Además no se realiza ningún tipo de encriptación por hardware. Los pares TX y RX deben rutearse como pares diferenciales.

143


En este otro ejemplo estamos empleando un PIC de 8 bits con el transeiver externo ENC28J60 de Microchip. En este caso la velocidad también es de 10 Mbits.

Conexión de un PIC18F4620 + ENC28J60 Sin embargo, veamos ahora la conexión de un PIC32. En este caso estamos utilizando los nuevos transeiver de Microchip, como el ENC624J600 con velocidades de hasta 100Mbits. Este transeiver soporta encriptación de datos por hardware y posee una dirección MAC pregrabada.

Conexión del PIC32 por SPI al transeiver. Debe conectarlo en modo paralelo para llegar a 100Mbits.

97


PLACA DE DESARROLLO

Vamos a utilizar la placa MCE WebServer Plus que incluye un PIC32MX360F512 y un ENC624J600 conectado en modo paralelo. Naturalmente este ejemplo de cloud computing se puede realizar en redes cableadas o a través de WI-FI.

Placa MCE WebServer Plus con PIC32. En este caso se puede conectar también por WI-FI G.

SOFTWARE DEL PIC En primer lugar vamos a programar el stack TCP IP para que, al presionar un pulsador, envie los datos a un script PHP alojado en un servidor remoto. Esto lo hacemos habilitando la función GenericTCPClient.c.

98


Hay que modificar los campos BYTE ServerName y RemoteURL para que apunten a nuestro script PHP. Notar que estamos cargando los datos a través del método GET. En este caso la variable es temp y le asignamos el valor 10 en forma estática, pero naturalmente podría ser la lectura del conversor AD. static BYTE ServerName[] ="www.mcelectronics.com.ar"; static ROM BYTE RemoteURL[] = "/script.php?temp=10";

SCRIPT PHP Debemos escribir un script que tome los datos enviados por el webserver a través del método GET y los inserte en una base de datos MySQL. En este caso utilizamos phpMyAdmin para crear la base de datos “mceweb_test” en el servidor. La tabla dentro de la base de datos se llama web y el campo a escribir temp. El script es el siguiente:

<?php $dbhost = 'localhost'; $dbuser = 'mceweb'; $dbpass = '123456s'; // NOTA: Reemplace password por el password de su cuenta de hosting $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Ocurrió un error al conectarse al servidor mysql'); $dbname = 'mceweb_test'; mysql_select_db($dbname); $sql = 'INSERT INTO web'.'(temp) '.'VALUES ('.$_GET["temp"].')'; //Tabla web y registro temp. mysql_select_db('mceweb_test'); $retval = mysql_query( $sql, $conn ); mysql_close($conn); echo $_GET["temp"]; ?> Puede encontrar este script en el DVD que acompaña la obra.

99


BASE DE DATOS

Finalmente vamos a acceder a la tabla “web” dentro de la base de datos “mceweb_test” para visualizar los datos almacenados luego de presionar varias veces el pulsador. Recuerde que cada vez que presione el pulsador se enviará un nuevo valor de temperatura. Utilizamos phpMyAdmin para visualizar el contenido:

Lo interesante es que se agregó el time stamp del servidor cada vez que se almacenaba un nuevo valor de temperatura en la tabla con lo que es posible crear este gráfico de temperatura en función del tiempo.

Puede encontrar una clase completa sobre Ethernet con PIC32 en el DVD que acompaña la obra.

100


101


102


Se termino de imprimir en Enero de 2014 en Rolta, (4865-7337), Ecuador 334, Buenos Aires. www.rolta.com.ar

103


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.