Hey,
ik heb een "debouncing" probleempje...
in het EJS systeem heb ik de fotocellen mooi aan het werk gekregen (gewoon de interne PULL-UP inschakelen, en als de cellen doorbroken worden dan krijg ik een "LOW" uitgang), ik heb de code als dusdanig moeten aanpassen, maar kom met wat "trial & error" ben ik er toch mooi geraakt.
ik ben nu perfect in staat om een tijdsopname te doen....met een bierviltje
op zich best leuk, maar een bierviltje onderbreekt nooit de 2 rijen fotocellen tegelijk natuurlijk.
ik heb in feite iets nodig (soort debounce) waarmee ik de µCU duidelijk kan maken dat, als een rij cellen doorbroken wordt of beide rijen tegelijk (een doorsnee Border Collie is nu eenmaal langer dan zo'n 10cm )
dat enkel de eerste waarneming telt, hierop werkt mijn code een aantal "vlaggen" af
maar doordat m'n fotocellen nog géén debouncing hebben, gebeuren alle waarnemingen zéér snel na elkaar
//---- Hieronder de routine bij een correcte start ----
/*
sensorState1 is de waarde van sensorA => LOW bij doorbreken lichtstraal dus
S1 is een vlag die geswitched wordt om aan te duiden dat de hond richting toestel loopt,
deze vlag wordt hoog gezet bij het startsignaal
naarDeBox & naarGeleider zijn vlaggen voor aanduiding welke richting een hond net uitgaat,
bij startsignaal worden die op LOW gezet
*/
if (sensorState1 == LOW && S1 == HIGH && naarDeBox == LOW && naarGeleider == LOW)
{
//verhinderen dat er meerdere tijden genomen worden van de 1ste hond!
if (checkLoopTijd == LOW && Hond == 0)
{
neemTijd(); // neem de tijd op, en verwerk die
toonTijd(); // berekenen de tijden en geef die weer op de display's
checkLoopTijd = HIGH; // zet de vlag om, om een tweede tijd te verhinderen
/*
aantonen dat deze routine maar één maal doorlopen mag worden
hiertoe zetten we vlag S1 op hoog
*/
S1 = LOW;
}
}
//---- Routine voor de sensor : "FotoCelB" bij het door NAAR de box lopen
if (sensorState2 == LOW && S1 == LOW && naarDeBox == LOW && naarGeleider == LOW)
{
naarDeBox = HIGH; // de hond loopt nu voor de eerste maal door de tweede rij fotocellen, op 10cm van de eerste rij
}
/*
hier is de hond onderweg naar het toestel om een bal op te halen, de meeste honden hebben hiervoor >= 4seconden nodig
maar hier zit het probleem net, de hond is zojuist door deze sensor gegaan, maar er volgt nog minimum 80cm lichaam na het
voor het eerst doorbreken van deze sensor
*/
//---- Routine voor de sensor : "FotoCelB" bij het door NAAR de geleider
/*
door mijn véél te lange honden :P kom ik quasi ogenblikkelijk in deze routine terecht
waardoor ik een foutief beeld krijg van de tijden
*/
// de Hond keert terug door de eerste rij fotocellen en was minimum 3,5 seconden onderweg
if (sensorState2 == LOW && S1 == LOW && naarDeBox == HIGH && naarGeleider == LOW)
{
S1 = HIGH;
naarDeBox = LOW;
naarGeleider = HIGH;
checkLoopTijd = LOW;
}
//---- Routine voor de sensor : "FotoCelA" bij het door NAAR de geleider
if (sensorState1 == LOW && S1 == HIGH && naarDeBox == LOW && naarGeleider == HIGH)
{
if (checkLoopTijd == LOW && Hond == 0)
{
doeietsmettijden(); // verwerkt de data tot een bruikbaar geheel
S1 = HIGH; // maak dat de volgende hond door kan komen
naarDeBox = LOW;
naarGeleider = LOW;
checkLoopTijd = HIGH;
Hond++;
}
}
ik heb al zitten proberen met de voorbeeld routine "Debounce", maar ik geraak er niet, omdat de ene hond al wat sneller door de sensors loopt dan de andere
hieronder wat ik probeerde :
//---- Routine voor de sensor : "FotoCelB" bij het NAAR de box lopen
if (sensorState2 == LOW && S1 == LOW && naarDeBox == LOW && naarGeleider == LOW)
{
debounceTijdSensorB = millis();
naarDeBox = HIGH;
}
//---- Routine voor de sensor : "FotoCelB" bij het NAAR de geleider lopen
if (sensorState2 == LOW && S1 == LOW && naarDeBox == HIGH && naarGeleider == LOW)
{
// 120 millis is ongeveer de lichaamslengte van een border collie op volle snelheid
if ( (millis() - debounceTijdSensorB) >= 120)
{
S1 = HIGH;
naarDeBox = LOW;
naarGeleider = HIGH;
checkLoopTijd = LOW;
}
}
iemand een voorzetje voor mij?
ik heb me hier al een punthoofd op gezocht
Grtz,
Yves
EDIT : hieronder een link voor een klein progje om het flyballen visueel voor te stellen:
http://users.skynet.be/fd193453/FD/Stridani.zip
Is van een collega flyball club uit Tjechië
Hierop kun je goed zien waarvoor het "debouncen" moet dienen.