Hola!
Quería compartir con ustedes un pequeño proyecto que hice.
Me encargaron un trabajo que requiere de varios circuitos impresos (PCB), unos 50 mas o menos, así que decidí armar algunas herramientas que me ayuden en la construcción.
Como sabrán para hacer un PCB hay que imprimir la imagen en toner, pasarla a la placa virgen y luego sumergir la misma en Cloruro Férrico durante unos 10 minutos. Para que la cosa salga mejor es conveniente poner el Cloruro a Baño Maria y mantener la plaqueta en movimiento.
Acá es donde nace mi proyecto. Se trata de un pequeño sistema que mantiene la plaqueta en movimiento por 10 minutos y pasado ese tiempo la retira del oxidante y avisa mediante un Beep que el proceso termino.
Algunos de los elementos que utilicé:
...y quedo mas o menos asi...
El sistema de engranajes que se ve en esta imagen fue modificado pero la dejo igual porq se ve bien lo demas.
Acá se ve mejor, los engranajes y motor son de lectoras en desuso. Arriba a la izquierda hay un micro Switch que se encarga de informarle al PIC donde esta la bandeja.
Detalle de la bandeja.
Todo el sistema esta controlado por un PIC, yo use un 18F2550 porque tenia uno a mano, pero el sistema esta pensado para un 16F84, solo hay que modificar un par de lineas de código y sale andando.
El esquema electrónico seria el siguiente:
Se debe colocar un pulsador en paralelo con el micro swith (RB0).
El modo de operación seria el siguiente:
La bandeja espera en la parte superior, se coloca la plaqueta y se presiona el pulsador (RB0)
ahora la bandeja descenderá y cuando llegue al final del recorrido el display mostrara una cuenta de 10 minutos.
Mientras tanto cada dos pulsos del MS se invertirá el sentido de giro del motor.
Una vez transcurridos los 10 minutos, el PIC da la orden de llevar la bandeja de nuevo a la parte superior (fuera del oxidante) y emite un Beep.
El Beep esta representado en el esquema por el LED verde.
El codigo fue escrito en C, comparto para que puedan usarlo y/o dar opiniones
//-T!------T!--------T!--------T!--------T!-----T!-------T!----------T!------T!-------T!-------T!-------T!------T!-----T!-------T!------T!--------
#include <p18f2550.h>
#include <delays.h>
#pragma config FOSC = XT_XT,FCMEN = OFF,IESO = OFF, CPUDIV = OSC1_PLL2
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF
#pragma config CPB = OFF,CPD = OFF
#pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF
#pragma config WRTB = OFF,WRTC = OFF,WRTD = OFF
#pragma config EBTR0 = OFF,EBTR1 = OFF,EBTR2 = OFF
#pragma config EBTRB = OFF
unsigned char i,k,e,v, medio,Unidad,Decena,Centena, Movimiento;
const rom unsigned char Display7Seg[10]={0x80, 0xF2, 0x48, 0x60, 0x32, 0x24, 0x04, 0xB0, 0x00, 0x20};
const rom unsigned char SentidoGiro[3]={0x00, 0x01, 0x02};
unsigned short j;
void Visualizacion (void);
void Beep (void);
void Retirar (void);
void ISRRB4_RB7(void);
//Creamos una nueva seccion de codigo a partir de la direccion 0x08.-
#pragma code Interrupcion = 0X0008
void VectorInterrupcion(void){
_asm goto ISRRB4_RB7 _endasm
}
#pragma code // Cerramos seccion.-
//*************************************************************************+
void main(void){
Centena = 9;
Decena = 0;
Unidad = 0;
Movimiento =0;
v=1;
ADCON1=0x0F;//Borrar para PIC16F84
TRISA = 0x00;
TRISB = 0x01;
LATA=0x3C;
LATB = 0xFD;
while(PORTBbits.RB0==0){//Espero q se precione el pulzador
}
while(PORTBbits.RB0==1){//Espero q se suelte el pulzador
}
LATB = 0x7F;
Movimiento = 2; //hago descender la bandeja
Delay10KTCYx(100);
for(k=1;k<=4;++k)¨{
while(PORTBbits.RB0==0){
LATA = 0x3D;
}
while(PORTBbits.RB0==1){
LATA = 0x3D;
}
Delay10KTCYx(100);
}
LATB = 0xEF;
while(PORTBbits.RB0==0){
LATA = 0x3D;
}
Movimiento = 2;
Delay1KTCYx(5);
INTCON = 0X90; //habilito interrupciones por cambio de estado en RB0
//------- bucle infinito------------
while (1){
//for(k=1;k<=3;++k){
Visualizacion();
//}
++Unidad;
if(Unidad==10){
Unidad=0;
++Decena;
if(Decena==6){
Decena=0;
++Centena;
}
}
if ((Unidad == 9)&&(Decena==5)&&(Centena==9)){
Retirar();
}
}
}
// ---------- SUB RUTINAS ----------
//-----------------------------------------
void Visualizacion (void){
for(i=1;i<=20;++i){
LATA= SentidoGiro[Movimiento];
LATB=Display7Seg[Unidad];
LATAbits.LATA2=1;
Delay1KTCYx(5);
LATAbits.LATA2=0;
LATB=Display7Seg[Decena];
LATAbits.LATA3=1;
Delay1KTCYx(5);
LATAbits.LATA3=0;
LATB=Display7Seg[Centena];//Modificar para PIC 16F84
LATAbits.LATA5=1;
Delay1KTCYx(5);
LATAbits.LATA5=0;
/*LATB =0xFF;
LATA= SentidoGiro[Movimiento];
Delay1KTCYx(10);
LATA=0x00;
*/
}
}
//------------------------------
void Beep (void){
for(e=1;e<=3;++e){
for(k=1;k<=10;++k){
for(i=1;i<=20;++i){
PORTCbits.RC1=1;
Delay10TCYx(20);
PORTCbits.RC1=0;
Delay10TCYx(15);
}
}
Delay10TCYx(225);
}
}
// Rutina de Interrupcion.-
#pragma interrupt ISRRB4_RB7
void ISRRB4_RB7(void){
if(INTCONbits.INT0IF==1){
INTCONbits.INT0IF = 0; //Borramos bandera
INTCON = 0X00;
}
if(v==2){
v=1;
if (Movimiento==1){
Movimiento = 2;
}else{
Movimiento =1;
}
}else{
v=2;
}
Visualizacion();
INTCON = 0X90;
}
void Retirar (void){
INTCON = 0X00;
LATB = 0xEF;
LATA = 0x02;
while(PORTBbits.RB0==0){//Espero q se precione el pulzador
}
while(PORTBbits.RB0==1){//Espero q se suelte el pulzador
}
LATB = 0x7F;
Delay10KTCYx(255);
Delay10KTCYx(200);
LATA = 0x3C;
Beep();
while(1){
}
}
//-T!------T!--------T!--------T!--------T!-----T!-------T!----------T!------T!-------T!-------T!-------T!------T!-----T!-------T!------T!--------
Por ultimo les dejo un video para que vean mejor como anda.
Aclaro que en el vídeo la cuenta empieza en 9 minutos y los segundos van mas rápido simplemente para no tener que esperar.
Otros post:
Eso es todo, ojala que les interese.
Espero comentarios!!