SCADA y Microcontrolador 16F877A
- Jebus
- 18 sept 2015
- 5 Min. de lectura
Bueno, el día de hoy se creará un proyecto en VS2010 y Python 3.X (más adelante), veamos como funcionará.
Descripcion del Programa:
- El programa mostrará 8 imágenes de led encendidos y 8 de led apagados sobre puestos.
- El programa tendrá 6 botones de acción los cuales generaran diferentes secuencias las cuales deberan ser ejecutadas en el microcontrolador 16F877A en este caso y en el programa en tiempo de ejecución.
- Como el microcontrolador 16F877A debe hacer las secuencias que el programa le indique, este debe tener configurada la opción RS232 y deberá ser configurado el puerto Serial (COM X) del computador.
- Debe tener por último un cuadro de texto (ComboBox) en el cual el usuario pueda seleccionar tres diferentes velocidades (100mS, 500mS y 1S).
Hardware Simulado:
El hardware utilizado en esta práctica será simulado en Proteus, aqui podremos ver si el microcontrolador está recibiendo datos y si está ejecutando la secuencia seleccionada, la lista de componentes es apenas el microcontrolador 16F877A, unas salidas lógicas conectadas al puerto B y el Terminal virtual de Proteus, adjunto una imágen para que puedan ver como quedan las conexiones de esta práctica.
Enlace del archivo de simulación y el archivo en CCS para el pic:

*Imagen de elaboración propia
Describamos como se hizo en términos generales (VS2010):
Generamos un nuevo proyecto, en el cual se agregaron las 16 imágenes correspondientes a los Led's de encendido y apagado, añadimos el cuadro de texto (ComboBox) y los botones de comando para tener la parte visual lista.
Al cargar el Formulario haremos visibles los PictureBox que contienen las imágenes de los Led's apagados y abriremos el puerto Serial (COM X) para la comunicación con el PIC.
Se añadieron 6 temporizadores (timers) los cuales habilitaran y desahilitaran el metodo Visible para las imágenes (PictureBox) cada 500mS, esta es la segunda opción de tiempo, esta parte es extensa ya que hay que cambiar el estado de cada imágen y por más que busque por internet como hacer esto con un código corto y no encontre decidí hacerlo por el camino largo, si queremos ver un led encendido lo que haremos en deshabilitar 7 PictureBox de los Led's encendidos, habilitar los 7 PictureBox de los Led's apagados y habilitar el Led encendido que queremos "ver".
Cada botón de comando habilitara su temporizador respectivo y desactivará el propio botón, esto es fundamental ya que en sistemas SCADA, si cambiaramos el Led por un Motor, podriamos dañarlo al enviarle señales de iniciar motor varias veces, además por último enviará por el puerto serial la señal para que el microcontrolador comience a trabajar.
Por último pero no menos importante esta el cuadro de texto (ComboBox) el cual tendrá solo tres opciones para elegir, el funcionamiento es básico ya que si estamos en una secuencia y decidimos cambiar la velocidad de la misma, el cuadro de texto detendrá la secuencia, enviará el comando al PIC para que re-ajuste el tiempo de las secuencias, habilitará todos los botones y mostrará un cuadro de dialogo el cual nos informara que debemos seleccionar de nuevo la secuencia para ver el cambio de tiempo.
Enlace de descarga (VS2010).*

*Imagen de elaboración propia
Nuevo!!!!
Describamos como se hizo en terminos generales (Python y Tkinter):
Ahora vamos a describir como se hizo este programa en Python 3.X y Tkinter:
La primera parte del programa consiste en implementar las secuencias visuales en el programa, me he valido de dos técnicas para mostrar las secuencias de iluminación, la primera técnica que se usó fue la de crear una lista de 8 posiciones con valores booleanos que van cambiando a medida que se encienden los led, esto para controlar cuando deben encender cada uno de los leds, esta técnica se uso solo para las dos primeras secuencias, la segunda técnica consiste simplemente en mostrar todos los led apagados e ir cambiandolos por los led encendidos a medida que se aumenta un contador para controlar la misma, se creó una ventana sencilla a la cual se le agregaron los botones de acción y el cuadro de texto combinado, los botones de acción llaman a una función llamada estadoX (donde X es la secuencia que se selecciona), y esta función habilita el temporizador, envia la señal del tiempo y de la secuencia al Microcontrolador.
Para enviar los datos al microcontrolador se ha usado la libreria PYSERIAL en su última version compatible con Python 3.X, esta versión es más complicada de manejar que la versión para Python 2.7 ya que la sintaxis que se debe usar para escribir en el puerto es:
Python 2.7: "s.write("String")"
Python 3.X: "s.write("string".encode())"
Esto significa que debe ser codificada para que la libreria PYSERIAL pueda enviarla correctamente ya que hace la conversión a ASCII automaticamente, de no ser asi el dato que se envia al pic no será interpretable generando así anomalias en el funcionamiento.
La linea de código "time.sleep(0.5)" se usa para que el programa no haga nada por 50ms y pueda enviar luego el siguiente carácter, esto debe ser así o si no el Microcontrolador no será capaz de interpretar el carácter enviado, en el codigo fuente que se adjunta hay comentarios que describen mejor el funcionamiento del mismo.
Lo que falta por hacer:
Si bien el programa funciona, hay ciertos aspectos que se deben corregir para conseguir un resultado mucho más cercano al obtenido con VS2010, listemos estos pequeños BUG's:
- Al cerrar el programa se debe Reiniciar físicamente el Microcontrolador ya que no se cierra el puerto antes de salir, se intentó crear una función que cerrara el puerto y saliera de la ventana pero los resultados no fueron satisfactorios.
- Debido a las limitaciones de Tkinter, solo se pueden agregar imagenes PPC o gif, lo que reduce la calidad de las mismas y en términos generales hace que el programa se vea Gráficamente inferior (comparado con VS2010).
- Se esta investigando en Programación Orientada a Objetos para implementar las ventanas como objetos y en agregar modularidad con este lengiaje ya que es bastante potente en este sentido.
- Algo en que hago enfásis es si tiene una mejora que pueda implementarse, porfavor contáctese conmigo, este blog ha sido creado para mostrar resultados y adicional poder adquirir nuevos en caso de que surjan.
Descarga del código Fuente:

*Imagen de elaboración propia
Descripción del Hardware:
Para la parte de hardware, usaremos los siguientes elementos:
- Conversor USB-TTL (3u$ Aproximadamente).
- Microcontrolador Pic 16F877A(3u$ Aproximadamente).
- 8 Led's con sus resistencias.
- Cristal de 20Mhz y dos condensadores de 22pF.
- Resistencia Pull-Up para el reset del micro
- Cable Hembra-Macho para conectar las salidas del conversor al PIC.
No necesitamos más para esta práctica.
Acontinuación dejo un video de funcionamiento del proyecto:
*Actualizado 12/10/15
Comments