Skocz do zawartości
drukarz

Ultradźwiękowy czujnik odległości do robota

Pomocna odpowiedź

Niestety tego schematu czujnika z dwukierunkowym przetwornikiem nie mogę dać, ponieważ jest to projekt komercyjny.

Wrzucę schemat mojego pierwszego czujnika. (W załączniku)

Sygnał na wyjciu filtra aktywnego można podać na komparator i odczytywać impulsy z wyjścia komparatora nóżką mikrokontrolera albo dodać do niego detektor obwiedni zbudowany z diody, rezystora i kondensatora i odczytywać na przykład przetwornikiem ADC

U góry oscylogramu widać przebieg na wyjściu filtru aktywnego, a na dole przebieg za detektorem obwiedni.

Ten schemat co wrzuciłem nie jest idealny. Wzmacniacze NE5532 są najlepsze do tego typu zastosowania jakie znalazłem ale warto by było dobrać inne wartości rezystorów i kondensatorów

US1.pdf

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
Pozatym jak wsadzisz taki układ na robota to na sto procent nie będzie działać, bo zakłucenia będą "szaleć" 🙂 po całym układzie. Wiem bo zrobiłem coś podobnego i nie działało to zbyt dobrze.

Troszkę przesadzasz. U mnie jednak działa. Jest co prawda odsłonięty od reszty elektroniki zwykłym jednostronnym laminatem, przetworniki są do płytki podłączone zwykłymi przewodami ekranowanymi (są w odległości ok 3cm od płytki) ale nie ma żadnych zakłóceń i działa jak należy.

Poza tym nie zawsze potrzebny jest zasięg 5m. Wiadomo że Twoje działają o niebo lepiej ale po co wydawać 60zł jak komuś to wystarczy?

Pozdrawiam.

Udostępnij ten post


Link to post
Share on other sites

U mnie były zakłócenia chyba dlatego że silniki ciągły 60 amperów 🙂.

Czujniki które kiedyś zbudowałem "na sucho" miały zasięg 2 metrów a jak je włożyłem na robota to musiałem z powodu zakłóceń ograniczyć zasięg do 0,5 metra a to do sumo jest dwa razy za mało 😉

Udostępnij ten post


Link to post
Share on other sites

Witam. Mam problem z takim właśnie sonarem. Zrobiłem go wg schematu p. Otulaka jak w linku w pierwszym poście tego tematu. Tylko u mnie jest nadajnik, odbiornik i dwie diody oraz wyrzucony całkowicie głośnik. Wgrałem program, wszystko oki i pojawił się dziwny problem z rozpoznaniem odległości. Zacząłem się domyślać, że sonar rozpoznaje tylko odległości "0" i "1". Moje przypuszczenia potwierdził program, gdzie uwzględniłem właśnie tylko echo równe 0 lub 1. (jeśli 0 to jedna dioda świeci jeśli - właściwie b.szybko mruga, jeśli 1 to druga to samo). no i jest tak że pracuje jedna lub druga więc rzeczywiście innych stanów nie ma. Spójrzcie na program dołączam poniżej (pozamieniane jest tylko sbi i cbi). Do "ifów" jest praktycznie taki sam jak u drukarza.

Co ciekawe, gdy nie ma żadnej przeszkody, echo jest równe zero, gdy się coś pojawi, echo = 1. Przeszkody wykrywa z odległości około 1,5m.

Czy ktoś może powiedzieć jaka jest przyczyna takiego zachowania układu?

Pozdrawiam.

/* wytwarzanie dźwięków

implementacja funkcji beep(częstotliwość,czas trwania)

*/

#include

#include "sonar.h"

#include "poprzednie.c"

int z;

int echo;

int ping(void)

{

// procedura wysyłająca paczkę ultradźwięków

// tutaj zanotujemy opóźnienie powrotu echa

{

sinus_40_khz();

sinus_40_khz();

sinus_40_khz();

sinus_40_khz();

sinus_40_khz();

sinus_40_khz();

sinus_40_khz();

sinus_40_khz();

sinus_40_khz();

sinus_40_khz();

sinus_40_khz();

sinus_40_khz();

sinus_40_khz();

sinus_40_khz();

sinus_40_khz();

}

// po wysłaniu paczki ultradźwięków wytłumiamy drgania

// przetwornika zwierając je do masy

PORTD &=~ (1<<0); //cbi(ultrasonic_pinA_port,ultrasonic_pinA_pin);

PORTD &=~ (1<<1); //cbi(ultrasonic_pinB_port,ultrasonic_pinB_pin);

delay(8);

//rozładowujemy pojemność przetwornika wejściowego

//poprzez zwarcie do masy

DDRD |= (1<<6); // sbi(DDRD,PD6);

PORTD &=~ (1<<6); //cbi(PORTD,PD6);

//delay(8);

// włączamy wejście

DDRD &=~ (1<<6); //cbi(DDRD,PD6);

// teraz czekamy na powrót echa

for(echo=0;echo<20;echo++)

{

if(bit_is_set(ACSR,ACO))

{

break;

}

}

return echo;

}

void sinus_40_khz(void)

{

DDRD |= (1<<0); //sbi(ultrasonic_pinA_DDR,ultrasonic_pinA_pin);

PORTD |= (1<<0); //sbi(ultrasonic_pinA_port,ultrasonic_pinA_pin);

DDRD |= (1<<1); //sbi(ultrasonic_pinB_DDR,ultrasonic_pinB_pin);

PORTD &=~ (1<<1); //cbi(ultrasonic_pinB_port,ultrasonic_pinB_pin);

// teraz czekamy połowę okresu sinosoidy

asm volatile (

"WDR":🙂;

asm volatile (

"WDR":🙂;

asm volatile (

"WDR":🙂;

asm volatile (

"WDR":🙂;

PORTD &=~ (1<<0); //cbi(ultrasonic_pinA_port,ultrasonic_pinA_pin);

PORTD |= (1<<1); //sbi(ultrasonic_pinB_port,ultrasonic_pinB_pin);

// teraz czekamy nieco krócej jak okres połowy sinusoidy

// bo procesor potrzebuje nieco czasu na powrót z tej procedury

// i ponowne do niej wejście - dopiero wtedy rozpocznie kolejną

// sinusoidę

asm volatile (

"WDR":🙂;

asm volatile (

"WDR":🙂;

}

int main (void)

{

int odleglosc;

// zwieramy nieodwracające wejście komparatora do masy

DDRD |= (1<<7); //sbi(DDRD,PD7);

PORTD &=~ (1<<7); // cbi(PORTD,PD7);

delay(8);

for (;😉

{

ping();

odleglosc=echo;

if(odleglosc==0)

{

LED_ON;

delayms(500);

LED_OFF;

}

if(odleglosc==1)

{

LED_1;

delayms(500);

LED_1off;

}

}

return (0);

}

Udostępnij ten post


Link to post
Share on other sites

Program działa w ten sposób że zmienna echo jest zwiększana od momentu wysłania do momentu odebrania wysłanej paczki ultradźwięków i następnie na podstawie wartości tej zmiennej jest określana odległość przeszkody. Jeśli natomiast zmienna osiągnie wartość >450 czyli przez jakiś czas nie odbierze wysłanej paczki, jest kasowana i liczy od nowa.

Ty natomiast ustawiłeś sobie 20 co znaczy że wykrywa przeszkodę oddaloną maksymalnie o około 10cm. A jak wykrywa z większych odległości tzn że odbiera ultradźwięki nie te które wysłał ostatnio a poprzednie.

I nie rozumiem dlaczego usunąłeś wszystkie funkcje?

Udostępnij ten post


Link to post
Share on other sites
Do nóżek odbiornika podłączyłem rezystor w celu eliminacji zakłóceń

to jest błąd!

sam rezystor jedynie osłabia cały sygnał (sygnał użyteczny wraz z zakłóceniami)W celu eliminacji samych zakłóceń stosuje się filtry.

W tym przypadku potrzebujemy filtra pasmowo-przepustowego z częstotliwością środkową równą tyle ile w datasheet'cie przeczytamy dla wzorcowego pomiaru. Do tego pasmo 3dB odpowiednio szerokie.

pozdro

Udostępnij ten post


Link to post
Share on other sites

Drukarz:

Właśnie tak rozumiem ten program jak opisałeś i dlatego dziwi mnie takie zachowanie układu. Zliczanie jest rzeczywiście do 20 max ale dałem wcześniej 400, czy 200 i było to samo.. Warunki w "ifach" odlegloosc=0 i odleglosc=1 dałem tylko po to, żeby sprawdzić czy układ rzeczywiście reaguje tylko na te dwie wartości no i tak jest. Bo gdyby było inaczej (np odleglosc = 15, nie zapalałaby się żadna dioda). Chodzi mi o to, czy ktoś wie jaka może być tego przyczyna i może mi pomóc.

A jakie funkcje konkretnie masz na myśli? Wkleiłem tylko to, z czym związany jest mój problem.

pozdrawiam

Udostępnij ten post


Link to post
Share on other sites
Do nóżek odbiornika podłączyłem rezystor w celu eliminacji zakłóceń

to jest błąd!

sam rezystor jedynie osłabia cały sygnał (sygnał użyteczny wraz z zakłóceniami)W celu eliminacji samych zakłóceń stosuje się filtry.

pozdro

Wiem że to jest osłabianie sygnału użytecznego wiem. I wiem do czego służą i co to są filtry 😃 i nie jest to błąd tylko świadome działanie.

ŻakSziRak nie bardzo rozumiem o co chodzi. Wkleiłeś program z załącznika w tym temacie i Ci nie chce działać?? Jak tak tzn że coś źle wkleiłeś.

Czy o to żeby go przerobić tak żeby w przypadku wykrycia przeszkody w jakiejś odległości podawał na jeden pin jedynkę a przy braku przeszkody na inny??

Udostępnij ten post


Link to post
Share on other sites

ŻakSziRak nie bardzo rozumiem o co chodzi. Wkleiłeś program z załącznika w tym temacie i Ci nie chce działać?? Jak tak tzn że coś źle wkleiłeś.

Czy o to żeby go przerobić tak żeby w przypadku wykrycia przeszkody w jakiejś odległości podawał na jeden pin jedynkę a przy braku przeszkody na inny??

Dobra to może inaczej napiszę 😉 Niepotrzebnie chyba wklejałem ten program bo przez to wyszło zamieszanie.

Programu nie kopiowałem tylko napisałem go jakiś czas temu na podstawie tutoriala pana Otulaka. Tak jak pisałem wcześniej wyrzuciłem głośnik, wstawiłem inaczej zapisane komendy (DDR...) i narazie wpiąłem dwie diody a ogólnie będzie miało to wyglądać tak, że w zależności od odległości będą miały być uruchamiane odpowiednie silniki. Chciałbym, żeby sonar działał tak ja powinien, czyli żeby rozróżniał odległości, wtedy mógłbym napisać odpowiednie intrukcje (np if odleglosc<50 to "coś tam", if ogleglosc >=50 to "coś tam innego"). U mnie natomiast jest tak, że program rozpoznaje tylko odleglosc rowna 0 lub 1. I to tu leży mój problem i pytałem czy ktoś ma pomysł jaka może być tego przyczyna. Może teraz się zrozumiemy 😉

Udostępnij ten post


Link to post
Share on other sites

Ale przecież ten mój program taki właśnie jest. Rozróżnia odległości i w zależności od nich wystawia jedynkę na odpowiedni pin portu. W czym więc problem?

Udostępnij ten post


Link to post
Share on other sites
Rozróżnia odległości i w zależności od nich wystawia jedynkę na odpowiedni pin portu. W czym więc problem?

No właśnie w tym, że u mnie tak nie jest, nie rozróżnia tych odległości tak jak powinien 😐 nie sprawdzałem u siebie bezpośrednio Twojego programu, ale wydaje mi się że ta moja przeróbka powinna dać taki sam efekt. A nie daje..

Dzisiaj sprawdzę jeszcze Twój program u mnie i zobaczę jak jest.

[ Dodano: 08 Mar 09 05:32 ]

W dalszym ciągu nie jest dobrze.. Drukarz sprawdziłem Twój program i mam to samo praktycznie czyli rozpoznaje tylko jedynkę jako odległość.

Co ciekawsze później zrobiłem inny eksperyment, skierowałem naprzeciwko prosto w siebie nadajnik i odbiornik, zbliżałem i oddalałem, wtedy reagował lekko lepiej na przykład rozróżniał odległości tak do 10. Próbowałem zmieniać maksymalne wartości echa, opóźnienia przy zwieraniu do masy i dalej jest średnio. Później zrobiłem jeszcze jedną rzecz - tą wiązkę sinusów wrzuciłem do pętli "for" żeby procedura wysyłania ultradźwięków była powtórzona kilka razy i dopiero odbiór, zasięg lekko się zwiększył. "Objawy" są takie, jakby sprzętowo coś było nie tak lub gdyby nadajnik i odbiornik były jakieś kijowe.. Ma ktoś jeszcze jakiś pomysł ?

Udostępnij ten post


Link to post
Share on other sites

No właśnie, że porzuciłem ten projekt z takimi samymi objawami prawie miesiąc temu z braku efektów. Próbowałem również kombinować z max232 podłączonym do nadajnika, co nie dalo żadnych rezultatów. Ale odziwo z moich doświadczeń wynikałoby, że nadajnik dosyćdobrze nadaje, ale jest problem w sofcie z obsługą odbiornika (na multimetrze jak patrzyłem to miałem ~3V). Nie jestem pewien, ale drukarz chyba super trafił (w nadajnik i odb.). Z tego co widze, to tylko u niego wszystko działa prawidłowo.

Udostępnij ten post


Link to post
Share on other sites
Nie jestem pewien, ale drukarz chyba super trafił (w nadajnik i odb.)

Sprawdzałem kilka przetworników i to z różnych źródeł. Więc to odpada.

Ale odziwo z moich doświadczeń wynikałoby, że nadajnik dosyćdobrze nadaje

A jak to sprawdzałeś?

ale jest problem w sofcie z obsługą odbiornika (na multimetrze jak patrzyłem to miałem ~3V)

Mierzenie napięcia nic Ci nie da. Już bardziej częstotliwość.

Może macie wewnętrzny generator ustawiony nie na 1MHz?

Udostępnij ten post


Link to post
Share on other sites

Temat jakby umarł. Trochę szkoda bo zbudowanie sonaru to bardzo ciekawa sprawa.

Z moich doświadczeń mogę powiedzieć, że schemat wklejony przez nes86 działa - jest to kit AVT-2822 (odbiornik 100% skopiowany, w nadajniku avt jest przetwornica).

Po eksperymentach z kit-em planuję zrobić własny układ, wszelka pomoc mile widziana 🙂

Udostępnij ten post


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

Gość
Napisz odpowiedź...

×   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...