ive been configuring this for a month.
until now i am not satisfy with the result.
the analog pir in the line follower with buzzer.
it will follow the line and when a person got close to the robot in 1 second, it will stop and beeps continuously, though it will resume its movements when their is no person near it.
my problem is when it triggers the alarm the robot will derailed on its track due to the "delay" used in code..
this is my code.
/*
I/O Usage
2- colision1 as input
3- colision2 as input
4- colision3 as input
-line sensor inputs
5- linesense1 as input low on black
6- linesense2 as input
7- linesense3 as input
-motor control output
8 - mot2 dir as output high=fwd
9 - mot2 run as output
11 - mot1 dir as output high= fwd
10 - mot1 run as output
*/
int ls1 = 5;
int ls2 = 6;
int ls3 = 7;
int m2dir = 8;
int m2run = 9;
int m1dir = 11;
int m1run = 10;
long int rtc;
int x = 0;
int val = 0;
int inputPin = A0;
int pinSpeaker = 4;
// Initialization routine
void setup() {
pinMode(pinSpeaker, OUTPUT);
pinMode(m2dir, OUTPUT);
pinMode(m2run, OUTPUT);
pinMode(m1dir, OUTPUT);
pinMode(m1run, OUTPUT);
pinMode(13, OUTPUT);
rtc=millis()+10;
}
int linesense=0;
int giveup=0;
int lastsense;
int runspeed=90;
//timers
byte retry_dly=0;
byte ledflsh=25;
// Main Line following program loop
void loop()
{
//[b] PROBLEM STARTS HERE.... [/b]
val = analogRead(inputPin); // val is where the output of analog pir when some one got near.
if (val < 1) {
x++;
delay(250); // if the sensor triggers above 1 seconds it will buzz. THIS IS MY MAIN PROBLEM DUE TO THE DELAY
THE LINE FOLLOWER WILL DERAILED IN ITS PATH BECAUSE OTHER INSTRUCTIONS ARE WAITING IN
1 SECONDS BEFORE OTHER INSTRUCTION ARE MADE.
if (x==3){
Stop(); // the robot stops when the sensor is high under 1 second....
for(int a = 2; a<15; a++){ // beeps 15 times before continuing its path as long as the sensor reports no movement
digitalWrite(pinSpeaker,HIGH);
delay(200);
digitalWrite(pinSpeaker,LOW);
delay(50);}
x=0;
}}
// Hardware Timer service
if(millis()>=rtc)
{
rtc=rtc+10;
if(retry_dly>0) retry_dly--;
if(ledflsh>0)
{
ledflsh--;
if(ledflsh==0)
{
ledflsh=25;
PORTB ^= 0x20;
}
}
}
linesense=0;
if(digitalRead(ls1)==LOW) linesense=1;
if(digitalRead(ls2)==LOW) linesense=linesense+2;
if(digitalRead(ls3)==LOW) linesense=linesense+4;
// if no line is detected (all high)
if((linesense==0) & (retry_dly==0))
{
if(giveup<10)
{
//reverse for 20mS
if(lastsense==1) runBot(runspeed*15/10,runspeed,LOW);
if(lastsense==3) runBot(runspeed*12/10,runspeed,LOW);
if(lastsense==4) runBot(runspeed,runspeed*15/10,LOW);
if(lastsense==6) runBot(runspeed,runspeed*12/10,LOW);
delay(40);
giveup++;
}
else
Stop();
//delay(1000);
}
// if line is detected
if(linesense!=0)
{
lastsense=linesense;
giveup=0;
retry_dly=50; // retry delay=500ms
}
// extreme left
if(linesense==1)
{
//Stop();
dirfwd();
analogWrite(m2run, runspeed);
analogWrite(m1run, 0);
// digitalWrite(m1dir,LOW);
delay(50);
}
// centered
if((linesense==2)|(linesense==7))
{
runBot(runspeed,runspeed,HIGH);
delay(50);
}
// skewed left
if(linesense==3)
{
Stop();
dirfwd();
analogWrite(m2run, runspeed*12/10);
delay(50);
}
// extreme right
if(linesense==4)
{
//Stop();
dirfwd();
analogWrite(m1run, runspeed);
analogWrite(m2run, 0);
// digitalWrite(m2dir,LOW);
delay(50);
}
// skewed right
if(linesense==6)
{
Stop();
dirfwd();
analogWrite(m1run, runspeed*12/10);
delay(50);
}
}
void runBot(int spd1,int spd2, boolean direction )
{
digitalWrite(m2dir,direction);
digitalWrite(m1dir,direction);
analogWrite(m1run, spd1);
analogWrite(m2run, spd2);
}
void dirfwd(void)
{
digitalWrite(m2dir,HIGH);
digitalWrite(m1dir,HIGH);
}
void rotBot(int speed, boolean direction)
{
digitalWrite(m2dir,direction);
digitalWrite(m1dir,~direction);
analogWrite(m2run, speed);
analogWrite(m1run, speed);
}
void Stop(void)
{
analogWrite(m2run, 0);
analogWrite(m1run, 0);
}
THERE IS NO PROBLEM WITH THE LINE FOLLOWER CODES, ONLY IN THE DELAY LINE MAKES THE PROBLEM UNSOLVED.
I HOPE SOME ONE IN THIS WORLD WILL HELP ME SOLVE THIS PROBLEM. IVE BEEN CONFIGURING THIS FOR THE PAST MONTHS.