Skocz do zawartości

Stanowisko do badania prędkości - Raspberry Pi, Python, czujniki PNP


Pomocna odpowiedź

3 minuty temu, Czolgista napisał:

Kwestia jest taka, że nie mam do tego żadnego oprogramowania, a chciałbym uzyskać już gotowe wyniki po pomiarze, niż przenosić ręcznie pomiar z czujników i obliczać prędkość.

Jeśli zdecydujesz się na Arduino to wyniki możesz przesyłać do komputera przez USB/UART. Kwestia wykorzystania tych danych na samym PC 🙂 

(edytowany)

@Czolgista Kwestia tego, co chcesz z tymi danymi później zrobić. Bo we wszystkich przypadkach (Rpi + pigpio, Pico + C/MicroPython, Arduino) masz czas przelotu, a znając dodatkowo drogę obliczenie prędkości to raptem jedno dzielenie.

Załóżmy, że w programie znasz już prędkość. Co dalej?

Przy okazji: jakoś w Twoim poście nie widzę linków do specyfikacji czujnika...

Edytowano przez ethanak

@Czolgista Wygląda na to, że masz dość wysokie wymagania odnośnie projektu... Warto na moment zająć się prostymi obliczeniami.

Mamy odległość między czujnikami 40 mm, czyli 0.04 m. Podawałeś, że prędkości to 4-12 m/s więc policzmy ile czasu będzie trwał cały pomiar.

Dla 4 m/s mamy: 0.04 / 4 = 0.01 s = 10ms,

natomiast dla 12 m/s: 0.04 / 12 = 3.333 ms

To dość długie czasy jak dla mikroprocesora, czy mikrokontrolera, więc nie powinno być problemu. Natomiast wyzwaniem może okazać się "dokładność" +/- 0.05m/s o której wspominasz.

Zacznijmy od rozdzielczości pomiaru.

Jeśli prędkość wyniesie 4.05 m/s to teoretyczny czas: 0.04 / 4.05 = 9.877 ms

A dla prędkości 12.05 m/s: 0.04 / 12.05 = 3.320 ms

Czyli różnica między 4.05, a 4 m/s to: 123 us

Natomiast między 12.05, a 12 m/s to raptem: 13 us

Największym wyzwaniem nie jest jednak sama wartość 13us, ale jej udział w całym czasie pomiaru, czyli 3.3 ms. Jak łatwo policzyć to jakieś 0.4%.

Wiemy już jakiej rozdzielczości pomiaru oczekujesz, w przypadku czasu to jakieś 13us. Użycie prostego pomiaru z zapamiętaniem czasu pierwszego impulsu i czekaniem w pętli na drugi tutaj się raczej nie sprawdzi.

Wspomniałeś natomiast o oczekiwanej dokładności - z nią może być o wiele trudniej niż z rozdzielczością pomiaru, szczególnie jeśli oczekujesz dokładności na poziomie 0.4%. Wybór mikrokontrolera lub mikroprocesora wydaje się tutaj najmniejszym problemem.

  • Lubię! 2

Jeszcze na zakończenie z mojej strony wyniki pomiarów.

Skrypt "test1" używał funkcji time.time() do pobierania czasu i w pętli aktywnie czekał na zmianę stanu GPIO. Natomiast skrypt "test3" używa biblioteki pigpio z ustawionym samplowaniem GPIO co 1us.

Pierwsze 2 kolumny pokazują wyniki dla impulsu o szerokości 3200us, kolejne 2 dla 3333 us.

2022-11-23-132339_2558x1398_scrot.thumb.png.a68773243d8a0cd5eddf074b95146608.png

  • Lubię! 2

Ja natomiast mam inne wątpliwości.

Załóżmy, że pomiar czasu z potrzebną dokładnością jest możliwy (Arduino pewnie się wyrobi z 12µs bez gmerania po licznikach, Pico spokojnie, RPi4 pewnie też). Jaki jest czas reakcji samego czujnika i jak wygląda powtarzalność?

 

  • Lubię! 1

PS. Wyniki nie były ręcznie filtrowane, ani modyfikowane. Nie pojawiały się też większe odchyłki od oczekiwanych wyników. Nawet priorytety procesów nie były zmieniane (tutaj przydały się 4 rdzenie malinki). A co do uwag odnośnie celowości używania płytki za kilkaset złotych do takiego zastosowania - to czas poświęcony na pomiary i pisanie na forum był więcej wart niż malinka, nawet w wersji 8GB 😉

  • Lubię! 2
1 minutę temu, Elvis napisał:

czas poświęcony na pomiary i pisanie na forum był więcej wart niż malinka

Ale dzięki Tobie czegoś nowego się dowiedziałem 🙂

6 minut temu, ethanak napisał:

Ja natomiast mam inne wątpliwości.

Załóżmy, że pomiar czasu z potrzebną dokładnością jest możliwy (Arduino pewnie się wyrobi z 12µs bez gmerania po licznikach, Pico spokojnie, RPi4 pewnie też). Jaki jest czas reakcji samego czujnika i jak wygląda powtarzalność?

Tutaj warto zacząć od małej powtórki z metrologii i doczytać czym różni się: dokładność, precyzja i rozdzielczość. W pełni się zgodzę, że rozdzielczość nie jest problemem. Ale powtarzalność reakcji czujnika, a więc precyzja oraz odniesienie uzyskanych wyników do rzeczywistości, czyli dokładność (o weryfikacji której wspominał @matsobdev ) jak najbardziej.

I to co najważniejsze - wysoka rozdzielczość nie zapewni nam wysokiej dokładności. Więc jak napisałem wcześniej - wybór mikrokontrolera / mikroprocesora to chyba najmniejszy problem w tym projekcie.

  • Pomogłeś! 1

Zrobiła się burza mózgów, bardzo fajnie :). Czujniki są różne np.: Czujnik Sick albo Czujnik P. I faktycznie tak jak pisaliście i liczył @Elvis czasy reakcji mogą być problemem, bo z pozoru wydawałoby się że czas odpowiedzi na poziomie 0,1 ms to bardzo dobry czas, ale jednak dla +/-0,05  m/s (razem 0,1 m/s) to za mało. Ale czy czasu reakcji nie możemy uwzględnić w obliczeniach, a jedynie w dokładności uwzględnić tą z czujnika? Wtedy byśmy mieli w tej sytuacji +/-0,02 m/s (czyli 0,04 ms), a z obliczeń (zakładając korzystniejszy wariant 50 mm drogi pomiarowej) wychodzi że potrzeba maksimum 0,052 ms dokładności dla V = 4 m/s.

Zakładając, że dobierzemy właściwy czujnik i dokładność będzie właściwa, to co byście proponowali dalej? Chciałbym aby wynik na komputerze wyglądał mniej więcej jak w załączniku - podana prędkość, energia kinetyczna i ew. wykres. Obliczenia są proste (prócz wykresów), ale nie mam żadnego programu co by to wygenerował, a nie chcę pobierać za każdym razem danych z Arduino i przeliczać. Dlatego myślałem o jakimś nieskomplikowanym kodzie w Pythonie, co z Raspberry wyświetlałby na monitorze/komputerze. Albo Arduino jak pisał @ethanak, ale nadal jest problem z obróbką i prezentacją danych. W załączniku widok jak mniej więcej to powinno wyglądać. 

Program - widokpng.png

19 godzin temu, Czolgista napisał:

nie mam żadnego programu co by to wygenerował

I co z tym zrobisz? Poszukasz gotowca? Zlecisz komuś napisanie? Sam napiszesz? Bo za chwilę się okaże, że masz problem nie z pomiarem, a z prezentacją wyników...

Bo 'nieskomplikowany kod w Pythonie' pewnie by wystarczył - tylko co dla Ciebie znaczy 'nieskomplikowany'...

20 godzin temu, Czolgista napisał:

W załączniku widok jak mniej więcej to powinno wyglądać. 

Pierwsza opcja to program w dowolnym języku, który będzie odczytywał dane wprost z UART. Jeśli szukasz czegoś łatwiejszego to na pewno da się to zrobić łatwiej za pomocą narzędzia Processing - tutaj przykład połączenia nawet z Arduino: https://www.arduino.cc/education/visualization-with-arduino-and-processing

Sprawdź jeszcze narzędzie, które opisałem w poniższym artykule - może wystarczy w tym przypadku:

https://forbot.pl/blog/arduino-jak-rysowac-rozbudowane-wykresy-na-zywo-id28017

Inna opcja, ale wymaga znajomośvi javascriptu: serwer www (wbrew pozorom w przypadku malinki to naprawdę nieskomplikowamy program w pythonie) i wizualizacja przez przeglądarkę. 

Ale w każdym przypadku coś trzeba napisać...

Na wstępie dziękuję wszystkim za wszelkie pomysły i sugestie, choć nie ukrywam że jest tu dla mnie sporo nowości 😊.

@Treker Ten program Telemetry pokazuje dane z czujników, ale nie wyświetli mi chyba obliczenia na podstawie moich danych i z czujnika? A modyfikacji raczej nie podołam bo jest w Javie.  

Podsumowując to co wywnioskowałem: Raspberry trochę mija się z celem, Arduino lepiej się sprawdzi. System pomiaru miałby wyglądać tak: Czujniki rejestrują zdarzenie i przewodami wysyłają sygnały napięciowe do mikrokontrolera Arduino (jakaś rozbudowana płytka z avr attiny lub STM8 jak pisał @_LM_), a ten mierzy czas między sygnałami zbiera dane napięcia w czasie, które posłużą później do narysowania wykresu -> te wszystkie dane są przesyłane na komputer poprzez UART/USB. Na komputerze dane są automatycznie obrabiane w dedykowanym (stworzonym od podstaw lub zmodyfikowanym podobnym z open source) oprogramowaniu i prezentowane w sposób jaki pokazałem w poprzednim poście (mniej więcej).  

@ethanak – a jaką korzyść da mi użycie przeglądarki zamiast innej formy uruchomienia programu? Niestety javasciprtu nie znam.

Pisałem natomiast o Pythonie, ponieważ podstawy znam i aktualnie uczę się cały czas tego języka, więc byłoby to fajne wyzwanie z szansą powodzenia. A nieskomplikowany oznacza, że pobiera dane (np. CSV), tworzy wykres (np. z użyciem bibliotek matplotlib), przeprowadza prostą kalkulację prędkości i energii, prezentując wyniki na ekranie z możliwością ich zapisu. A jeśli nie podołam z programem, to zostanie opcja zlecenia komuś napisania takiego programu. Jest to projekt laboratoryjny stąd duża dokładność i inne wymagania.

Ale czas reakcji czujników chyba nie powinien być uwzględniany w obliczaniu dokładności/błędu prędkości, a jedynie sama dokładność czujników?

1 minutę temu, Czolgista napisał:

Ale czas reakcji czujników chyba nie powinien być uwzględniany w obliczaniu dokładności/błędu prędkości, a jedynie sama dokładność czujników?

Dzisiaj poprawiałem ploter laserowy, bo jeden ze sterowników reagował kilkadziesiąt milisekund za późno. Efekt był taki, że przy hamowaniu po dłuższym odcinku w osi Y potrafiło skrzywić ramę... Tak każdy element wpływający na opóźnienia pomiaru itp. musisz brać pod uwagę.

  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...