miércoles, 25 de junio de 2014

Balantza Elektronikoa

Proiektu hau kaxak eramateko gurdi batean instalatzeko balantza elektriko bat egitea zen, baina azkenean, proiektu hau egiteko sentsore egokia lortu ezin izan denez balantza arrunt bat egitea erabaki da. Balantza honek LCD bat dauka balioak agertzeko eta menu batean pisu arrunta eta akumulatuaren artean aukeratu ahal izango da. Menu hori kontrolatzeko hiru botoi egongo dira, OK, BERA eta ATZERA.


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:

Hasieran simulazioak,  sentsorearen gainean behatzarekin indarra eginaz lortu ziren, sentsorearen azalera baina handiagoak ziren elementuen pisua ez baitzuen detektazen. Horretarako zilindro batek sentsorearen arean presiona zezan, kaxa moduko bat egin zen, azalera handiagoko elementuak jartzeko.


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