PAWEL1 Napisano Kwiecień 10, 2019 Udostępnij Napisano Kwiecień 10, 2019 Dzień dobry. chciałbym zbudować układ pomiaru czasu założenia: OBIEKT PRZEKRACZA LINIĘ START-u PO PRZEKROCZENIU PUNKTU POMIARU „META” WYŚWIETLA SIĘ CZAS KTÓRY UPŁYNĄŁ OD STARTU Czujniki: Cyfrowy czujnik odległości 150cm – Waveshare (x2) LUB Moduł detektora przeszkód z czujnikiem IR (x2) WYŚWIETLACZ: JAZDA NACZAS „LINE FOOLOWER’ META : 00:00:000 CZAS WYŚWIETLANY: 00:00:000 (MINUTY : SEKUNDY : TYSIĘCZNE SEKUNDY) POMIAR CZASU_1.pdfPOMIAR CZASU_1.pdf START – JEDNYM Z PRZYCISKÓW NA WYŚWIETLACZU STOP - JEDNYM Z PRZYCISKÓW NA WYŚWIETLACZU RESET POMIARÓW ZA POMOCĄ JEDNYM Z PRZYCISKÓW NA WYŚWIETLACZU) UKŁAD NA „KABLACH” ZASILANIE BATERIA 5V {POWERBANK) CZY UKŁAD MOŻE DZIAŁAĆ NA JEDNYM CZUJNIKU (BRAMCE). TRASA JAKO OKRĄŻENIE I EWENTUALNIE DWA OKRĄŻENIA? dziękuję za wszelką pomoc Paweł I ZAŁĄCZNIK 😉 POMIAR CZASU_1.pdf Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Kwiecień 11, 2019 Udostępnij Kwiecień 11, 2019 Cześć, witamy na forum 😀 11 godzin temu, PAWEL1 napisał: CZY UKŁAD MOŻE DZIAŁAĆ NA JEDNYM CZUJNIKU (BRAMCE). TRASA JAKO OKRĄŻENIE I EWENTUALNIE DWA OKRĄŻENIA? Tak. Czujnik może wykryć 2 stany i 2 przejścia (zbocza). Ciebie interesuje te pierwsze kiedy nie było nic w bramce a teraz się pojawiło. Taka sytuacja może co prawda zajść gdy coś jedzie do przodu lub się cofnie, więc musisz się zastanowić czy bramka ma być odporna na takie zachowanie. W najprostszym przypadku odejmujesz czasy, w których zaszło przerwanie wiązki w bramce. Jeżeli chcesz badać kierunek w jakim porusza się robot, to musisz dać 2 czujniki (podobnie jak w enkoderze). Jak chcesz kilka okrążeń, to po prostu w nieskończoność odejmujesz czasy i wyświetlasz tylko te aktualne. 1 Cytuj Link do komentarza Share on other sites More sharing options...
PAWEL1 Kwiecień 11, 2019 Autor tematu Udostępnij Kwiecień 11, 2019 założenie jest takie, że "robot/pojazd" porusza się w jedną stronę, funkcja delay opóźni ponowny odczyt stanu chciałbym zaprogramować prosty układ, prosty w działaniu Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Kwiecień 11, 2019 Udostępnij Kwiecień 11, 2019 (edytowany) O jakiej funkcji delay piszesz, bo nie wiem gdzie ma być użyta? Tu chyba nie da się przekombinować 🤔 chyba. bool dziala = false; Jeżeli zbocze narastajace, to: jezeli !dziala: start = milis() dziala = true w przeciwnym razie: //minimum 1 okrazenie: delta_czas = milis() - start wypisz_czas(delta_czas) Edytowano Kwiecień 11, 2019 przez Gieneq Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
PAWEL1 Kwiecień 29, 2019 Autor tematu Udostępnij Kwiecień 29, 2019 wykorzystałem pomoc i jest program, niestety jak zwykle jest błąd sensor Arduino ir proximity sensor interfacing wg strony http://blog.circuits4you.com/2016/04/arduino-ir-proximity-sensor-interfacing.html program działa na module arduino nano 3.0 atmega328p program liczący czas już nie //czas przejazdu #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); //ustawienie adresu lcd na magistrali I2C 0x27 dla wyswietlacza 16 znakow w 2 liniach const int ProxSensor_start; const int ProxSensor_stop; int sygnal_reset = 7; // numer pinu do podania sygnału high dla resetu czasu przejazdu int ProxSensor_start = 8; // numer pinu do podania sygnału high dla start int ProxSensor_stop = 9; // numer pinu do podania sygnału high dla stop unsigned long czas_start; unsigned long czas_meta; //unsigned long czas_przejazdu; unsigned long timeStart, timeStop, timeElapsed; int w=0 void setup() // ustawienia poczatkowe dla programu { lcd.init(); // wyswietlacz lcd.backlight(); lcd.setCursor(0,0); lcd.print("CZAS PRZEJAZDU:"); lcd.setCursor(0,1); // ustawienie kursora w pierwszej pozycji w drugim wierszu lcd.print("00:00:000"); // wypisanie komunikatu pinMode(ProxSensor_start, INPUT); pinMode(ProxSensor_stop, INPUT); } void loop() { if(digitalRead(ProxSensor_start) == HIGH && w = 0) // sygnal start, rozpoczecie liczenia czasu { czas_start = milis(); w=1 } if(digitalRead(ProxSensor_meta) == HIGH && w = 1) // sygnal stop, zakoncz liczenie czasu { lcd.setCursor(0,1); wyswietl_wynik(czas_start, milis()); } else { w = 0 } if(digitalRead(sygnal_reset) == HIGH) { lcd.setCursor(0,0); lcd.print("CZAS PRZEJAZDU:"); lcd.setCursor(0,1); lcd.print(00:00:000); w = 0 } } void wyswietl_wynik(long timeStart, long timeStop) { float h,m,s.ms; unsigned long over; timeElapsed = timeStop-timeStart; // h=int(timeElapsed/3600000); over=timeElapsed%3600000; m=int(over/60000); over=over%60000; s=int(over/1000); ms=(over%1000); // if(h>=0 and h<=9){lcd.print("0");} // lcd.print(h,0); // lcd.print(":"); lcd.setCursor(0,1); if(m>=0 and m<=9){lcd.print("0");} lcd.print(m,0); lcd.print(":"); if(s>=0 and s<=9){lcd.print("0");} lcd.print(s,0); lcd.print(":"); if(ms>=0 and ms<=9){lcd.print("0");} lcd.print(ms,0); } Cytuj Link do komentarza Share on other sites More sharing options...
PAWEL1 Kwiecień 29, 2019 Autor tematu Udostępnij Kwiecień 29, 2019 po poprawkach układ działa pojawił się problem ponownego załączenia odliczania czasu impuls start - impuls stop = wynik czas -> ponownie start odmierza od początku co zrobić aby czekał na impuls reset i dopiero wtedy gotowy do kolejnego pomiaru // czas przejazdu robota #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); // ustawienie adresu LCD na magistrali I2C 0x27 dla wyświetlacza - 16 znaków w 2 liniach int przycisk_reset = 7; // numer pinu arduino do podłączenia przycisku reset, rezystor do masy 1k int czujnik_start = 8; // numer pinu arduino do podłączenia czujnika laserowego na starcie int czujnik_stop = 9; // numer pinu arduino do podłączenia czujnika laserowego na mecie unsigned long czas_start; // zapisanie czasu początku przejazdu unsigned long czas_stop; // zapisanie czasu końca przejazdu unsigned long timeStart, timeStop, timeElapsed; // czasy w funkcji zmieniajacej czas z milisekund na czas zrozumiały dla człowieka int w = 0; // zmienna pomocnicza ustawiona na 0 void setup() // ustawienia początkowe dla programu { lcd.init(); // inicjalizacja wyświetlacza LCD lcd.backlight(); // wygaszenie wyświetlacza LCD lcd.setCursor(0,0); // ustawienie kursora w pierwszej pozycji w pierwszym wierszu lcd.print("Czas przejazdu:"); // wypisanie komunikatu lcd.setCursor(0,1); // ustawienie kursora w pierwszej pozycji w pierwszym wierszu lcd.print("00:00:000"); // wypisanie komunikatu pinMode(czujnik_start, INPUT); // ustawienie pinów jako wejść pinMode(czujnik_stop, INPUT); // ustawienie pinów jako wejść } void loop() // początek pętli programu { if (digitalRead(czujnik_start) == LOW && w == 0) // sprawdzenie warunku czy czujnik start otrzymał impuls i czy zmienna 'w' równa się 0 { czas_start = millis(); // przypisanie do zmiennej aktualnej wartości wewnętrznego licznika w = 1; // zmienna pomocnicza ustawiona na 1 } if (digitalRead(czujnik_stop) == HIGH && w == 1) // sprawdzenie warunku czy czujnik meta nie otrzymał impulsu i czy zmienna 'w' równa się 1 { lcd.setCursor(0,1); // ustawienie kursora w pierwszej pozycji w drugim wierszu wyswietl_wynik(czas_start, millis()); // uruchomienie funkcji zmieniającej czas z milisekund na czas zrozumiały dla człowieka } else { w = 0; // zmienna pomocnicza ustawiona na 0 } if (digitalRead(przycisk_reset) == HIGH) // sprawdzenie warunku czy przycisk reset otrzymał impuls { lcd.setCursor(0,0); // ustawienie kursora w pierwszej pozycji w pierwszym wierszu lcd.print("Czas przejazdu:"); // wypisanie komunikatu lcd.setCursor(0,1); // ustawienie kursora w pierwszej pozycji w drugim wierszu lcd.print("00:00:000"); // wypisanie komunikatu w = 0; // zmienna pomocnicza ustawiona na 0 } } void wyswietl_wynik(long timeStart, long timeStop) // funkcja zmieniająca czas z milisekund na czas zrozumiały dla człowieka { float h,m,s,ms; unsigned long over; timeElapsed = timeStop-timeStart; // h=int(timeElapsed/3600000); over=timeElapsed%3600000; m=int(over/60000); over=over%60000; s=int(over/1000); ms=(over%1000); // if(h>=0 and h<=9){lcd.print("0");} // lcd.print(h,1); // lcd.print(":"); lcd.setCursor(0,1); if(m>=0 and m<=9){lcd.print("0");} lcd.print(m,0); lcd.print(":"); if(s>=0 and s<=9){lcd.print("0");} lcd.print(s,0); lcd.print(":"); if(ms>=0 and ms<=9){lcd.print("0");} lcd.print(ms,0); } kolejny krok to rozbudowanie o dodatkowy punkt pomiarowy dziękuję Rafałowi za czas spędzony przy programie Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!