Skocz do zawartości
tiger333

Własny robot arduino

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); 

}

 

Udostępnij ten post


Link to post
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?

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites
(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 przez wojtekizk

Udostępnij ten post


Link to post
Share on other sites

Hmm, zastanowię się nad tym lecz jeśli chodzi o budowę funkcji kierowałem się kursem budowy robota z tej strony.

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