Czujnik odległości Sharp 2D120XJ100F (Bascom)

Często w robotach zachodzi potrzeba zmierzenia dystansu, od robota do przeszkody. Wtedy z
pomocą przychodzą nam gotowe dalmierze firmy SHARP.
Zależnie od modelu mogą one mierzyć dystans z rożnych przedziałów. Ja zdecydowałem się na
kupno czujnika 2D120XJ100F. Z jego noty katalogowej wynika, że mierzy on odległość w
przedziale od 4 do 30 cm. Czujnik z takim przedziałem może mieć bardzo dobre zastosowanie na
przykład w robocie mini sumo czy w małych robotach mapujących, gdzie występują małe
odległości od robota do przeszkody.
Czujnik ten zwraca wartość napięcia na wyjściu zależnie od wykrytej odległości do przeszkody.
Wartości napięć w zależności od dystansu, są przedstawione na wykresie zamieszczonym w nocie
katalogowej czujnika, która znajdującej się pod adresem:
Jego zaletą jest to, że nie mierzy dystansu, na zasadzie pomiaru siły odbitej wiązki podczerwieni,
tylko dokonuje pomiaru kąta pod którym pada na czujnik odbita wiązka.
Postanowiłem wykonać eksperyment, sprawdzający zgodność tego wykresu z rzeczywistością. Na
zdjęciach poniżej przedstawiam wygląd stanowiska do pomiarów.
Podczas testów okazało się, że udało mi się zmierzyć dystans trzech centymetrów. Co już nie było
zgodne z notą katalogową. Przeprowadziłem testy z różnymi przeszkodami. Okazało się, że
tworzywo z jakiego jest wykonana przeszkoda wpływa na pomiar odległości. Jednak wszystkie
pomiary wykonywałem z przeszkodą w formie kawałka drewna. Jest to dosyć uniwersalna rzecz, z,
której jest wykonana większość przedmiotów w domach (roboty mapujące przeważnie poruszają się
w warunkach domowych). Także kawałek drewna dawał takie same efekty co ściana czy plastik.
Jednak przy gąbkach wskazania czujników był dosyć zniekształcone, co może mieć znaczenie w
robotach mini sumo.
Pomiary wykonywałem przy oświeconym świetle i po ciemku (było na tyle jasno żeby się dało
odczytać wskazywaną wartość). Jednak przy obu testach wartości napięcia na wyjściu, nie różniły
się zbytnio. Na wykresie po niżej przedstawiam zależność napięcia wyjściowego do odległości.
Ta charakterystyka jest wynikiem mojego eksperymentu.
Niestety ta charakterystyka nie jest liniowa, co utrudnia napisanie programu mierzącego dystans
przy pomocy tego czujnika.
Poniżej przedstawiam przykładowy program, służący do obsługi czujnika. Jego zadaniem jest
zmierzenie dystansu i wypisanie go na ekranie LCD. Użyłem języka bascom ze względu na jego
popularność i łatwość obsługi wyświetlacza LCD, oraz przetwornika ADC.
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.5 , E = Portd.1 ,
Rs = Portd.0
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Dim Odczyt As Word
Dim Odleglosc As Integer
Dim A As Bit
Dim T_odczyt(30) As Word                                ' Tablica zawierajaca dane z czujnika zalezne od odleglosci
T_odczyt(3) = 589
T_odczyt(4) = 511
T_odczyt(5) = 436
T_odczyt(6) = 379
T_odczyt(7) = 339
T_odczyt(8) = 305
T_odczyt(9) = 275
T_odczyt(10) = 251
T_odczyt(11) = 233
T_odczyt(12) = 213
T_odczyt(13) = 202
T_odczyt(14) = 190
T_odczyt(15) = 176
T_odczyt(16) = 167
T_odczyt(17) = 155
T_odczyt(18) = 147
T_odczyt(19) = 140
T_odczyt(20) = 132
T_odczyt(21) = 125
T_odczyt(22) = 119
T_odczyt(23) = 115
T_odczyt(24) = 107
T_odczyt(25) = 105
T_odczyt(26) = 102
T_odczyt(27) = 96
T_odczyt(28) = 91
T_odczyt(29) = 88
T_odczyt(30) = 83
''''''''''''''''''''''''
'Poczatek petli glownej
Do
Odleglosc = 3                                             'inicjacja zmiennej Odległosc wartością początkową
Odczyt = Getadc(0)                                        'odczyt napięcia z czujnika
A= 0                                                      'przyrównanie flagi A do zera
While A = 0                                               'początek petli While-Wend, wykonywanej dopóki A=0
If Odczyt < T_odczyt(odleglosc) And Odleglosc < 30 Then   'jeżeli wartość odczytana z
                                                          'czujnika, jest mniejsza niż
                                                          'wartość przy aktualnie sprawdzanej odleglosci,
                                                          'a wartość sprawdzana nie przekracza zakresu
Odleglosc = Odleglosc + 1                                 'to zwiększ wartosc sprawdzanej odległości
Elseif Odczyt => T_odczyt(odleglosc) Then                 'jeżeli wartość odczytana jest mniejsza lub
                                                          'równa sprawdzanej odległości
Cls
Lcd Odleglosc                                             'wypisz wartość sprawdzana, która jest też wartością mierzoną
Waitms 100                                                'odczekaj 100ms
A= 1                                                      'ustaw flagę A na stan 1
Elseif Odleglosc = 30 Then                                'sprawdź czy sprawdzana odległość nie przekracza zakresu
Cls
Lcd "poza zakresem"                                       'pokaż komunikat o przekroczonym zakresie pomiarowym
Waitms 100                                                'odczekaj 100ms
A= 1                                                      'ustaw flagę A na 1
End If
Wend
Loop
end
Program ten został przetestowany na kontrolerze Atmega32. Jest zdolny do pomiaru z dokładnością
plus, minus 0,5centymetra. Nie będę tutaj omawiał wszystkich elementów programu, tylko skupie
się na algorytmie pomiaru.
W tablicy T_odczyt znajdują się wartości odczytane z przetwornika ADC przy zadanych
odległościach. Numer wpisu do tablicy to jest odległość, przy której zmierzono taką wartość. Wpisy
zaczynają się od 3, ponieważ poniżej 3cm czujnik już nie mierzy poprawnie. N początku programu,
ustawiamy dystans, od którego zaczniemy sprawdzać, pobieramy wartość z czujnika i ustawiamy
flagę pomocniczą A na 0. Następnie wchodzimy do pętli While-Wend, która będzie wykonywana
dopóki A=0, czyli aż to wykonania pomiaru. Sprawdzamy idąc od najmniejszego dystansu, czy nie
mieści się on w danym przedziale. Nie będę tego tutaj dokładnie opisywał, ponieważ wszystko jest
świetnie pokazane w komentarzach w kodzie programu. Jest to na zasadzie przyłożonej linijki,
przykładamy ją do przedmiotu i jedziemy od początku, aż do momentu w którym kończy się
przedmiot (kończy się mierzony dystans), ale może się stać, że kiedy dojedziemy do końca
przedmiotu, będzie on dłuższy od linijki i potrzebujemy lepszego przyrządu (przekroczyliśmy
zakres pomiarowy). Myślę, że w ten sposób przedstawiłem odpowiednio zagadnienie pomiaru
odległości.
Jeszcze na koniec napiszę coś o zakłóceniach. Jak już wcześniej pisałem, czujnik ten może zwracać
różne wartości zależnie od koloru przeszkody oraz od jej przepuszczalności światła. Dużą zaletą
tych czujników jest to, że światło na nie padające nie powoduje zakłóceń. Przeprowadziłem też test
na zakłócenia pochodzące od innych nadajników podczerwieni(pilot od TV), i pokazały dokładnie
to czego się spodziewałem. Czujnik nie był zdolny do pokazania odległości, wskazywał ciągle zero.
Niestety nie mogłem sprawdzić, czy dwa takie same czujniki naprzeciwko siebie powodują
zakłócenia. Jednak sądząc po ich zasadzie działania, będzie ten sam efekt, co podczas testu z
pilotem TV. Problem z zakłóceniami może się pojawić podczas walki mini sumo, gdzie przeciwnik
może mieć ten sam czujnik.

Komentarze do „Czujnik odległości Sharp 2D120XJ100F (Bascom)

  1. Wykres za przeproszeniem do bani… nie podpisane osie, brak jednostek.
    Po drugie: „zależność napięcia wyjściowego do odległości” –> Powinno być „OD odległości”.

    Po trzecie tablica z odczytami to idiotyzm. Jest coś takiego jak aproksymacja. Dopasować odpowiednią funkcję i nią przybliżać… Kilkadziesiąt linijek mniej…

    • No przyznaję, że jeśli chodzi o wykres to go spieprzyłem. Artykuł pisałem już kilka laty temu, jak moja wiedza była o wiele mniejsza i w tedy to było jedyne rozwiązanie jakie przychodziło mi do głowy.
      W najbliższym czasie będę budował konstrukcje wykorzystującą ten czujnik i w tedy zastosuje już odpowiednie metody i w tedy postaram się to opisać.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Time limit is exhausted. Please reload CAPTCHA.

This site uses Akismet to reduce spam. Learn how your comment data is processed.