Skocz do zawartości

Nieprawidłowe dane odczytane z czujnika HC-SR04


seba1412

Pomocna odpowiedź

Witam forumowiczów,
jestem w trakcie robienia pracy magisterskiej w której mam zamiar użyć czujnik odległości HC-SR04. Podczas implementacji kodu wzorowałem się na kursie Arduino w którym temat ten został omówiony dosyć przystępnie. Jednak kiedy zacząłem prezentować dane za pomocą Serial Plotter oraz Serial Monitor zauważyłem problem z którym walczyłem przez ostatnie 3 dni, wczoraj natomiast kupiłem nowy czujnik HC-SR04 jednak błedy się powtarzają ku mojemu niezadowoleniu. Od strony technicznej wygląda to tak:

-Używam Arduino Uno R3(Compatible),

-korzystam ze standardowego Arduino Ide,

-czujnik wcześniej wspomniany HC-SR04.

Pod spodem załączam jako obrazek wykres wraz z kodem jaki napisałem. projekt zawiera się w kilku plikach. Główną funkcję do pomiaru odległości umieściłem w osobnym pliku.

Problemem jest to że czujnik okresowo podaje wartości zerowe(widoczne na wykresie) mimo że odległość zmienia się płynnie i nigdy nie osiąga takiej wartości w rzeczywistości.

Za wszelkie sugestie będę mega wdzieczny, przewaliłem googla i nie znalazłem niczego pomocnego 🙁

Link do komentarza
Share on other sites

Co oznacza "zero" (bo ten nie ma prawa zmierzyć zerowej odległości) - czy przypadkiem nie "błąd odczytu"?

To wygląda, jakbyś chciał zbyt często odpytywać czujnik i radośnie zakładał, że wszystkie pomiary się powiodą. A radosne założenia mają z reguły nieprzyjemne skutki...

Przy okazji - za umieszczanie kodu na obrazku powinieneś dostać tęgiego kopa w rzyć. Do przyswojenia sobie zanim zadasz następne pytanie: zasady umieszczania kodu w postach na niniejszym forum.

Link do komentarza
Share on other sites

seba1412, jak masz połączony układ (płytka stykowa/lutowany)? Jak zasilasz całość?

płytka stykowa, natomiast zasilanie i masa do czujnika była doprowadzona z innego źródła niż arduino ponieważ 5V z arduino było mi potrzebne do sterowania tranzystorem, teraz podmieniłem zasilania do czujnika z arduino i podsumowując:

Czujnik działa ale nie mam wyjścia 5V do sterowania silnikiem, (silnik sterowany był dwoma wyprowadzeniami, pierwsze to 5v z arduino, drugie które było "w trybie PWM"(pin nr 5) w celu sterowania obrotami silnika[na schemacie pin PD0]). Niski stan na PWM powodował otwieranie tranzystora. Teraz gdy podpinam 5V z zewnętrznego źródła zasilania którym zasilałem wczesniej czujnik, silnik się nie obraca 🙁

Czujnik mierzy odległość poprawnie jednak gdy zakładam go na szczyt rury plexi o średnicy 5 cm i długości 50cm jest w stanie wykrywać obiekt jedynie na 28cm w głąb rury. Ehh.... Dla rozjaśnienia pokaże zdjęcie:

Tutaj co prawda poglądowo, bez połączeń które zostały wykonane jakies 2 tygodnie temu. Na szczycie rury znajduje się wspomniany czujnik HC SR 04 który mierzy odległość od czerwonego krążka unoszącego się na strumieniu powietrza.

Czy taka rura może ograniczyć pomiar czujnika? 2 lata temu znajomi robili identyczny projekt, ten sam czujnik, mikrokontroler i u nich działało...

[ Dodano: 01-08-2018, 02:35 ]

Co oznacza "zero" (bo ten nie ma prawa zmierzyć zerowej odległości) - czy przypadkiem nie "błąd odczytu"?

To wygląda, jakbyś chciał zbyt często odpytywać czujnik i radośnie zakładał, że wszystkie pomiary się powiodą. A radosne założenia mają z reguły nieprzyjemne skutki...

Przy okazji - za umieszczanie kodu na obrazku powinieneś dostać tęgiego kopa w rzyć. Do przyswojenia sobie zanim zadasz następne pytanie: zasady umieszczania kodu w postach na niniejszym forum.

Zero oznacza że wartość jaką dostawałem w terminalu wynosiła zero - jej pochodzenia nie byłem w stanie określić.

"To wygląda, jakbyś chciał zbyt często odpytywać czujnik i radośnie zakładał, że wszystkie pomiary się powiodą. A radosne założenia mają z reguły nieprzyjemne skutki..."~ Nie zgodzę się z tym. Z resztą na screenie jest pokazane że robię opóźnienie 100ms. Co do radosnych założeń, nie wiem po co taki komentarz

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

Przede wszystkim musisz wiedzieć, że ten czujnik nie jest miernikiem odległości i nie mierzy - jak to napisałeś, "odległość od czerwonego krążka". To zwykły nadajnik paczki impulsów ultradźwiękowych, odbiornik, wzmacniacz i detektor. Oczywiście można ten zestaw wykorzystać do pomiaru odległości poprzez pomiar czasu od nadania paczki do powrotu echa, ale kluczowym jest tu wyrażenie "powrotu echa". Nadajnik wysyła dość szeroką wiązkę a każda rzecz znajdująca się w tej wiązce może odbijać sygnał i dawać impuls lub jakieś rozmyte coś w odbiorniku. To nie musi być płaska, prostopadła powierzchnia tak jak świecąc latarką na ścianę nie widzisz tylko tych prostopadłych do Ciebie a wszystkie inne też. Nawet świecąc wzdłuż muru widzisz go, prawda? Z rurą jest tak samo. Całą jej powierzchnia wysyła echo i w rezultacie szuni8k dostaje długotrwały, dość przypadkowy sygnał który bardzo łatwo może pomylić z "poprawnym" echem od powierzchni krążka. Tak więc wkładanie tak prymitywnego czujnika do rury to już na starcie zły pomysł. Do tego dochodzi jeszcze szerokopasmowy szum opływającego powietrza wokół krążka, po ściankach rury i wreszcie dmuchającego na sam odbiornik i masz wynik. Na pewno próbowałeś kiedyś dogadać się z osobą oddaloną o kilka metrów w tłumie przekrzykujących się ludzi więc wiesz czego wymagasz od czujnika z 5zł. To, że komuś się udało, może być zbiegiem wielu sprzyjających okoliczności, włącznie z punktem i kątem zamocowania tego czujnika, rodzajem wlutowanych przetworników, prędkością strumienia powietrza, źródłem tego strumienia, prowadzeniem sygnałów do Arduino, a nawet producentem czujnika i rodzajem elektroniki na nim zamontowanej.

Moim zdaniem te zera w wynikach są niepokojąco okresowe co by raczej wskazywało na sam program. Nie uderzyło Cię to? Próbowałeś zmieniać te 100ms? Próbowałeś zmieniać sposób obsługi czujnika? Funkcja pulseIn() to straszny prymityw, poszukaj biblioteki newPing:

http://playground.arduino.cc/Code/NewPing

Ona robi wiele rzeczy porządnie wiedząc, że ma do czynienia z czujnikiem ultradźwiękowym a nie z jakimś stabilnym i powtarzalnym źródłem impulsów. Popatrz, w Twoim kodzie wystarczy, że coś się wydarzy między wygenerowaniem impulsu a startem pomiaru a już masz błąd. Nawiasem mówiąc produkcja krótkich impulsów za pomocą mulastych digitalWirite() to jakaś pomyłka.

No i koniecznie poczytaj to:

https://www.intorobotics.com/8-tutorials-to-solve-problems-and-improve-the-performance-of-hc-sr04/

  • Pomogłeś! 1
Link do komentarza
Share on other sites

A więc tak, odniosę się do wszystkiego w miarę po kolei bo sporo tego napisałeś:

- to że napisałem że czujnik "mierzy" to oczywiście był tylko skrót myślowy, miałem sporo fizyki w szkole i na studiach, rozumiem naturę rozchodzenia się fali mechanicznej w szczególności fali dzwiękowej i jestem świadom wszystkich czynników jakie mają wpływ na dokładność pomiaru ale fakt że i Ty je zrozumiałeś świadczy o tym że naprawdę chciałeś pomóc bo zadałeś sobie trud aby wejść w szczegóły mojego projektu za co wielkie dzięki.

-kwestia zer w pomiarach, oczywiście zmieniałem opóźnienie ale nie miało to żadnego wpływu na pomiary - zera zawsze występowały. Powodem było najprawdopodobniej złe połączenie. Piny trigger i echo podłaczyłem na początku do Arduino, natomiast Vcc i GND do innej płytki stykowej zasilanej osobnym zasilaczem regulowanym. Po podłączeniu Vcci GND do arduino zera zniknęły. Nie miałem pojęcia że Arduinowe 5V może być inne niż "zasilaczowe" 5V. Patrzyłem na to raczej jak na różnicę potencjałów mierzoną w ustandaryzowanych normach.

Natomiast jak pisałem wcześniej zmiana zasilania naprawiła jeden problrm ale zostawiła mnie z 2 innymi. Po pierwsze czujnik nie chce mierzyć na całej długości rury, czyli 45 cm. Robi to tylko na 28cm w głąb. Zastanawiam się czy nie rozwiązałbym tego problemu poprzez zastosowanie rury o średnicy 11cm zamiast 5cm. Druga sprawa bardziej poważna dla mnie(i tu liczyłbym na waszą pomoc, ponieważ jestem bardziej programistą niż elektronikiem) nie mam już dostępnego pinu znapięciem 5v które steruje moim silnikiem. Jak na schemacie obwód sterowania tranzystorem wygląda tak że z jednej strony mam 5V a z drugiej sygnał PWM który bedąc w stanie niskim powoduje różnice potencjału(5V) a zatem przepływ prądu.

Moje pytanie, czy mogę tym jednym pinem 5V zasilać jednocześnie czujnik oraz obwód otwierający tranzystor?? Nie mam pojęcia ile prądu może wymagać otwarcie tranzystora(a raczej zasilanie transoptora bo to jego obwód zasilam bezpośrednio z Arduino) i czy moje Arduino podoła z tym zadaniem a już na pewno nie chciałbym spalić procka.

[ Dodano: 01-08-2018, 15:10 ]

W zasadzie przyszła mi teraz na myśl pewna idea. Poprawcie mnie jeśli mówię źle. Chodzi o obwód zasilający transoptor. Czy na pin na którym teraz jest na stałe +5V nie mógłbym podać sygnału PWM (który w stanie wysokim osiąga 5V) a na pin na którym obecnie jest PD0 podać GND z Arduino? Wydaje mi się że powinno zadziałać. Wtedy juz nawet nie będę potrzebował żadnego pinu zasilającego +5V, prawda?

Link do komentarza
Share on other sites

Stosując kilka źródeł zasilania zawsze zastanawiaj się jak wyglądają oczka prądu. Prąd z zasilacza - żeby wypływał z niego (np. z +5V) i coś zasilał musi dokładnie taki sam wracać do przeciwnego bieguna (np. do GND) zasilacza. Generalną zasadą jest więc podłączanie wszystkich wyjść GND wszystkich zasilaczy do jednej wspólnej masy układu. Bez tego, pojedynczy drut +5 czy +12V z zasilacza niczego nie zasili. Nie podłączasz przecież baterii jednym biegunem licząc na zapalenie żarówki w latarce, prawda?

"sygnał PWM który bedąc w stanie niskim powoduje różnice potencjału(5V) a zatem przepływ prądu. "

Nie, pin procesora to taki przełącznik zwierający linię PWM raz do masy (procesora) a raz do +5V (procesora). A teraz zastanów się którędy popłynie prąd z dodatkowego zasilacza +5V podłączonego tylko kablem +5V. Od razu odpowiadam: nigdzie.

Oczywiście możesz wykorzystać +5V z płytki Arduino do zasilania diody LED włączającej tranzystor. Obciążalność pinów +5V zależy od wielu czynników, a przede wszystkim od tego skąd całość zasilasz. Napisz coś więcej o systemie zasilania. Jeżeli Arduino napędzasz z jakiegoś zasilacza +5V nie korzystając z pokładowego stabilizatora, to jesteś ograniczony jedynie wydajnością tego zasilacza i fizycznymi możliwościami złącz, ścieżek itp. Jeżeli wetknąłeś się 'ładowarką" przez złącze USB (np. UNO) to masz tam jeszcze po drodze bezpiecznik 0.5A.

PWM możesz także podłączyć inaczej: opornik R1 (680Ω) dać do pinu PWM procesora a katodę diody transoptora podłączyć do masy. Teraz tranzystor (i silnik) będzie włączany stanem logicznym wysokim więc musisz "odwrócić" wypełnienie PWM. W takim wypadku 0% będzie stopem a 100% będzie jedną na maksa (obecnie masz odwrotnie) no i nie masz problemu filozoficznego czy +5V wytrzyma oraz dodatkowego kabla zasilania, bo masę i tak musisz mieć wszędzie dociągniętą. Oczywiście w każdym z przypadków dioda LED jest zasilana de facto z +5V bo przecież stąd jest zasilany procesor i to z tej szyny weźmie się prąd na pinie PWM.

Moim zdaniem obecność rury powoduje, że w przypadku bardzo małych odległości od celu echo od jej ścianek przysłania sygnał użyteczny. To działa jakbyś włożył czujnik do pudełka po butach. Nadajnik promieniuje bardzo szeroko i tak samo odbiornik odbiera. Dopiero gdy zanikną odbicia od bliskich ścianek, odbiornik może zauważać prawdziwe echo nadchodzące z przodu. Moim zdaniem lepiej byś zrobił gdybyś wysunął czujnik z rury, kierując go wciąż na nią wzdłuż jej osi. To co prawda powoduje, że widzisz także obiekty poza rurą, ale jest szansa pomiaru odległości przedmiotu zanurzonego w niej na 0cm. Być może wyjściem jest też wyłożenie wewnętrznych ścianek rury - być może tylko do odległości np. 30cm od czujnika - materiałem pochłaniającym dźwięk, grubym filcem, pluszem itp.

"Nie mam pojęcia ile prądu może wymagać otwarcie tranzystora"

Nie widzisz obwodu otwierania tranzystora MOSFET. Widzisz tylko diodę świecącą.

Link do komentarza
Share on other sites

Dziękuję za Twój post. Mam w związku z nim trochę przemyślen, a więc odnosząc się do każdego akapitu:

akapit 1: obwód zasilania diody właśnie posiadał +5V(z Arduino) i GND(jak sam napisałeś, przełącznik który raz styka do 5V i do GND na przemian).

akapit 2: tu chyba nie rozumiem, no właśnie mam +5V i GND to dlaczego prąd ma nie przepływać? Moim zdaniem powinien przepływać w momencie kiedy PWM jest niskie, zwarte do GND Arduino.

akapit 3: Arduino zasilam z USB podłączonego do komputera

akapit 4: teraz sposób zasilenia to w zasadzie to co napisałem pod koniec poprzedniego posta? A więc czy dobrze zrozumiałem: do anody transoptora podłączam Pin PWM i pomiędzy wpinam opornik R1, do katody podłączam Arduinowe GND i całość jest "aktywna" gdy PWM jest w stanie wysokim? Wydaje mi się że to własnie miałeś na myśli. Jeśli tak to fajny pomysł i za takim rozwiązaniem bym optował jednak nie rozumiem jednej rzeczy. Czy mam zewrzeć ze sobą wybrany pin GND z Arduino z pinem GND z zewnętrznego zasilacza jesli będę potrzebował jeszcze z niego skorzystac? Do masz na myśli pisząc że masy muszę mieć "wszędzie dociągnięte"?? To jest w zasadzie najważniejszy akapit który może mi pomóc rozwiązać 50% problemów.

akapit 5: Problem jest gdy obiekt jest dalej niz 28 cm. Gdy obiekt jest blisko czujnika pomiar jest bardzo dobry

akapit 6: Oczywiście że tak, tam równiez zastosowałem skrót myślowy

Za Twoją odpowiedz na pytania dot. akapitu 4 będę mega wdzięczny! Czekam na odpowiedz i pozdrawiam 🙂

Link do komentarza
Share on other sites

OK, błędnie zrozumiałem, że +5V na anodzie diody LED pochodzi z jakiegoś obcego zasilacza niepodłączonego do GND całości. Jeżeli wziąłeś to z Vcc Arduino, układ zadziała.

Potwierdzam: wszystkie źródła zasilania jakich używasz muszą mieć podłączone oba końce do układu. Jeżeli wszystkie zasilacze mają dawać napięcie dodatnie względem masy (np. procesora), to wszystkie bieguny ujemne (minusy, GND czy jak tam je nazwiesz) muszą być połączone ze sobą i z masą układu. Prąd który wypływa z końcówki plusowej zasilacza musi mieć szansę wpłynąć z powrotem do końcówki minusowej tego samego zasilacza. Niepodłączenie masy zasilacza do masy całości powoduje, że nic z niego nie wypływa (bo prąd nie ma którędy wrócić z powrotem) i nie zasila on niczego.

USB ma w zasadzie wydajność 500mA i tego możesz się spodziewać. Na pokładzie Arduino masz bezpiecznik 0.5A, ale ponieważ tego typu elementy nie są produkowane w aptekach, nie licz na precyzyjne odcinanie. W każdym razie ten prąd spokojnie starczy na procesor, jakieś interfejsy (radio małej mocy, Ethernet, RS232/485 itp), wiele czujników, wyświetlacz LCD (tu głównie podświetlanie więc raczej coś < 4-6 cali). Z modułem GSM, szczególnie takim pracującym w starych trybach już może być problem. Na pewno żadne tam silniki czy serwa.

W takim razie sytuacja jest odwrotna: przy małej odległości krążka jego echo jest wystarczająco silne by odbiornik zobaczył sygnał i wyprodukował impuls do procesora. Im dalej w głąb tym rośnie szum od ścianek rury, bo każdy jej cm robi hałas w każdą stronę a maleje wielkość echa od celu. Dodatkowo krążek się pochyla na boki więc w zależności kiedy uderzy w niego impuls może on odbić się osiowo a może w ścianę i dopiero po kilku odbiciach pośrednich (dłuższa droga) dotrzeć do odbiornika. W międzyczasie może się wygasić lub zsumować z echem bezpośrednim.. Rzeczywiście, zwiększenie średnicy rury powinno na pierwszy rzut oka pomóc, ale nie umiem tego przewidzieć na 100%. To skomplikowane otoczenie a dodatkowo nie znamy sposobu tworzenia się fal stojących i odbić we wnętrzu rury z uwzględnieniem charakterystyk kierunkowych nadajnika i odbiornika. Do tego szum powietrza. Zamodelowanie tego w głowie jest trudne i moim zdaniem jesteś skazany na eksperymenty. Być może właśnie zmniejszenie średnicy rury spowodowałoby uproszczenie fizyki rozchodzenia się impulsu, patrz światłowody jedno- i wielomodowe. Do tego zamiana krążka na kulkę dałaby przynajmniej powtarzalność obiektu niezależnie od jego pochylenia kątowego.

Szczerze mówiąc trochę mnie dziwi wybór czujnika akustycznego do pracy w tak hałaśliwych warunkach. Osobiście zaczął bym raczej od metod optycznych, np. któregoś SHARPa z triangulacją. Ten przynajmniej nie widzi i nie słyszy przepływającego powietrza oraz nie przeszkadza mu praca w rurze, bo patrzy tylko na wąski i dobrze określony wycinek świata.

Czyli próby, próby, próby.. plus oczywiście wyciągnie poprawnych wniosków. Daj znać o wynikach.

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

Bardzo dziękuję za Twoją pomoc, nawet zachęciłeś mnie do nauki elektroniki 😃 Ale w tej chwili potrzebowałem wiedzy "na już" a Ty musiałeś nieźle się rozpisać żeby wszystko wyłożyć jak trzeba.

Co do czujnika to po prostu chodziło mi o to żeby było tanio a prostota z jaką można go oprogramować również kusiła. No i jakoś nie pomyślałem o problemach natury fizycznej kiedy zobaczyłem jak bezproblemowo działa u znajomych.

Dziś zamówiłem większą rurę, dam znać jutro o wynikach 😉

Link do komentarza
Share on other sites

Tym razem czujnik działa ale do większej rury musiałem dorobić większy korek który ma również większą powierzchnię styku z nową rurą. Całość wygląda teraz mizernie pod względem  dynamiki. Krązek w rurze powoli unosi się do gury i pomimo tego że użyłem krążki o różnych średnicach nie przyniosło to rezultatu. A całość ma być docelowo regulowana regulatorem PID więc takie rozwiązanie nie zda egzaminu. Poprzednia rura była najlepszym rozwiązaniem, problem był tylko w czujniku odległości więc to może tutaj spróbuję coś innego??

Znacie inne czujniki które są w stanie dokonywać pomiarów w zakresie od 0 do 1 metra z dokładnością do 1 cm? Może być nawet do pół metra. Optyczne? Z tego co widziałem w necie to za ich pomocą mogę tylko sprawdzić czy obiekt nie przekracza jakiejś zadanej odległości np. 15cm.

Tym razem czujnik działa ale do większej rury musiałem dorobić większy korek który ma również większą powierzchnię styku z nową rurą. Całość wygląda teraz mizernie pod względem  dynamiki. Krązek w rurze powoli unosi się do gury i pomimo tego że użyłem krążki o różnych średnicach nie przyniosło to rezultatu. A całość ma być docelowo regulowana regulatorem PID więc takie rozwiązanie nie zda egzaminu. Poprzednia rura była najlepszym rozwiązaniem, problem był tylko w czujniku odległości więc to może tutaj spróbuję coś innego??

Znacie inne czujniki które są w stanie dokonywać pomiarów w zakresie od 0 do 1 metra z dokładnością do 1 cm? Może być nawet do pół metra. Optyczne? Z tego co widziałem w necie to za ich pomocą mogę tylko sprawdzić czy obiekt nie przekracza jakiejś zadanej odległości np. 15cm.

 

EDIT: czy nada się czujnik Laserowy odległości Lidar TFMini UART - 12m? Problem w tym że jego dokładność to 0,06m czyli 6cm. Jeśli mierzysz odległość od 0 do 50cm to 6cm to psoro... Co tu zrobić?

Jednak ten czujnik się też nie nada, jego zasięg efektywnego pomiaru zaczyna się od 30cm

 

Link do komentarza
Share on other sites

A sprawdź coś takiego. Nie próbowałem co prawda tego wsadzać do rury, ale w sumie drogi nie jest, możesz spróbować. Dokładność teoretyczna to 1mm na 2m, w praktyce nieco mniej i nieco bliżej. Tylko nie pomyl czujników, bo bardzo podobny ma zakres do 10cm a nie do 2m!

  • Lubię! 1
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.