tiger333 Napisano Wrzesień 4, 2019 Udostępnij Napisano Wrzesień 4, 2019 Witam, mam mały problem z moim robotem, otóż kończą mi się już pomysły co mam nie tak. Według poniższego kodu robot powinien do czasu napotkania przeszkody. Przy napotkaniu przeszkody serwo ma skręcić w prawo i czujnik ma sprawdzić czy jest "czysto", jeśli tak to skręca w prawo, jeśli nie, to serwo ma obrócić się w lewo i tak jak wcześniej sprawdza przeszkodę. Jeśli po obu stronach jest przeszkoda to ma jechać przez sekundę do tyłu. Problem w tym, że jak go włączę to jedzie przód/ tył czasem serwo się obróci. Dodam, że jak próbowałem bez serwa i czujnika mając program do samej jazdy na różne strony to działał poprawnie. Poniżej wstawiam cały kod: #include <Servo.h> //biblioteka serwomechanizmu Servo servo; // definicja nazwy serwomechanizmu int predkosc=150; // piny ustalone dla silnikow zgodnie z podlaczeniem int ENA=3; int IN1=6; int IN2=7; int IN3=8; int IN4=9; int ENB=11; #define servoPin 10 #define trigPin 2 //ustawienie pinow czujnika odleglosci #define echoPin 4 void setup() { servo.attach(servoPin); servo.write(30); pinMode(trigPin,OUTPUT); // ustawienie wyjsc czujnika odleglosci pinMode(echoPin,INPUT); pinMode(ENA,OUTPUT); // konfiguracja wyjsc silnikow pinMode(ENB,OUTPUT); pinMode(IN1,OUTPUT); //lewy silnik pinMode(IN2,OUTPUT); //lewy silnik pinMode(IN3,OUTPUT); //prawy silnik pinMode(IN4,OUTPUT); //prawy silnik } void loop() { if(zmierzOdleglosc()>20){ //jesli nie ma przeszkody jedz przod przod(); }else{ // wykryto przeszkode stop hamowanie(); servo.write(0); // sprawdz przeszkode po prawej delay(800); } if(zmierzOdleglosc()>20){ //jesli nie ma przeszkody jedz prawo prawo(); delay(400); }else{ //przeszkoda obroc czujnik w lewo servo.write(60); delay(800); } if(zmierzOdleglosc()>20){ // jesli nie ma przeszkody jedz lewo lewo(); delay(400); }else{ // jesli jest preszkoda jedz tyl 1s i wyprostuj servo tyl(); delay(1000); servo.write(30); } delay(100); } int zmierzOdleglosc(){ // pomiar odleglosci w cm long czas,dystans; digitalWrite(trigPin,LOW); delayMicroseconds(2); digitalWrite(trigPin,HIGH); delayMicroseconds(10); digitalWrite(trigPin,LOW); czas=pulseIn(echoPin,HIGH); dystans=czas/58; return dystans; } void przod(){ analogWrite(ENA, predkosc); // deklaracja predkosci do przodu analogWrite(ENB, predkosc); digitalWrite(IN1,LOW); //deklaracja jazdy do przodu digitalWrite(IN2,HIGH); digitalWrite(IN3,HIGH); digitalWrite(IN4,LOW); } void tyl(){ analogWrite(ENA, predkosc); // deklaracja predkosci do tylu analogWrite(ENB, predkosc); digitalWrite(IN1,HIGH); //deklaracja jazdy do tylu digitalWrite(IN2,LOW); digitalWrite(IN3,LOW); digitalWrite(IN4,HIGH); } void lewo(){ analogWrite(ENA, predkosc); // deklaracja predkosci w lewo analogWrite(ENB, predkosc); digitalWrite(IN1,HIGH); //deklaracja jazdy na lewo digitalWrite(IN2,LOW); digitalWrite(IN3,HIGH); digitalWrite(IN4,LOW); } void prawo(){ analogWrite(ENA, predkosc); // deklaracja predkosci w prawo analogWrite(ENB, predkosc); digitalWrite(IN1,LOW); //deklaracja jazdy na prawo digitalWrite(IN2,HIGH); digitalWrite(IN3,LOW); digitalWrite(IN4,HIGH); } void hamowanie(){ analogWrite(ENA, predkosc); // deklaracja predkosci hamowania analogWrite(ENB, predkosc); digitalWrite(IN1,HIGH); //deklaracja hamowania digitalWrite(IN2,HIGH); digitalWrite(IN3,HIGH); digitalWrite(IN4,HIGH); } Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Wrzesień 4, 2019 Udostępnij Wrzesień 4, 2019 31 minut temu, tiger333 napisał: Problem w tym, że jak go włączę to jedzie przód/ tył czasem serwo się obróci. Dodam, że jak próbowałem bez serwa i czujnika mając program do samej jazdy na różne strony to działał poprawnie. Poniżej wstawiam cały kod: Nie wiemy zupełnie nic na temat Twojego robota. Nie wiemy jak jest zbudowany, jak zasilany i co tam właściwie masz - ciężko coś doradzić. Sprawdziłeś wszystkie komponenty osobno? Wiesz, że czujnik odległości na pewno działa poprawnie? Źródło zasilania jest w stanie obsłużyć dodatkowy napęd, czyli serwomechanizm? Link do komentarza Share on other sites More sharing options...
tiger333 Wrzesień 4, 2019 Autor tematu Udostępnij Wrzesień 4, 2019 (edytowany) Robot jest z zestawu Lixbot Racer, wersja czterokołowa. Tak czujnik działa poprawnie sprawdzone wszystko osobno. Zasilane z dwóch akumulatorów Typu 18650 Edytowano Wrzesień 4, 2019 przez tiger333 Link do komentarza Share on other sites More sharing options...
wojtekizk Wrzesień 5, 2019 Udostępnij Wrzesień 5, 2019 (edytowany) heyah Zakładam, że na początku ten obrót serwa o 30 st. to jest dokładnie ruch "na wprost", potem dla prawo masz 0 a w lewo 60 ( czyli prawo=0, na wprost 30 a w lewo 60)... Zobacz, krok po kroku co robisz w pętli loop: 1. (pierwsze if): nie ma przeszkody -> jedziesz na wprost jest przeszkoda - zatrzymujesz robota, obracasz czujnik w prawo o 30 st., to delay(800) dobrałeś doświadczalne 🙂 zakładam, że zatrzymałeś robota, bo była przeszkoda, czyli obróciłeś wieżyczkę Twojego Rudego 102 o 30 st. 2. (drugie if) : nie ma przeszkody -> obracasz cały czołg o 30 st. (to delay(400) empiryczny czas na obrót o 30 st. ... i co robisz dalej? ano przechodzisz do trzeciego if-a 🙂 3. (trzeci if): tutaj masz obrócony czołg w prawo i wieżyczkę, która obecnie "zezuje" o 30 st. w prawo od pozycji na wprost ???? i jeśli Grigory nie widzi przeszkód ( a może tak być prawda) ... to każesz mu obrócić się w lewo. Wracasz do punktu wyjścia. ???? Czyli cały algorytm jest delikatnie mówiąc nieco skopany 🙂 Przemyśl dokładnie krok po kroku co robi Twój czołg i zastanów się jak tu uprościć działanie. Czy oby na pewno musisz obracać wieżyczką, i potem wracać z nią do pozycji "na wprost"? Czy może nie lepiej byłoby obracać całym czołgiem, i po obrocie sprawdzić czy można już jechać? Pomysłów jest kilka. aaaa.... i jeszcze coś , może po każdym obrocie czołgu warto by zatrzymać cały czołg, bo kolejny if wykonuje się podczas obrotu 🙂 Pozdrawiam Edytowano Wrzesień 5, 2019 przez wojtekizk Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
tiger333 Wrzesień 5, 2019 Autor tematu Udostępnij Wrzesień 5, 2019 Hmm, zastanowię się nad tym lecz jeśli chodzi o budowę funkcji kierowałem się kursem budowy robota z tej strony. Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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ę »