//junction detection and maze solving algorithm void move_forward(void){ OCR5AL = SPEED_FAST_L; OCR5BL = SPEED_FAST_R; unsigned char count_node = 0; ShaftCountLeft = 0; motion_set(Forward); flag=0; do{ Initialise_White_Line_Sensors(); Average_Seven_White_Line_Sensors(); follow(); if (((Left_white_line < THRESHOLD_WL_L1) && (Center_white_line > THRESHOLD_WL_C1) && (Right_white_line > THRESHOLD_WL_R1))|((Left_white_line > THRESHOLD_WL_L1) && (Center_white_line > THRESHOLD_WL_C1) && (Right_white_line > THRESHOLD_WL_R1))) { move_forward_mm(COUNT_MM_20); if ((Left_white_line > THRESHOLD_WL_L1) && (Center_white_line > THRESHOLD_WL_C1) && (Right_white_line > THRESHOLD_WL_R1)) { PORTC=0x08; _delay_ms(500); PORTC=0x00; rotate_right_end(); move_forward_mm(COUNT_MM_80_F); move_forward_mm(COUNT_MM_80_F); move_forward_mm(COUNT_MM_80_F); flag=1; break; } else { if (tag==0) { move_reverse_mm(COUNT_MM_20); PORTJ=0x00; rotate_right(); j=j+1; a=d[j]; d[j]=1; d[j]=d[j]+a; if (d[j]==4) { d[j]=0; j=j-2; break; } else { break; } } else if (tag==1) { move_reverse_mm(COUNT_MM_20); PORTJ=0x00; rotate_right(); j=j+1; a=d[j]; d[j]=1; d[j]=d[j]+a; k=k+1; b=d1[k]; d1[k]=1; d1[k]=d1[k]+b; if (((d[j]==4) && (d1[k]!=4))) { d[j]=0; j=j-2; break; } else if (((d[j]==4) && (d1[k]==4))) { d1[k]=0; k=k-2; d[j]=0; j=j-2; break; } else { break; } } } } else if ((Left_white_line > THRESHOLD_WL_L1) && (Center_white_line > THRESHOLD_WL_C1) && (Right_white_line < THRESHOLD_WL_R1)) { move_forward_mm(COUNT_MM_40); if ((Left_white_line < THRESHOLD_WL_L1) && (Center_white_line > THRESHOLD_WL_C1) && (Right_white_line < THRESHOLD_WL_R1)) { PORTJ=0xFF; if (tag==0) { j=j+1; a=d[j]; d[j]=2; d[j]=d[j]+a; if (d[j]==4) { d[j]=0; j=j-2; break; } else { break; } } else if (tag==1) { j=j+1; a=d[j]; d[j]=2; d[j]=d[j]+a; k=k+1; b=d1[k]; d1[k]=2; d1[k]=d1[k]+b; if (((d[j]==4) && (d1[k]!=4))) { d[j]=0; j=j-2; break; } else if (((d[j]==4) && (d1[k]==4))) { d1[k]=0; k=k-2; d[j]=0; j=j-2; break; } else { break; } } } else if ((Left_white_line < THRESHOLD_WL_L1) && (Center_white_line < THRESHOLD_WL_C1) && (Right_white_line < THRESHOLD_WL_R1)) { OCR5AL = SPEED_SLOW_L; OCR5BL = SPEED_SLOW_R; motion_set(Right); angle_rotate_right(); if ((Center_white_line > THRESHOLD_WL_C1)) { break; } else { OCR5AL = SPEED_SLOW_L; OCR5BL = SPEED_SLOW_R; motion_set(Left); angle_rotate_left(); if ((Left_white_line < THRESHOLD_WL_L1) && (Center_white_line < THRESHOLD_WL_C1) && (Right_white_line < THRESHOLD_WL_R1)) { if (tag==0) { move_reverse_mm(COUNT_MM_30); rotate_left(); j=j+1; a=d[j]; d[j]=3; d[j]=d[j]+a; if (d[j]==4) { d[j]=0; j=j-2; break; } else { break; } } else if (tag==1) { move_reverse_mm(COUNT_MM_30); rotate_left(); j=j+1; a=d[j]; d[j]=3; d[j]=d[j]+a; k=k+1; b=d1[k]; d1[k]=3; d1[k]=d1[k]+b; if (((d[j]==4) && (d1[k]!=4))) { d[j]=0; j=j-2; break; } else if (((d[j]==4) && (d1[k]==4))) { d1[k]=0; k=k-2; d[j]=0; j=j-2; break; } else { break; } } } else { break; } } } } else if((Left_white_line < THRESHOLD_WL_L1) && (Center_white_line < THRESHOLD_WL_C1) && (Right_white_line < THRESHOLD_WL_R1)){ OCR5AL = SPEED_SLOW_L; OCR5BL = SPEED_SLOW_R; TCCR4B |= (1 << CS42) | (1 << CS40); if (time>10) { move_forward_mm(COUNT_MM_30); if((Left_white_line < THRESHOLD_WL_L1) && (Center_white_line < THRESHOLD_WL_C1) && (Right_white_line < THRESHOLD_WL_R1)) { u_turn(); j--; k--; time=0; TCCR4B |= (0 << CS42) | (0 << CS40); break; } else if((Left_white_line > THRESHOLD_WL_L1) || (Center_white_line > THRESHOLD_WL_C1) || (Right_white_line > THRESHOLD_WL_R1)) { u_turn(); j--; if (tag==1) { k--; } PORTJ=0xFF; tag=1; time=0; TCCR4B |= (0 << CS42) | (0 << CS40); break; } } else { motion_set(Right); angle_rotate_right(); if ((Center_white_line > THRESHOLD_WL_C1)/*|(Right_white_line > THRESHOLD_WL_R1)*/) { time=0; TCCR4B |= (0 << CS42) | (0 << CS40); break; } else { OCR5AL = SPEED_SLOW_L; OCR5BL = SPEED_SLOW_R; motion_set(Left); angle_rotate_left(); break; } } } }while(1); motion_set(Stop); }
int main(void) { /*TCCR1A=0xA1; TCCR1B=0x05; OCR1A=150; //Left Motor PWM OCR1B=150; //Right Motor PWM DDRD=0x30; //Declaring PD4,PD5 as output*/ DDRA=0X00; //Sensor Input PORTA=0X07; DDRB=0x0F; while(1) { switch(PINA & 0X07) { case 0x00: //0 { left(); } break; case 0x01: //1 { left(); } break; case 0x02: //2 { straight(); } break; case 0x03: //3 { left(); } break; case 0x04: //4 { right(); } break; case 0x05: //5 { straight(); } break; case 0x06: //6 { right(); } break; case 0x07: //7 { u_turn(); } break; } } return 0; }