View previous topic :: View next topic |
Author |
Message |
marcus02
Joined: 22 Jan 2013 Posts: 7
|
Maxbotix ultrasonic sensor with 16f877a |
Posted: Tue Feb 05, 2013 11:25 am |
|
|
Hi experts,
I'm currently working on a project by using Maxbotix ultrasonic sensor which is an analogue sensor and PIC16f877A microcontroller.
I'm using two analogue sensors with only 1 PIC.
The problem that i'm facing now is my sensors are unstable with the long range.
It can only works perfectly within the range of 50cm instead of 6meters.
Once the object is detected in range then it will trigger on a LED.
But now the situation is like the LED simply blinking once i set the range >50cm for example 100cm.
Please help as i need a stable long range sensing for my project.
Code: |
#include <16f877a.h>
#device ADC=10
#include <stdio.h>
#use delay(clock = 20000000)
#fuses hs,noprotect, nowdt,nolvp, nobrownout, nowrt
void sensor11();
void sensor22();
float sensor1,sensor2,value1,value2;
int y,z;
void main()
{ setup_adc_ports(AN0_AN1_AN3);
setup_adc(ADC_CLOCK_INTERNAL);
y=0;
z=0;
output_high(PIN_C0);
output_high(PIN_C1);
output_high(PIN_C2);
output_high(PIN_C3);
output_high(PIN_D0);
while(TRUE)
{
sensor11();
sensor22();
} //end while
} //end main
void sensor11()
{
//sensor 1
set_adc_channel(0);
delay_us(100);
value1=read_adc(); //read adc value from sensor 1
sensor1=(value1*1.240234375); //convert value to cm
if ((sensor1<100)&&(y==0))
{
y=1;
output_high(PIN_B0); //sensor 1 led ON
delay_ms(100);
}
else if ((sensor1>100)&&(y==1))
{
y=0;
output_low(PIN_B0); //sensor 1 led OFF
delay_ms(100);
}
}
void sensor22()
{
//sensor 2
set_adc_channel(1);
delay_us(100);
value2=read_adc(); //read adc value from sensor 1
sensor2=(value2*1.240234375); //convert value to cm
if ((sensor2<100)&&(z==0))
{
z=1;
output_high(PIN_B1); //sensor 2 led ON
delay_ms(100);
}
else if ((sensor2>100)&&(z==1))
{
z=0;
output_low(PIN_B1); //sensor 2 led OFF
delay_ms(100);
}
}
|
Regards,
Marcus |
|
|
Gabriel
Joined: 03 Aug 2009 Posts: 1067 Location: Panama
|
|
Posted: Tue Feb 05, 2013 12:15 pm |
|
|
Ive played with these sensors...
my suggestion is to test your circuit in a different room or outside preferably in open space...
indoor testing for me resulted in many false echos and redundant signal return paths (fancy way of saying More Echos)
after that the sensors got wierd, and spat out serial data in an unknown baud rate...
in addition you could try to clean up your data by using an "olympic" filter...
there are several examples in the forum.
g. _________________ CCS PCM 5.078 & CCS PCH 5.093 |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Tue Feb 05, 2013 12:16 pm |
|
|
Multiple things are not helping:
1) Is ADC_CLOCK_INTERNAL recommended with your clock?.....
2) Just how stable is the supply voltage?. This is being used as your ADC reference. It won't be good when you are looking for small changes.
3) Consider taking a short 'burst' of readings, and averaging them. Ultrasonic readings are very erratic, with some objects being detected yards away, while others are hard to resolve even at short distances. You'll often get reflections off flat objects and pick up other things from the reflections.
Give the sensor model, or better a link to it's data sheet. Maxbotic's do dozens of different models.
Then seriously, get rid of the float arithmetic. You don't need it.
Best Wishes |
|
|
asmboy
Joined: 20 Nov 2007 Posts: 2128 Location: albany ny
|
|
Posted: Tue Feb 05, 2013 4:51 pm |
|
|
got a complete schematic of what you've built that you can post ???
ALSO
give 10 bit resolution , the floating point calc of
value1*1.240234375 ... seems a bit out of whack.
if it were me i'd do something like
(unsigned int32 ) value_out = ((unsigned int32 ) (value1*1240) / 1000);
and do any scalar fprint() formatting as needed to return the result
with all the accuracy/resolution the ADC measurement is actually capable of.
can you see why i say that ??
EDIT: Just realized that this too, is along the line of what Ttelmah was kind
of enough to mention. |
|
|
SherpaDoug
Joined: 07 Sep 2003 Posts: 1640 Location: Cape Cod Mass USA
|
|
Posted: Wed Feb 06, 2013 6:46 am |
|
|
BTW a good test target is a hard surfaced ball. A ping pong ball, a billiards ball, or a soccer ball work well depending on range. Flat surface targets are highly dependent on angle. _________________ The search for better is endless. Instead simply find very good and get the job done. |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Wed Feb 06, 2013 7:16 am |
|
|
SherpaDoug wrote: | BTW a good test target is a hard surfaced ball. A ping pong ball, a billiards ball, or a soccer ball work well depending on range. Flat surface targets are highly dependent on angle. |
How about a corner reflector, like the one the left on the moon?
(But made from, say, hard wood.)
Mike |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Wed Feb 06, 2013 7:58 am |
|
|
It depends what you want to 'prove'. A 'good' target ( in terms of finding how well the system will cope with difficult targets), is a tennis ball. The combination of a furry surface, and resilient interior, make these quite hard to resolve. You'll often find the ultrasonic's missing these, and instead picking up the corner of a bookcase several feet further away....
Best Wishes |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Wed Feb 06, 2013 9:25 am |
|
|
Agreed.
Mike |
|
|
marcus02
Joined: 22 Jan 2013 Posts: 7
|
|
Posted: Wed Feb 06, 2013 10:06 am |
|
|
Gabriel wrote: | Ive played with these sensors...
my suggestion is to test your circuit in a different room or outside preferably in open space...
indoor testing for me resulted in many false echos and redundant signal return paths (fancy way of saying More Echos)
after that the sensors got wierd, and spat out serial data in an unknown baud rate...
in addition you could try to clean up your data by using an "olympic" filter...
there are several examples in the forum.
g. |
http://www.ccsinfo.com/forum/viewtopic.php?t=29018
Bro.. is it this thread that you mean? calibration of analogue input?
regards,
marcus |
|
|
marcus02
Joined: 22 Jan 2013 Posts: 7
|
|
Posted: Wed Feb 06, 2013 10:10 am |
|
|
Ttelmah wrote: | Multiple things are not helping:
1) Is ADC_CLOCK_INTERNAL recommended with your clock?.....
2) Just how stable is the supply voltage?. This is being used as your ADC reference. It won't be good when you are looking for small changes.
3) Consider taking a short 'burst' of readings, and averaging them. Ultrasonic readings are very erratic, with some objects being detected yards away, while others are hard to resolve even at short distances. You'll often get reflections off flat objects and pick up other things from the reflections.
Give the sensor model, or better a link to it's data sheet. Maxbotic's do dozens of different models.
Then seriously, get rid of the float arithmetic. You don't need it.
Best Wishes |
Here is the datasheet of the ultrasonic sensor that i used.
www.maxbotix.com/documents/MB1010_Datasheet.pdf
I am not looking for small changes... I wish to make it detect as far as 1meter long but it will only stable within the range of 50cm. =(
sorry for my bad english.
regards,
marcus |
|
|
Gabriel
Joined: 03 Aug 2009 Posts: 1067 Location: Panama
|
|
Posted: Wed Feb 06, 2013 10:28 am |
|
|
... i mean this thread:
http://www.ccsinfo.com/forum/viewtopic.php?t=19509&highlight=filter
Search for "filter" in the code library ... and "Olympic"
...
What Ttelmah suggest has nothing to do with your sensor...
it means you have a 20mhz crystal on the chip and you are using the INTERNAL setting... this is wrong... read the DATASHEET... search for TAD...
Id take his advise seriously... and try to understand what he is telling you... he is one of the more active/respected forum users...
br.
G _________________ CCS PCM 5.078 & CCS PCH 5.093 |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Wed Feb 06, 2013 2:13 pm |
|
|
You do realise that to use two of these sensors, you need to turn the one you are not using 'off', while you read the other?. They work on the same frequency, and if left in automatic mode, will be sending pulses every 50mSec or so, that the other sensor _will_ receive, giving unexpected distances all the time....
You need to have the PIC operating the RX line of each unit, and pull the one not being read 'high'. Then pull the one you want to read low, wait 49mSec, and read the analog.
Best Wishes |
|
|
Gabriel
Joined: 03 Aug 2009 Posts: 1067 Location: Panama
|
|
Posted: Wed Feb 06, 2013 3:40 pm |
|
|
Ttelmah is right... again.
The reason he points out is precisely the reason why Maxbotics has an application note for multiple sensor operation on their site!
G. _________________ CCS PCM 5.078 & CCS PCH 5.093 |
|
|
marcus02
Joined: 22 Jan 2013 Posts: 7
|
|
Posted: Wed Feb 06, 2013 6:17 pm |
|
|
Ttelmah wrote: | You do realise that to use two of these sensors, you need to turn the one you are not using 'off', while you read the other?. They work on the same frequency, and if left in automatic mode, will be sending pulses every 50mSec or so, that the other sensor _will_ receive, giving unexpected distances all the time....
You need to have the PIC operating the RX line of each unit, and pull the one not being read 'high'. Then pull the one you want to read low, wait 49mSec, and read the analog.
Best Wishes |
Hi,
I do know that these two sensors are using the same frequency..
But i have no idea on how to turn the one i am not using 'off'.
What do you mean by having the PIC operating the RX line of each unit and pull the one not being read 'high'?
Sorry i am newbie in this field couldn't understand that much.
Thanks.
Regards,
marcus |
|
|
Gabriel
Joined: 03 Aug 2009 Posts: 1067 Location: Panama
|
|
Posted: Thu Feb 07, 2013 6:40 am |
|
|
Like i said:
Quote: | Maxbotics has an application note for multiple sensor operation on their site |
I just checked their website again... they even have code samples...
good thing is that the sensors are built using PICs so the code should be ease to port to CCS...
G _________________ CCS PCM 5.078 & CCS PCH 5.093 |
|
|
|