Skocz do zawartości
sparow

Czujniki ultradzwiekowe hc- sr04

Pomocna odpowiedź

Witam

Czy istnieje mozliwosc zaimplementowania w kodzie na arduino UNO dwoch czujnikow hc- sr04? Jeden obsluguje spokojnie ale po oddaniu kolejnego i nadpisaniu programu o kolejny trig oraz echo nie dziala wtedy zaden. Prosze o pomoc i nakierowanie czy sie da w ogole bo jesli nie to powalcze moze z sharpem. Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Jasne że się da. Ciężko jednak wskazać Ci jak bez informacji o tym:

-w jaki sposób podłączasz czujniki,
-jak wygląda Twój kod

Udostępnij ten post


Link to post
Share on other sites

A więc tak


#define trig1 2 //czujnik 1
#define echo1 3 
#define trig2 7 //czujnik 2
#define echo2 6

// silnik lewy
const int kierunekLewy=12;
const int hamulecLewy=9;
const int predkoscLewy=5;

//silnik prawy
const int kierunekPrawy=13;
const int hamulecPrawy=8;
const int predkoscPrawy=11;


void setup() {
Serial.begin(9600);
pinMode(trig1, OUTPUT);
pinMode(echo1, INPUT);
pinMode(trig2, OUTPUT);
pinMode(echo2, INPUT);
pinMode(kierunekLewy,OUTPUT);
pinMode(kierunekPrawy,OUTPUT);
pinMode(hamulecLewy,OUTPUT);
pinMode(hamulecPrawy,OUTPUT);
pinMode(predkoscLewy,OUTPUT);
pinMode(predkoscPrawy,OUTPUT);
}

void loop () {
 int czas, dist,czasII,distII;
 digitalWrite(trig1, HIGH);
 delayMicroseconds(1000);
 digitalWrite(trig1, LOW);
 czas = pulseIn(echo1, HIGH);
 dist = (czas/2) / 29.1;
digitalWrite(trig2, HIGH);
 delayMicroseconds(1000);
 digitalWrite(trig2, LOW);
 czasII = pulseIn(echo2, HIGH);
 distII = (czasII/2) / 29.1;

if   (dist >=30 && distII >=30){
doPrzodu();
delay(50);
}

 else { 
doTylu();
delay(500);
 }
}
void doPrzodu()
{
analogWrite(predkoscLewy,255);
analogWrite(predkoscPrawy,255);
//Lewy do przodu
digitalWrite(kierunekLewy,HIGH);
digitalWrite(hamulecLewy,LOW);
//Prawy do przodu
digitalWrite(kierunekPrawy,HIGH);
digitalWrite(hamulecPrawy,LOW);
}

void doTylu()
{
analogWrite(predkoscLewy,255);
analogWrite(predkoscPrawy,0);
//Lewy do przodu
digitalWrite(kierunekLewy,LOW);
digitalWrite(hamulecLewy,LOW);
//Prawy stop
digitalWrite(kierunekPrawy,HIGH);
digitalWrite(hamulecPrawy,HIGH);
}

Kod po zakomentowaniu dzialania jednego czujnika dziala. Dziala zarowno dla czujnika 1 i 2 ale kazdy osobno. Zapewne zrobilem maslo maslane ale to moje poczatki wiec prosze o nakierowanie co i jak. Teraz wykonuje sie od razu warunek drugi czyli jedzie do tylu. Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Spróbuj dodać przed obydwoma pomiarami delay(1000);. Według mnie wracająca fala z jednego czujnika trafia w momencie pomiaru do drugiego.

Udostępnij ten post


Link to post
Share on other sites

Dodanie opoznienia powoduje brak zadzialania czujnikow. Nie reaguja wcale nawet osobno po zakomnetowaniu jednego z nich. Jakieś inne pomysly? I tak zmieniłem stany i predkosci w funkcji jazdy do tyłu bo widze ze skopiowalem bledna wersje kodu. Ale reszta bez zmian

Udostępnij ten post


Link to post
Share on other sites

Witam.

O ile wiem, to czas trwania impulsu wyzwalającego dla HC-SR04 wynosić ma 10us a nie 1000us. Może w tym jest problem?

Pozdrawiam

Udostępnij ten post


Link to post
Share on other sites

Fajnie jakbyś pozbył się z Twojego kodu wszystkich zbędnych funkcji i skupił się na samym pomiarze. Oczyść co się da i wyświetlaj wyniki w konsoli. Gdy to Ci już zadziała to dokładaj kolejne funkcjonalności.

Funkcja pulseIn jest niczym innym jak kolejnym delayem, który oczekuje na stan wysoki i mierzy jego długość. Tu delay, tam delay i robi się jedno wielkie opóźnienie. +jak Jamik zauważył powinno być 10us

Proponuję spróbować coś w stylu:

digitalWrite(trig1, HIGH);
delayMicroseconds(10);
digitalWrite(trig1, LOW); 
czas1 = pulseIn(echo1, HIGH);
Serial.Println(czas1); //wyswietlanie wyniku w konsoli

digitalWrite(trig2, HIGH);
delayMicroseconds(10);
digitalWrite(trig2, LOW); 
czas2 = pulseIn(echo2, HIGH);
Serial.Println(czas2); //wyswietlanie wyniku w konsoli

Udostępnij ten post


Link to post
Share on other sites

Wrocilem wlasnie z pracu i sprawdzilem pokolei. Nie no bomba. Wreszcie dziala wszystko. Oczywiscie trzeba dopracowac szczegoły ale jest progres:) Posiadacie moze jakas warta przeczytania lekturke odnosnie reg PI do regulacji predkosci pojazdu? oraz wyznaczania odometri na podstawie enkoderow. Posiadam siliniki Pololu 29:1 350 obr/min z enkoderem 64 imp./obr. Bede za wszystko bardzo wdzieczny. Pozdrawiam i zycze milej nocy

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ść
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...