Skocz do zawartości

Własny robot arduino


tiger333

Pomocna odpowiedź

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

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

(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 przez tiger333
Link do komentarza
Share on other sites

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 przez wojtekizk
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

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

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.