Pisua detektatzeko sentsorea, indar sentsore bat da, flexiforce sentsorea hain zuzen ere.
Sentsore honek erresistentzia bariable baten moduan funtzionatzen du. Indarrik aplikatu gabe bere erresistentzia oso altua da eta indarra aplikatzean erresistentzia jaitsi egiten da. Zirkuitu honetan, programtau ahal izateko, mikrokontralagailuak tentsio aldaketak detektatzen ditu gainean aplikatzen zaion indarraren edota pisuaren arabera, kasu honetan bezala. Hau egin ahal izateko pic mikrokontrolagailua erabili da, pic c programaren bitartez programatuz. Sentsoreak bidalitako tentsioak pic-aren bitartez LCD-an kg-tan azaltzeko, konbertsio analogiko bat egin da, while batzuen bitartez botoi bakoitza sakatuta dagoenean zer egin behar duen esanaz.
Balantza elektronikoa egiteko erabili den programa:
#include <16F88.h>
#device ADC=10 //Conversor ADC/ de 10 bits de resolución
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES PUT //Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOIESO //Internal External Switch Over mode disabled
#use delay(clock=4000000)
#include "lcd.c"
#define OK PIN_A1
#define BERA PIN_A2
#define ATZERA PIN_A3
int16 resultado; //Variable para el resultado de la conversión AD
/*****************************************************************************
Funcion principal
*****************************************************************************/
void main(void)
{
float pisua,total=0;
// int8 m1_lerro=1, m2_lerro=1;
lcd_init(); //Inicia la pantalla LCD
//Se activa el ADC y se selecciona el canal RA0/AN0. Frecuencia de trabajo Fosc/32
setup_adc(adc_clock_internal); //Ajusta frecuencia de muestreo del ADC ¡¡OJO!!
setup_adc_ports(sAN0);//VSS_VDD|sAN0); //RA0 entrada analógica
set_adc_channel(0); //Selección del canal 0 (RA0)
while(TRUE)
{
printf(lcd_putc,"\f%cPisu arrunta",0x7e); //Visualiza el texto fijo del
printf(lcd_putc,"\n Akumulutua"); //Visualiza el texto fijo del
while((input(OK)==1)&&(input(BERA)==1)); //itxaron OK edo BERA sakatu arte
delay_ms(20); //Erreboteak ekiditzeko
if(input(OK)==0)
{
pisua=0;
while((input(OK)==0)); //Itxaron OK askatu arte
delay_ms(20); //Erreboteak ekiditzeko
printf(lcd_putc,"\fPisua: %.2f kg ",pisua);
printf(lcd_putc,"\nSakatu OK"); //Visualiza el texto fijo del
while((input(OK)==1)); //itxaron OK sakatu arte
delay_ms(20); //Erreboteak ekiditzeko
resultado=read_adc(); //Inicia la conversión y lee el resultado
pisua=resultado*(11.339/1025.0)-0.9; //Calculamos la tension
lcd_gotoxy(7,1);
printf(lcd_putc,"%.2f ",pisua); //Visualiza el resultado
if(pisua<0)
printf(lcd_putc,"\fPisua: 0.00 kg ");
printf(lcd_putc,"\nSakatu ATZERA"); //Visualiza el texto fijo del
while(input(ATZERA)==1); //itxaron ATZERA sakatu arte
continue;
}
else if(input(BERA)==0) //
{
total=0,pisua=0;
printf(lcd_putc,"\f Pisu arrunta"); //Visualiza el texto fijo del
printf(lcd_putc,"\n%cAkumulutua",0x7e); //Visualiza el texto fijo del
while(input(OK)==1); //itxaron OK sakatu arte
delay_ms(20); //Erreboteak ekiditzeko
printf(lcd_putc,"\fPisua: %.2f kg",pisua);
printf(lcd_putc,"\nTotal: %.2f kg",total); //Visualiza el texto fijo del
while((input(OK)==0)); //Itxaron OK askatu arte
delay_ms(20); //Erreboteak ekiditzeko
while(TRUE)
{
while((input(OK)==1)&&(input(ATZERA)==1)); //itxaron OK sakatu arte
delay_ms(20); //Erreboteak ekiditzeko
if(input(ATZERA)==0)
break; //while-etik atera
resultado=read_adc(); //Inicia la conversión y lee el resultado
pisua=resultado*(11.339/1024.0)-0.9;//Calculamos la tension
lcd_gotoxy(7,1);
printf(lcd_putc,"%.2f ",pisua); //Visualiza el resultado
if(pisua<0)
printf(lcd_putc,"\fPisua: 0.00 kg ");
printf(lcd_putc,"\nSakatu ATZERA"); //Visualiza el texto fijo del
total+=pisua;
lcd_gotoxy(7,2);
printf(lcd_putc,"%.2f ",total); //Visualiza el resultado
while((input(OK)==0)); //Itxaron OK askatu arte
delay_ms(20); //Erreboteak ekiditzeko
} //fin de while total
}//fin de if BERA
}//fin de while 1
}//fin de main
Lcd-an agertzen de menua hauxe da, ISIS-en simulatuta:
Lehenengo menuan pisu arrunta eta akumulatuaren artean aukeratu ahal izango da. OK botoia sakatu ezgero ondorengo pantaila azalduko litzateke.
OK botoia berriro sakatzean une horretan snetsoreak detektatzen duen pisua emango du.
Eta orduan ATZERA botoia sakatuta hasierako menura itzultzen da.
Hasierako menuan pisu arrunta soilik kalkulatu nahi ez bada BERA botoiaren bidez akumulatua aukeratu ahal izango da.
OK sakatzean une horretan detektatzen duen pisua eta akumulatua kalkulatzeko pantaila azaltzen da.
Berriro OK sakatzean une horretan detektatzen duen pisua eta akumulatua emango ditu.
ISIS-eko simulazioaren ondoren protoboard batean simulatu da proiektua:
Programazioa ondo zegoela ikustean PCB-aren txanda da. Lehendabizi ISIS-en bitartez amaierako plakan egongo diren elementu guztiak kokatuz.
Eta ondoren ARES-ekin PCB-a diseinatuz.
Hori egin ondoren circuitcam- en soldatu beharreko puntu guztietan hustuketa egiten da, zirkuitu - laburrik ez egoteko. Bertan LMD artxiboa sortu eta prest dago LPKF- ra pasatzeko. LPKF-aren bitartez egiten da plaka.
Erabilitako materiala:
- 16F88 Pic-a
- 7805-a
- 16X2 LCD-a
- 100nF-ko kondentsadorea
- 10k-ko 3 erresistentzia
- 4k7ko erresistentzia
- Konektoreak(2 pin 3 pin 4 pin eta 10 pin)
- Kableak
- Estainua
Plaka amaieran elementu guztiak kokatuta:
Proiektuko fitxategiak deskargatzeko sakatu hemen.
EGILEAK: Xabier Izagirre eta Eneko Fuentes
No hay comentarios:
Publicar un comentario