Skocz do zawartości

[Czujniki] Dalmierze firmy SHARP na przykładzie 2D120XJ100F


pawel

Pomocna odpowiedź

Ja badałem moje analogowe 4-30cm i uważam, że dokładność kilku mm jest do uzyskania. Przyjrzyj się sygnałowi na oscyloskopie cyfrowym - jest tam kilka ciekawych cech. Parę słów napisałem o SHARPach w tym wątku.

Uśrednianie to zła droga ale wiedząc o charakterze zakłóceń czy raczej pewnych "dodatków" do sygnału wyjściowego, bez problemu napiszesz odpowiednią funkcję.

Link do komentarza
Share on other sites

Nie mam niestety oscyloskopu. Nawet w najprostszej postaci 🙁

Z tego co udało mi się znaleźć w sieci i wyczytać z twoich rad, wynika, że sygnał z sharpa nie jest liniowy i ma charakterystykę niemal jak sygnał PWM. Stąd pewnie biorą się wahania pomiarów w "dziurach" sygnału i przy takiej a nie innej rozdzielczości ADC oraz uśrednianiu przez ADC kilku pomiarów w czasie, nigdy nie uda się uzyskać stałego pomiaru.

Pierwsze co mi przychodzi do głowy to dokonywanie odczytu z ADC w przerwaniu, tylko czy przerwanie wyzwoli się tak niewielkimi zmianami amplitudy?

Druga rzecz to zastosowanie filtru górnoprzepustowego odcinającego spadki napięcia, ale nie mam bladego pojęcia jak dobrać taki filtr.

Chwilowo dodanie kondensatora 100uF na VCC i GND blisko czujnika, poprawiły jakby stabilność pomiarów. Nie są nadal stałe, ale jakby zmienność zmalała.

Link do komentarza
Share on other sites

Nie, nie. To nie ma nic wspólnego z PWMem. Lepiej wyobraź to sobie jak schodki albo jak układ, który coś mierzy i w tym czasie na wyjściu jest wynik poprzedniego pomiaru. Jak już zmierzy nową odległość, napięcie na wyjściu zmienia się skokowo - oczywiście jeśli odległość jest inna niż poprzednio. No i teraz to przejście między schodkami nie jest monotoniczne. Dwa schodki mogą być oddzielone szpilką w górę (w dół chyba nie widziałem). Bardzo krótką ale na tyle dużą energetycznie, że "rozhuśta" filtr dolnoprzepustowy tak, że prawodopodobnie cały następny schodek będzie do kosza. Jeśli zrobisz filtr który będzie ją w stanie pochłonąć, jego pasmo będzie musiało być na tyle wąskie, że będzie musiało upłynąć kilka schodków, by wartość napięcia po dużej zmianie odległości była stabilna. Z kolei bez filtra, jeśli jednorazowy pomiar ADC trafi w taką anomalię, błąd może sięgać i 100%.

Ja odczytuję ADC ciągle tzn. "przemiatam" wszystkie potrzebne mi wejścia. Wyniki z SHARPa zbieram w buforze i szukam kilku (3) podobnych próbek. Bazuję na "płaskości" schodka i czasie jego trwania - tam jest wszystko OK. Szybkość próbkowania dobrałem tak, by w jednym schodku mieściło się kilka konwersji A/D. Jak znajdę taką stabilną paczkę uznaję, że to jest właściwy pomiar - działa bez pudła.

Jutro wrzucę jakieś obrazki z oscyloskopu.

Nie domyśłam się, w jaki sposób chciałbyś wyzwalać pomiary zmianą napięcia.

Jeżeli masz problemy z zasilaniami, wszystko inne schodzi na plan dalszy. Zamiast czujnika podepnij dzielnik rezystorowy. Jeżeli będziesz miał odchylenia większe niż ±2LSB, gdzieś w okolicy czai się kaszanka...

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

Nie, nie. To nie ma nic wspólnego z PWMem. Lepiej wyobraź to sobie jak schodki albo jak układ, który coś mierzy i w tym czasie na wyjściu jest wynik poprzedniego pomiaru. Jak już zmierzy nową odległość, napięcie na wyjściu zmienia się skokowo - oczywiście jeśli odległość jest inna niż poprzednio. No i teraz to przejście między schodkami nie jest monotoniczne.

To rozumiem. Znalazłem wykres przebiegu czujnika. Wykres robiony prawdopodobnie przy stałej odległości, więc schodki są na tym samym poziomie. Widoczne są jednak między nimi spadki napięcia, więc jeśli ADC wstrzeli się w taki spadek, pomiar również będzie zafałszowany.

Ja odczytuję ADC ciągle tzn. "przemiatam" wszystkie potrzebne mi wejścia. Wyniki z SHARPa zbieram w buforze i szukam kilku (3) podobnych próbek. Bazuję na "płaskości" schodka i czasie jego trwania - tam jest wszystko OK. Szybkość próbkowania dobrałem tak, by w jednym schodku mieściło się kilka konwersji A/D. Jak znajdę taką stabilną paczkę uznaję, że to jest właściwy pomiar - działa bez pudła.

Dzięki za jasne objaśnienie.

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

Już to robiłem. Liczyłem średnią ze 100 pomiarów i za każdym razem średnia była inna.

Jeśli podejście statystyczne to raczej powinno badać się rozkład wyników i przeprowadzać zaawansowane analizy rozkładu (t-studenta?).

W najprostszym ujęciu, jak to napisał marek1707, trzeba szukać kilku podobnych wyników.

Próbuję zrobić kilka pomiarów, zapisać je do tablicy, posortować i wyliczyć średnią z kilku (wartość do ustalenia) pierwszych wyników.

Dla przykładu zrobiłem 50 pomiarów dla 10cm.

Wartości oscylują w granicach 259-278, przy czym średnia wynosi 266, mediana 265 a najczęściej występującą wartością jest 265 - 12 razy, 269 - 7 razy. Rozkład wartości wygląda tak:

Wydaje mi się, że statystycznie muszę ustalić tablicę wartości dla skali centymetrowej, sprawdzać wyniki, ustalać najczęściej występującą wartość i jeszcze określać najbliższą wartość z tablicy.

Link do komentarza
Share on other sites

Jeśli zdejmiesz ch-kę konkretnego czujnika dla wielu punktów, w szczególności np. co 1 cm to możesz utworzyć tablicę parametrów do interpolacji, choćby liniowej. Możesz ją zrobić jeszcze w PC, żeby się "mały" procesor nie męczył albo wbudować procedurę kalibracji w system pomiarowy. Mając tak dużo danych, przybliżenie odcinkami prostych spokojnie da dokładność 1mm. Bazując na histogramie rozkładu pomiarów możesz potem wybrać wartość najbardziej prawdopodobną, przyjąć ją za wynik z ADC, odszukać odpowiedni przedział w tablicy, wrzucić parametry do interpolatora i dostać całkiem dokładną odległość.

Wczoraj pisałem trochę z pamięci. Dziś na szybko jeszcze raz przyjrzałem się staremu projektowi i odgrzebałem kilka przebiegów. Wrzucam poniżej, może do czegoś Wam się to przyda.

Szpilki są, ale nie tak duże jak pamiętałem. Znaczy wysokie owszem, nawet bardzo ale energię niosą niewielką, bo są dość krótkie:

Niestety zasada pracy przetworników SAR powoduje, że jeśli taki babol pojawi się pod koniec okresu próbkowania sygnału wejściowego, błąd pomiaru może być bardzo duży. Dobra wiadomość: szpilki pojawiają się częściej w okresach szybkich zmian odległości.

Niestety nie "gardzą" też okresami względnego spokoju. Na szczęście do walki ze szpilkami wystarczy prosty filtr RC. U mnie jest to 1k szeregowo z wyjściem czujnika (ale na PCB blisko procesora) i zaraz za nim 100nF do masy bezpośrednio na wejściu przetwornika A/D.

Tak jak na powyższych trzech rysunkach, tak i tu kolor żółty to sygnał z czujnika, niebieski - wejście przetwornika. Oba mają tę samą skalę pionową, ale przesunięty poziom zera żeby się nie nakładały:

A tu jest sekwencja "prawidłowej" zmiany napięcia na wyjściu czujnika. Szybkość obiektu była duża (> 1m/s) więc między jednym a drugim schodkiem zmiana sygnału wyniosła ze 400%. Widać, że filtr dojeżdża do 8-10 bitów gdzieś po 1ms, co stanowi ułamek długości schodka:

Acha, jeszcze jedno. Im dalej do "ściany", tym czujnik gorzej radzi sobie ze stabilnością. W sumie to oczywiste, słabnie zależność kąta widzenia od odległości. Tak więc dokładność względna jest mniej więcej stała ale jeśli naprawdę zależy nam na dokładności bezwzględnej, połowa zakresu podawanego przez producenta to chyba szczyt marzeń.

Mam też trochę spostrzeżeń na temat samego położenia czujnika i tego, co jest zabudowane obok niego a co może istotnie wpłynąć na wyniki pomiarów ale o tym.. innym razem.

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

Zatem pierwszym problemem do rozwiązania to uzyskanie stabilnych i powtarzalnych odczytów na wyjściu czujnika a drugim właściwa interpretacja wyników.

Problem dokładności pomiaru rozwiązałeś stosując filtr RC. Pamiętasz, czy pomiary na ADC były za każdym razem stabilne? Czy musiałeś stosować dodatkowe zabiegi programowe?

Ja zastosowałem dławik na linii VCC i 100uF kondensator na wejściu zasilania tuż przy czujniku a programowo uśrednianie kilku pomiarów z odrzuceniem pomiarów skrajnych. Pomiary ADC dość stabilne.

Drugim problemem jest interpretacja otrzymanych pomiarów z ADC. Funkcja odległość(napięcie) ma mocno nieliniowy charakter i problemem jest dla mnie właściwa aproksymacja funkcji, jeśli chcę otrzymać płynne pomiary odległości.

Dokładność pomiarów rzędu 1-2mm uzyskuję dopiero po zastosowaniu funkcji wielomianowej 4 stopnia, co strasznie pożera zasoby procesorka a i tak obarczone jest błedami.

Chyba jednak lepszym rozwiązaniem będzie liniowa interpolacja w wąskich przedziałach.

Link do komentarza
Share on other sites

Nie znalazłem wyników starych pomiarów ale zrobiłem nowe 🙂

Mój układ pomiarowy:

Płytka z 5V procesorem mega2561 taktowanym zegarem 16MHz z zewnętrznego generatora. Napięcie referencyjne Vref dostarczane z TL431 ustawionego na 4.1V, zablokowane kondensatorami: 100nF ceramiczny || 10uF tantal. Zasilanie +5V z przetwornicy step-down PWM 250kHz. Zasilanie analogowe pobierane z +5V przez rezystor 22R i zablokowane kondensatorem 100nF.

Czujnik zasilany z +5V poprzez dławik 10uH i zablokowany kondensatorami 100nF || 10uF. Wyjście czujnika podłączone do wejścia przetwornika A/C poprzez filtr 1k/100nF. Przetwornik taktowany zegarem 125kHz (prescaler 1/128) w trybie start-stopowym, bez używania trybów uśpienia CPU a wręcz przeciwnie: miało co robić - przerwania chyba od wszystkiego co się rusza. Konwersje (tego kanału) wyzwalane co 4ms. Wyniki zbierane do tablicy 1024 elementowej w postaci histogramu. Tablica była na początku cyklu testowego zerowana a następnie startowany był cykl 1000 pomiarów. Po każdej konwersji inkrementowałem komórkę tablicy o indeksie równym wynikowi pomiaru - no wiadomo, w końcu to histogram. Po 4 sekundach (jak łatwo policzyć) miałem rozkład wyników. Znajdowałem maksimum i drukowałem zawartość 8 komórek tablicy wokół najwyższego "słupka" histogramu.

Poniżej wyniki. W pierwszym wierszu podawana jest wartość i indeks najwyższego znalezionego słupka histogramu, np. 651@548 oznacza, że było 651 pomiarów o wartości 548. W kolejnym wierszu wypisałem numer pierwszego słupka z lewej oraz wysokości kolejnych słupków w otoczeniu tego najwyższego. Na końcu jest suma liczby wypisanych pomiarów. Gdyby były jeszcze jakieś pomiary nie mieszczące się w tych 8 wypisanych (histogram byłby bardziej "rozlazły" niż 8 słupków, suma S byłaby < 1000. "Obiektem pomiarowym" była podstawka pod herbatę zrobiona z prasowanego korka.

Oświetlenie przedmiotu zgodne z kierunkiem patrzenia czujnika (zza jego pleców) żarówką 60W z odległości 40cm przyciemnioną do ok. 1/3:

651@ 548

542: 0, 0, 0, 0, 0, 14, 651, 335, 0, 0, 0, 0

S: 1000

641@ 548

542: 0, 0, 0, 0, 0, 36, 641, 323, 0, 0, 0, 0

S: 1000

639@ 548

542: 0, 0, 0, 0, 0, 12, 639, 349, 0, 0, 0, 0

S: 1000

J.w. ale 100% mocy:

579@ 548

542: 0, 0, 0, 0, 0, 195, 579, 226, 0, 0, 0, 0

S: 1000

587@ 548

542: 0, 0, 0, 0, 0, 185, 587, 228, 0, 0, 0, 0

S: 1000

589@ 548

542: 0, 0, 0, 0, 0, 187, 589, 224, 0, 0, 0, 0

S: 1000

100% mocy, strumień światła skierowany prostopadle wprost w przestrzeń między czujnikiem a przedmiotem:

609@ 548

542: 0, 0, 0, 0, 0, 159, 609, 232, 0, 0, 0, 0

S: 1000

587@ 548

542: 0, 0, 0, 0, 0, 168, 587, 245, 0, 0, 0, 0

S: 1000

589@ 548

542: 0, 0, 0, 0, 0, 166, 589, 245, 0, 0, 0, 0

S: 1000

100% mocy, strumień wprost "w twarz" czujnika tj. zza przedmiotu:

566@ 548

542: 0, 0, 0, 0, 0, 5, 566, 429, 0, 0, 0, 0

S: 1000

575@ 548

542: 0, 0, 0, 0, 0, 5, 575, 420, 0, 0, 0, 0

S: 1000

579@ 548

542: 0, 0, 0, 0, 0, 6, 579, 415, 0, 0, 0, 0

S: 1000

Tak to wygląda u mnie. O ile pamiętam, dużą różnicę stanowił rodzaj przedmiotu. Powierzchnia lepiej odbijająca ale jakaś nierówna, np. wycinek białej gąbki wżywanej do wypełniania paczek był dożo trudniejszym orzechem dla czujnika. A zresztą, mogę to od razu sprawdzić, proszę bardzo:

Przedmiot oświetlony żarówką 60W, 30% mocy, 40cm, strumień światła zgodny z kierunkiem patrzenia czujnika:

447@ 493

487: 0, 166, 340, 7, 1, 9, 447, 30, 0, 0, 0, 0

S: 1000

402@ 493

487: 0, 188, 356, 6, 3, 15, 402, 30, 0, 0, 0, 0

S: 1000

438@ 493

487: 0, 181, 329, 6, 1, 9, 438, 36, 0, 0, 0, 0

S: 1000

Tu już gorzej ale wystarczy odsunąć żarówkę na 80cm i wszystko wraca do normy:

892@ 493

487: 0, 6, 6, 0, 0, 36, 892, 60, 0, 0, 0, 0

S: 1000

W przypadkach, gdy nie utrudniamy życia czujnikowi wyniki nie odbiegają od tego, co gwarantuje producent procesora. ±1LSB oznacza, że praktycznie mierzę DC. Mimo to widzę, że w kodzie zostały funkcje wyboru stabilnej wartości 🙂 Hm, może czas je wyciąć..

No to na tyle 🙂

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

No dobrze. Ładnie to opisałeś i jasno, dzięki.

Ciągle jest jednak małe "ale". Póki co wszystko to ustalenie wartości "stabilnego" pomiaru z ADC. Albo nie doczytałem, albo jeszcze trza to przeliczyć na cm. Piszesz tylko o interpolacji. Dokonywałeś interpolacji liniowej w przedziale wyznaczonym przez punkty predefiniowanej tablicy? Taka metoda wydała mi się najprostsza i (w zależności od odległości) wyznacza funkcję i za jej pomocą oblicza odległość z dokładnością +/- 2-3mm.

Link do komentarza
Share on other sites

To wydawało mi się najważniejsze i ten problem podnosiłeś w poprzednim poście. Mając stabilny pomiar robisz interpolację, niechby i liniową - to już matematyka z gimnazjum.

Ja nie potrzebowałem przeliczania na cm czy mm bo mój układ pracował na liczbach otrzymywanych z ADC. Tam akurat ważne były różnice, niekoniecznie wyrażone w jakichś jednostkach długości.

Gdybym miał to robić teraz, zrobiłbym taką procedurę kalibracji:

- Zebrałbym możliwie dużo punktów pomiarowych (np. co 1 cm) dobrze kontrolując warunki oświetlenia i samej odległości czujnika do przedmiotu.

- Powtórzył to samo dla skrajnych temperatur pracy mojego urządzenia, np. dla +5 i +50 stopni. Jeśli wyniki byłyby niedopuszczalnie różne, wstawiłbym do systemu pomiar temperatury i korekcję od niej.

- Przybliżyłbym pomiary krzywą, której charakter odpowiada sposobowi pracy czujnika. Wielomian nie jest dobrym pomysłem (na co wskazuje aż 4 stopień i wciąż słabe efekty). Raczej obstawiałbym coś typu 1/n bo w końcu triangulacja czujnika polega na liczeniu tangensów (a raczej arctan).

- Policzyłbym nowe punkty i potraktował je jako wzorcowe - to powinno zniwelować błędy samego pomiaru odległości w trakcie kalibracji i wygładzić krzywą.

- Dla każdego punktu zapamiętałbym jego położenie w osi x oraz współczynniki a i b prostej "wskazującej" na kolejny punkt wzorcowy - 15 minut w Excelu łącznie ze skalowaniem współczynników.

Teraz mając "pewny" wynik konwersji A/C odszukałbym odpowiedni przedział po osi x, odczytał z tablicy a i b, podstawił do wzoru y = ax+b i cieszył się wynikiem w mm lub lepiej.

W sumie to przecież oczywiste, w końcu tak działa przybliżanie odcinkami prostych. Nie wiem, czego nie rozumiesz. Podejrzewam, że dałoby się to wszystko opchnąć prostą arytmetyką stałoprzecinkową 32-bitową albo krótszą.

Analiza statystyczna rozkładu czystych wyników konwersji A/C mogłaby dawać podstawy do ostrzeżeń typu: "Wynik niepewny w takim to a takim stopniu z powodu złych warunków oświetlenia, typu powierzchni itp".

EDIT:

Po ponownym przeczytaniu powyższego zauważyłem, że niektórzy mogliby wyciągnąć mylne wnioski o superuniwersalności metody i czujnika. Tak nie jest. Ta czy inna kalibracja będzie poprawna tylko dla tej jednej, konkretnej sztuki czujnika.

Plamka "światła" rzucana przez podczerwony LED czujnika, choć w sumie dość dobrze skolimowana jak na tak prymitywną obudowę ma mały kąt, ale jednak niezerowy - oceniam na jakieś 10-15 stopni. To znaczy, że nie mierzymy "w punkcie" i że ważne jest nachylenie powierzchni obiektu do osi czujnika.

O typie powierzchni już wspomniałem - może nie wpływa bezpośrednio na wynik ale na pewno na jego "pewność", czyli statystyczny rozrzut pomiarów.

Do tego dochodzi pewna nieprzyjemna cecha SHARPa, którą nazwałbym nadwrażliwością na oświetlenie własne. W sumie jak się zastanowić to nie jest to nic dziwnego. Ponieważ wiązka IR jest rozbieżna a to co widzę na "ekranie" jakim jest obiekt jest tylko częścią wysyłanej energii, pewnie z 20% mocy promieniowania rozpraszane jest w postaci świecenia dookólnego. Zanika ono wraz ze zwiększaniem odchylenia od osi ale nigdy nie jest zerowe. No, może przy kątach rzędu 90 stopni. I teraz jeżeli będziemy zbliżać obiekt równoległy do osi czujnika, detektor bardzo szybko zauważa odbicie od tej powierzchni mylnie interpretując to jako prostopadły obiekt na osi pomiaru.

Kolejna sprawa do kierunek "najazdu" obiektu w oś widzenia czujnika. Można wyróżnić trzy możliwości: najazd od strony emitera, najazd os strony detektora oraz symetryczne zbliżania z pozostałych dwóch kierunków. Każdy kierunek zachowuje się inaczej i prezentuje inną ch-kę mierzonych odległości. Z tych cech wynikają pewne wytyczne co do sposobu montażu czujnika:

- Czujnik należy montować w pojeździe wyłącznie pionowo. Wtedy zjawisko "zauważania" przeszkody będzie symetryczne z obu stron pojawiania się jej w polu widzenia czujnika. Może wieczorem wrzucę odpowiednie wykresy - naprawdę można się zdziwić.

- Czujnik należy montować tak, by emiter znajdował się na górze a detektor na dole. Detektor "patrzy pod skosem" skierowanym w stronę emitera. Jeżeli detektor umieścimy na dole, będzie patrzył do góry wprost na lampy na suficie (źle) ale jeśli umieścimy na górze - będzie widział światło własnego emitera odbite od podłogi (dużo, dużo gorzej). To już sufit lepszy.

- Czujnik nie może być zamontowany zbyt nisko, ponieważ oświetlenie podłogi światłem własnego emitera powoduje, że czujnik wciąż widzi obiekt w odległości ok. 15-20cm a napięcie wyjściowe nigdy nie będzie mniejsze (odległość większa) i w dodatku bardzo zakłócone. W przypadku detektora na dole, można montować na wysokości nawet 1cm od podłoża, być może z osią lekko odchyloną w górę. W przeciwnym wypadku (detektor na górze) wysokość nawet 10cm jest niewystarczająca.

- Obudowa czujnika wygląda, jakby była przygotowana do zabudowy w jakimś tunelu lub osłonie i wg. mnie nie jest to przypadkowe. Należy trochę poeksperymentować z rurkami, osłonkami itp co naprawdę bardzo poprawia odporność na odbicia boczne, oświetlenie zewnętrzne, wykrywanie podłogi itd. Jest to tym łatwiejsze, że minimalną mierzoną odległością są 4cm, więc i tak należy czujnik "wsunąć" w pojazd na tę głębokość po to, by bezpośredni kontakt z przeszkodą nie powodował wyników typu "nic nie widzę, wolna przestrzeń, spoko jedziemy do przodu".

Wszystko powyższe odnośi się do analogowego czujnika SHARP 4-30cm. Podejrzewam, że podobne spostrzeżenia mają użytkownicy innych, bardziej dalekosiężnych modułów tej serii - może tylko skale się zmieniają, ale chętnie posłucham Waszych opinii.

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.