Go Down

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

matt121187


sorry, im new with arduino..what do u mean by " First step, make Arduino work with basic code for NewPing."? from the ping sensor coding, i can get the distance, but how to get the value of times?


You create a time stamp for each ping.  Then, looking at multiple ping times, and the comparison to the ping time stamp, you can easily calculate the speed (also if it's getting closer or further away).  For example, you have two pings like the following:

Ping 1: Timestamp 50,000uS - Ping time 8,000uS
Ping 2: Timestamp 100,000uS - Ping time 7,000uS

So, two pings that are 50ms apart, the first distance is 8000uS (140cm), sencond ping is 7,000uS (123cm).  So, in 50ms, it got 17cm closer (140-123).  17cm/50ms = .17/0.05 m/s or 3.4 m/s or 7.6 miles/hour.

Only the previous and current ping timestamp and distance are needed.  If you use scheduled polling so you always know exactly how far apart each ping is (for example, exactly 50,000uS) then you don't even need to know the timestamp, just the current and previous ping distance.  Just don't use delay(50) to make them 50ms apart, that won't be accurate.  You'll need to either use an interrupt timer or polling to keep things accurate.  Interrupt timer would be ideal but more complicated unless you used a timer library would would greatly simplify things.

I've written a little sketch for you that uses the NewPing and TimerOne library that outputs the speed via serial and uses the timer interrupt to make the ping timing very accurate.  I added lots of comments so you should be able to follow along.  Speed values are in meters per second, with positive values coming at you and negative moving away.  Anyway, here's the sketch:

Code: [Select]
#include <TimerOne.h>
#include <NewPing.h>

#define TRIGGER_PIN  12 // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     11 // Arduino pin tied to echo pin on the ultrasonic sensor.

NewPing sonar(TRIGGER_PIN, ECHO_PIN); // NewPing setup of pins.

volatile int previous = 0, current = 0; // Must be volatile because these change inside the interrupt code.
volatile float mps = 0.0;
volatile boolean newping = false;

void setup() {
 delay(1000);                        // Wait a second before we start.
 Timer1.initialize(50000);           // 50000uS = 50ms.
 Timer1.attachInterrupt(pingSensor); // pingSensor to run every 50ms.
 Serial.begin(115200);               // Open serial monitor at 115200 baud to see ping results.
}

void loop() {
 if (newping) { // There a new ping, print speed.
   /* START - This section would be replaced with code that would do something with the result other than just output to serial. */
   if (mps) {   // Non-zero speed, show result.
     Serial.print(mps);
     Serial.println(" m/s");
   } else Serial.println("-"); // Can't determine speed, output "-" instead of speed.
   /* END */
   newping = false; // Set to false till next ping.
 }
}

void pingSensor() {
 previous = current;
 current = sonar.ping_cm(); // Send out a ping and get the results in CM.
 if (previous && current) { // If either are zero, we had a no-ping result or on the first ping.
   mps = (float) (previous - current) * 0.2; // Calculate speed in m/s (positive values are coming at you, negative moving away).
 } else mps = 0; // Can't calculate speed.
 newping = true; // Flag that there's a new ping.
}


Hope this helps!

Tim


tq so much eckel!!its work for me..i using parallax ping ultrasonic sensor and add some more coding..later i post here what ive done..tq so much!!

teckel


Hi,

First of all THANK YOU TIM for this library!!!!!!!!!!!!!!!!!!!!
And thank you to all the enthusiasts who have been posting here!

I have been running into a slight problem that I have not been able to fix, despite dowloading the lib again, googling it a million times, etc. I am trying to get readings from a PING))) sensor and from a maxbotic MAX SONAR (which can be PWM, An or BW, I have it as PWM) and arduino throws the same error:
'NewPing' does not name a type

sketch_jan06a:3: error: 'NewPing' does not name a type
sketch_jan06a:4: error: 'NewPing' does not name a type
sketch_jan06a.cpp: In function 'void loop()':
sketch_jan06a:19: error: 'sonar1' was not declared in this scope
sketch_jan06a:23: error: 'sonar2' was not declared in this scope

Any suggestions would be greatly greatly appreciated..... Thank you!!!!!


Your exact sketch compiled fine here.  But, I can get it to fail and give the above errors by removing the #include <NewPing.h> line.  This means that while you're telling it to load NewPing.h, it can't find it.  Most of the time, this means that you didn't install NewPing properly to the correct directory.  Libraries are installed inside your "Arduino" library in a subdirectory named "libraries".  Inside "libraries" you would create a new directory named "NewPing" with the files in the NewPing zip file in the NewPing directory.  See the other directories inside "libraries" for examples of how it should look.  The only instructions I have for installing a library with Arduino is:

Quote
Put the "NewPing" folder in "libraries\".


If you can't figure out how to correctly install a library, do a web search for how to install an Arduino library, maybe someone else has a better way of describing it.

Tim
Arduino - Teensy - Raspberry Pi
My libraries: NewPing - LCDBitmap - toneAC - NewTone - TimerFreeTone

Mr-What


Very good job, man!!!!
Two questions:
- is it possible to use multiple ultrasonic sensors? i.e 4 sensors?
- with multiple sensors and a distance between 10 and 20 cm how fast can be the readings?
Thanks

For my HC-SR04 app, I use a common trigger signal (to all 8 sensors), then pin-change interrupts to read pulse time.
I went outside the libraries to do this.  Haven't tried to see how fast I can ping, but they all share the same
timeout, currently at .030 sec (30ish Hz max).  They don't seem to work for distances longer than about
.020 ping time, so I'd think that a max rate of around 40 Hz should be achievable... for full 2+m range.

I don't know how much faster you could go at max 20cm, since subsequent pulses might
give false readings from objects around 2-2.5m away.

See http://arduino.cc/forum/index.php/topic,141363.0.html for my test code.

Mr-What


I'm writing a library for these: http://goo.gl/FWMjI  and I'd love to try some cool mapping ideas with your code...


I'm writing my own too.  My test code is posted at http://arduino.cc/forum/index.php/topic,141363.0.html.
The big difference for my code is that an array of HC-SR04's all share the same trigger, then read pulse
time using pin-change interrupts (on mega).

It is kind of hard for me to generalize pin-change interrupts, so it is somewhat hard-coded.
more of an example than a good general-purpose library.

teckel



I'm writing a library for these: http://goo.gl/FWMjI  and I'd love to try some cool mapping ideas with your code...


I'm writing my own too.  My test code is posted at http://arduino.cc/forum/index.php/topic,141363.0.html.
The big difference for my code is that an array of HC-SR04's all share the same trigger, then read pulse
time using pin-change interrupts (on mega).

It is kind of hard for me to generalize pin-change interrupts, so it is somewhat hard-coded.
more of an example than a good general-purpose library.


The problem with pin-change interrupts is that it's not even tested on the Uno, only Mega.  It's a little ridged for a general-purpose library.  The next release of NewPing *should* have a pin interrupt-based method. I've expanded my required compatibility to include the Uno, Teensy 2.0, and Teensy 3.0.  So, it's a little more challenging at times.

I do have a question for you.  How do you deal with pings that don't return?  Waiting for the interrupt doesn't work as sometimes there isn't a ping return.  I'm building an ultra-low-powered system currently and because I can't rely on getting a ping result, I can't do what I wanted, which is to put the ATmega to sleep while waiting for the pin interrupt.  Still got it down to using only 1.27mA, but even lower would be better.

Tim
Arduino - Teensy - Raspberry Pi
My libraries: NewPing - LCDBitmap - toneAC - NewTone - TimerFreeTone

Go Up