Skocz do zawartości

Sharp GP2Y0A21YK0F 10-80 cm analog


Cukor

Pomocna odpowiedź

WItam, mam oprogramowany czujnik Sharp GP2Y0A21YK0F podłączony do arduino z wyświetlaczem 16x2 HD44780. Pomiary czujnika są dość zgodne z rzeczywistą odległością jednak martwi mnie jedna rzecz. Gdy skieruje czujnik w pustkę np w sufit (dla niego to jest pustka skoro ma zasięg 80cm) wyświetla mi na ekranie ~60cm a jak np w stronę okna to wyświetla ~30cm. Dlaczego tak jest skoro ma zasięg 80cm? Wiem ze ta różnica jest uwarunkowana oświetleniem czujnika ponieważ robiłem test na to. Czujnik docelowo ma się znaleźć w robocie minisumo. Problem jest taki że jak robot będzie "widział pustkę" to jednak czujnik wskaże mu powiedzmy to ~60cm co będzie błędem. Jak się tego ustrzec?

Link do komentarza
Share on other sites

Czy czujnik wyświetla w ogóle wartości większe niż 60 cm? Jak przeliczasz napięcie na odległość?

Czy przez okno masz na myśli otwarte okno, czy szybę? Szyba może być wykrywana przez ten czujnik.

Link do komentarza
Share on other sites

Odleglosc w cm obliczam tak :

distance (cm) = 41.543 * (Voltage + 0.30221) ^ -1.5281 (matlab EzyFit tool)

Znalazlem to gdzies w internecie w komentarzach do czujnika.

Jesli skierowac czujnik odpowiednio na sciane to wyswietla wartosci do ~80cm. Narazie nie sprawdzalem na ile to jest dokladne. Z tym okne to znajduje sie ono na drugim koncu pokoju wiec napewno jest wiecej niz 80cm. Glownie chodzi mi o to jak sie powinien zachowywac taki czujnik jak "nic" nie widzi. Moze to byc wina programu lub podlaczenia?

wklejam kod jakby ktos chcial

/*
* GccApplication4.c
*
* Created: 2014-05-19 21:44:12
*  Author: Mieloch
*/ 

#define F_CPU 16000000L
#include <avr/io.h>
#include "HD44780.h"
#include <math.h>

int main(void)
{
char buffer[10];

ADCSRA |= ((1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0));    //Prescaler at 128 so we have an 125Khz clock source
ADMUX |= (1<<REFS0);
ADMUX &= ~(1<<REFS1);                //Avcc(+5v) as voltage reference
ADCSRB &= ~((1<<ADTS2)|(1<<ADTS1)|(1<<ADTS0));    //ADC in free-running mode
ADCSRA |= (1<<ADATE);                //Signal source, in this case is the free-running
ADCSRA |= (1<<ADEN);                //Power up the ADC
ADCSRA |= (1<<ADSC);

LCD_Initalize();   //inicjalizacja LCD
int i;
float tmp, tmp2;
char buffer2[4]; // napiecie na adc
int d1, d2;
float f2;
   while(1)
   {
       // cm distance (cm) = 41.543 * (Voltage + 0.30221) ^ -1.5281 (matlab EzyFit tool)
	tmp2 = ADCW;
	i = tmp2;
	/* zamiana na cm i przygotowanie wyniku do wyswietlenia */
	tmp= (tmp2*5)/1024;
	tmp = 41.543 * pow((tmp + 0.30221),(-1.5281));
	d1 = tmp;
	f2 = tmp - d1;
	d2 = trunc(f2*10000);
	sprintf(buffer, "cm : %d.%04d", d1, d2);
	/* ### */ 
	itoa(i,buffer2,10); // przygotowanie wartosci ADC do wyswietlenia
	LCD_GoTo(0, 0);
	LCD_WriteText(buffer); // wyswietlanie odl w cm
	LCD_GoTo(0, 1);
	LCD_WriteText(buffer2);// wyswietlanie wartsci ADC
	_delay_ms(500);
	LCD_Clear();
   }
}
Link do komentarza
Share on other sites

Nie wrzucaj do ATmegi liczb zmiennoprzecinkowych.

Rada ode mnie jest taka: odczytuj wartości bitowe oraz napięcie. Na tej podstawie będziesz mógł odczytać z charakterystyki umieszczonej w datasheecie odległość, której nie musi znać procesor.

Przy pisaniu taktyki będziesz mógł ustalić odległość stawiając przedmiot w pożądanej odległości, a następnie odczytasz wartość z wyświetlacza.

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

Czyli rozumiem ze odczytywac tylko wartosc z przetwornika ADC i dzieki niej ustalac napiecie i na tych danych budowac algorytm?

Tylko nikt mi nie powiedzial jeszcze co powinien wskazywac czujnik gdy nic nie stoi mu na drodze w zasiegu 80cm...

Link do komentarza
Share on other sites

Zaglądałeś do noty katalogowej? Jest tam przecież dokładna charakterystyka, która wprawdzie kończy się na 80 cm, ale z jej kształtu można przypuszczać, że zmierza do wartości ok. 0,3V. Z moich dotychczasowych doświadczeń z tymi czujnikami wynika zresztą podobnie.

Spróbuj wyświetlić sobie nie odległość, a napięcie jakie jest na wyjściu czujnika, dzięki temu będziesz wiedział, czy coś jest nie tak z jego wskazaniami, czy z wielomianem, który stosujesz.

Link do komentarza
Share on other sites

mactro, czasami nota a rzeczywistość mogą dać różne wyniki. Szczególnie przy mocnym oświetleniu naturalnym bądź niektórym sztucznym. Najlepiej podłączyć czujnik i multimetrem zmierzyć.

Link do komentarza
Share on other sites

Właśnie zaintrygowany Twoim poprzednim postem postanowiłem zmierzyć 😋 Wyniki:

➡️ 70 cm - 0,47V

➡️ 80 cm - 0,44V

➡️ 90 cm - 0,43V

➡️ okno w odległości ok. 2m - 0,21V

➡️ ściana w podobnej odległości - 0,17V

Zmierzone przetwornikiem ADC Atmegi32u4, wartości średnie dla 1000 pomiarów.

Link do komentarza
Share on other sites

Hmm, ciekawe. Mi kiedyś wyszło inaczej, ale właśnie sobie uświadomiłem, że wysokość nad podłożem (i rodzaj tego podłoża) ma znaczenie. Widocznie u mnie jakieś śladowe ilości odbijały się po drodze i czujnik próbował to interpretować. I chyba warto być tego świadomym, że czujnik ma jakiś kąt widzenia w pionie i może odbierać refleksy od podłoża jeżeli jest nisko położony.

Link do komentarza
Share on other sites

czujnik skierowany na pomaranczowa sciane w odleglosci ~1,5m pokazuje 0,55-0,6v. Trzymam go reka w powietrzu, podstawienie mu kartki jako podloze nie zmienia pomiaru. Cos musi być nie tak bo nei trzyma wartosci z noty katalogowej. Napiecie nigdy nie przekracza 3v nawet ma problem by sie zblizyc do tej wartosci, a powinno. Moze to być wina polaczenia? Nie stosuje zadnych filtrow przy tym czujniku, powinienem?

Mactro w jaki sposob masz podlaczony ten czujnik?

Link do komentarza
Share on other sites

Tantal 10u na zasilaniu, tuż przy czujniku. Poza tym warto jako wartość wyjściową przyjmować średnią (albo średnią kroczącą) z np. 10 pomiarów. Bez tego, miałem dość spory rozrzut wskazań.

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

Teraz działa, az wstyd powiedziec co bylo nie tak, zasilalem go 3,3v a nie 5v...

Rozumiem ze ten tantal jest dolaczony miedzy zasilaniem a gnd?

Link do komentarza
Share on other sites

Tak, tylko pamiętaj, że tantale mają paski z innej strony niż kondensatory elektrolityczne.

Ja korzystam z ceramicznych 100n, bo takie mam pod ręką i czujniki sprawują się przyzwoicie.

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.