jueves, 1 de marzo de 2012

Sigue Lineas

Este ingenio electrónico es capaz de seguir una linea negra de determinadas proporciones sobre un campo blanco de forma autonoma, sin control externo. Los sensores que lo equipan y que ven la linea, determinan por medio de la programación del PIC 16F876A qué movimientos deben realizar los motores para alcanzar su objetivo. En función de la programación puede seguir una ruta lineal con curvas múltiples o un circuito determinado con cruces a ambos lados.
















/***********************************************************************
sabe diferenciar mas o menos las marcas de direccion pero hay situaciones como la T que no sabe ni lo que tiene que hacer PIN_B6 eten 2 a 0 en ON a 1 en OFF PIN_B7 eten 1 a 0 en ON a 1 en OFF PIN_A5 Enable MD martxa/paro PIN_C0 Enable MI martxa/paro PIN_C1 PWM2 para el motor IZDA PIN_C2 PWM1 para el motor DCHA PIN_C7 MI zentzua kontrolatzeko 0 aurrera, 1 atzera PIN_C6 MD zentzua kontrolatzeko 0 aurrera, 1 atzera *********************************************************************/
#include <16f876A.h>
#use delay(clock=20000000)
#fuses NOPROTECT,NOWDT,HS,NOPUT,NOPROTECT,BROWNOUT
#fuses NOCPD,NOWRT,NODEBUG

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)

#define vau1 40
#define vau2 50
#define vau3 60
#define vau4 70
#define vau5 80
#define vau6 90
#define vau7 100
#define vau8 110
#define vau9 120

#define vat1 85
#define vat2 75
#define vat3 65
#define vat4 55
#define vat5 45
#define vat6 35
#define vat7 25
#define vat8 15
#define vat9 05

#define S1 input(PIN_B0)
#define S2 input(PIN_B1)
#define S3 input(PIN_B2)
#define S4 input(PIN_B3)
#define S5 input(PIN_B4)
#define S6 input(PIN_B5)
#define S7 input(PIN_B6)
#define S8 input(PIN_B7)

 #define MD_ON output_high(PIN_C0) //Motorra I martxan
#define MD_OFF output_low(PIN_C0) //Motorra I geldirik
#define MI_ON output_high(PIN_A5) //Motorra D martxan
#define MI_OFF output_low(PIN_A5) //Motorra D geldirik
#define MI_AUR output_low(PIN_C7) //Motorra ezkerra aurrera
#define MI_ATZ output_high(PIN_C7) //Motorra ezkerra atzera
#define MD_AUR output_low(PIN_C6) //Motorra eskubia aurrera
#define MD_ATZ output_high(PIN_C6) //Motorra eskubia atzera

 #define N 1
#define B 0

 int8 duty;

/*******************************************************************
 Aurrera
*********************************************************************/
void aurrera(void)
{
 MI_AUR; set_pwm2_duty(duty);
 MD_AUR; set_pwm1_duty(duty);
}

/*******************************************************************
 giro Ezkerrera (suave)
 ********************************************************************/
void gir_ezk(void)
{
 MD_AUR; set_pwm1_duty(vau7);
 MI_AUR; set_pwm2_duty(0);            // MI paro rapido (0,0)
 }

/*******************************************************************
 giro Eskubira (suave)
*********************************************************************/
void gir_esk(void)
{
 MI_AUR; set_pwm2_duty(vau7);
 MD_AUR; set_pwm1_duty(0);         // MD paro rapido (0,0)
}

 /*******************************************************************
 Errotazio Ezkerrera (brusco)
 ********************************************************************/
void rot_ezk(void)
{
 MD_AUR; MI_ATZ;
 set_pwm1_duty(vau9);
 set_pwm2_duty(vat7);
}

 /*******************************************************************
 Errotazioa Eskubira (brusco)
 *********************************************************************/
void rot_esk(void)
{
 MD_ATZ; MI_AUR;
 set_pwm1_duty(vat7);
 set_pwm2_duty(vau9);
}

/*******************************************************************
 Paroa
*********************************************************************/
void paro(void)
{
 MD_AUR; set_pwm1_duty(0);            // MD paro rapido (0,0)
 MI_AUR; set_pwm2_duty(0);             // MI paro rapido (0,0)
}

 /*******************************************************************
 Eskubira
*********************************************************************/
 void main()
{
 int1 ezes=0; //hasi eskubitik
 // int1 s0,s1,s2,s3,s4,s5,s6,s7,s8,s9;

 setup_adc_ports(NO_ANALOGS);
 setup_timer_2(T2_DIV_BY_16,124,1);
 setup_ccp1(CCP_PWM);
 setup_ccp2(CCP_PWM);

 set_tris_a(0b00011111); //A5 irteera
 set_tris_b(0XFF);
 set_tris_c(0);

 MD_ON;
MI_ON;
 paro();

 switch(input_a()&0b00000011)
 {
 case 0x00 : duty= 40;
 break;
 case 0x01 : duty= 65;
 break;
 case 0x02 : duty= 80;
 break;
 case 0x03 : duty= 120;
 break;
}

while(ezes==0) //dena eskubitik
{
 if((S1==N)&&(S2==N)&&(S4==B))
 {
 aurrera();
 }
 else if((S1==N)&&(S2==B)&&(S4==B)) //rectifica a la izq
 {
 gir_ezk();
 }
 else if((S1==B)&&(S2==N)&&(S4==B)) //rectifica a a dcha
 {
 gir_esk();
 }
 }
}//main bukaera

2 comentarios: