Zanim...
Zanim...



Polskie Forum FPV

Forum modelarzy i pilotów FPV
Dzisiaj jest piątek 16 lis 2018, 15:31


Strefa czasowa UTC+1godz.




Nowy temat Odpowiedz w temacie  [ Posty: 8 ] 
Autor Wiadomość
Post: wtorek 16 paź 2018, 20:56 
Offline
Awatar użytkownika

Rejestracja: środa 21 sie 2013, 22:04
Posty: 3248
Lokalizacja: Olsztyn
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

Cytuj:
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 | Przeglądany 569 razy ]


Programy

Program do arduin'a:
Kod:
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 | Przeglądany 569 razy ]

IMG_4ec3c5db6ee8f6048.jpg
IMG_4ec3c5db6ee8f6048.jpg [ 28.24 KiB | Przeglądany 569 razy ]

IMG_4ec3c5cca122f4956.jpg
IMG_4ec3c5cca122f4956.jpg [ 50.2 KiB | Przeglądany 569 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.

_________________
"Jak mądrze zadawać pytania"

Polska Giełda Modelarska i FPV na facebooku


Na górę
 Wyświetl profil  
 
Post: środa 17 paź 2018, 00:50 
Offline
Awatar użytkownika

Rejestracja: sobota 01 mar 2014, 14:03
Posty: 1373
Lokalizacja: Lubelskie
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:
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 ;-)

_________________
Moje modele FPV.

Pozdrawiam
Wojtek


Ostatnio zmieniony środa 17 paź 2018, 23:19 przez Głuś, łącznie zmieniany 3 razy

Na górę
 Wyświetl profil  
 
Post: środa 17 paź 2018, 05:24 
Offline
Awatar użytkownika

Rejestracja: środa 21 sie 2013, 22:04
Posty: 3248
Lokalizacja: Olsztyn
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ś.

_________________
"Jak mądrze zadawać pytania"

Polska Giełda Modelarska i FPV na facebooku


Na górę
 Wyświetl profil  
 
Post: środa 17 paź 2018, 22:32 
Offline
Awatar użytkownika

Rejestracja: sobota 01 mar 2014, 14:03
Posty: 1373
Lokalizacja: Lubelskie
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:

_________________
Moje modele FPV.

Pozdrawiam
Wojtek


Ostatnio zmieniony środa 17 paź 2018, 23:23 przez Głuś, łącznie zmieniany 1 raz

Na górę
 Wyświetl profil  
 
Post: środa 17 paź 2018, 23:20 
Offline
Awatar użytkownika

Rejestracja: środa 19 mar 2014, 02:03
Posty: 6620
Lokalizacja: Polska
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.


Na górę
 Wyświetl profil  
 
Post: środa 17 paź 2018, 23:35 
Offline
Awatar użytkownika

Rejestracja: sobota 01 mar 2014, 14:03
Posty: 1373
Lokalizacja: Lubelskie
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 FPV.

Pozdrawiam
Wojtek


Na górę
 Wyświetl profil  
 
Post: środa 17 paź 2018, 23:57 
Offline
Awatar użytkownika

Rejestracja: środa 19 mar 2014, 02:03
Posty: 6620
Lokalizacja: Polska
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.


Na górę
 Wyświetl profil  
 
Post: czwartek 18 paź 2018, 00:24 
Offline
Awatar użytkownika

Rejestracja: sobota 01 mar 2014, 14:03
Posty: 1373
Lokalizacja: Lubelskie
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:
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:
delay(1);
na np.
Kod:
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:
laSer <= 1000
bo podejrzewam że w słoneczny dzień 1000 będzie zły. Najlepiej tą wartość dobrać eksperymentalnie ;-)

_________________
Moje modele FPV.

Pozdrawiam
Wojtek


Na górę
 Wyświetl profil  
 
Wyświetl posty nie starsze niż:  Sortuj wg  
Nowy temat Odpowiedz w temacie  [ Posty: 8 ] 

Strefa czasowa UTC+1godz.


Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości


Nie możesz tworzyć nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Przejdź do:  
Technologię dostarcza phpBB® Forum Software © phpBB Group

Strona korzysta z plików cookie w celu realizacji usług zgodnie z . Polityką prywatności
Możesz określić warunki przechowywania lub dostępu do cookie w Twojej przeglądarce lub konfiguracji usługi.