Go Down

Topic: NewPing Library: HC-SR04, SRF05, SRF06, DYP-ME007, Parallax PING))) - v1.5 (Read 129 times) previous topic - next topic

mouchadino

#495
Jun 17, 2014, 05:49 am Last Edit: Jul 07, 2014, 07:13 pm by robtillaart Reason: 1
I have try upload the sketch with arduino1.05R2 but i get 1 of sensor sornar aktive  1 more not working please... help me...it.s make me crazy :p

the sketch as bellow :P
Code: [Select]

/* Code modified for analog output by: mOuchadino

Available PWM pin : 3, 5, 6, 9, 10, 11
Available Digital I/O pin : 2 to 13
*/

#include <NewPing.h>

#define SONAR_NUM 2 // Number or sensors.
#define MAX_DISTANCE 400 // Maximum distance (in cm) to ping.
#define PING_INTERVAL 30 // Milliseconds between sensor pings (29ms is about the min to avoid cross-sensor echo).

unsigned long pingTimer[SONAR_NUM]; // Holds the times when the next ping should happen for each sensor.
unsigned int cm[SONAR_NUM]; // Where the ping distances are stored.
uint8_t currentSensor = 0; // Keeps track of which sensor is active.

NewPing sonar[SONAR_NUM] = { // Sensor object array.
 NewPing(5, 6, MAX_DISTANCE), // Each sensor's echo pin, trigger pin, and max distance to ping.
 NewPing(7, 8, MAX_DISTANCE),
};

int pwmPins[SONAR_NUM] = {
 9, 10 }; // array Nomor pin utk keluaran PWM Analog out 0-5v
int led = 13;

void setup() {
 Serial.begin(115200);
 pingTimer[0] = millis() + 75;              // First ping starts at 75ms, gives time for the Arduino to chill before starting.
 for (uint8_t i = 1; i < SONAR_NUM; i++)  { // Set the starting time for each sensor.
   pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
 }

 for (uint8_t i = 0; i < SONAR_NUM; i++) { // pwm output pin counter
   pinMode(pwmPins[i], OUTPUT);
 }

 {              
 // initialize the digital pin as an output.
 pinMode(led, OUTPUT);    
}

 Serial.println();
}

void loop()
{
 for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop through all the sensors.
   if (millis() >= pingTimer[i]) { // Is it this sensor's time to ping?
     pingTimer[i] += PING_INTERVAL * SONAR_NUM; // Set next time this sensor will be pinged.
     if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle(); // Sensor ping cycle complete, do something with the results.
     sonar[currentSensor].timer_stop(); // Make sure previous timer is canceled before starting a new ping (insurance).
     currentSensor = i; // Sensor being accessed.
     cm[currentSensor] = 0; // Make distance zero in case there's no ping echo for this sensor.
     sonar[currentSensor].ping_timer(echoCheck); // Do the ping (processing continues, interrupt will call echoCheck to look for echo).
   }
 
 }

{
 digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
 delay(1000);               // wait for a second
 digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
 delay(2000);               // wait for a second
}
 // Other code that *DOESN'T* analyze ping results can go here.
}

// If ping received, set the sensor distance to array.
void echoCheck()
{
 if (sonar[currentSensor].check_timer())
   cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM;
}

// Sensor ping cycle complete, do something with the results. Location option 1 for code processing

void oneSensorCycle()
{
 for (uint8_t i = 0; i < SONAR_NUM; i++) {
   // turn the pin on:
   // http://arduino.cc/en/Reference/analogWrite
   analogWrite(pwmPins[i], cm[i]);

   //        Serial.print(i); // print sensor number accessed
   //        Serial.print("="); // = märk
   //        Serial.print(cm[i]); // sensor distance value
   //        Serial.println("cm "); // cm
   //        Print format i = xxx cm
 }
}

===========================================================================================

#include <NewPing.h>

#define SONAR_NUM 2 // Number or sensors.
#define MAX_DISTANCE 400 // Maximum distance (in cm) to ping.
#define PING_INTERVAL 33 // Milliseconds between sensor pings (29ms is about the min to avoid cross-sensor echo).

unsigned long pingTimer[SONAR_NUM]; // Holds the times when the next ping should happen for each sensor.
unsigned int cm[SONAR_NUM]; // Where the ping distances are stored.
uint8_t currentSensor = 0; // Keeps track of which sensor is active.

NewPing sonar[SONAR_NUM] = { // Sensor object array.
// Each sensor's trigger pin, echo pin, and max distance to ping.
 NewPing(5, 6, MAX_DISTANCE),
 NewPing(7, 8, MAX_DISTANCE),
 
};

int pwmPins[SONAR_NUM] = {9, 10 };  // an array of pin numbers to which pwm output is written
int led = 13;

void setup()
{
 Serial.begin(115200);
 pingTimer[0] = millis() + 75; // First ping starts at 75ms, gives time for the Arduino to chill before starting.

 for (uint8_t i = 1; i < SONAR_NUM; i++) {// Set the starting time for each sensor.
   pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
 }

 for (uint8_t i = 0; i < SONAR_NUM; i++) { // pwm output pin counter
   pinMode(pwmPins[i], OUTPUT);
  }
{              
 
  // initialize the digital pin as an output.
 
 pinMode(led, OUTPUT);    
}

 Serial.println();
}

void loop()
{
 for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop through all the sensors.
   if (millis() >= pingTimer[i]) { // Is it this sensor's time to ping?
     pingTimer[i] += PING_INTERVAL * SONAR_NUM; // Set next time this sensor will be pinged.
     if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle(); // Sensor ping cycle complete, do something with the results.
     sonar[currentSensor].timer_stop(); // Make sure previous timer is canceled before starting a new ping (insurance).
     currentSensor = i; // Sensor being accessed.
     cm[currentSensor] = 0; // Make distance zero in case there's no ping echo for this sensor.
     sonar[currentSensor].ping_timer(echoCheck); // Do the ping (processing continues, interrupt will call echoCheck to look for echo).
   }
 }
}

// If ping received, set the sensor distance to array.
void echoCheck()
{
 if (sonar[currentSensor].check_timer())
   cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM;
}

// Sensor ping cycle complete, do something with the results. Location option 1 for code processing

void oneSensorCycle()
{
 for (uint8_t i = 0; i < SONAR_NUM; i++) {
   // turn the pin on:
   
   analogWrite(pwmPins[i], cm[i]);

           Serial.print(i); // print sensor number accessed
           Serial.print("="); // = märk
           Serial.print(cm[i]); // sensor distance value
           Serial.println("cm "); // cm
   //        Print format i = xxx cm
 }
}


moderator update: added code tags  -->  # button above smileys

mouchadino

#496
Jun 17, 2014, 05:51 am Last Edit: Jul 07, 2014, 07:15 pm by robtillaart Reason: 1
==============================================================================
i modifed the sketch like as bellow  =( still not working with 2 sonar


Code: [Select]

#include <NewPing.h>

#define SONAR_NUM 2 // Number or sensors.
#define MAX_DISTANCE 400 // Maximum distance (in cm) to ping.
#define PING_INTERVAL 100 // Milliseconds between sensor pings (29ms is about the min to avoid cross-sensor echo).

unsigned long pingTimer[SONAR_NUM]; // Holds the times when the next ping should happen for each sensor.
unsigned int cm[SONAR_NUM]; // Where the ping distances are stored.
uint8_t currentSensor = 0; // Keeps track of which sensor is active.

NewPing sonar[SONAR_NUM] = { // Sensor object array.
 NewPing(5, 6, MAX_DISTANCE), // Each sensor's echo pin, trigger pin, and max distance to ping.
 NewPing(7, 8, MAX_DISTANCE),
};

int pwmPins[SONAR_NUM] = {9, 10 }; // array Nomor pin utk keluaran PWM Analog out 0-5v
int ledPins[SONAR_NUM] = {12, 13};

void setup() {
 Serial.begin(115200);
 pingTimer[0] = millis() + 75;              // First ping starts at 75ms, gives time for the Arduino to chill before starting.
 for (uint8_t i = 1; i < SONAR_NUM; i++)  { // Set the starting time for each sensor.
   pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
 }

for (uint8_t i = 0; i < SONAR_NUM; i++) { // pwm output pin counter
   pinMode(pwmPins[i], OUTPUT);
 }
               
 // initialize the digital pin as an output.
 
for (uint8_t i = 0; i < SONAR_NUM; i++) { // pwm output pin counter
   pinMode(ledPins[i], OUTPUT);
 }  

 Serial.println();
}

void loop()
{
 for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop through all the sensors.
   if (millis() >= pingTimer[i]) { // Is it this sensor's time to ping?
     pingTimer[i] += PING_INTERVAL * SONAR_NUM; // Set next time this sensor will be pinged.
     if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle(); // Sensor ping cycle complete, do something with the results.
     sonar[currentSensor].timer_stop(); // Make sure previous timer is canceled before starting a new ping (insurance).
     currentSensor = i; // Sensor being accessed.
     cm[currentSensor] = 0; // Make distance zero in case there's no ping echo for this sensor.
     sonar[currentSensor].ping_timer(echoCheck); // Do the ping (processing continues, interrupt will call echoCheck to look for echo).
   }
 
 }

{
{
 digitalWrite(ledPins[12,13], HIGH);   // turn the LED on (HIGH is the voltage level)
 delay(500);               // wait for a second
 digitalWrite(ledPins[13,12], LOW);    // turn the LED off by making the voltage LOW
 delay(1000);               // wait for a second
}
}
 // Other code that *DOESN'T* analyze ping results can go here.
}

// If ping received, set the sensor distance to array.
void echoCheck()
{
 if (sonar[currentSensor].check_timer())
   cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM;
}

// Sensor ping cycle complete, do something with the results. Location option 1 for code processing

void oneSensorCycle()
{
 for (uint8_t i = 0; i < SONAR_NUM; i++) {
   // turn the pin on:

   analogWrite(pwmPins[i], cm[i]);

           Serial.print(i); // print sensor number accessed
           Serial.print("="); // = märk
           Serial.print(cm[i]); // sensor distance value
           Serial.println(" -cm "); // cm
   //        Print format i = xxx cm
 }
}


===========================================================================

but if i.m delete the as bellow the 2 sensor work fine :p

Code: [Select]

{
 digitalWrite(ledPins[12,13], HIGH);   // turn the LED on (HIGH is the voltage level)
 delay(500);               // wait for a second
 digitalWrite(ledPins[13,12], LOW);    // turn the LED off by making the voltage LOW
 delay(1000);               // wait for a second
}

every body please help me ..... =(   =(

moderator update: added code tags  -->  # button above smileys

shomar

Hi Tim,

Any Plans for releasing the version 1.6 soon?

I am using this with ATtiny  as well as arduino and trying to avoid keeping the timers commented/uncommented for each use  :)

Thanks for the great library BTW

Shomar

rastamankg

I have problem with this library. If I upload example sketch, everything works, but if I use this library for my project, Arduino loose USB communication, does anybody knows what should I do?
Thanks

visualxl

Thank you for writing this library out for us.

I just got DYP-ME007Y module, and I've never played around with it. So, I straight away use your library.. and..

NewPingExample does not seem to work.

NewPingEventTimer work. But we have to only grab the first reading of the second wave onwards if the reading is important to you. Pardon me if my linggo is not correct.

So let say, the first wave (1, 2, 3, 4, 5, 6, 7), ignore this.

Then, subsequent waves onwards, it looks like (77, 67, 57, 47, 37, 28, 25). So, you may pick any one of this. I would prefer picking the first reading in my case.

walshlg

PLEASE, PLEASE include code for the 3 pin parallax 28015 sensors.  They are available now for 1/10 the price of the 4 pin sensors.

walshlg

OK here is a suprise: set the Trigger_Pin and Echo_Pin to the same port and by golly it seems to be working fine!

Ping / Parallax  28015 3-pin sensor


TryChick

I am not sure why I'm not getting a return of zero for sensor readings that are out of range.  I get wildly varying distances when there is nothing in front of the sensors, but accurate readings when I have something in front.  Any ideas? I have two HC-SR04s on my bot, so I modified the NewPingExample for 2 sensors, but it does the same thing when only one sensor is being pinged.

Code: [Select]

#include <NewPing.h>

#define L_TRIG 46  // Arduino pin tied to trigger pin on the left ultrasonic sensor.
#define L_ECHO 47  // Arduino pin tied to echo pin on the left ultrasonic sensor.

#define R_TRIG 48  // Arduino pin tied to trigger pin on the right ultrasonic sensor.
#define R_ECHO 49  // Arduino pin tied to echo pin on the right ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar_L(L_TRIG, L_ECHO, MAX_DISTANCE); // NewPing setup of pins and maximum distance for left sensor.
NewPing sonar_R(R_TRIG, R_ECHO, MAX_DISTANCE); // NewPing setup of pins and maximum distance for right sensor.

unsigned int uS; //declare variable for ping time in microseconds

void setup() {
  Serial.begin(9600); // Open serial monitor at 9600 baud to see ping results.
}

void loop() {
  delay(50);                      // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
  uS = sonar_L.ping(); // Send ping, get ping time in microseconds (uS).

  Serial.print("L Ping: ");
  Serial.print(uS / US_ROUNDTRIP_CM); // Convert ping time to distance in cm and print result (0 = outside set distance range)

   
  uS = sonar_R.ping(); // Send ping, get ping time in microseconds (uS).

  Serial.print("\tR Ping: ");
  Serial.println(uS / US_ROUNDTRIP_CM); // Convert ping time to distance in cm and print result (0 = outside set distance range)

}

OhMyCod

Hi Tim,

Can this library be used to work with the maxsonar range of proximity sensors? Like this one.....
https://www.sparkfun.com/products/9495

The sensor generates a pulse whose width is proportional to distance, the problem is that measuring the pulse width requires the use of the pulseIn() function which can take some time.

Thanks

Howard782

Hi Tim

Thanks for your great NewPing Library. I would like to ask two questions please:-

1. Can I use multiple sensors using the one wire method? or is that a no, as your 15 sensors example uses both wires?

2. I would like to know your thoughts on multiple sensors versus one sensor on a rotating platform, which is 'better' and why?

Can't wait for version 1.6!

rugby21_22

hi all anybody can  tell me that what is that US_ROUNDTRIP_IN in the code? and how can i get distance in INCHES kindly waiting for you reply ?

AWOL


hi all anybody can  tell me that what is that US_ROUNDTRIP_IN in the code? and how can i get distance in INCHES kindly waiting for you reply ?
Have look at reply #502 and see if that gives you any clues.
"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Go Up