hi i having trouble with a code for a robot
I think but m not to sure that I’m running out of SRAM from the recursive methods im calling
or may be I’m doing something else wrong?
because after a little while the Arduino crashes or freezes
any way below is my code for the robot
#include <Arduino.h>.
boolean test =false;
int testwait =100;
/************************************************/
int E1 = 5;
int M1 = 4;
int E2 = 6;
int M2 = 7;
/***********************************************/
int fsensor =A0;
int Lsensor =A1;
int Rsensor =A2;
int Lbump= A4;
int Rbump =A5;
/**********************************************/
int FSvalue =0;
int LSvalue =0;
int RSvalue =0;
int LBvalue =0;
int RBvalue =0;
/*********************************************/
int pwm_speed;
/********************************************/
//Distances
int fwall =75;
int rwall= 40;
int lwall = 40;
int BUMP =550;
int clear =50;
int rvering =50;
int lvering =50;
/********************************************/
//Speed
int stp;
int fast = 255;
int slow = 100;
/********************************************/
//delays
int reverse = 500;
int rev = 30;
int dist = 30;
int turn90 = 260;
int turn180 = 500;
int turn45 =125;
int wallDelay =50;
/****************************************/
/********************************************/
void setup() {
pinMode(M1, OUTPUT);
pinMode(M2, OUTPUT);
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13,HIGH); //just an led for debugging
if (test){
analogWrite(E1, 0);
analogWrite(E2, 0);
Serial.println(" Testing");
delay(testwait);
Serial.println("");
FSvalue = analogRead(fsensor);
RSvalue = analogRead(Rsensor);
LSvalue = analogRead(Lsensor);
Serial.print(" F sensor ");
Serial.print(FSvalue);
Serial.print(" R sensor ");
Serial.print(RSvalue);
Serial.print(" L sensor ");
Serial.print(LSvalue);
}
flags();
}
void flags(){
Serial.print(" flags ");
if (test){
Serial.print(" Testing ");
analogWrite(E1, 0);
analogWrite(E2, 0);
delay(testwait);
}
/*******************************************************************************************************************************/
//wall flags
stop();
if (FSvalue>fwall && RSvalue<rwall && LSvalue<lwall){ //wall in ahead but not to the left or right
Reverse(reverse);
FWall();
}else if (analogRead(fsensor)>fwall && analogRead(Rsensor)>rwall && analogRead(Lsensor)<lwall){ //wall ahead and to the right
Reverse(reverse);
FWall();
}else if (analogRead(fsensor)>fwall &&analogRead(Rsensor)<rwall && analogRead(Lsensor)>lwall){ //wall ahead and to the left
Reverse(reverse);
FLWall();
}else if (analogRead(fsensor)>fwall &&analogRead(Rsensor)>rwall && analogRead(Lsensor)>lwall){ //wall ahead left and right
Reverse(reverse);
FRLWall();
// veering flags
}else if (analogRead(fsensor)<clear &&analogRead(Rsensor)>rvering && analogRead(Lsensor)<lvering){
Reverse(rev);
turnLeft(turn45);
}else if (analogRead(fsensor)<clear && analogRead(Rsensor)<rvering && analogRead(Lsensor)>lvering){
Reverse(rev);
turnRight(turn45);
}else if (analogRead(fsensor)<clear){
Clear(dist);
}else {Slow(dist);}
}
void stop(){
analogWrite(E1, stp);
analogWrite(E2, stp);
}
void Slow(int dist){
digitalWrite(13,LOW);
Serial.print(" slow");
digitalWrite(M1,HIGH);
digitalWrite(M2, LOW);
analogWrite(E1, slow);
analogWrite(E2, slow);
delay(dist);
}
void Clear(int distance){
Serial.print(" clear");
digitalWrite(M1,HIGH);
digitalWrite(M2, LOW);
analogWrite(E1, fast);
analogWrite(E2, fast);
delay(distance);
}
void FWall(){
digitalWrite(13,LOW);
Serial.print(" F wall");
digitalWrite(M1,LOW);
digitalWrite(M2, HIGH);
analogWrite(E1, 0);
analogWrite(E2, 0);
delay(wallDelay);
turnLeft(turn90);
}
void FLWall(){
digitalWrite(13,LOW);
Serial.print(" F L wall");
digitalWrite(M1,LOW);
digitalWrite(M2, HIGH);
analogWrite(E1, 0);
analogWrite(E2, 0);
delay(wallDelay);
turnRight(turn90);
}
void FRLWall(){
digitalWrite(13,LOW);
Serial.print(" F R L wall");
digitalWrite(M1,LOW);
digitalWrite(M2, HIGH);
analogWrite(E1, 0);
analogWrite(E2, 0);
delay(wallDelay);
turnLeft(turn180);
}
void turnRight(int turnDelay){
Serial.print(" turn Right");
digitalWrite(M1,LOW);
digitalWrite(M2, LOW);
analogWrite(E1, fast);
analogWrite(E2, fast);
delay(turnDelay);
}
void turnLeft(int turnDelay){
Serial.print(" turn Left");
digitalWrite(M1,HIGH);
digitalWrite(M2, HIGH);
analogWrite(E1, fast);
analogWrite(E2, fast);
delay(turnDelay);
}
void Reverse(int rev){
digitalWrite(13,LOW);
Serial.print(" Reverse");
digitalWrite(M1,LOW);
digitalWrite(M2, HIGH);
analogWrite(E1, fast);
analogWrite(E2, fast);
delay(rev);
}
Moderator edit: Please read this