I am a newbie and I am testing to see if an ultrasonic sensor can be used to detect an edge of a table

I am having a problem because the only output of the bot currently is the part of
"backward();
delay(1000);
right();
delay(1200);"
here is my code below.

#include <NewPing.h>
const int leftfwd  = 7;
const int leftbwd  = 6;
const int rightfwd = 4;
const int rightbwd = 5;
const int ena = 11;
const int enb = 10;
#define trig_pin 9
#define echo_pin 8
#define maximum_distance 200
boolean goesForward = false;
int distance =100;  
NewPing sonar(trig_pin, echo_pin, maximum_distance);

void setup() {
pinMode(ena,OUTPUT);
pinMode(enb,OUTPUT);
pinMode(leftfwd,OUTPUT);
pinMode(leftbwd,OUTPUT);
pinMode(rightfwd,OUTPUT);
pinMode(rightbwd,OUTPUT);

distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
}
void loop() {
  int distanceRight = 0;
  int distanceLeft = 0;
delay(50);
if (distance < 40){
  stagger();
    }
else{
  backward();
    delay(1000);
    right();
    delay(1200);
    
  }
distance = readPing();
}
int readPing(){
  delay(70);
  int cm = sonar.ping_cm();
  if (cm==0){
    cm=250;
  }
  return cm;}
void stagger(){
  if(!goesForward){
    goesForward=true;
      digitalWrite(leftfwd, HIGH); 
      digitalWrite(leftbwd, LOW);
      digitalWrite(rightfwd, HIGH);
      digitalWrite(rightbwd, LOW);
      analogWrite(ena,255);
      analogWrite(enb,235);}
}
void forward(){
      digitalWrite(leftfwd, HIGH); 
      digitalWrite(leftbwd, LOW);
      digitalWrite(rightfwd, HIGH);
      digitalWrite(rightbwd, LOW);
      analogWrite(ena,255);
      analogWrite(enb,255);  }
void backward(){
  goesForward=false;
      digitalWrite(leftfwd, LOW);
      digitalWrite(leftbwd, HIGH);
       analogWrite(ena,255);
      analogWrite(enb,255);
      digitalWrite(rightfwd, LOW);
      digitalWrite(rightbwd, HIGH);
       
       } 
void right(){
      digitalWrite(leftfwd, LOW);
      digitalWrite(leftbwd, HIGH);
      digitalWrite(rightfwd, HIGH);
      digitalWrite(rightbwd, LOW);}
void left(){
      digitalWrite(leftfwd, HIGH);
      digitalWrite(leftbwd, LOW);
      digitalWrite(rightfwd, LOW);
      digitalWrite(rightbwd, HIGH);}
void Stop(){      
      digitalWrite(leftfwd, LOW);
      digitalWrite(leftbwd, LOW);
      digitalWrite(rightfwd, LOW);
      digitalWrite(rightbwd, LOW);}

Would you want to take the measurement at the beginning of loop()?

Why delay(50) after setting int distanceLeft =0;?

Did you try any Serial.prints to see what the deets are?

Why so many delays() of such lengthy times?

Also.

You make the variable int distance =100; and set it to 100, should it not default to 0?

Why does do 5 read pings in setup()?

int readPing()
{
  int cm = 0;
  int temp = 0;
  for ( int j = 0; j < 3; j++ )
  {
    temp = sonar.ping_cm();
    if ( temp > 0)
    {
      cm += temp;
    } else
    {
      j = j - 1;
    }
  }
  return cm / 3;
}
1 Like

This code-version makes visible in the serial monitor what your code is doing and what values your variables have

// MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START * MACRO-START *

https://forum.arduino.cc/t/comfortable-serial-debug-output-short-to-write-fixed-text-name-and-content-of-any-variable-code-example/888298
#define dbg(myFixedText, variableName) \
  Serial.print( F(#myFixedText " "  #variableName"=") ); \
  Serial.println(variableName);
// usage: dbg("1:my fixed text",myVariable);
// myVariable can be any variable or expression that is defined in scope

#define dbgi(myFixedText, variableName,timeInterval) \
  do { \
    static unsigned long intervalStartTime; \
    if ( millis() - intervalStartTime >= timeInterval ){ \
      intervalStartTime = millis(); \
      Serial.print( F(#myFixedText " "  #variableName"=") ); \
      Serial.println(variableName); \
    } \
  } while (false);
// usage: dbgi("2:my fixed text",myVariable,1000);
// myVariable can be any variable or expression that is defined in scope
// third parameter is the time in milliseconds that must pass by until the next time a
// Serial.print is executed
// end of macros dbg and dbgi
// print only once when value has changed
#define dbgc(myFixedText, variableName) \
  do { \
    static long lastState; \
    if ( lastState != variableName ){ \
      Serial.print( F(#myFixedText " "  #variableName" changed from ") ); \
      Serial.print(lastState); \
      Serial.print( F(" to ") ); \
      Serial.println(variableName); \
      lastState = variableName; \
    } \
  } while (false);
// MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END * MACRO-END *


void PrintFileNameDateTime() {
  Serial.println( F("Code running comes from file ") );
  Serial.println( F(__FILE__) );
  Serial.print( F("  compiled ") );
  Serial.print( F(__DATE__) );
  Serial.print( F(" ") );
  Serial.println( F(__TIME__) );
}


// easy to use helper-function for non-blocking timing
boolean TimePeriodIsOver (unsigned long &startOfPeriod, unsigned long TimePeriod) {
  unsigned long currentMillis  = millis();
  if ( currentMillis - startOfPeriod >= TimePeriod ) {
    // more time than TimePeriod has elapsed since last time if-condition was true
    startOfPeriod = currentMillis; // a new period starts right here so set new starttime
    return true;
  }
  else return false;            // actual TimePeriod is NOT yet over
}

unsigned long MyTestTimer = 0;                   // Timer-variables MUST be of type unsigned long
const byte    OnBoard_LED = 13;


void BlinkHeartBeatLED(int IO_Pin, int BlinkPeriod) {
  static unsigned long MyBlinkTimer;
  pinMode(IO_Pin, OUTPUT);
  if ( TimePeriodIsOver(MyBlinkTimer, BlinkPeriod) ) {
    digitalWrite(IO_Pin, !digitalRead(IO_Pin) );
  }
}



#include <NewPing.h>
const int leftfwd  = 7;
const int leftbwd  = 6;
const int rightfwd = 4;
const int rightbwd = 5;
const int ena = 11;
const int enb = 10;
#define trig_pin 9
#define echo_pin 8
#define maximum_distance 200
boolean goesForward = false;
int distance = 100;
NewPing sonar(trig_pin, echo_pin, maximum_distance);

void setup() {
  Serial.begin(115200);
  Serial.println("Setup-Start");
  PrintFileNameDateTime();

  pinMode(ena, OUTPUT);
  pinMode(enb, OUTPUT);
  pinMode(leftfwd, OUTPUT);
  pinMode(leftbwd, OUTPUT);
  pinMode(rightfwd, OUTPUT);
  pinMode(rightbwd, OUTPUT);
  distance = readPing();
}

void loop() {
  BlinkHeartBeatLED(OnBoard_LED,250);

  int distanceRight = 0;
  int distanceLeft = 0;
  delay(50);
  
  dbgi("0:",distance,500);
  dbgc("1:",goesForward);
  
  if (distance < 40) {
    stagger();
  }
  else {
    backward();
    delay(1000);
    right();
    delay(1200);
  }
  distance = readPing();
}


int readPing() {
  //delay(70);
  int cm = sonar.ping_cm();
  if (cm == 0) {
    cm = 250;
  }
  return cm;
}


void stagger() {
  dbg("entering stagger",goesForward);
  if (!goesForward) {
    goesForward = true;
    digitalWrite(leftfwd, HIGH);
    digitalWrite(leftbwd, LOW);
    digitalWrite(rightfwd, HIGH);
    digitalWrite(rightbwd, LOW);
    analogWrite(ena, 255);
    analogWrite(enb, 235);
  }
  dbg("leaving stagger",goesForward);
}


void forward() {
  digitalWrite(leftfwd, HIGH);
  digitalWrite(leftbwd, LOW);
  digitalWrite(rightfwd, HIGH);
  digitalWrite(rightbwd, LOW);
  analogWrite(ena, 255);
  analogWrite(enb, 255);
}


void backward() {
  dbg("entering backward",goesForward);
  
  goesForward = false;
  digitalWrite(leftfwd, LOW);
  digitalWrite(leftbwd, HIGH);
  analogWrite(ena, 255);
  analogWrite(enb, 255);
  digitalWrite(rightfwd, LOW);
  digitalWrite(rightbwd, HIGH);
  dbg("leaving backward",goesForward); 
}


void right() {
  dbg("entering right",goesForward);
  
  digitalWrite(leftfwd, LOW);
  digitalWrite(leftbwd, HIGH);
  digitalWrite(rightfwd, HIGH);
  digitalWrite(rightbwd, LOW);
  dbg("leaving right",goesForward);
}


void left() {
  digitalWrite(leftfwd, HIGH);
  digitalWrite(leftbwd, LOW);
  digitalWrite(rightfwd, LOW);
  digitalWrite(rightbwd, HIGH);
}


void Stop() {
  digitalWrite(leftfwd, LOW);
  digitalWrite(leftbwd, LOW);
  digitalWrite(rightfwd, LOW);
  digitalWrite(rightbwd, LOW);
}

best regards Stefan

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.