Skocz do zawartości

[C] Jak odczytać odległość czujnikiem Sharp GP2D12


Pomocna odpowiedź

Witam!

Przymierzam się do zastosowania czujnika Sharp GP2D12 w moim robocie. Podczepiłem go więc do miktokontrolera AtMega8 i napisałem prosty program mający za zadanie zapalić diodę LED, gdy czujnik coś zobaczy.

Linijka odpowiedzialna za uruchomienie diody wygląda tak:

if(PINB & _BV(6)) PORTC = 0x04; elsr PORTC = 0x00;

Program działa, ale dioda zapala się dopiero, gdy czujnik zobaczy coś w odległości co najwyżej 18cm. Przy większej odległości dioda gaśnie. Teoretycznie czujnik powinien działać do 80cm. Postanowiłem więc utworzyć zmienną, która zmieni wartość z 0 na 1 gdy czujnik cokolwiek zobaczy. No i tu pojawił się problem. Nie mogę sobie poradzić z odczytaniem wartości z czujnika.

Moją ostatnią wersją było:

if(_BV(6)>63) PORTC = 0x04;

Dioda świeci się jednak cały czas, a gdy zmieniam wartość na 64 to w ogóle się nie zapala.

No i tu pojawia się moje pytanie. Jak za pomocą języka C odczytać wartość z tego czujnika?

Link to post
Share on other sites

Skoro czujnik może mierzyć odległość w zakresie 10-80cm to najpierw zastanów się jak on ją przekazuje na swoje wyjście. Odpowiedź jest w dokumentacji tego go czujnika. Jak już ją znajdziesz to pomyśl jak możesz tę informację wprowadzić do procesora. Na pewno nie przez odczyt stanu wejścia cyfrowego bo niby jak można na nim odróżnić 10cm od 20cm i od 80cm skoro masz tylko dwa stany: 0 i 1.

Link to post
Share on other sites
Skoro czujnik może mierzyć odległość w zakresie 10-80cm to najpierw zastanów się jak on ją przekazuje na swoje wyjście. Odpowiedź jest w dokumentacji tego go czujnika. Jak już ją znajdziesz to pomyśl jak możesz tę informację wprowadzić do procesora. Na pewno nie przez odczyt stanu wejścia cyfrowego bo niby jak można na nim odróżnić 10cm od 20cm i od 80cm skoro masz tylko dwa stany: 0 i 1.

Zdaję sobie z tego sprawę, ale nie bardzo wiem jak rozwiązać ten problem. Dokumentacja też nie wiele mi mówi, chyba że czegoś nie widzę.

GP2D12-DATA-SHEET.PDF

Link to post
Share on other sites

Jaki problem chcesz rozwiązywać z tą dokumentacją? Przecież to jest jasno napisane a na dodatek masz odpowiedni wykres. Czego nie rozumiesz w sposobie działania tego czuunika?

Link to post
Share on other sites

Musisz go podłączyć pod wejście analogowe.

Trzeba też znać jego zależność odległości od napięcia, które wysyła na wejście. w dokumentacji tego czujnika znalazłem taki wykres.

Na podstawie tego wykresu musisz wyliczyć kilka zależności liniowych. Bierzesz po dwa punkty i liczysz z układów dwóch równań a(i) i b(i).

Później wartości z ADC wpisujesz do tej funkcji i masz odległość.

Na ADC można podawać napięcie od 0 do 5V. Odczyt jest za to od 0 do 1023. Wartość napięcie na pinie można więc policzyć z takiej proporcji.

5 ----- 1023

x ----- odczyt

Nie wiem, co jeszcze można na ten temat napisać.

Eddit:// Może dopiszę to, że wartości poniżej 10cm, do pisania funkcji nie bierzesz pod uwagę. Zaczynasz od 10cm czyli tego piku.

sharp.thumb.png.14c599bf26565fc97dc170c8d77f037f.png

Link to post
Share on other sites

Oj można i to dużo, jednak mądrej głowie dość dwie słowie. Zawsze można też nie napisać i dać szansę samodzielnego dojścia do rozwiązania lub choćby zadawania ciekawych pytań. Warto ludziom pozwalać myśleć - zostaje na dłużej. Odkrywanie nowych rzeczy daje wielką satysfakcję. Jeżeli Kolega malum nie trawi wykresu w dokumentacji i jak się wydaje nie rozumie pojęcia sygnału analogowego, to czy pomoże mu zdanie: "Na podstawie tego wykresu musisz wyliczyć kilka zależności liniowych"?

Link to post
Share on other sites

Gdy ja zaczynałem swoją przygodę czy to z programowaniem, elektroniką, czy już z robotyką, to też zdarzało mi się czegoś nie rozumieć, albo nie znać jakiegoś pojęcia. Bardzo mnie denerwowało, gdy zadawałem jakieś pytanie, a odpowiedzi były naprawdę proste i na wyciągnięcie ręki, chociaż wtedy nie widoczne dla mnie, a ktoś odpowiadał rzeczy typu: Internet jest togo pełen. Odsyłam do not katalogowych. I gdyby mi ktoś napisał z jakimi pojęciami mam się zaznajomić sukces osiągnąłbym szybciej.

Więc ja może napiszę coś co zmusi do myślenia, a niektóre z tych rzeczy zawarłem w poprzednim poście.

1. Co to są wejścia/wyjścia analogowe i cyfrowe?

2. Na jakich pinach w atmedze8 są wejścia analogowe?

3. Jakie sygnały można wprowadzić na wejście analogowe i jak są one odczytywane w tym mikroprocesorze i jak je odczytać?

4. Jakie sygnały można wprowadzić na wejście cyfrowe i jak są one odczytywane przez ten mikroprocesor?

5. Co to jest funkcja liniowa?

6. Jak wyprowadzić wzór na funkcję liniową mając dwa punkty?

7. Jak podzielić funkcję nieliniową na kilka funkcji liniowych?

8. Jak coś takiego zapisać w funkcji w języku C?

Dodatkowo: Polecam uczyć się takich rzeczy na Arduino, ma bardzo przyjazną bibliotekę oraz jest do tego wiele poradników w internecie. Podobno bardzo fajny kurs, sam go nie czytałem, bo z Arduino zacząłem przygodę trochę wcześniej można znaleźć tutaj: https://forbot.pl/blog/artykuly/programowanie/kurs-arduino-0-zapowiedz-cyklu-id5290

Jeżeli chcesz się męczyć z atmegą to polecam książkę z której sam się uczyłem: https://www.sklep.atnel.pl/pl/p/KSIAZKA-I-wydanie-2/75

A jako, że AVRy będą przechodzić w niebyt ja zacząłem się uczyć programować STM32 tutaj mogę polecić też kurs z tego serwisu: https://forbot.pl/blog/artykuly/programowanie/stm32-praktyce-1-platforma-srodowisko-id2733 , chociaż sam szukam jakiejś książki lub kursu, gdzie byłyby opisane biblioteki HALa.

Link to post
Share on other sites

Takie odpowiadanie nie wprost (w jednym-dwóch pierwszych postach) ma również inny - obok zmuszającego do myślenia - cel. To prosty test. Jeżeli widzę, że pytający w ogólne nie wie o czym pisze a jego tekst to stek mających wyglądać mądrze zlepków zdań, to oczekuję przynajmniej zaangażowania i poważnego podejścia. Jeśli po jednym dwóch pytaniach naprowadzających gość przestaje się odzywać (a wierz mi - to częsty przypadek) to znaczy, że nie chce tego wiedzieć, nie chce poszukać, nie chce mu się nic. Zobacz ile obiecująco rozpoczętych wątków jest w ten sposób "zawieszonych" od bardzo dawna. A teraz przeczytaj jeszcze raz pierwszy post tutaj. Przecież to kompletna nieznajomość nie tylko podstaw elektroniki, ale też programowania. Przecież

if(_BV(6)>63) PORTC = 0x04;

to jakiś bezsens. Kompilator z góry wie, jaki jest wynik a Ty, żeby mieć spokojne sumienie będziesz musiał wyłożyć składnię i semantykę C, krótko opisać makra itd..

Co jakiś czas zdarzają się na szczęście głodni wiedzy zapaleńcy którzy po wskazaniu im ich słabości wgryzają się, czytają co tylko mogą i powracają na Forum mądrzejsi, z nowymi, ciekawszymi pytaniami lub wręcz samodzielnie rozwiązanym problemem. Zwykle generują sobie następne, ale znów wystarczy kilka pytań i jadą dalej. Wątki urastają do wielu stron a na końcu masz pewność, że człowiek nie nadepnie na te same grabie już nigdy, bo sam je w trawie znalazł i odniósł do szopy. Jeśli zrobisz to za niego, za chwilę odetnie sobie palec sekatorem...

Link to post
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

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.