Miernik odległości na bazie czujnika GP2Y0A02YK0F

Miernik odległości na bazie czujnika GP2Y0A02YK0F

GP2Y0A02YK0F – tą kombinacją liter i cyfr oznaczono czujnik firmy Sharp przeznaczony do wykrywania obiektów w zasięgu od 20 do 150 cm. Element działa jak dalmierz i można go zastosować do pomiaru odległości do obiektu.

Czujnik emituje wiązkę podczerwieni. Na podstawie sygnału odbitego od obiektu, na wyjście czujnika podawane jest napięcie o poziomie proporcjonalnym do odległości do obiektu.

Podstawowe parametry czujnika są następujące:

  • użyteczny zakres pomiarowy: od 20 cm do 150 cm,
  • wyjście napięcie o poziomie od 2,5 V do 0,5 V, proporcjonalne do zmierzonej odległości,
  • zasilanie od 4,5 V do 5,5 V,
  • średni pobór prądu wynosi 33 mA (w szczycie impulsu wartość jest większa),
  • wymiary 44,5×18,9×21,6 mm,
  • złącze 3-stykowe typu JST PH.
Fotografia 1. Wygląd czujnika

 

Rysunek 2. Rozmieszczenie i opis wyprowadzeń

Czujnik zamieszczono na fotografii 1, opis wyprowadzeń złącza JST PH prezentuje rysunek 2.

Budowa i działanie

Na rysunku 3 pokazano schemat blokowy czujnika. LED oznacza diodę wytwarzającą skupioną wiązkę światła podczerwonego wysyłaną w kierunku obiektu. Po odbiciu światło pada na matrycę detektora PSD (Position Sensing Device). Moduł jest wyposażony w wewnętrzny oscylator i stabilizator, do którego podłączone jest wejście zasilania Vcc. Sygnał proporcjonalny do wyniku pomiaru wytwarzany jest w układzie pomiarowym (Signal processing circuit) i poprzez bufor wyprowadzany na wyjście Vo.

Rysunek 3. Wewnętrzny schemat blokowy czujnika

 

Rysunek 4. Pomiar odległości metodą triangulacji

Do obliczenia dystansu pomiędzy czujnikiem a obiektem służy metoda triangulacji. Istotę metody i działanie czujnika objaśnia rysunek 4. Dioda Led IR wytwarza wiązkę światła podczerwonego skupionego przez soczewkę do rozmiarów niewielkiej plamki. Po odbiciu od przeszkody, plamka światła pada na matrycę PSD.

W zależności od odległości, w jakiej znajduje się obiekt, odbite światło pada na matrycę pod innym kątem i w innym miejscu. To przesunięcie, proporcjonalne do odległości obiektu, zamieniane jest na odpowiedni poziom napięcia wyjściowego Vo. Wykres napięcia w funkcji zmierzonej odległości pokazany został na rysunku 5.

Rysunek 5. Krzywa zależności napięcia Vo od odległości

Ze względu na istotę stosowanej metody uzyskana krzywa ma przebieg logarytmiczny. Z kolei skończona rozdzielczość użytej matrycy PSD sprawia, że wraz ze wzrostem mierzonej odległości spada nachylenie krzywej i pogarsza się precyzja i rozdzielczość pomiaru. W przypadku najkrótszych dystansów następuje gwałtowne przegięcie krzywej ograniczające możliwe do realnego zmierzenia odległości do 20 cm.

Podłączenie czujnika

Czujnik został podłączony do płytki Nucleo. Dla uzyskania większej mobilności do zasilania płytki wykorzystano zewnętrzny zasilacz dostarczający napięcie 7...12 V podawane na wyprowadzenie VIN. Zestawienie wszystkich koniecznych połączeń zebrano w tabeli 1. Ze względu na impulsowy pobór prądu przez czujnik producent zaleca podłączyć kondensator filtrujący 10 mF jak najbliżej wyprowadzeń Vcc i GND modułu. Jego zastosowanie poprawiło nieco parametry sygnału wyjściowego, jednak w tej konfiguracji nie okazało się niezbędne. Do tej samej płytki Nucleo, do złącza typu arduino, podłączono moduł wyświetlacza LCD do prezentacji wyników prowadzonych pomiarów.

Procedury programowe

Czujnik GP2Y0A02YK0F wykonuje pomiary nieprzerwanie od momentu podłączenia zasilania. Co około 40 ms odświeżane jest ustawienie napięcia wyjściowego Vo. Na rysunku 6 pokazano zależności czasowe cyklu kolejnych odczytów.

Rysunek 6. Zależności czasowe cyklu kolejnych odczytów

Aby odczytać zmierzoną przez czujnik odległość, należy napięcie z wyjścia Vo podać na wejście przetwornika ADC mikrokokntrolera na płytce Nucleo, np. na port PA1. Przetwornik należy skonfigurować do pracy w trybie ciągłej konwersji napięcia podawanego na port PA1. Po zakończeniu kolejnego cyklu konwersji jej rezultat, jako wartość 16-bitowa, powinien być zapisywany przez mechanizm DMA w buforze. Zawartość bufora będzie pobierana przez procedury przeliczające odczytany poziom napięcia na odległość. Na listingu 1 pokazano deklarację zmiennych oraz procedurę inicjującą. Tabela stałych dist_volt_const_tab[] zawiera wartości, które będą używane do przeliczeń napięcia na zmierzoną odległość. Wartości stałych odpowiadają zaznaczonym na wykresie punktom (rysunek 5).

Listing 1. Deklaracje oraz procedura inicjująca
uint32_t dalmierz_srednia;
uint16_t dalmierz_wynik;
uint8_t num_probki;
const double dist_volt_const_tab[]={
//20 30 40 50 60 70 80 90 100 110 120 130 140 150
2.5, 2.0, 1.5, 1.25, 1.05, 0.9, 0.82, 0.73, 0.65, 0.6, 0.55, 0.5, 0.45, 0.42
};
double dist_volt_tab[14];

#define DALMIERZ_POMIAR_BRAK -1
#define DALMIERZ_ILE_PROBEK 100
#define DALMIERZ_PRZEDZIAL_MIN 0
#define DALMIERZ_PRZEDZIAL_MAX 14

//inicjacja procedur dalmierza gp2y0a02
uint8_t gp2y0a02_Ini(void)
{
for (uint8_t x=0;x<DALMIERZ_PRZEDZIAL_MAX;x++)
{
dist_volt_tab[x] =dist_volt_const_tab[x];
}
dalmierz_wynik =DALMIERZ_POMIAR_BRAK;
dalmierz_srednia =0;
num_probki =0;
return TRUE;
}

 

Listing 2. Procedura odczytu i uśredniania wartości z przetwornika ADC
//odczyt uśrednionej wartości z przetwornika ADC
uint16_t gp2y0a02_OdczytSredniejADC(void)
{
int16_t adc_odczyt =ADC_Odczyt(NumKanal_Dalmierz);
if (adc_odczyt ==ADC_TRWA_KONWERSJA) return dalmierz_wynik;

dalmierz_srednia =dalmierz_srednia +adc_odczyt;
num_probki++;
if (num_probki >=DALMIERZ_ILE_PROBEK)
{
dalmierz_srednia =dalmierz_srednia / num_probki;
dalmierz_wynik =(uint16_t)dalmierz_srednia;
dalmierz_srednia =0;
num_probki =0;
}
return dalmierz_wynik;
}

Procedura z listingu 2 służy do odczytu i uśredniania wartości z przetwornika ADC. Uśrednianie polega na sumowaniu wartości kolejnych próbek. Gdy zostanie odczytana, określona przez zmienną DALMIERZ_ILE_PROBEK, liczba próbek, z otrzymanej sumy wyciągana jest średnia arytmetyczna.

Procedura gp2y0a02_ADCtoU() z listingu 3 przekształca otrzymaną w wyniku konwersji liczbę z przedziału 0...4095 na wartość napięcia Vo. Liczba 3,3 określa w woltach poziom napięcia referencyjnego przetwornika ADC na płytce Nucleo.

Listing 3. Procedura przekształcająca wynik na wartość napięcia
//konwersja odczyt ADC -> napięcie
double gp2y0a02_ADCtoU(uint16_t adc_odczyt)
{
double napiecie =(3.3 * (double)adc_odczyt) / 4095;
return napiecie;
}

 

Listing 4. Główna procedura obsługi czujnika
//odczyt zmierzonej odległości
double gp2y0a02_OdczytOdleglosci_cm(void)
{
int8_t przedzial;
double odleglosc_cm;

uint16_t adc_odczyt =gp2y0a02_OdczytSredniejADC();
double napiecie =gp2y0a02_ADCtoU(adc_odczyt);

for (przedzial=DALMIERZ_PRZEDZIAL_MIN;przedzial<DALMIERZ_PRZEDZIAL_MAX;przedzial++)
{
if (napiecie>=dist_volt_tab[przedzial]) break;
}
odleglosc_cm =((przedzial-1)*10)+20;
if (przedzial==DALMIERZ_PRZEDZIAL_MIN || przedzial==DALMIERZ_PRZEDZIAL_MAX)
{
//pomiar poza dopuszczalnym zakresem
return odleglosc_cm;
}
double delta_v_przedzial =dist_volt_tab[przedzial-1]-dist_volt_tab[przedzial];
if (delta_v_przedzial<0) return odleglosc_cm;
double napiecie_d =napiecie -dist_volt_tab[przedzial];
double prop =1 -(napiecie_d/delta_v_przedzial);
odleglosc_cm =odleglosc_cm +(prop *10);

return odleglosc_cm;
}

Listing 4 zawiera główną procedurę obsługi czujnika. Zastosowane są tam opisane wcześniej procedury do odczytu z przetwornika ADC i konwersji pomiaru.

Następnie w pętli for() wyszukiwany jest przedział odległości, w jakim zawiera się uśredniony odczyt z czujnika. Wyszukiwanie polega na porównaniu uśrednionej wartości napięcia Vo z wartościami przepisanymi z tabeli stałych dist_volt_const_tab[]. W tym momencie znana jest odległość z rozdzielczością 10 cm.

Do dalszych obliczeń przyjmuje się uproszczone założenie, że krzywa z rysunku 5 składa się z liniowych odcinków pomiędzy punktami wyznaczającymi kolejne 10-centymetrowe przedziały. Na zasadzie proporcji wyliczana jest odległość między czujnikiem a obiektem, z dokładnością do 1 cm.

Rozrzut parametrów poszczególnych egzemplarzy czujnika GP2Y0A02YK0F powoduje, że każdy czujnik ma trochę inną charakterystykę pomiarową. Dla zwiększenia precyzji pomiaru można przewidzieć w programie dodatkową procedurę kalibracyjną. Powinna polegać na wykonaniu serii 14 pomiarów, zaczynając od 20 cm do 150 cm, co 10 cm. Odczyty wartości napięcia Vo każdego pomiaru powinny zostać przepisane do tabeli zmiennych double dist_volt_tab[14].

Możliwość przeprowadzenia kalibracji jest powodem, dla którego w obliczeniach używa się zmiennych z tej tabeli a nie stałych z tabeli dist_volt_const_tab[].

Końcowe wnioski

Czujnik GP2Y0A02YK0F, ze względu na wyjście napięciowe, jest prosty w obsłudze i może pracować z różnymi typami kontrolerów wyposażonych w przetwornik ADC. Cechuje się wąską wiązką podczerwieni i dosyć stabilnymi odczytami, mało wrażliwymi na poziom zewnętrznego oświetlenia. Wadą jest wyraźnie spadająca rozdzielczość przy pomiarach na dystansach dłuższych niż 1 metr.

Ryszard Szymaniak

Artykuł ukazał się w
Elektronika Praktyczna
listopad 2019
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik grudzień 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio listopad - grudzień 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje listopad - grudzień 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna grudzień 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich styczeń 2025

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów