Go Down

Topic: snelheidsmeter voor tennisballen (Read 385 times) previous topic - next topic

danielXD

hoi :)

fijn dat je dit leest!

ik ben bezig voor een snelheidsmeter voor bijvoorbeeld tennisballen. ik heb al een begin gemaakt maar het lukt niet helemaal, want hij geeft valse metingen. en op de serial monitor print hij heel vaak en ik weet niet welke de juiste meting is.

ik heb twee afstandsensoren 100 cm uit elkaar staan en naar de lucht gericht. als de afstand van de eerste sensor minder dan 1m is dan triggert hij en is het de bedoeling dat ie de tijd bijhoudt totdat de tweede sensor triggert. de tijd bijhouden doe ik met de millis functie. als je die tijd door 3,6 deelt dan weet je de snelheid.

ik ben nu pas net klaar met het deel dat hij meet hoeveel tijd er tussen zit dat ze allebei triggeren.

dit is de sketch:

Code: [Select]




unsigned long timeStart;
unsigned long timeEnd;
unsigned long reistijd;
int duration2, distance2;
int duration1, distance1;

int g = 0;
int c = 0;

int trigPin1 = 3;//////
int echoPin1 = 4;

int trigPin2 = 5;
int echoPin2 = 6;//////

 
boolean button1Pressed = false;

void setup() {
  Serial.begin(9600);
  pinMode(trigPin1, OUTPUT);/////
  pinMode(echoPin1, INPUT);
  
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);///////

  
}

void firstsensor(){

  digitalWrite (trigPin1, HIGH);
  delayMicroseconds (10);
  digitalWrite (trigPin1, LOW);
  duration1 = pulseIn (echoPin1, HIGH);
  distance1 = (duration1/2) / 29.1;
    
}
void secondsensor(){
 
    digitalWrite (trigPin2, HIGH);
    delayMicroseconds (10);
    digitalWrite (trigPin2, LOW);
    duration2 = pulseIn (echoPin2, HIGH);
    distance2 = (duration2/2) / 29.1;

}



void loop() {  
     firstsensor();
secondsensor();
      
      if (distance1 < 50){
       timeStart = millis();
       c = 1;
      }
  
        if(distance2 < 50){
            timeEnd = millis();
            reistijd = timeEnd - timeStart;
          
            //hier dus printen op lcd
            reistijd = 0;
            g = 1;
          }

if(c == 1 && g ==1){
Serial.println(reistijd);
c = 0;
g = 0;
}
          
//     Serial.println(distance1);
//    Serial.println(distance2);

            // doe 3,6 gedeeld door de tijd in hele seconden

}

MAS3

Hoi danielXD, welkom.

Die sketch ziet er voor mij op het 1e gezicht best goed uit, ik moet er daarbij van uit gaan dat je overal de juiste formules toepast.
Het klopt dat je heel vaak een waarde ziet komen, want loop wordt steeds uitgevoerd.
Schijnbaar zijn distance1 en distance2 heel vaak kleiner dan 50.
Maar wat ze zijn weet je niet (nul is ook kleiner dan 50, en -1 ook).
Daarom denk ik dat je nu het beste je code kunt gaan uitbreiden met wat debugging functionaliteit.

Die functionaliteit zou wat mij betreft dan bestaan uit een aantal dingen.

Ten eerste voeg je een delay() toe aan je sketch, zodat je tijd hebt om te lezen wat er op je seriële monitor verschijnt.
Delay() moet altijd bestreden worden wat mij betreft, maar juist voor debugging kan dat een enorme uitkomst bieden, en dat stukje gooi je uiteindelijk, als je sketch eenmaal goed werkt, toch weer weg.
De delay() zou ik dan laten optreden nadat je de data naar de seriële poort hebt gestuurd, want zo beïnvloed ie je meting verder niet.
Iets van delay(500) of (1000) ofzo.
Verder zou ik dan ook distance1 en distance2 naar de seriële monitor sturen, vergezeld van een stukje identificatie, zodat je ook weet wat je ziet.
Plus 1 of 2 lege regels.
Nu zie je dus veel meer informatie op je seriële monitor verschijnen, en wellicht kun je daaruit opmaken wat er mis gaat.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

danielXD

bedankt voor het antwoord ik ga het proberen! :)

danielXD

Hoi danielXD, welkom.

Die sketch ziet er voor mij op het 1e gezicht best goed uit, ik moet er daarbij van uit gaan dat je overal de juiste formules toepast.
Het klopt dat je heel vaak een waarde ziet komen, want loop wordt steeds uitgevoerd.
Schijnbaar zijn distance1 en distance2 heel vaak kleiner dan 50.
Maar wat ze zijn weet je niet (nul is ook kleiner dan 50, en -1 ook).
Daarom denk ik dat je nu het beste je code kunt gaan uitbreiden met wat debugging functionaliteit.

Die functionaliteit zou wat mij betreft dan bestaan uit een aantal dingen.

Ten eerste voeg je een delay() toe aan je sketch, zodat je tijd hebt om te lezen wat er op je seriële monitor verschijnt.
Delay() moet altijd bestreden worden wat mij betreft, maar juist voor debugging kan dat een enorme uitkomst bieden, en dat stukje gooi je uiteindelijk, als je sketch eenmaal goed werkt, toch weer weg.
De delay() zou ik dan laten optreden nadat je de data naar de seriële poort hebt gestuurd, want zo beïnvloed ie je meting verder niet.
Iets van delay(500) of (1000) ofzo.
Verder zou ik dan ook distance1 en distance2 naar de seriële monitor sturen, vergezeld van een stukje identificatie, zodat je ook weet wat je ziet.
Plus 1 of 2 lege regels.
Nu zie je dus veel meer informatie op je seriële monitor verschijnen, en wellicht kun je daaruit opmaken wat er mis gaat.
ik heb dit geprobeerd en nu zijn de metingen een beetje onrealistisch zou u me daar misschien mee willen helpen

dit is trouwens nu de code:

Code: [Select]

 /*ik heb twee afstandsensoren en als de afstand kleiner
 dan 1 meter is dan is er een bal langs gegaan en dan meet
   hij de tijd die de bal erover doet om 1 meter te reizen
  met mn opa heb ik ernaar gekeken en als de afstandsensoren
  1 meter uit elkaar doen dan moet je 3,6 delen dooor de tijd
  in hele seconden dan heb je de km p/u

*/

unsigned long timeStart;
unsigned long timeEnd;
unsigned long reistijd;
int duration2, distance2;
int duration1, distance1;



int trigPin1 = 3;//////
int echoPin1 = 4;

int trigPin2 = 5;
int echoPin2 = 6;//////

 
boolean button1Pressed = false;

void setup() {
  Serial.begin(9600);
  pinMode(trigPin1, OUTPUT);/////
  pinMode(echoPin1, INPUT);
 
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);///////

 
}

void firstsensor(){

  digitalWrite (trigPin1, HIGH);
  delayMicroseconds (10);
  digitalWrite (trigPin1, LOW);
  duration1 = pulseIn (echoPin1, HIGH);
  distance1 = (duration1/2) / 29.1;
   
}
void secondsensor(){
 
    digitalWrite (trigPin2, HIGH);
    delayMicroseconds (10);
    digitalWrite (trigPin2, LOW);
    duration2 = pulseIn (echoPin2, HIGH);
    distance2 = (duration2/2) / 29.1;

}



void loop() { 
firstsensor();
secondsensor();
     
      if (distance1 < 50){
       timeStart = millis();
   
      }
   
        if(distance2 < 50){
            timeEnd = millis();
            reistijd = timeEnd - timeStart;


          if(reistijd != 0 && reistijd < 500){
//             reistijd = 3,6 / reistijd;   
         delay(40);
            Serial.println(reistijd);
            //hier dus printen op lcd
           
          }
          }


}
         
//     Serial.println(distance1);
//    Serial.println(distance2);

            // doe 3,6 gedeeld door de tijd in hele seconden



MAS3

Hoi.

De code die je hebt geplaatst lijkt me niet compleet.
Verder zegt de tekst "en nu zijn de metingen een beetje onrealistisch"mij ook niet veel.
Dus wat zie je en wat had je daarvoor in de plaats verwacht.
Ik kan alleen met je meekijken naar de code en daar iets over zeggen.
Ik heb hier niet van zulke sensoren, en kan dus ook niet zo'n opstelling maken.
Dat is waarom ik je eerder vertelde hoe je kunt gaan debuggen, das dus het opsporen van fouten.
In de code die je nu geplaatst hebt, zie ik nergens staan dat je de meetwaarde waar je mee gaat rekenen, via de seriële verbinding verstuurt, wel dat je wat anders eruit hebt gesloopt.
Als je die waardes kunt zien, kun je namelijk eens bekijken wat daar mis mee zou kunnen zijn.

Verder zie ik dat je wel een delay hebt toegevoegd, maar die staat ergens anders als waar ik 'm heb aangeraden, en hij is ook heel kort.
40 milliseconden gebeurt 25 keer per seconde, zo snel kun jij geen regel tekst lezen, ook niet als dat maar uit 1 woord bestaat.

Nieuw is de controle of reistijd geen nul en kleiner dan 500 is.


Wat ik graag van je wil weten is dus wat je bedoelt met 'onrealistisch', en wat de inhoud van distance1, distance2 en reistijd is.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

MAS3

Ik zie trouwens nog iets anders.
Je kijkt of het object al in zicht is, door te kijken of de afstand kleiner dan 50 is.
Dat blijf je doen, en zo lang als het object in zicht blijft, maak je timeStart en/of timeEnd aan.
Ik weet niet hoe vaak jouw object gezien word per sensor, maar ik denk dat je 'm maar 1 keer (de eerste keer) per sensor wil registreren.
Dus moet je niet alleen kijken of je het object kunt zien, maar ook of je 'm al eerder gezien hebt.
Of beter gezegd, je moet 'm alleen zien als je 'm niet eerder zag.
Pas als je je rekensom hebt gemaakt en de snelheid hebt bepaald, kun je weer vergeten dat je je object gezien hebt.

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

danielXD

Bedankt voor het helpen! Ik ga er vanmiddag mee bezig.

shooter

je gebruikt reistijd twee keer, en als unsigned long maar dat moet eigenlijk een float zijn.
dus gebruik bijv snelheid =float( reistijd)/3.6
je denkwijze is wel goed, echter als de bal door de eerste is gezien, dan moet je die sensor niet meer scannen, want het kan 3 minuten duren voor er een timeout is.
dus als je de bal ziet op de eerste dan alleen kijken naar sensor2, met een korte timeout van bijvoorbeeld 51.
want als de bal er nog niet bij sensor2 is, dan duurt het veel te lang voordat sensor2 reset.
Je moet dus heel vaak pulsen, want anders is de bal alweer weg, voordat voordat de bundel hem ziet.
Een andere manier is om slechts 1 sensor te gebruiken en dan 2 maal de afstand te meten, en dan kun je ook de afgelegde afstand bepalen.
Voordeel is simpeler detectie .


paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

MAS3

Ben je eigenlijk nog verder gekomen ?

Als het inderdaad zo is dat je het object meerdere malen per sensor kunt zien, dan zou je kunnen overwegen of je niet kan registreren wanneer het object het eerst gezien word, en wanneer die voor het laatst gezien word (door 1 sensor dus, zoals shooter al zei).
Maar dan moet je wel rekening houden met een aantal zaken denk ik.
Zoals hoe het traject van die bal verloopt en de hoek die die sensor kan zien.

reistijd word aan het eind omgezet naar snelheid, maar heet dan nog steeds reistijd.
Wellicht niet netjes, maar verder lijkt het me niet zo'n probleem.
Maar als je daar nu aan begint te twijfelen, kun je de 2e dus ook een andere naam geven.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

shooter

ja dat reistijd is wel een probleem want hij gaat van INT naar FLOAT.

paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

daniellll

hoi ik ben mn wachtwoord vergeten  :)  :)  :)  :) , dus ik ben danielXD maar alleen op een ander account
dus allemaal heel erg bedankt voor het meedenken! en sorry dat het even duurde voordat ik antwoordde

ik ben nog niet heel veel verder gekomen. ook denk ik dat het oppervlak te klein is om een bal in te mikken om nog meer afstandsensoren te gebruiken wordt het een beetje duur. dus ik denk dat ik het als volgt wil gaan doen:

ik schrap het idee van de afstandsensor en ik ga bezig met 2 lasers.

er zijn twee U-vormige frames van hout waar aan de onderkant een laser zit en met spiegeltjes bedekt de straal de hele U. aan het einde van de straal is een lichtsensor. en als de lichtsensor bijv. lager dan 1000 is(in analoge waardes) dan is er een bal doorheen gekomen. als je 2 van die frames hebtkan je dus detijd ermee meten. 2 lasers van in totaal 10 euro is een stuk voordeliger dan 10 afstandsensoren van 50 euro.
ook denk ik dat het programma wat makkelijker wordt omdat je niet die pulsen hoeft te veranderen want daar snap ik niks van  :) .

mijn vragen aan jullie:
- 1 denken jullie dat een lichtsensor snel genoeg is om een erg snelle bal te meten?
- 2 vinden jullie dit een goed plan en zijn er misschien verbeterpunten?
- 3 zouden jullie misschien een code kunnen maken die een beetje werkt als mijn vorige maar dan dat jullie het verbeteren met dat int en float en dan doe ik het deel van dat de lichtsensor een bal detecteert(het hoeft niet hoor :) )

heel erg bedankt voor het lezen :) !!!!

MAS3

Hoi DanielXD.
De kans is heel klein dat je inderdaad je wachtwoord bent vergeten.
Veel groter is de kans dat je ten slachtoffer bent gevallen aan de grillen van de eikels die hier de site runnen.
Dat zijn niet de moderatoren, maar degenen die het programmeer werk doen aan de site.
Die hebben namelijk bedacht dat het wel een goed idee is om zomaar dingen aan de site te gaan veranderen.
En er dan vanzelf wel achter komen of het goed gaat of niet.
Nou het gaat niet goed, en omdat zij zelf de site niet gebruiken, zal het ze dus ook aan de reet roesten of het wel goed gaat.
Er zijn nieuwe regels over wachtwoorden gemaakt.
Maar niemand heeft daar iets over gezegd.
Erger nog, die nieuwe regels gelden ook voor oude wachtwoorden.
En omdat jouw oude wachtwoord schijnbaar niet bekend stond als een heel sterk wachtwoord, krijg je dus altijd te zien dat je wachtwoord onjuist is, ook als het het wachtwoord is dat je hebt opgegeven.
Een sterk wachtwoord heeft kleine letters, hoofdletters, cijfers en speciale tekens er in.
Dus zoiets: $t3RkW0orD.
En daar houdt het niet op met de problematiek.

Ik heb geen idee of een lichtsensor snel genoeg is voor een snelle bal.
Licht zelf is wel zeker snel genoeg om die bal te zien.
En houd er ook rekening mee dat er nog meer is dat voldoende mee moet kunnen met de snelheid.

Voor wat betreft het maken van een code, ik vind dat je dat zelf moet doen.
Dat kost je tijd, maar je leert er ook van.
En dat vind ik het belangrijkst.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Go Up