meten hoelang een fotosensor onderbroken is [OPGELOST]

Hey,

in m'n projectje (chronometer hondensport) stoot ik als beginneling op een praktisch probleempje/

m'n chronometer project moet van verschillende, opeenvolgende honden een tijdsopname doen.

ik kan perfect een tijdsopname doen van 1 hondje, no problem.

maar als een volgende hond in de baan komt heb ik momenteel een klein? probleem.

het zit zo:

er staan twee rijen fotocellen op 15 cm uit elkaar aan de ingang van de baan.
voor alle gemak noem ik ze A & B, waarbij A de zijde naar de geleiders is (en dat is ook tegelijk de chrono lijn) en B de zijde van de baan is, (hier wordt bepaald of er al dan niet een hond in de baan is)

de eerste hond komt in de baan, en er wordt een tijd genomen, quasi ogenblikkelijk daarna kruist de neus van de hond ook lijn B, dus er zijn twee sensorlijnen gelijktijdig onderbroken gedurende x aantal duizendsten van een seconde (variabel naargelang de snelheid van de hond).

op een bepaald moment verlaat het achterlijf van de hond sensorlijn A maar is nog actief binnen sensorlijn B, tot op het moment dat de hond daar ook volledig doorgelopen is.

de hond gaat om een balletje en komt terug...
eerst door sensorlijn B ditmaal en quasi ogenblikkelijk erna ook door sensorlijn A.

op het moment dat de hond door sensorlijn A loopt richting baasje, dan neem ik terug een tijd op.

nu zijn er een aantal mogelijkheden voor de daaropvolgende 3 honden:

  1. de volgende hond is een ietsje te laat vertrokken en de eerste hond is al uit de beide sensorlijnen eer de volgende hond aan de sensors komt

  2. de volgende hond is veel te vroeg vertrokken, en loopt door de sensorslijnen A & B vooraleer de vorige hond door sensorlijn B gelopen is

  3. de volgende hond en de eerdere hond lopen quasi gelijktijdig door de beide sensorlijn, maar de eerste hond was eerst door sensorlijn B en dan pas de volgende hond door sensorlijn A (dit is wat we beogen in deze sport, de nauwst mogelijke kruisingen van 2 honden)
    in dit geval is het quasi onmogelijk om te zien hoeveel duizendsten de tweede hond over had op z'n kruising omdat beide honden gelijktijdig door de beide sensorlijnen lopen...

  4. de eerste hond maakt een fout en komt naast de baan terug, en loopt dus niet door sensorlijnen A & B bij de terugkeer (hierop reageert de lijnrechter door een welbepaalde lamp aan te zetten), de volgende hond komt dus door de sensors en krijgt een foutmelding daardoor

  5. de eerste hond is juist niet helemaal uit de sensorlijn A als de volgende hond er net wel inkomt, waardoor de sensorlijn A niet onderbroken werd maar wel de sensorlijn B zeer kortstondig.

nu heb ik reeds een groot deel van deze mogelijkheden uitgezet in een excel bestand, met een tijdsinterval van 1 milliseconde.

mijn grootste probleem is momenteel het volgende:

als er een hond door de sensorlijnen loopt dan verzet ik een vlag (HIB = Hond In Baan), maar doordat de honden x aantal milliseconden de sensors onderbreken, komt bij een volgende doorgang van de loop{} natuurlijk direct de volgende voorwaarde voor een tijdsopname kijken

hieronder een stukje van m'n huidige code:

Hond =0;
debounceB =0;

//#### Routine voor de "A" sensor bij een correcte 1ste hond naar de box ####
      if (startLijnSensor == HIGH && HIB == LOW && toonDisplay == LOW && debounceB == 0)
         {
           Hond++; // toon aan dat hond 1 in de baan is
           Heat[Hond].wisselTijd = millis(); // neem een eerste tijd
           toonDisplay = HIGH; // toon aan dat de gegevens op een bepaald moment mogen getoond worden (idle)
         }
//#### Routine voor de "B" sensor bij het doorlopen NAAR de box ####
      if (passLijnSensor == HIGH && HIB == LOW && debounceB == 0)
         {
           debounceB = millis(); // neem een tijd voor later gebruik
           HIB = HIGH; // Toon aan dat er een hond op de baan zit
         }
//#### Routine voor de sensor :  "FotoCelB" bij het doorlopen NAAR de geleider ####
      if (passLijnSensor == HIGH && HIB == HIGH && (millis() - debounceB) > 1000 && debounceB != 0)  
         {
           HIB = LOW; // de hond heeft net de baan correct verlaten
           toonDisplay = LOW; // toon aan dat er bij "idle" terug gegevens mogen getoond worden
         }
//#### Routine voor de sensor :  "FotoCelA" bij het doorlopen NAAR de geleider van 1° hond ####
      if (startLijnSensor == HIGH && HIB == LOW && toonDisplay == LOW && debounceB > 0 )
         {
           Heat[Hond].loopTijd = millis(); // neem de eindtijd van deze hond
         }
//#############################################################

in feite moet ik kunnen meten of een fotosensor onderbroken werd of niet gedurende een bepaalde tijd (een vaste waarde helpt niet, omdat niet alle honden even snel lopen)

ik zoek dus naar een systeem dat me verteld:

de sensorlijn (A of B) is gedurende x milliseconden NIET onderbroken geweest, dus de nieuwe voorwaarde gaat pas in nadat er een onderbreking was...
enige uitzondering is de perfecte kruising, waarbij de doorgang van de twee honden als een vloeiend geheel waargenomen wordt

iemand een idee?
ik vrees eigenlijk dat dit zelfs voor een wiskundige & programmeur is, want ik loop steeds terug vast tegen de loop{} functie

ik ben wel in het bezit van een demo programma waarop dit visueel wordt weergegeven als iemand dit nuttig zou vinden

Grtz,
Yves

Yves, ken je de uitdrukking: " Eén beeld zegt meer dan duizend woorden. " ?

misschien kun je een schema posten hoe de opstelling van de sensors is en hoe(veel) honden op welke manier door de sensorpoortjes kunnen lopen.
Ik kan me niet helemaal visueel voorstellen hoe de door jouw beschreven zaken in een soort tijdsdiagram er uit gaan zien.

Hey Cartoonist,

ik heb een hulpprogramma die alles in bewegende beelden duidelijk maakt..
is niet groot, en veilig, maar weet bij god niet hoe ik het kan doorsturen via deze weg aan je

Grtz,
Yves

Je kunt het programmatje inpakken als *.zip.
Vervolgens ga klik je op reply (dus niet de quick reply).
Daarna type je je berichtje, en klik je op de tekst "Attachments and other options", direct onder het edit venster waar je zojuist je bericht hebt ingetypt.
Nu kun je op "bladeren" of "browse" als je Engels als taal hebt ingesteld klikken.
Je mag hier onder andere zipjes toevoegen.
Dan op post klikken en klaar is Klara.

Hey MAS3,

ga dat hier eens direct proberen zie :slight_smile:
het programma is ook vertaald naar het engels

grtz,
Yves

Stridani.zip (363 KB)

Ik kan het demo programma op mijn linux-PC in een windows-zandbak afspelen.

echter:
Het demo is niet consequent in het verloop.
Als ik een van de drie foutieve mogelijkheden (outside,error of early passing) uitprobeer dan met hoge snelheid licht het rode fout bolletje even op.
Op lage snelheid licht het rode fout bolletje niet op want het verloop ziet er precies eender uit als in een ok of OK loop.

Zeer verwarrende demo, daar kom ik niet veel verder mee.

De demo helpt ook mij niet echt verder ivm wat er nu precies misloopt, maar hij bevestigt wel mijn idee over hoe de situatie er 'in the real world' uit ziet...
En dat bevestigt dan weer mijn oorspronkelijke vermoeden dat wat jij wil doen met 2 sensoren gewoonweg niet mogelijk is...

Om de richting van 1 hond te bepalen, heb je 2 sensoren nodig.
Als de linkse sensor eerst onderbroken wordt, en dan de rechtse, dan weet je dat de hond van links naar rechts loopt. En vice versa.
Als een andere hond daar even zijn neus tussen steekt, dan weet 'het systeem' gewoonweg niet meer wat er aan de hand is...

EDIT: volgend mij zal elke hond zijn eigen 2 sensoren op zijn eigen baan nodig hebben...

Hey Janosik & Cartoonist,

ik ben er wel in geslaagd om de fouten waar te nemen, het enige wat momenteel onmogelijk is om de kleinst mogelijke kruising waar te nemen (maar daar heb je volgens mij extra hardware nodig die dan aan de beide zijden van de sensorgate opgesteld staat (bvb sonar module) en waarmee je de aankomende hond(bruin) zijn snelheid gaat vergelijken met de uitkomende hond(grijs)

de real-world situatie ziet er min of meer als volgt uit:
het is een soort van 4x15,5 meter voor honden, waarbij de volgende hond pas de baan op mag als de vorige op z'n minst door de passline gelopen is.

na veel gehakketak heb ik het toch kunnen oplossen (en heb er bovendien een heel stuk oude code mee kunnen weglaten).

in feite komt het er op neer dat ik aan elke beweging een letter toegekend heb:
A voor de eerste sensor bij het doorgaan
B voor de tweede sensor bij het doorgaan
B voor de eerste sensor bij het terugkeren
A voor de tweede sensor bij het terugkeren

dus "A"-"AB"-"ABB"-ABBA" is een correcte run (zie video van ons team, dichtsbijzijnde baan)
voorbeeld van een correcte run met extra scherpe kruisingen

echter "A"-"AB"-"ABA"-"ABAB" is een run waarbij de volgende hond te vroeg inkomt op de uitgaande hond...

opmerking : mijn sensors gaan bij een onderbreking op "LOW" staan voor alle duidelijkheid

void Check_Sensor_Tijd()
{
  int buttonState1 = digitalRead(FotocelA);
  int buttonState2 = digitalRead(FotocelB);
  
  if (buttonState1 == LOW && richting == "")
  {
    sLS_aan = millis(); //sLS => startLijnSensor => op de demo de rechtse lijn
    richting += 'A';      // richting is nu 'A'
  }

  if (buttonState2 == LOW && richting == "A")
  {
    pLS_aan = millis(); //pLS => passLijnSensor => op de demo de linkse lijn
    richting +='B';       // richting is nu 'AB'
  }

  if (buttonState2 == LOW && richting == "AB" )
  {
    richting +='B';       // richting is nu 'ABB'
  }

  if (buttonState1 == LOW && richting == "ABB")
  {
    sLS_uit = millis();
    richting += 'A';      // richting is nu 'ABBA'
  }
}

dus in feite heb ik nu eindelijk na quasi een jaartje ploeteren (en vreselijk véél goede raad van een aantal mensen op dit nederlandstalig forum) een werkend systeem (dat wel vatbaar is voor een aantal fancy verbeteringen natuurlijk)

nu kan ik proefdraaien en de timing voor de foutafhandeling optimaliseren...
en ik zal zeker nog terug komen, want ik heb nog een miljoen vragen in petto (vooral hardwarematig)

Grtz,
Yves