Entradas y Salidas de un PIC controladas por Internet
Basado en un proyecto de Wichit Sirichote


Si bien ya hay circuitos microcontrolados que se conectan a tarjetas de red y no requieren sistemas anfitriones (host's) este simple proyecto permitirá conocer e iniciarse en el maravilloso mundo del telecontrol a través de internet. Es posible controlar dos LED's, un relé (y este a su vez accionar lo que queramos) y leer el estado de dos líneas digitales de entrada.

Como se ve en el diagrama el sistema básicamente se compone de un servidor conectado a internet el cual interpreta la información proveniente de la red y, de ser necesario, actúa enviando y recibiendo datos desde y hacia el PICmicro.

A través de una dirección IP el usuario puede acceder al programa EZServer el cual es un simple pero eficiente servidor para plataformas windows especialmente pensado para aplicaciones microcontroladas. Este programa interactúa con el PICmicro permitiéndole recibir datos desde el usuario remoto y enviándole datos hacia él. De esta forma, cuando un usuario se conecta al server y el acceso es permitido (logea) queda automáticamente conectado con el PICmicro por medio del puerto serie. De esta forma es posible controlar por internet las entradas del PICmicro y actuar por la misma vía sobre sus salidas. Parte del programa del PICmicro incluye datos que el usuario recibe en la ubicación remota, incluyendo una pequeña guía de comandos posibles a ejecutar. 

El circuito electrónico es bastante rudimentario, se limita a los componentes típicos de alimentación, los del oscilador a cuarzo, la resistencia que evita el reseteo del micro y algunos pines dispuestos como entradas con sus pull-ups y otros pines dispuestos como salidas a diodos LED. Hay, también, un pin de salida conectado a un transistor que actua en configuración corte/ saturación el cual permite accionar un relé. Este, si bien podría haberse omitido o ser otro LED mas, se dispuso para que, por ejemplo, pueda conectarse una lámpara de 220v o algo potente y ver un efecto mas real que el causado por un LED. La tensión de entrada es de 12V, así como la tensión de la bobina del relé. El resto del circuito se alimenta con 5V los cuales los provee el regulador integrado 7805. El mismo no es necesario que se monte sobre disipador ya que la corriente insumida por este circuito es mínima. Los tres bornes a la derecha del circuito representan los pines de interconexión con el puerto serie del PC. En el caso de un conector de 9 pines el terminal de recepción (Rx) corresponde al 2, el terminal de transmisión (Tx) corresponde al 3 y el terminal de masa (Gnd) corresponde al 5. De usar un conector de 25 pines el terminal de recepción corresponde al 3, el de transmisión al 2 y el de masa al 7. La comunicación con la PC se efectúa a 9600 8N1. Gracias a los diodos que cada PIC dispone sobre sus puertos es posible improvisar una interface RS232 funcional con tan solo un par de resistencias. El consumo en corriente de este circuito debe calcularse como 100mA + corriente de la bobina del relé.

En la foto se observa el circuito montado sobre un entrenador para PICmicro de Cekit.

Con respecto al software anfitrión (host) usaremos el Easy-Server (ó EZServer) del cual solo disponemos una versión previa al lanzamiento (beta) pero que funciona muy bien. El mismo no requiere instalación en Windows y, por ende, cuando se lo desee desinstalar bastará con borrar el ejecutable y su archivo de configuración. 


Descargar el programa (181KB)

Todo se limita a esta ventana de monitor donde se reflejan los accesos al servidor. Por omisión el programa captura el primer puerto serie disponible. Pero este puede ser cambiado por el usuario remoto ingresando "close" para cerrar el puerto actual y "com2" para abrir ahora el puerto serie COM 2. De querer abrir el puerto 3 o 4 colocar el número donde el 2. Cabe aclarar que las comillas no deben ingresarse. Todo lo que el usuario remoto haga será visto en el monitor del servidor, tal como se ve en la captura de arriba. Como dato se da la IP del visitante y la duración de la conexión ni bien se cierre. Este servidor solo permite un usuario por vez, de manera que si hay algún usuario conectado, el segundo que entre recibirá un mensaje de error donde se le indicará porque no puede acceder en ese momento. De los dos botones que este programa tiene el segundo (el del signo de pregunta) es para ver quien lo hizo y el primero (el del engranaje) es para acceder a la configuración del servidor. Los únicos datos posibles a cambiar son: la contraseña (que por omisión es "clave", sin las comillas), el puerto que ocupará el servidor dentro del TCP/IP y el mensaje de bienvenida que reciban los usuarios al conectarse al sistema. 

En tanto, del lado remoto el usuario accede por medio del terminal TELNET, el cual todo windows trae. Ir a inicio, seleccionar Ejecutar y en la paleta ingresar TELNET y darle al enter. En la barra de menú seleccionar Conectar y del despliegue elegir Sistema remoto... Aparecerá una paleta como la de arriba. Donde dice Nombre del host debe ingresarse la dirección IP de la computadora que corre el servidor o bien algun seguidor de IP en cuyo caso la dirección será como la que se observa. Donde dice puerto colocar el valor establecido en los parámetros del servidor (por omisión es 8888 y el 99.9% de las veces funciona muy bien con ese puerto). Y el terminal no es crítico dado que aquí no se usan caracteres especiales ni nada por ese estilo. Luego darle a Conectar para acceder al servidor.

Adicionalmente, si se desea ver lo que se tipea en el TELNET es posible ir al menú de Preferencias dentro de Terminal y activar la casilla que dice "Eco local". De esta forma podrá verse la tecla pulsada.

Una vez conectado, el servidor envía el mensaje de bienvenida (el cual puede modificarse a gusto en el programa EZServer) y solicita que se ingrese la clave. Si no se activo el eco local la clave no se verá y solo aparecerá OK! como se ve arriba si la clave ingresada es correcta. Caso contrario se desconectará del servidor. Recordar darle enter luego de ingresar la password. Luego del OK! el servidor pone al TELNET en conexión con el PICmicro. Ahora estaremos actuando sobre las salidas y recibiendo información del mismo. El programa cargado en el microcontrolador incluye una pequeña ayuda de opciones a la cual se accede tipeando el signo de pregunta "?" y enter. De esta forma aparecerá un menú como el que se ve en el spot de arriba. 

Aquí hacemos una aclaración: del apurón las opciones de encender y apagar LED's están invertidas. Esto quiere decir que 1 apaga el LED 1, 2 lo enciende. 3 Apaga el LED 2, cuatro lo enciende.

También es posible comprobar el funcionamiento del circuito microcontrolado sin necesitar de internet.

Para ello el Hyperterminal de Windows o cualquier otro programa terminal que nos permita trabajar directamente sobre el puerto de comunicaciones será suficiente. En este caso, como no hay conexión remota a un servidor el mensaje de bienvenida y la password no se verán.

En tanto el programa a cargar en el microcontrolador está escrito en C y compilado usando el programa PCW de la empresa CCS. Como el mismo es una demo solo permite compilar para micros PIC16F63 pero esto no es impedimento, ya que por mas que seleccionemos ese micro como el set de instrucciones no cambia demasiado no representa problema alguno. 

// remote2.c
// Basado en un programa original de Wichit Sirichote
// Circuito para experimentar con Easy-Server
// PIC16F84 conectado a Easy-Server via puerto serie
// Parametros de comunicacion: 9600 8n1
// Puertos del microcontrolador
// RA0 LED1 activa a nivel bajo
// RA1 LED2 activa a nivel bajo
// RB0 K1 Rele, activa a nivel alto
// RB1 sw1 Interruptor 1, estado alto = abierto
// RB2 sw2 Igual que sw1
// RB6 TxD Salida de datos puerto serie
// RB5 RxD Entrada de datos puerto serie

#include <REMOTE.H>

unsigned int command;

#define LED1 PIN_A0
#define LED2 PIN_A1
#define K1 PIN_B0
#define sw1 PIN_B1
#define sw2 PIN_B2

print_help(){
  puts("Presiona Para...");
  puts(" 1 LED 1 On");
  puts(" 2 LED 1 Off");
  puts(" 3 LED 2 On");
  puts(" 4 LED 2 Off");
  puts(" 5 RELE On");
  puts(" 6 RELE Off");
  puts(" 7 Sensor 1");
  puts(" 8 Sensor 2");
  puts(" ? Ayuda");
  }

send_ok(){
  putc(7); // Hace sonar el terminal remoto
  printf("\n\rComando %c Ok\n\r",command);
  }

service1(){
  output_low(LED1);
  send_ok();
  }

service2(){
  output_high(LED1);
  send_ok();
  }

service3(){
  output_low(LED2);
  send_ok();
  }

service4(){
  output_high(LED2);
  send_ok();
  }

service5(){
  output_high(K1);
  send_ok();
  }

service6(){
  output_low(K1);
  send_ok();
  }

main() {
  setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
  output_high(LED1);
  output_high(LED2);
  output_low(K1);

  while(1){
    command = getc();
    switch(command){
      case 13: printf(" PICmicro server\n\n\r");
      break;
      case '?': print_help();
      break;
      case '1': service1();
      break;
      case '2': service2();
      break;
      case '3': service3();
      break;
      case '4': service4();
      break;
      case '5': service5();
      break;
      case '6': service6();
      break;
      case '7': printf("\n\rSensor 1 = %c\n\r",input(sw1)+0x30);
      break;
      case '8': printf("\n\rSensor 2 = %c\n\r",input(sw2)+0x30);
      break;
      }
    }
  }

Adicionalmente este código requiere de una librería con funciones:

#device PIC16C63
#use delay(clock=4000000)
#nolist
/////////////////////////////// I/O definitions for INPUT() and OUTPUT_xxx()
#define PIN_A0 40
#define PIN_A1 41
#define PIN_A2 42
#define PIN_A3 43
#define PIN_A4 44
#use fixed_io(A_OUTPUTS=PIN_A0,PIN_A1,PIN_A2,PIN_A3,PIN_A4)
#byte port_A=5

#define PIN_B0 48
#define PIN_B1 49
#define PIN_B2 50
#define PIN_B3 51
#define PIN_B4 52
#define PIN_B5 53
#define PIN_B6 54
#define PIN_B7 55
#use fixed_io(B_OUTPUTS=PIN_B0,PIN_B6)
#byte port_B=6

#use rs232(baud=9600 ,xmit=PIN_B6,rcv=PIN_B5,invert)

/////////////////////////////// Useful defines
#define FALSE 0
#define TRUE 1

#define BYTE int
#define BOOLEAN short int

#define getc getch
#define getchar getch
#define puts(s) {printf(s); putchar(13); putchar(10);}
#define putc putchar

/////////////////////////////// Constants used for RESTART_CAUSE()
#define WDT_FROM_SLEEP 0
#define WDT_TIMEOUT 8
#define MCLR_FROM_SLEEP 16
#define NORMAL_POWER_UP 24
/////////////////////////////// Constants used for SETUP_COUNTERS()
#define RTCC_INTERNAL 0
#define RTCC_EXT_L_TO_H 32
#define RTCC_EXT_H_TO_L 48
#define RTCC_DIV_2 0
#define RTCC_DIV_4 1
#define RTCC_DIV_8 2
#define RTCC_DIV_16 3
#define RTCC_DIV_32 4
#define RTCC_DIV_64 5
#define RTCC_DIV_128 6
#define RTCC_DIV_256 7
#define WDT_18MS 8
#define WDT_36MS 9
#define WDT_72MS 10
#define WDT_144MS 11
#define WDT_288MS 12
#define WDT_576MS 13
#define WDT_1152MS 14
#define WDT_2304MS 15
#define L_TO_H 0x40
#define H_TO_L 0

#define RTCC_ZERO 0x0B20 // Used for ENABLE/DISABLE INTERRUPTS
#define RB_CHANGE 0x0B08 // Used for ENABLE/DISABLE INTERRUPTS
#define EXT_INT 0x0B10 // Used for ENABLE/DISABLE INTERRUPTS

#define GLOBAL 0x0B80 // Used for ENABLE/DISABLE INTERRUPTS
#list

Bajar ambos archivos y el compilado en hexa listo para subir al micro...

Hasta aquí el comienzo y prototipo funcional de este proyecto. Cualquier sugerencia, idea o lo que sea será bien recibida a fin de lograr mejorarlo y optimizarlo. Las próximas metas a lograr con este proyecto son:

Como en todos los casos, para colaborar con este proyecto escribir a: proyectos@pablin.com.ar colocando en la línea de asunto "Proyecto Control PIC por internet".

Ultima actualización: 22 de Octubre de 2001