Вы находитесь на странице: 1из 9

DEBER DE MICROCONTROLADORES.

AUTOR: George Raúl Lucas Loor

PUERTA DE GARAJE AUTOMÁTICA UTILIZANDO EL PIC16F887

Este proyecto responde a la necesidad de una puerta de garaje automática en el


domicilio para suplir la que se encuentra actualmente en mi vivienda ya que esta
debe ser abierta manualmente y obliga al conductor a salir del vehículo en el
caso de que no se encuentre nadie más en la vivienda.

Para esto se pretende automatizar el sistema de apertura y cierre del garaje


mediante el uso de un microcontrolador (PIC16F887), este llevará un conteo
interno de un reloj en segundos el cual está basado en interrupciones con el
TMR0.

Se estimó previamente el tiempo necesario con el motor de 24[v] y el sistema de


engranaje para saber el tiempo que demora en abrir y cerrar la puerta
completamente. Dicho tiempo es de 45 [s] (En el código se configuró a 10
segundos de apertura y 10 de cierre para apreciarlo de mejor manera).
El contador de segundos dará la orden de activar el motor e indicador para los
tiempos requeridos, así como un botón de reset en caso de emergencia. En la
memoria EEPROM se almacena el tiempo que transcurre desde que se empieza
a operar para que en el caso de un reinicio, se empiece a contar desde el
segundo que se guardó previamente y así abrir y/o cerrar la puerta
correctamente.
Lista de Materiales
ELEMENTO CANTIDAD PRECIO
PIC16F887 1 $5

MOTOR DC 24 [v] 1 $20

L239D 1 $1

INTERRUPTORES 2 $2

ENGRANAJES 2 $5
CABLES 2 $4

TOTAL $37

Esquemático en Proteus.

Al energizar el circuito, tenemos un motor detenido y un led indicador en verde.


Para empezar a operar, se debe presionar el botón de operación.

Ilustración 1 - Estado Inicial


Al presionar el botón de operación el indicador de apertura de la puerta se activa,
y el motor empieza a girar en el sentido definido como positivo durante 10
segundos que dura la apertura de la puerta.

Ilustración 2 - Estado de operación (Apertura)

Luego de 10 segundos, el indicador cambia a modo de cierre, y el motor se polariza


negativamente permitiendo así el cierre de la puerta durante otros 10 segundos.

Ilustración 3 - Estado de operación (Cierre)


CÓDIGO.
/*GEORGE RAUL LUCAS LOOR

PROYECTO DE AUTOMATIZACION DE PUERTA DE GARAJE*/

int btn;

int btn1;

int i=0;

int estado;

long offset=0;

//Se declaran variables para Timer0 y manipulación

unsigned long millis_count=0;

unsigned long time1=0,tanterior=0, tneto,treset;

//Se configura el Timer0

void InitTimer0(){

OPTION_REG = 0x85;

TMR0 = 100;

INTCON = 0xA0;

//Se configura la funcion de interrupcion

void Interrupt(){

if (TMR0IF_bit){

TMR0IF_bit = 0;

TMR0 = 100;

millis_count++; //Contador ascendente

}
unsigned long millis()

return(millis_count);//Se retorna el valor del contador

void main() {

InitTimer0();

//Intento de configuracion de puertos en asm (salia error al compilar)

/*asm{

banksel TRISB

clrf TRISB

banksel TRISD

clrf TRISD

banksel ANSEL

clrf ANSEL

clrf ANSELH

banksel PORTB

clrf PORTB

banksel PORTD

clrf PORTD }*/

//Se configuran los puertos

ANSEL=0;

ANSELH=0;

TRISA=1;

TRISB=0;

TRISD=0;
PORTA=0;

PORTB=0;

PORTD=0;

PORTC=0;

//Leer el valor de la posicion 2 de la EEPROM y lo guarda en una variable

treset = EEPROM_Read(0x02);

//INICIO DE PROGRAMA

while (1){

PORTD=0;

offset=millis();

//Indicador de estado inicial del programa en ensamblador

asm{

MOVLW 0b00000001 ; mueve 0xAA al registro W

MOVWF PORTB ; pasa el valor al puerto B

//Se pregunta por el estado de botonera de operacion

estado=PORTA.RA0;

if (estado==0){

btn=1;

while (btn==1){

//Indicador de estado de operacion del programa

asm{

MOVLW 0b00000000 ; mueve 0xAA al registro W

MOVWF PORTB ; pasa el valor al puerto B

//Se calcula la diferencia entre el tiempo inicial y el actual

time1=millis()-offset;

//Se calcular el tiempo neto desde que se empezó a operar el motor

tneto=time1-tanterior;

//Guarda ese valor en la memoria EEPROM

EEPROM_Write(0x02,tneto);
//Activa el motor para abrir la puerta de garaje

PORTD.RD0=1;

PORTD.RD1=0;

//Indicador de apartura de puerta de garaje

PORTD.RD3=1;

PORTD.RD4=0;

/*La condicion corresponde al tiempo que se demora en abrir la puerta

Dicho tiempo es estimado en base al motor que se usa.

Se lo configuro a 10 segundos de apertura para que se pueda

observar de mejor manera en la simulacion*/

if (tneto>1000){

//Indicador de estado de cierre de la puerta del garaje

asm{

MOVLW 0b00010000 ; mueve 0xAA al registro W

MOVWF PORTD ; pasa el valor al puerto B

//Activa el motor en sentido contrario para cerrar la puerta del garaje

asm{

MOVLW 0b00010010 ; mueve 0xAA al registro W

MOVWF PORTD ; pasa el valor al puerto B

//PORTD.RD0=0;

//PORTD.RD1=1;

//Se configura 10 segundos de retardo para que cierre la puerta

delay_ms(10000);

/*Una vez concluido el proceso de apertura y cierre en 25 segundos

se regresa al bucle principal del programa donde se puede volver

a accionar la puerta si asi se lo desea

(dicho tiempo es para facilitar la visualización en el simulador

y no tener que esperar mas tiempo hasta ver los cambios)*/

break;
}

}}

Вам также может понравиться