Ultrasoonsensors doen raar

Hallo allemaal ,

Ik ben bezig met een nieuw robot projectje , en ik gebruik nu voor de eerste keer ultrasone afstandssensoren.
Ik heb een aantal HC-SR04 sensoren.

http://www.elecfreaks.com/store/images/Sensor_ObjDec_Ultra_HC_SR04_7.jpg

Ik had een kleine test opstelling gemaakt met een Arduino. Maar nu doen de sensors raar.
Ik heb geprogrammeerd dat een led moet aangaan als een object dichter dan 10 cm komt.
Soms gaat die al aan bij bv 25cm , en daarna blijft het helemaal niet stabiel.
Als ik dan op pakweg 7 cm zit , begint de led als zot te knipperen.

Ook , komt er hoorbaar geluid uit de transducer , een hoge toon van ongeveer rond de 15kHz denk ik.

Dus dacht ik aan storingen op de voeding door de Arduino.
Maar na bijplaatsen van een elco en een ontstoringscondensator nog altijd geen verbetering.

Programma :

c code:

int ECHO_L_PIN = 2;                           
int TRIG_L_PIN = 3;                            

int ECHO_R_PIN = 4;                            
int TRIG_R_PIN = 5;  

int LedLPin = 6;
int LedRPin = 7;

void setup(){
  pinMode(ECHO_L_PIN, INPUT);
  pinMode(ECHO_R_PIN, INPUT);
  pinMode(LedLPin, OUTPUT);
  pinMode(LedRPin, OUTPUT);
  pinMode(TRIG_L_PIN, OUTPUT);
  pinMode(TRIG_R_PIN, OUTPUT);
}

void loop(){
 

 digitalWrite(TRIG_R_PIN, LOW);                 
  delayMicroseconds(2);
  digitalWrite(TRIG_R_PIN, HIGH);                
  delayMicroseconds(10);
  digitalWrite(TRIG_R_PIN, LOW);                 
  int distance_R = pulseIn(ECHO_R_PIN, HIGH);       
  distance_R= distance_R/58;                        distance from time of pulse

 delayMicroseconds(200);


 if ((distance_R <= 10) && (distance_R > 0))
 {
   digitalWrite(LedRPin , HIGH);
   digitalWrite(LedLPin , LOW);
 }
 
 else
 {
   
 digitalWrite(LedRPin , LOW);
   digitalWrite(LedLPin , LOW);
 }


}

Kan iemand mij hierme helpen?

Ik heb even op een andere site gekeken en daar gebruikt men voor de berekening float in plaats van int

float distance_R = pulseIn(ECHO_R_PIN, HIGH);
distance_R= distance_R/58;

Depeet

Ik heb het juist eens even getest , maar zonder resultaat. Hoe langer ik ermee bezig ben , hoe vreemder het allemaal word :p

Ik heb ook gemerkt dat het niet altijd een hoge toon is, nu is het meer een gekraak , een aantal Hz

[Bericht gewijzigd door GlennV op 2 april 2013 12:47:42 (30%)]

In het begin van je code schrijf je

int ECHO_R_PIN = 4;
int TRIG_R_PIN = 5;

int LedLPin = 6;
int LedRPin = 7;

Moet het niet het volgende zijn?

#define TRIG_R_PIN 5
#define ECHO_R_PIN 4
#define LEDRPIN 7

In jouw programma geef je de variabele ECHO_R_PIN een waarde
Met define link je volgens mij de label ECHO_R_PIN met pin 4 van je arduino

het gekraak is me ook een raadsel en 40kHz enkel hoorbaar door mijn buurman, maar hij is dan ook een nachtmens ;-)

Depeet

Je moet dat apparaat aansturen met een positief gaande puls van tenminste 10 microseconde breed.

Vervolgens moet je wachten op een ontvangen reactie, dus niet gelijk weer gaan zenden. Het bereik is omstreeks 4 meter, en als de geluidssnelheid 333 m/s is, is dat minimaal ongeveer 25 ms wachttijd die je moet aanhouden. Doe je dat niet (slechts 200 microseconde lees ik) dan detecteer je ook echo's van vorige uitzendingen.

Een afstandmeetfunctie die een integerwaarde retourneert die je vervolgens deelt door 58 bevreemdt mij.

Ik denk, als je 4 cm wilt meten en de retourpuls dan maar 250 microseconde op zich laat wachten, dat het niet verstandig is aparte zend en ontvangstfuncties te maken. Beide in een functie opnemen.

Opgepast: MaartenBakker citaat: "ruik ik een troll die per ongeluk met de arreslee meegelift is" :

Op 2 april 2013 13:44:09 schreef depeet:
In het begin van je code schrijf je

int ECHO_R_PIN = 4;
int TRIG_R_PIN = 5;

int LedLPin = 6;
int LedRPin = 7;

Moet het niet het volgende zijn?

#define TRIG_R_PIN 5
#define ECHO_R_PIN 4
#define LEDRPIN 7

In jouw programma geef je de variabele ECHO_R_PIN een waarde
Met define link je volgens mij de label ECHO_R_PIN met pin 4 van je arduino

het gekraak is me ook een raadsel en 40kHz is enkel hoorbaar door mijn buurman, maar hij is dan ook een nachtmens ;-)

Depeet

edit: laat maar

[Bericht gewijzigd door muddy op 5 april 2013 09:21:25 (97%)]

Magnetische flux loopt altijd in gesloten paden, elektrische stroom niet per se (volgens de wet van Ampère), want: elektrische lading kan ophopen.

Op 2 april 2013 23:27:49 schreef muddy:

Als ik namelijk in de datasheet kijk, zie ik dit:
distance (meter) = length of pulse * 170.

Kennelijk verstaat men onder "length of pulse" de tijdsduur tussen de aanvang van de zendpuls en de aanvang van de ontvangen puls,

Die tijdsduur is namelijk de looptijd van het geluid. Ga je ervan uit dat de snelheid van het geluid 340 m/s is dan vind je dus als afstand van het weerkaatsende object 170 maal "length of pulse" omdat het geluid twee maal die afstand doorlopen heeft, teweten heen en terug.

Ik snap dat je deelt door 58 (voor wie het niet snapt: wat is de relatie tussen 170, 58 en 1/x)

Om die vraag te beantwoorden dien ik te weten wat je onder 1/x verstaat. Vooralsnog zie ik geen relatie waaruit ik zelf zou kunnen gissen wat je onder 1/x verstaat.

maar je doet het precies verkeerd.
Afstand (meter) = distance_R * 170;
Afstand (decimeter) = distance_R * 17;
Afstand (centimeter) = distance_R * 1.7;

Als distance_R de tijdsduur is tussen zenden en ontvangen puls en dat blijkt uit je eerste regel dan zijn je volgende twee regels fout, want afstand in dm is een 10 maal groter getal en afstand cm is een 100 maal groter getal dan de afstand in meter.

Opgepast: MaartenBakker citaat: "ruik ik een troll die per ongeluk met de arreslee meegelift is" :

Allemaal bedankt voor het mee redeneren. De code klopt blijkbaar want als ik de Arduino de afstandswaarden laat terugsturen via serialPrint , zijn de waardes logisch. Het valt wel op dat er veel de waarde "0" tussen zit.

edit: je probleem komt me heel bekend voor. Volgens mij heb ik hetzelfde gehad.

Bij mij was het probleem dat ik te snel met de volgende meting begon. Als je in de datasheet kijkt, staat er dat zij aanbevelen om een meting minimaal 60mS te laten duren, oftewel: maximaal 17 metingen per seconde. Als je dat niet doet, heb je kans op de volgende situatie:

je stuurt een signaal uit. Een deel van dit signaal reflecteert en komt 1mS later bij de ontvanger aan. Die denkt 'zo, ik ben klaar'. Je begint de volgende meting, maar het vorige signaal reflecteert nog een keer en komt nu pas binnen. De ontvanger kan geen onderscheid maken tussen het vorige en het huidige signaal, en denkt nu dus dat het signaal binnen 0uS is gereflecteerd.

Oftewel: zet aan het einde van je code nog een delay van 30mS ofzo. je kunt een beetje experimenteren met de lengte van de delay.

[Bericht gewijzigd door muddy op 5 april 2013 09:27:09 (97%)]

Magnetische flux loopt altijd in gesloten paden, elektrische stroom niet per se (volgens de wet van Ampère), want: elektrische lading kan ophopen.

Bedankt allemaal.
Ik heb nu een delay van 80ms er tussen gezet. Dit werkt perfect.
Alleen merk ik wel dat het soms relatief lang duurt vooraleer dat een object word gedetecteerd.
Bijvoorbeeld als ik mijn hand voor de sensor houd dat het eventjes (0.5 s tot 1s) duurt tot mijn led aangeeft dat er iets gedetecteerd is.
Maar dit zal dan wel aan de sensors liggen?

Het kan heel leerzaam zijn, om niet tevreden achterover te leunen, nu het min of meer werkt, maar stuk voor stuk de antwoorden die hier gepost zijn na te lopen en te beoordelen. Eventueel aanvullende metingen doen, daar hoef je geen meetapparatuur voor te hebben als je de controller kunt programmeren en laten blijken wat hij meet.

Ik denk hierbij aan het _aantal_ reflecties op een transmissie van een puls. Aan de hardheid van voorwerpen die reflecteren en dat soort zaken.

En, o ja, leg die deling door 58 even uit, en hoe dat zit met integers en floats, dan ontmoedig je de meedenkers niet voor eventueel beantwoorden van toekomstige vragen van jou of van derden.

Succes

Opgepast: MaartenBakker citaat: "ruik ik een troll die per ongeluk met de arreslee meegelift is" :

Ok even de uitleg :

Het geluid gaat met een snelheid van +/- 340m/s.
Omdat ik meet in cm wordt dit 34000 cm/s.

De formule voor snelheid, afstand en tijd is : V=S/T

Hieruit volgt : T = S/V of T = S/(34000)
Maar omdat het geluid de afstand 2 maal moet afleggen (heen en terug) wordt dit :

T = 2*S/(34000) Ofwel T = S/17000 cm/s

Hieruit volgt :

T = (1/17000)*S Ofwel T = 0.000058*S

Maar omdat we tijd waarschijnlijk het beste kunnen meten in µs :

T/1000000 = 0.000058*S

Nu bereken we de afstand :

T = (0.000058*S)*1000000
T = 58*S

S = T/58

De integers zijn normaal gezien groot genoeg voor de meting ( van - 32768 tot +32768 ).
Een float is nauwkeuriger omdat deze kan dienen om kommagetallen op te slaan.
Voor dit is een integer dus eigenlijk voldoende.

Ik hoop dat het nu wat duidelijk is :)

Ja, dankjewel voor de uitleg het is inderdaad WAT duidelijker, maar wat heeft de eenheid van geleidbaarheid siemens afgekort tot S ermee te maken?

Ofwel T = S/17000 cm/s

Je integers tot 32567 zijn kennelijk krap voldoende om een afstand van 32767/58=564 cm te registreren. Daarboven: bonje. Waarom is die integer 58 en niet 59, omdat de reele waarde 58,82 is, behoudens de temperatuur die je op de CV hebt ingesteld in de hierna te omschrijven habitat en de lokale weersgesteldheid?

Zo wordt het rap een bende, T wordt uitgedrukt in s (seconde) en niet in cm/s. De tijd t tussen verzonden puls en ontvangen reflectie is dus, zoals al zo vaak in dit topic vermeld, de afstand in meter van het reflecterende voorwerp/170 [seconde]. In uw geval als geciteerd, is de tijd dus geen m/s maar meter/[10 ms]. Het is bij een ten opzichte van het gemiddelde beschikbare, beperkte breincapaciteit volstrekt nuttig te oordelen je aan SI eenheden te houden, teneinde totale verwarring en de inherent daarmee gepaard gaande fouten te vermijden. Deel je het gemeten tijdverschil door 17000 in plaats van 170, teneinde het zogenaamd makkelijk te maken, dan kom je niet op seconde uit maar op eenheden van 10 ms. Lekkah makkelijk??

En kunt je nu verklaren wat de oorzaak van auditief hoorbare signalen uit de transducers is, die je met je nog jonge oren meldde, en het paniekverwekkende gekraak dat de transducers produceerden?
Turf nu je gemelde problemen af en verklaar ze, raad ik aan.

Ben je bereid om meerdere, bij voorkeur zelfbedachte, proeven te nemen met de ultrasone trx die je hebt aangeschaft en die de Chinezen voor je bedachten en produceerden voor een habbekrats, compleet met blijkbaar ongelezen doc en derhalve tot vragen in dit topic leidend op CO? Of denk je OK het werkt en verder interesseert het me geen barst, want het werkt zoals ik wil dat het werkt en verder is alles best, blij dat CO hielp, ofwel - totaal andere instelling die er niet toe leidt dat je robot je een kopje thee serveert op korte termijn, bij voorkeur op een verjaardag met een allegaartje stoelen langs de wand van een Vinex doorzonkamertje, waar je hele familie vrienden en kennissen op bezoek zijn - je op lange termijn je gemeenschap helpt te overleven, althans minimaal op het niveau dat je voorvaderen al dan niet met, naar huidige maatstaven, crimineel gedrag voor je prepareerden?

Opgepast: MaartenBakker citaat: "ruik ik een troll die per ongeluk met de arreslee meegelift is" :

Zo dat moest er even uit of niet?

Dat je niet verder dan 564cm kunt meten maakt niets uit. Blijkbaar hebben zowel de TS als jij de datasheet niet gelezen, maar de sensor werkt tot 4m. http://www.micropik.com/PDF/HCSR04.pdf

Over het algemeen ben ik het er wel mee eens om je aan de geldende standaarden te houden. In jouw geval zou ik de afstand in mm opslaan en ook rekenen met mm. Het maakt nu - eerlijk gezegd - redelijk weinig uit omdat het toch maar een projectje voor jezelf is, maar mocht je later in een bedrijf gaan werken, dan wil je dat het begrijpelijk blijft voor anderen.

Over de S in de formule: de kleine letter s wordt in de natuurkunde nog steeds gebruikt om afstand aan te duiden.

Overigens: ik kan me herinneren dat ik met deze sensor tot 30Hz heb kunnen meten. Experimenteer een beetje.

Magnetische flux loopt altijd in gesloten paden, elektrische stroom niet per se (volgens de wet van Ampère), want: elektrische lading kan ophopen.

Op 6 april 2013 17:33:26 schreef muddy:
Zo dat moest er even uit of niet?

Ja.

Overigens, u was toch de bijdrager die schreef:

maar je doet het precies verkeerd.
Afstand (meter) = distance_R * 170;
Afstand (decimeter) = distance_R * 17;
Afstand (centimeter) = distance_R * 1.7;

Als je een aantal stommiteiten op een rij voor je kiezen krijgt en er wordt niet gereageerd op mijn bijdrage:

Je moet dat apparaat aansturen met een positief gaande puls van tenminste 10 microseconde breed.

Vervolgens moet je wachten op een ontvangen reactie, dus niet gelijk weer gaan zenden. Het bereik is omstreeks 4 meter, en als de geluidssnelheid 333 m/s is, is dat minimaal ongeveer 25 ms wachttijd die je moet aanhouden. Doe je dat niet (slechts 200 microseconde lees ik) dan detecteer je ook echo's van vorige uitzendingen.

dan vergaat je de lust wel om "vraagje vraagje" stellers van een antwoord te voorzien.

Dat je niet verder dan 564cm kunt meten maakt niets uit. Blijkbaar hebben zowel de TS als jij de datasheet niet gelezen

BLIJKBAAR?? en wat schrijf ik hierboven dan? TS is er herhaaldelijk van diverse zijden op gewezen, dat er een float behoort te worden gebruikt. Dat de integer in range blijft is puur geluk (conform het spreekwoord dat geluk relateert aan IQ) . Er kunnen trouwens wel degelijk nog reflecties binnenkomen van voorwerpen verder verwijderd dan 4 meter; 4 meter kan onmogelijk een scherpe grens zijn. Dat worden dan ineens negatieve getallen.

Over het algemeen ben ik het er wel mee eens om je aan de geldende standaarden te houden. In jouw geval zou ik de afstand in mm opslaan en ook rekenen met mm. Het maakt nu - eerlijk gezegd - redelijk weinig uit

Dat zou u in mijn geval niet, omdat ik dat namelijk niet zou doen.

omdat het toch maar een projectje voor jezelf is,

U denk het allemaal zo goed te weten maar zat nu juist wel in het door mij geciteerde bestand inmiddels door u vervangen door een nietszeggende bijdrage

edit: laat maar

[Bericht gewijzigd door muddy op 5 april 2013 09:21:25 (97%)]

juist ordes fout door met machten van 10 te vermenigvuldigen in plaats van te delen. Dan zou je toch zeggen dat je met de neus op de harde feiten wordt gedrukt waar ik op wijs, maar nee modder maar lekker door - uw nickname is terecht zo gekozen, en leer er absoluut niets van.

Ik denk niet dat u zich profileert op een wijze die het rechvaardigt mij de maat te nemen.

Opgepast: MaartenBakker citaat: "ruik ik een troll die per ongeluk met de arreslee meegelift is" :

Bedankt voor de hulp allemaal , maar dit is toch een forum waar we ideeën delen en elkaar vriendelijk helpen ipv te zeggen dat het zo of zo beter is.
Dus laten we dat a.u.b zo houden :)

En ik wist inderdaad dat het maximum 4m is , daarom kies ik voor integers.

En je hebt gelijk met die millimeters , maar centimeters vond ik wat duidelijker om mee te denken.

In ieder geval , de sensors werken , ik krijg ze niet zo snel als muddy , maar snel genoeg voor een robot-hoofd :)

Als we elkaar hier al met "u" gaan aanspreken, dan moet je gaan uitkijken.

@Druiloor: niemand moet op je post te reageren. Er is geen wet die dat verplicht. Misschien heb je een wet voor jezelf opgesteld, maar voor anderen geldt die niet. Wen er aan.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Ik heb juist mijn bijdrages weggehaald omdat daar fouten in stonden. Als ik ze had laten staan, dan was er nog meer verwarring ontstaan.

En met 'jou' bedoel ik de TS :-)

Magnetische flux loopt altijd in gesloten paden, elektrische stroom niet per se (volgens de wet van Ampère), want: elektrische lading kan ophopen.
maartenbakker

Golden Member

@druiloor: aangezien ik u als anonymus niet kan mailen, wacht ik nog op een mail met de eerder al eens gevraagde uitleg.

"The mind is a funny thing. Sometimes it needs a good whack on the side of the head to jar things loose."

Kijk ook eens naar de "NewPing" arduino library:
http://playground.arduino.cc/Code/NewPing

Ik heb een aantal van precies hetzelfde type ultrasoon afstandsensor en daarbij werkt het bij mij goed. De library werkt standaard in microseconden delay, maar heeft ook functies om dit weer om te zetten naar bijv. centimeters.