Skocz do zawartości

Czujniki ultradzwiekowe hc- sr04


Pomocna odpowiedź

Napisano

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

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

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

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

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

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

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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...