Skocz do zawartości

Robocik jeżdżący - kręci się w koło - brak reakcji na czujnik


daniel89

Pomocna odpowiedź

Witajcie!

Mam zrobioną płytkę na podstawie arduino z wgranym ide arduino do tego mostek l293dne z wszystkimi wyprowadzeniami, które podpinam do tej płytki i chcę aby jeździło na czujniku HC-SR04. Wgrywam program, który podam i robot kręci się w koło nie ma reakcji na czujnik co skopałem ? 😕

Jak trzeba jakieś zdjęcia lub więcej informacji to mogę podać pytajcie i pomagajcie 😉

a oto program:

[ Dodano: 02-05-2014, 14:41 ]



#define trig 2
#define echo 3
int pwmMotorA=5;
int InMotorA1=4;
int InMotorA2=6;
int pwmMotorB=8;
int InMotorB1=9;
int InMotorB2=10;



void setup () {

 pinMode(pwmMotorA, OUTPUT); 
 pinMode(pwmMotorB, OUTPUT); 
 pinMode(InMotorA1, OUTPUT); 
 pinMode(InMotorA2, OUTPUT);   
 pinMode(InMotorB1, OUTPUT); 
 pinMode(InMotorB2, OUTPUT);   
 pinMode (trig, OUTPUT);
 pinMode (echo, INPUT);
analogWrite(pwmMotorA,200);
analogWrite(pwmMotorB,200);}
void loop () {
 int duration, distance;
 digitalWrite( trig, HIGH);
 delayMicroseconds(1000);
 digitalWrite (trig, LOW);
 duration = pulseIn (echo, HIGH);
 distance = (duration/2) / 29.1;
 delay(500);



if (distance >20) {
 analogWrite(pwmMotorA,200);
 analogWrite(pwmMotorB,200);
 digitalWrite(InMotorA1, LOW);
 digitalWrite(InMotorA2, HIGH);
 digitalWrite(InMotorB1, LOW);
 digitalWrite(InMotorB2,HIGH);
 delay(200);}

 if (distance<=20) {
 digitalWrite(InMotorA1, LOW); 
 digitalWrite(InMotorA2, HIGH);
 digitalWrite(InMotorB1, LOW); 
 digitalWrite(InMotorB2, LOW);
 //Ustawienie prędkości obrotowej na 50% (zakres PWM: 8bitów czyli 0-255)
 analogWrite(pwmMotorA,200);
 analogWrite(pwmMotorB,0);
 delay(200); }


 if (distance <=20 && distance >10){
 analogWrite(pwmMotorA,200);
 analogWrite(pwmMotorB,200);
 digitalWrite(InMotorA1, HIGH); 
 digitalWrite(InMotorA2, LOW);
 digitalWrite(InMotorB1, HIGH); 
 digitalWrite(InMotorB2, LOW);
 delay(200);}

 if (distance >20) {
 analogWrite(pwmMotorA,200);
 analogWrite(pwmMotorB,200);
 digitalWrite(InMotorA1, LOW);
 digitalWrite(InMotorA2, HIGH);
 digitalWrite(InMotorB1, LOW);
 digitalWrite(InMotorB2,HIGH);
 delay(200);}

} 

__________

Komentarz dodany przez: Treker

Program należy umieszczać w tagach code.

Link do komentarza
Share on other sites

Przydałby się jakiś schemat całości.

Czy sam czujnik działa? Sprawdź bez silników. Na przykład możesz zapalić diodę, gdy coś jest przed czujnikiem.

P.S. i umieść kod w tagach

Link do komentarza
Share on other sites

Jak to sprawdzić? Brałem 2 diody zieloną i czerwoną na rezystorach podpiąłem na wyjście do płytki i ustawiłem w programie, że jak odległość większa niż 20 to powinna się palić zielona, a w przeciwnym razie (enable) czerwona.Jak wgrałem to paliła się zielona cały czas. Jak podszedłem zaczęła migać zielona. Jak oddalałem się, to jakby 2 się zapalały, albo ten czujnik głupieje, albo ja.

Link do komentarza
Share on other sites

Próbowałeś używać gotowej biblioteki do obsługi tego czujnika?

Popraw swoje posty (znaki interpunkcyjne, pisownia itd. itp...).

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

Płytka jest zrobiona na atmega88pa-pu.

Wkleiłem bibliotekę Ultrasonic i z neta jakiś program na nią ściągnąłem, ale nie kompilowało. Ciągłe błędy, więc chciałem to bez tej biblioteki zrobić, tym bardziej, że pełno było tego typu na necie przykładów.

Co mam z tym zrobić ? Dodam, że ta płytka była już naprawiana przeze mnie bo luty nie stykały ale teraz jest niby dobrze z tym, że nie mam obsługi monitora portu szeregowego i wgrywam program po kabelkach bo wyprowadzenie coś szwankuje, a dioda na 12 pinie coś dziwnie miga, ale pozostałe piny są dobrze wyprowadzone. Sprawdzałem przejścia więc powinny komunikować tym bardziej, że sterowanie czujnikiem ruchu na tym zrobiłem i działało.

Więc co z tym dalej mam zrobić ? Dobrze sprawdziłem czujnik? Jakąś bibliotekę macie gotową z kodem? to bym przetestował. Co tutaj jest skopane pomocy ! bo mnie już ten robocik irytuje tym bardziej, że to całe arduino ide już w 3 wersjach miałem, bo co różna wersja to nie chciała wgrać programu, i te błędy eh 😕

Link do komentarza
Share on other sites

Na schemacie, który wkleiłeś raz, że nic nie widać, a dwa, że nie ma tam połączeń żadnych. Gdzie jest ten czujnik ultradźwiękowy podłączony?

Ogólnie przetworniki ultradźwiękowe, to nie jest najłatwiejszy temat jak na początek. Dużo łatwiej poszłoby z SHARPami analogowymi. Na razie odstaw "robota" i zajmij się samym czujnikiem. Musisz mieć stabilne odczyty, żadne "dziwne migania" nimi nie są.

Link do komentarza
Share on other sites

Czujnik ultradźwiękowy jest podłączony tak jak w kodzie w te piny i do zasilania z tej płytki na 5v i do masy. Nie mam innego czujnika tylko ten więc chciałbym na nim zrobić aby jeździł . Schemat faktycznie mało widoczny. Przeskalowało za bardzo poszukam większego. Jak mam sam czujnik sprawdzić ? Wypiąłem z tej płytki , w nocie jest że do 5v podpiąć i do masy boczne wyprowadzenia, a trig i echo do pinów digital więc jak do 2 i 3 wepnę to powinno być dobrze. Możliwe jest że prąd poszedł za duży na ten czujnik z tej płytki? bo z tych katalogów to tylko wiem że można go obsłużyć napięciem 5v a prądy to jakieś w mili tam są podane i nie wiem co do czego - dopiero się uczę.

tak wygląda z tym że z kwarcem 20MHz i na atmega88pa-pu

tutaj schemat, z tym, że ma kilka dodatkowych wyprowadzeń tak jak na zdjęciu wyżej, ale działa na tej samej zasadzie

Link do komentarza
Share on other sites

Jeśli podłączyłeś poprawnie zasilanie, to nie mogłeś go spalić. Nie znam na tyle tych czujników i Arduino, aby analizować, to co w tej chwili robisz. Tym bardziej, że nie mam pod ręką takiego układu. Musisz poczekać na porady kogoś innego 😉

Link do komentarza
Share on other sites

Masz dwa warunki:

 if (distance >20) {

Na początek może łatwiej byłoby testować tylko przy jednym warunku? Typu jedź, gdy >50, w przeciwnym wypadku stój.

Link do komentarza
Share on other sites

Dobrze zrobię tak jak mówisz tylko, że na diodach czy to działa. Znalazłem bibliotekę do tego czujnika i ją wgrałem. Teraz zrobię z jednym if ustawione na >=25 oraz else. Podepnę pod 2,3 pin digital oraz zasilanie z tego 5v i gdn zobaczymy.

[ Dodano: 02-05-2014, 17:31 ]


#define trig 2
#define echo 3
int ledG=9;
int ledR=8;

void setup () {
 pinMode (trig, OUTPUT);
 pinMode (echo, INPUT);
 pinMode (ledG, OUTPUT);
 digitalWrite (ledG, LOW);
 pinMode (ledR, OUTPUT);
 digitalWrite (ledR, LOW);
}
void loop () {
 int czas, dist;
 digitalWrite( trig, HIGH);
 delayMicroseconds(1000);
 digitalWrite (trig, LOW);
 czas = pulseIn(echo, HIGH);
 dist = (czas/2) / 29.1;

 if (dist>=25) {
   digitalWrite (ledR, LOW);
   digitalWrite (ledG, HIGH);
   delay(50); }
else{
   digitalWrite (ledG, LOW);
   digitalWrite (ledR,HIGH);
   delay (50);}
}

Zrobiłem tak jak w programie . Pali się czerwona dioda jak zbliżam rękę dalej czerwona jak oddalam to tak po 40 cm miga raz czerwona raz zielona. Coś skopałem?

Biblioteka którą dodałem znowu jakieś błędy wywala.

Link do komentarza
Share on other sites

delay(50); 

w ifach jest zbędne.

Spróbuj fragment:

digitalWrite( trig, HIGH); 
delayMicroseconds(1000); 
digitalWrite (trig, LOW); 
czas = pulseIn(echo, HIGH); 
dist = (czas/2) / 29.1; 

Zamienić na:

  digitalWrite(trig, LOW);
 delayMicroseconds(2);
 digitalWrite(trig, HIGH);
 delayMicroseconds(10);
 digitalWrite(trig, LOW);
 duration = pulseIn(echo, HIGH);
 dist = (czas/2) / 29.1;
Link do komentarza
Share on other sites

#define trig 2
#define echo 3
int ledG=9;
int ledR=8;

void setup () {
 pinMode (trig, OUTPUT);
 pinMode (echo, INPUT);
 pinMode (ledG, OUTPUT);
 digitalWrite (ledG, LOW);
 pinMode (ledR, OUTPUT);
 digitalWrite (ledR, LOW);
}
void loop () {
 int duration, dist;
 digitalWrite( trig, LOW);
 delayMicroseconds (2);
 digitalWrite (trig, HIGH);
 delayMicroseconds(10);
 digitalWrite (trig, LOW);
 duration = pulseIn(echo, HIGH);
 dist = (duration/2) / 29.1;

 if (dist>=25) {
   digitalWrite (ledR, LOW);
   digitalWrite (ledG, HIGH);
    }
else{
   digitalWrite (ledG, LOW);
   digitalWrite (ledR,HIGH);
   }
}

Zrobiłem tak i oto efekty:

-pali się dioda czerwona a zielona miga tak na mikrosekundy

-gdy zbliżę rękę pali się czerwona, jak oddalę to przy tak 25cm miga zielona, ale tak jakby się chciała załączyć a nie mogła, a ta czerwona świeci z nią na zmianę.

-jak dotknę ręką prawego ,,oka'' czujnika to załącza się zielona i też zależy jak położę ten czujnik w jakiej pozycji bo do góry nogami nie działało jakby wcale

Link do komentarza
Share on other sites

Dodaj jeszcze na koniec pętli:

delay(500);

Jak wygląda wtedy sytuacja?

Badanie odczytów, gdy zasłaniasz jedną część czujnika nie ma żadnego sensu.

Link do komentarza
Share on other sites

Sprostowanie...

Po dodaniu delay 500, po else diody załączają się po jakichś 20 sekundach od załączenia zasilania płytki. Potem pali się dioda czerwona tak na 5 sekund symbolizująca pozycję większą od 30cm po czym na sekundę załącza się zielona i tak w koło. Gdy zbliżę rękę na granicę 30cm lub mniej to zapala się zielona z tym, że dopiero gdy minie 5 sekund NIE OD RAZU i wtedy gdy mam rękę w tym polu trzyma to zapalenie zielonej spory czas. Następnie, gdy zjeżdżam ręką za granicę 30cm zapala się czerwona na 5 sekund i miga zielona 1 sekundę potem znowu czerwona 5 sekund i tak w koło.

Co można jeszcze z tym zrobić ?

[ Dodano: 03-05-2014, 16:30 ]

Po dokładnej analizie tego czujnika na moje oko stwierdzam, że jest on uszkodzony fabrycznie. Oczywiście mogę się mylić dlatego nim zamknę temat chciałbym, aby osoba, która ma taki sam czujnik zbadała oporność na tych dwóch ,,mikrofonach"" dających echo oraz trig. U mnie na nim dopatrzyłem się, że jeden ma oporność coś koło 17,8 k Ohma a drugi nie ma przejścia na żadnym zakresie. Do tego jeden opornik smd jest jakby odłupany. Zdjęcia nie mogę niestety zrobić gdyż aparat mój nie łapie ostrości na tak małe przedmioty 😋

Czekam na odpowiedź ..

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.