Laserowa bramka do pomiaru czasu

Tu można uprawiać dyskutanctwo ;-)

Moderatorzy: moderatorzy2014, moderatorzy

Awatar użytkownika
PiotrSz
Posty: 3518
Rejestracja: środa 21 sie 2013, 22:04
Lokalizacja: Olsztyn

Laserowa bramka do pomiaru czasu

Post autor: PiotrSz »

Kolega którego żona zajmuje się zawodami jeździeckimi poprosił mnie żebym spróbował zbudować mu prosty system pomiaru czasu który będzie startował pomiar po pierwszym przejechaniu jeźdźca przez bramkę a zatrzymywała czas po ponownym przejechaniu. W danej chwili na torze będzie znajdował się jeden koń więc nie ma problemu z identyfikacją kto przejeżdża.
Znalazłem na forum forbot.pl taki temat
Przy budowie coraz szybszych line follower'ów są coraz większe problemy z dokładnym pomiarem czasu. Dokładny czas pomaga sprawdzić czy jest poprawa w jeździe. Przedstawiam tu jeden z najszybszych i najtańszych sposób zrobienia sobie bramek do pomiaru czasu.

Elektronika

Cały układ opiera się na arduino. Jest z nim taka wygoda ,że nie ma problemu żeby uruchomić uart. Jako czujnik wykorzystany jest fototranzystor 3mm. Jako laser wykorzystany jest najtańszy wskaźnik laserowy.
IMG_4ec2de03694d07386.png
IMG_4ec2de03694d07386.png (1.41 KiB) Przejrzano 3940 razy
Programy

Program do arduin'a:

Kod: Zaznacz cały

int laser = 0; 
int first = 0;
void setup()
{
 Serial.begin(9600);
}

void loop()
{
   laser = analogRead(0);
   if (first == 0 & laser < 1000){    
     Serial.print(1);
     delay(1000); //zabezpieczenie przed podwójnym uruchomieniem
     first = 1;
     laser = analogRead(0);
}
laser = analogRead(0);
if (first == 1 & laser < 1000 ){ 
 Serial.print(2);  
}
}
Jako ,że program jest na tyle prosty wydaje mi się ,że jest zrozumiały bez komentarzy.

Do pomiaru czasu służy program napisany w delphi. W programie użyty jest port COM5. Cały program jest tak napisany aby był jak najprostszy. Podczas uruchamiania programu arduino musi być podłączone. Po wciśnięciu przycisku start należy poczekać aż przycisk się zdezaktywuje jest to czas na reset arduin'a. Zmierzony czas nie może być mniejszy niż 1s ze względu na zabezpieczenie przed zatrzymaniem czasu zanim robot przejedzie przez bramkę.
IMG_4ec2dfeceba9a3089.png
IMG_4ec2dfeceba9a3089.png (5.32 KiB) Przejrzano 3940 razy
IMG_4ec3c5db6ee8f6048.jpg
IMG_4ec3c5db6ee8f6048.jpg (28.24 KiB) Przejrzano 3940 razy
IMG_4ec3c5cca122f4956.jpg
IMG_4ec3c5cca122f4956.jpg (50.2 KiB) Przejrzano 3940 razy
Czas.rar
Na forum arduinowców jest sporo a ja w tym temacie jestem zielony.
Czy znajdzie ktoś chwilę żeby mi pomóc z przerobieniem softu tak żeby pomiar startował się samodzielnie ?

Bramkę robię pro bono czyli za przysłowiową butelkę księżycówki + koszt materiałów ;-) więc w razie co na zlocie mogę się podzielić ;-)
Temat wrzucam do Hyde Parku bo on nie jest jakoś strikte modelarski.
Awatar użytkownika
Głuś
Posty: 1487
Rejestracja: sobota 01 mar 2014, 14:03
Lokalizacja: Lubelskie
Kontakt:

Re: Laserowa bramka do pomiaru czasu

Post autor: Głuś »

Wiesz troszku ciężko się pisze nie mając płytki na stole bo nie można od razu sprawdzić, ale po mojemu i o ile Cię dobrze zrozumiałem to będzie tak:

Kod: Zaznacz cały

int laSer;
unsigned long zapamietanyCzas;
int odczytLasera;
unsigned long pomiarCzasu;

void setup() {

  Serial.begin(9600);

}

void loop() {
  laSer = analogRead(0);
  if (odczytLasera == 0 && laSer <= 1000) { //pierwsze przeciecie wiazki swiatla #tutaj byc moze piwinno byc laSer >= 1000, nie pamietam co wypluwa analogRead podczas przeciecia wiazki swiatla - trzeba sprawdzic.

    zapamietanyCzas = millis();
    odczytLasera = 1;
  }

  else if (odczytLasera == 1 && laSer <= 1000) { //drugie przeciecie wiazki swiatla #tutaj byc moze piwinno byc laSer >= 1000, nie pamietam co wypluwa analogRead podczas przeciecia wiazki swiatla - trzeba sprawdzic.
    pomiarCzasu = millis() - zapamietanyCzas; //trzeba to jeszcze zamienic na jakies bardziej przyjazne jednostki
    float pomiarSekundy = pomiarCzasu / 1000; //o ile mnie pamiec nie myli tak to powinno byc bo 1000ms to s. Mozna przeliczyc jeszcze zeby minuty wypluwalo.
    Serial.println(pomiarSekundy);
    odczytLasera = 0;
  }
}
Tak na szybko napisałem po nocy więc jak ktoś wie lepiej to niech wskaże lepsze rozwiązanie, a nie burczy zaraz :-P Zaznaczam że nie jestem programistą w C...
Pewnie coś pokićkałem bo spać mi się chce, ale wgraj i sprawdź to dojdziemy co i jak ;-)
Ostatnio zmieniony środa 17 paź 2018, 23:19 przez Głuś, łącznie zmieniany 3 razy.
Moje modele https://fpv.com.pl
Gogielki Eachine EV300D na dwa pasma jednocześnie ;-)

Pozdrawiam
Wojtek
Awatar użytkownika
PiotrSz
Posty: 3518
Rejestracja: środa 21 sie 2013, 22:04
Lokalizacja: Olsztyn

Re: Laserowa bramka do pomiaru czasu

Post autor: PiotrSz »

Głuś, dzięki za reakcję. Arduino mega jest w drodze i powinien razem ze wskaźnikiem laserowym być do końca tygodnia, wtedy sprawdzę to co spłodziłeś.
Awatar użytkownika
Głuś
Posty: 1487
Rejestracja: sobota 01 mar 2014, 14:03
Lokalizacja: Lubelskie
Kontakt:

Re: Laserowa bramka do pomiaru czasu

Post autor: Głuś »

Mega do tak prostego programu to aż szkoda :-) Wystarczy promini (ewentualnie nano) z prockiem 328, a nawet i 168, ale tych starszych zwyczajnie nie opłaca się już kupować bo różnica w cenie to ~40 centów ;-)
Do tego bym zamówił taki ekranik: https://www.aliexpress.com/item/1pcs-0- ... 4c4dx0gp2Q i żaden programik, ani UART Ci nie potrzebny.
Jak już mocno byś chciał na Mega to można dokupić taki TFT: https://www.aliexpress.com/item/3-2-inc ... 4c4dflS8F0 (tylko poczekaj na czarne piątki i inne "halołiny") bo ja je po niecałe 6$ brałem rok temu :-)
Na tym można by zrobić np. żeby pokazywało 6 ostatnich pomiarów, a nawet i dużo więcej - zależnie od wielkości czcionki. Do tego ma od razu obsługę SD po SPI więc można pomiary na kartę pamięci zapisywać. Dodajemy https://www.banggood.com/3Pcs-DS3231-AT ... rehouse=CN i mamy pomiar z aktualnym czasem zmierzenia.
Teraz są jeszcze fajniejsze TFT sterowane z UART, ale nie miałem takiego w łapkach, musiał bym go mieć na biurku żeby coś pod niego napisać.

Na razie sprawdź czy działa to dopisze jeszcze żeby dioda mrygała podczas startu i mety np. raz i dwa razy.

PS. Poprawiłem w poprzednim poście dwa drobiazgi.
PS2. Dobra poprawiłem jeszcze raz, bo tamto na kolanie w pociągu i po nocy pisałem :-P W sumie będzie działać tak samo, ale krócej i przejrzyściej jest. :roll:
Ostatnio zmieniony środa 17 paź 2018, 23:23 przez Głuś, łącznie zmieniany 1 raz.
Moje modele https://fpv.com.pl
Gogielki Eachine EV300D na dwa pasma jednocześnie ;-)

Pozdrawiam
Wojtek
Awatar użytkownika
pawelsky
Posty: 9750
Rejestracja: środa 19 mar 2014, 02:03
Lokalizacja: Polska
Kontakt:

Re: Laserowa bramka do pomiaru czasu

Post autor: pawelsky »

Głuś pisze:Wystarczy promini (ewentualnie nano)
Zdecydowanie Nano (kosztuje $2) - mocniejszy regulator i wbudowane USB (nie trzeba cudowac z zewnetrznymi donglami do programowania).

Co do samego programu to nie zadziala poprawnie, bo pomiar czasu zakonczy sie praktycznie natychmiast po przeslonieciu bramki (bedzie ona przeslonieta przez jakis czas). Trzeba wprowadzic kilkusekundowe opoznienie drugiego pomiaru.
Awatar użytkownika
Głuś
Posty: 1487
Rejestracja: sobota 01 mar 2014, 14:03
Lokalizacja: Lubelskie
Kontakt:

Re: Laserowa bramka do pomiaru czasu

Post autor: Głuś »

pawelsky, no nie wiem... ostatnio na ali bywają nano wątpliwej jakości, w lecie uruchomiłem sterownik do wentylacji (dwa wentylatory: jeden tłoczy chłodne powietrze z piwnicy, drugi spod sufitu wytłacza gorące na strych), wszystkiego pilnuje właśnie arduino z czujnikiem DS18B20 i jakimś czujnikiem wilgotności Bosha chyba (nie pamiętam już - nie ważne). Na nano działy się takie kwiatki że wentylatory czasem włączały się bez powodu. Kombinowałem: szukałem przyczyny w kodzie, zmieniałem czujniki, dorobiłem logowanie odczytów, aż w końcu wręcz stałem nad nim godzinę i patrzyłem co się dzieje żeby być 100% pewny że to nie bzdury w odczytach. Zmieniłem na promini i jak ręką odjął - ten sam kod, te same czujniki, działało całe lato bez zarzutu.
Podobne kwiatki miałem jak robiłem sterownik ledów RGB do koptera. Statystycznie co trzecie nano trafiało mi się jakieś dziwne, a może trafiłem na takiego sprzedawcę co słabe klony klepie bo 2-3 lata temu kupione nano chodzą do dziś super.
Nano jest fajne do prototypów, do docelowego projektu zawsze wybieram promini, ale to tylko moje zdanie :-)
pawelsky pisze:Trzeba wprowadzic kilkusekundowe opoznienie drugiego pomiaru.
Może i tak być, dzięki za słuszną uwagę :-)
Moje modele https://fpv.com.pl
Gogielki Eachine EV300D na dwa pasma jednocześnie ;-)

Pozdrawiam
Wojtek
Awatar użytkownika
pawelsky
Posty: 9750
Rejestracja: środa 19 mar 2014, 02:03
Lokalizacja: Polska
Kontakt:

Re: Laserowa bramka do pomiaru czasu

Post autor: pawelsky »

Głuś pisze:ostatnio na ali bywają nano wątpliwej jakości...
...Zmieniłem na promini i jak ręką odjął
Kupowalem dziesiatki i mini i nano z Ali i problemow nie mialem. Poza tym to ten sam proc, wiec jak sa watpliwej jakosci nano to i pro mini watpliwej jakosci tez beda.
Awatar użytkownika
Głuś
Posty: 1487
Rejestracja: sobota 01 mar 2014, 14:03
Lokalizacja: Lubelskie
Kontakt:

Re: Laserowa bramka do pomiaru czasu

Post autor: Głuś »

Dodałem opóźnienie 1000ms czyli 1s dla drugiego pomiaru. Ten koń chyba nie jest taki wielki żeby biegł więcej niż jedną sekundę, ale zmienić to nie problem :-)

Kod: Zaznacz cały

int laSer;
unsigned long zapamietanyCzas;
int odczytLasera;
unsigned long pomiarCzasu;
int diodaLed = 13;

void setup() {

  Serial.begin(9600);
  pinMode(diodaLed, OUTPUT);

}

void loop() {
  laSer = analogRead(0);
  if (odczytLasera == 0 && laSer <= 1000) { //pierwsze przeciecie wiazki swiatla
    //tutaj byc moze piwinno byc laSer >= 1000, nie pamietam co wypluwa analogRead podczas przeciecia wiazki swiatla - trzeba sprawdzic.

    zapamietanyCzas = millis();
    odczytLasera = 1;
    digitalWrite(diodaLed, HIGH);
  }

  else if (odczytLasera == 1 && laSer <= 1000 && zapamietanyCzas + 1000 <= millis() ) { //drugie przeciecie wiazki swiatla
    //tutaj byc moze piwinno byc laSer >= 1000, nie pamietam co wypluwa analogRead podczas przeciecia wiazki swiatla - trzeba sprawdzic.
    pomiarCzasu = millis() - zapamietanyCzas; //trzeba to jeszcze zamienic na jakies bardziej przyjazne jednostki
    float pomiarSekundy = pomiarCzasu / 1000; //o ile mnie pamiec nie myli tak to powinno byc bo 1000ms to s. Mozna przeliczyc jeszcze zeby minuty wypluwalo.
    Serial.println(pomiarSekundy);
    odczytLasera = 0;
    digitalWrite(diodaLed, LOW);
  }
}
PS. Widzę edytor forumowy pozawijał komentarze do nowych linii - jutro jak będę przy kompie to poprawię tak żeby po skopiowaniu się kompilowało :-)

EDYTA:


Teraz dopiero zauważyłem że szablon forum zachowuje się responsywnie i zawija bądź, nie zawija wiersze zależnie od szerokości ekranu, ale na wszelki wypadek poprawiłem :roll:
Dodałem jeszcze diodę led (tą Arduinową na D13) - jak QŃ wystartuje dioda się zaświeci, jak dobiegnie do mety zgaśnie. Jednym słowem świecąca się dioda oznacza trwający pomiar.

Jak złożysz układ to wgraj najpierw z przykładów "AnalogReadSerial" tylko w ostatniej linii zmień

Kod: Zaznacz cały

delay(1);
na np.

Kod: Zaznacz cały

delay(300);
bo Cię oczy będą boleć :mrgreen: i sprawdź jakie wartości pojawiają się gdy wiązka światła pada na fotorezystor, a jakie gdy nie. Najlepiej na dworze, w warunkach zbliżonych do tego gdzie to ma działać. Zależnie od tego co wyjdzie trzeba w liniach 16 i 24 ustawić

Kod: Zaznacz cały

laSer <= 1000
bo podejrzewam że w słoneczny dzień 1000 będzie zły. Najlepiej tą wartość dobrać eksperymentalnie ;-)
Moje modele https://fpv.com.pl
Gogielki Eachine EV300D na dwa pasma jednocześnie ;-)

Pozdrawiam
Wojtek
ODPOWIEDZ