You are on page 1of 10

AC1 JP1 1 2 12Vac D4 1N4007 D5 1N4007 AC2 AC1 AC2

Vcc 13.5V D1 1N4007 D2 1N4007

+5V

+5V

Vin

Vout

VIN D3 1N4007 R2 1K

VOUT

C1 2200uf (25V)

U1 LM317

U2 LM7805

GND

R1 470

Adj

C2 220uf

D6 PWR

R3 20K

R4 1K

LED R6 470 D7 LED1

Buzzer R7 100

LS1

Buzzer

+5V

+5V

+5V

+5V

R5 470 R7 1K D5 LED 1 SW1 Up C1 1uf 2 1 SW2 Down C2 1uf 2 R8 1K

R6 470

D6 LED

Sw_Up

Sw_Down

+5V

+5V

+5V

+5V

R15 LDR R17 470 R19 470 Light_Sensor_L R18 470

R16 LDR Light_Sensor_R R20 470


1

D8 LED

R21 22K

1
2

D9 LED

R22 22K

+5V R23 1.5K

+5V

+5V

DIS

VCC

7 R24 15K 6 2 C4 102

C3 3 104

LS1

Q THR TR U1 NE555

Tx
GND

CV

/************************************** White Line Follower ==================================

***************************************/ //#define ICD_DEBUG uns8 vblEncPulseHigh; uns16 vblEncValue; uns16 uns8 uns8 uns16 uns16 MSec; Sec; Min; DelaySec; DelayMSec;

#include "intr.h" #pragma codepage 1 #include "FuncLib.h" #pragma codepage 0 #include "init.h" uns16 ADC_Read(uns8 ChannelNo); void Read_Switches(); void FunContinuousSetMode(); void FunDistanceSetMode(); //****** Main Function *********** void main() { myDiv(vblCurrDistance , 100 , &b, &r); RobotDistanceBuff[3] = Convert_Des2Asc(b); myDiv(r , 10 , &b, &r); RobotDistanceBuff[4] = Convert_Des2Asc(b); RobotDistanceBuff[5] = Convert_Des2Asc(r); nop(); LCD_Out(1, 0, "MODE : Dist Set"); LCD_Out(2, 0, "SET:"); LCD_Chr_Cp(RobotDistanceBuff[0]); LCD_Chr_Cp(RobotDistanceBuff[1]); LCD_Chr_Cp('.'); LCD_Chr_Cp(RobotDistanceBuff[2]); LCD_Chr_Cp(','); nop(); FunDistanceSetMode(); //State = ReadSwitches; break;

} } } } //************* Dis Set Mode Fuction ******************** void FunDistanceSetMode() { uns16 tmpADCvalue; nop(); tmpADCvalue = ADC_Read(0); vblLDRvalue_L = tmpADCvalue; nop(); tmpADCvalue = ADC_Read(1); vblLDRvalue_R = tmpADCvalue; nop(); if((vblLDRvalue_L > 200)&&(vblLDRvalue_R < 200)) { Rly_Motor_L = 1; Rly_Motor_R = 0; DelayMSec = 100; while(DelayMSec != 0); State = ContinuousSetMode; } else if((vblLDRvalue_L < 200)&&(vblLDRvalue_R > 200)) { Rly_Motor_L = 0; Rly_Motor_R = 1; DelayMSec = 100; while(DelayMSec != 0); State = ContinuousSetMode; } else if((vblLDRvalue_L > 200)&&(vblLDRvalue_R > 200)) { Rly_Motor_L = 1; Rly_Motor_R = 1; DelayMSec = 100; while(DelayMSec != 0); State = ContinuousSetMode; } else // No white line found { myDiv(r , 10 , &b, &r); RobotDistanceBuff[4] = Convert_Des2Asc(b); RobotDistanceBuff[5] = Convert_Des2Asc(r); nop();

LCD_Out(2, 0, "SET:"); LCD_Chr_Cp(RobotDistanceBuff[0]); LCD_Chr_Cp(RobotDistanceBuff[1]); LCD_Chr_Cp('.'); LCD_Chr_Cp(RobotDistanceBuff[2]); LCD_Chr_Cp(','); LCD_Chr_Cp('C'); LCD_Chr_Cp('U'); LCD_Chr_Cp(':'); LCD_Chr_Cp(RobotDistanceBuff[3]); LCD_Chr_Cp(RobotDistanceBuff[4]); LCD_Chr_Cp('.'); LCD_Chr_Cp(RobotDistanceBuff[5]); nop(); if(vblSetDistance <= vblCurrDistance) { Rly_Motor_L = 0; Rly_Motor_R = 0; Buzzer = 1; LCD_Cmd(_LCD_CLEAR); LCD_Out(1, 0, "Robot Stop"); DelaySec = 5; while(DelaySec != 0); Buzzer = 0; State = ReadSwitches; } else if((Rly_Motor_L == 0)&&(Rly_Motor_R == 0)) { State = ReadSwitches; nop(); } else nop(); tmpADCvalue = ADC_Read(0); vblLDRvalue_L = tmpADCvalue; nop(); tmpADCvalue = ADC_Read(1); vblLDRvalue_R = tmpADCvalue; nop(); if(( )) { Rly_Motor_L = 1; Rly_Motor_R = 1; DelayMSec = 100;

while(DelayMSec != 0); State = ContinuousSetMode; } else { // No white line found Rly_Motor_L = 0; Rly_Motor_R = 0; Buzzer = 1; LCD_Cmd(_LCD_CLEAR); LCD_Out(1, 0, "Whiteline Over"); DelaySec = 5; while(DelaySec != 0); Buzzer = 0; State = ReadSwitches; nop(); } vblCurrDistance = vblEncValue / 5; myDiv(vblCurrDistance , 100 , &b, &r); RobotDistanceBuff[3] = Convert_Des2Asc(b); myDiv( LCD_Cmd(_LCD_CLEAR); LCD_Out(1, 0, "Obstacle Detected"); while(Obstacle_Sensor == 0); LCD_Cmd(_LCD_CLEAR); LCD_Out(1, 0, "Obstacle Clear"); DelaySec = 5; while(DelaySec != 0); LCD_Out(1, 0, "MODE: Cons Set "); } } //--------------------------------void Read_Switches() { nop(); State = ReadSwitches; if((Sw_Up == 0)&&(Sw_Down == 0)) {

// Change mode

} if((Sw_Up == 0)&&(Sw_Down == 1)) // Up switch { DelaySec = 3; while((DelaySec != 0)&&(Sw_Up == 0)); if(DelaySec == 0) // Robot go {

vblCurrDistance = 0; vblEncValue = 0; if(vblRobotMode == 0) State = ContinuousSetMode; else State = DistanceSetMode; nop(); } else { if(vblSetDistance < 1000) vblSetDistance++; } LCD_Out(1, 0, "Robot Start "); while(Sw_Up == 0); } if((Sw_Up == 1)&&(Sw_Down == 0)) // Down switch { DelaySec = 3; while((DelaySec != 0)&&(Sw_Down == 0)); if(DelaySec == 0) // Mode change { if(vblRobotMode == 0) vblRobotMode = 1; else vblRobotMode = 0; nop(); } else { if(vblSetDistance > 0) vblSetDistance--; } if(vblRobotMode == 1) LCD_Out(1, 0, "MODE: Dist Set "); else LCD_Out(1, 0, "MODE: Cons Set "); while(Sw_Down == 0); } if(vblRobotMode == 1) { myDiv(r , 10 , &b, &r); RobotDistanceBuff[1] = Convert_Des2Asc(b); RobotDistanceBuff[2] = Convert_Des2Asc(r); nop(); myDiv(vblCurrDistance , 100 , &b, &r); RobotDistanceBuff[3] = Convert_Des2Asc(b); myDiv(r , 10 , &b, &r); RobotDistanceBuff[4] = Convert_Des2Asc(b); RobotDistanceBuff[5] = Convert_Des2Asc(r); nop(); LCD_Out(2, 0, "SET:"); LCD_Chr_Cp(RobotDistanceBuff[0]);

LCD_Chr_Cp(RobotDistanceBuff[1]); LCD_Chr_Cp('.'); LCD_Chr_Cp(RobotDistanceBuff[2]); LCD_Chr_Cp(','); LCD_Chr_Cp('C'); LCD_Chr_Cp('U'); LCD_Chr_Cp(':'); LCD_Chr_Cp(RobotDistanceBuff[3]); LCD_Chr_Cp(RobotDistanceBuff[4]); LCD_Chr_Cp('.'); LCD_Chr_Cp(RobotDistanceBuff[5]); nop(); } else { LCD_Out(1, 0, "MODE: Cons Set "); myDiv(vblCurrDistance , 100 , &b, &r); RobotDistanceBuff[3] = Convert_Des2Asc(b); myDiv(r , 10 , &b, &r); RobotDistanceBuff[4] = Convert_Des2Asc(b); RobotDistanceBuff[5] = Convert_Des2Asc(r); nop(); LCD_Out(2, 0, " ");

LCD_Chr_Cp('C'); LCD_Chr_Cp('U'); LCD_Chr_Cp(':'); LCD_Chr_Cp(RobotDistanceBuff[3]); LCD_Chr_Cp(RobotDistanceBuff[4]); LCD_Chr_Cp('.'); LCD_Chr_Cp(RobotDistanceBuff[5]); nop(); } }

//------- Read Analog Input ----------------------uns16 ADC_Read(uns8 ChannelNo) { uns8 tmpNoOfSample; GIE PEIE = 1; = 1;

//-----Other init---------MSec = 0; Sec = 0; vblRobotMode = 1; vblEncPulseHigh = 0; vblEncValue = 0; State = ReadSwitches; } // CODE : Above 2048 words (PCLATH is saved) // RAM : Located in bank 0 and 1 (no mapping between bank 0 and 1) #define int_save_registers \ #pragma char s1_save = 0x20 \ #pragma char s1_savX = 0xA0 \ #pragma rambank 0 \ char s2, s3; \ #pragma update_RP 0 \ s1_save = W; \ W = swap( STATUS); \ RP0 = 0; \ #pragma update_RP 1 \ s2 = W; \ s3 = PCLATH; \ PCLATH = 0; #define int_restore_registers \ PCLATH = s3; \ W = swap( s2); \ #pragma update_RP 0 \ STATUS = W; \ s1_save = swap( s1_save); \ W = swap( s1_save); \ #pragma update_RP 1 uns16 Counter; #pragma origin 0x04 //interrupt vector address

interrupt serverX(void) { int_save_registers char sv_FSR = FSR; // save FSR if required if(TMR1IF==1) { TMR1IF=0;

TMR1ON = 0; TMR1L = t1l; TMR1H = t1h; TMR1ON = 1; if(DelayMSec != 0) DelayMSec--; if(vblEncPulseHigh == 0) // pulse off time { if(Encoder_Sensor == 1) { vblEncPulseHigh = 1; if(vblEncValue < 65000) vblEncValue++; } } else { if(Encoder_Sensor == 0) { vblEncPulseHigh = 0; } } if(MSec < 999) { MSec++; } else { MSec =0; if(DelaySec != 0) DelaySec--; if(Sec < 60) Sec++; else // After 1 Minute { Sec = 0; if(Min < 60) Min++; else { Min = 0; } } } nop(); } FSR = sv_FSR; // restore FSR if saved int_restore_registers }

You might also like