Skocz do zawartości

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


Czolgista

Pomocna odpowiedź

Cześć. Zajmuję się budową małego stanowiska do pomiaru prędkości spadających obiektów. Będą w nim 2 czujniki typu PNP lub NPN (bramki pomiarowe). Zamysł jest, aby odczytać sygnał obecności z obu czujników, zmierzyć czas pomiędzy zarejestrowanymi sygnałami i finalnie uzyskać wartość prędkości z obliczeń. Całą procedurę przeprowadzić na komputerze lub ew. innym urządzeniu zintegrowanym. Zastosowane czujniki to będą indukcyjne pierścieniowe lub optyczne szczelinowe. Prędkości niewielkie, jakieś 4-12 m/s. Zastanawiam się nad wyborem platformy do tego projektu oraz co będzie mi potrzebne. Wstępnie myślałem o systemie Raspberry Pi i języku Python (podstawy znam, może wystarczy). Będę wdzięczny za podpowiedzi i nakierunkowanie. 

Link do komentarza
Share on other sites

@Czolgista witam na forum! Czy na pewno potrzebujesz aż Raspberry Pi? Zapewne da się to zrobić np. na zwykłym Arduino. Kwestia jeszcze tylko jakiej precyzji i rozdzielczości pomiaru oczekujesz (aby się nie okazało zaraz, że to jakieś ultra dokładne urządzenie laboratoryjne) 😉

Link do komentarza
Share on other sites

Skoro dane i tak mają być obrabiane później na większym sprzęcie to wystarczy nawet mikrokontroler avr attiny lub STM8. Surowe dane przesyłasz do kompa zp usb lub przejściówki uart a resztą zajmie się oprogramowanie na PC. 

Edytowano przez _LM_
  • Lubię! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

@Czolgista Tak jak napisał @Treker zanim zaczniesz programować warto chwilę zastanowić się nad wymaganiami projektu. Napisałeś, że prędkości to jakieś 4-12m/s, ale czy to jest zakres pomiarowy, czy prędkości mogą być mniejsze albo większe "czasami"? Kolejne pytanie to odległość między czujnikami. To bardzo ważne, bo przykładowo jeśli między czujnikami jest 1m, a prędkość maksymalna wynosi 4m/s, to czas między impulsami będzie wynosił 250ms - czyli bardzo dużo czasu. Ale jeśli między czujnikami jest 1cm, a prędkość wynosi 12m/s to na pomiar zostaje już tylko 83us. Kolejne ważne pytanie to rozdzielczość pomiaru - czy wystarczy ustalić, czy jest to 4m/s czy 12m/s, czy przykładowo interesuje Cię każde 0.1 m/s. To w połączeniu z odległością między czujnikami pozwoli doradzić rozwiązanie. Pewnie najlepsze będzie sprzętowe, czyli wykorzystując układ licznikowy lub PWM, ale zanim się coś doradzi, trzeba ustalić założenia.

No i przy okazji pojawia się ciekawe pytanie - czy na pewno nie da się tego zrobić na Raspberry? I jakie czasy można mierzyć za pomocą malinki - to brzmi jak ciekawe wyzwanie 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

26 minut temu, Elvis napisał:

No i przy okazji pojawia się ciekawe pytanie - czy na pewno nie da się tego zrobić na Raspberry?

Trochę źle postawione pytanie. Bo oczywiście że się da. Można przecież programować "goły" procesor (w końcu kto każe ładować tam jakiś system operacyjny), można zrobić to na poziomie kernela (w końcu jakoś te odbiorniki IR działają).

Zadałbym pytanie inaczej: czy można to zrobić używając typowego dla malinki popularnego systemu operacyjnego (Linux) i jako jedynego języka programowania używając Pythona i dostępnych bibliotek? Według mojej wiedzy nie - ale jeśli się mylę to chciałbym wiedzieć jak.

 

Link do komentarza
Share on other sites

Ultradźwiękowe czujniki odległości HC-SR04 jakoś działają (np. https://linuxhint.com/measure_distance_raspberry_pi/)

Więc moim zdaniem jak najbardziej się da, natomiast jaka będzie rozdzielczość takiego pomiaru to nie wiem - stąd było pytanie do autora wątku o wymagania. A inna sprawa, że sam jestem ciekaw jaką rozdzielczość pomiarową zapewnia metoda używana dla HC-SR04. Może warto przetestować 🙂

Link do komentarza
Share on other sites

1 godzinę temu, Elvis napisał:

sam jestem ciekaw jaką rozdzielczość pomiarową zapewnia metoda używana dla HC-SR04.

Pozwoliłem sobie użyć - o ile wiem - najszybszej i najdokładniejszej metody:

#!/usr/bin/env python3

from ctypes import cdll
import struct
libc=cdll.LoadLibrary('libc.so.6')
cgt=libc.clock_gettime

CLKID = 7 # CLOCK_BOOTTIME
count=100000

b=list(bytes(8) for i in range(count))

for i in range(count):
    cgt(CLKID,b[i])

a1=struct.unpack('LL',b[0])[1]

suma=0
n=0
maxt=0
for i in range(1,count):
    a2=struct.unpack('LL',b[i])[1]
    if a2 < a1:
        continue
    t=a2-a1
    n += 1
    suma += t
    if t > 10000:
        print(t)
    maxt=max(maxt,t)
    a1=a2

print('Średnia',suma/n,'max',maxt)

Na RPi Zero 2 W średni czas obrotu pętli to ok.4 µsec, natomiast maksymalny odnotowałem 250µsec.

Nar RPi Zero W średni czas to 17 µsec, maksymalny odnotowany to ok. 500µsec przy wyłączonych wszystkich usługach, 10msec przy działającym prostym serwerze w pythonie (który nie robi nic siedzeniem w select przez sekundę w pętli).

 

Link do komentarza
Share on other sites

Zakładam, że model Raspberry jest do wyboru, więc przetestowałem na RPi4. Naiwna metoda z time.time() działa zaskakująco dobrze, można uzyskać pomiary nawet na poziomie 1us, chociaż rozrzut wyników jest wówczas widoczny.

Ale jeśli rozdzielczość pomiaru rzędu 5us będzie wystarczająca to Python + Rpi jest jak najbardziej wykonalnym rozwiązaniem.

Link do komentarza
Share on other sites

1 godzinę temu, Elvis napisał:

jeśli rozdzielczość pomiaru rzędu 5us będzie wystarczająca

Uruchomiłem analogiczny program na swoim pececie (z uwzględnieniem 64-bitowych wartości).

Dla mojego i7 średni czas obrotu pętli to 350 ns, maksymalny zarejestrowany to 56 µs. Tak że coś w te 5 µs pozwalam sobie wątpić. Chyba że procek w Rpi4 jest o rząd wielkości szybszy niż mój 😉

Powiem tak: jeśli normalne działanie systemu może zakłócić pomiar, to system do robienia pomiarów się nie nadaje. Owszem - jeśli to pomiar, który można powtórzyć, można odrzucić wyniki odbiegające od średniej, bawić się w różne statystyczne mądrości - ale nie w przypadku pojedynczego pomiaru.

Aha, mój sposób odczytu czasu nie jest wcale dokładniejszy niż time.time(), po prostu jest niezależny od jakichkolwiek manipulacji związanych z automatycznym przestawianiem się czasu w najmniej odpowiednich momentach (np. korekta z NTP), jako że podaje czas od uruchomienia systemu a nie bieżącą godzinę.

I jeszcze jedno: jeśli możemy dowolnie wybrać RPi to stawiam na Pico, nie mam żadnego wolnego pod ręką ale ciekaw jestem jaką realną dokładność można osiągnąć programem w MicroPythonie...

 

Edytowano przez ethanak
Link do komentarza
Share on other sites

@ethanak Nie wiem co mierzysz swoim programem, ja po prostu podłączyłem do RPi4 generator funkcyjny i porównywałem czasy trwania impulsu z wynikami zmierzonymi programem w Pythonie. Jak napisałem wcześniej, wyniki są bardzo obiecujące, chociaż oczywiście czasem pojawiają się błędy - ale to efekt "naiwnego" napisania programu. Co do przełączania zadań, to wystarczy odpowiednio ustawić priorytety uruchamianego programu, bo chyba jest oczywiste że jeśli tego nie zrobimy to cpu może być przydzielany innym zadaniom.

Natomiast nieco mniej naiwne podejście to użycie biblitoteki pigpio https://abyz.me.uk/rpi/pigpio/

Jest do niej wrapper napisany w Pythonie, więc nie trzeba nic w C robić - a sama biblioteka używa DMA do obsługi GPIO, więc dokładność prawie idealna. Prawie, bo czasem są wyniki o 5us odbiegające od wskazań generatora.

Więc odpowiednimi ustawieniami priorytetów procesu oraz dobrą biblioteką można spokojnie używać Pythona. O ile oczywiście te 5us dokładności wystarczy.

Link do komentarza
Share on other sites

27 minut temu, ethanak napisał:

Pico

Jeśli o Pico chodzi, to dobrze ustawić zegar, żeby VCO = 1596 Mhz (skrypt w \SDK\src\rp2_common\hardware_clocks\scripts\vcocalc.py). Największe zużycie energii, ale najrówniejszy zegar, niski jitter. 133 Mhz i wielokrotności. Zawsze większa powtarzalność. Chociaż nie mówię, że to MP jakoś ma poprawić, raczej C, żeby robić wszystko co się da dla dokładności pomiaru.

Edytowano przez matsobdev
Link do komentarza
Share on other sites

@Elvis Czyli otrzymałem odpowiedź na pytanie:

20 godzin temu, ethanak napisał:

jeśli się mylę to chciałbym wiedzieć jak.

 

Ergo:

  • "Naiwna" metoda  (czyli taka, jak w przytoczonym przykładzie czujnika odległości) ma prawo dawać błędne wyniki;
  • Istnieją popularne biblioteki, których użycie może dać prawidłowy wynik.

I o to chodziło!

Inna sprawa, że celowość użycia urządzenia za kilkaset PLN do czegoś, co z powodzeniem i bez kombinowania zrobi płytka za dwie dychy jest czymś czego nie rozumiem 🙂 Ale to już wykracza poza temat.

 

 

Link do komentarza
Share on other sites

Założenia są następujące: Dokładność uzyskanej prędkości +/- 0,05 m/s. Droga pomiaru może mieć maksymalnie 50 mm (dajmy 40 mm). Zakres prędkości 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ść. Bo mógłbym też wykorzystać do tego oscyloskop, ale to również wiąże się z ręcznym przenoszeniem pomiarów i dalszym obliczeniem. Przykładowy czujnik (specyfikacja): Datenblatt (pepperl-fuchs.com)

Link do komentarza
Share on other sites

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.