Jeśli jesteś właścicielem tej strony, możesz wyłączyć reklamę poniżej zmieniając pakiet na PRO lub VIP w panelu naszego hostingu już od 4zł!

Arduino prosty robot


Dzisiaj pokażę wam jak zbudowć prostego robota, który po napotkaniu przeszkody rozgląda się
cofa i skręca.

Potrzebne materiały:

-arduino
-podwozie robota razem z silnikami (można kupić lub zrobić samemu)
-sterownik silników
-ultra dźwiękowy czujnik odległości
-serwo
-płytka stykowa
-kabelki połączeniowe
-baterie



Krok 1:

Po pierwsze trzeba przygotować podwozie. Jeśli kupiłeś gotowe musisz je skręcić,
jeśli robisz je sam pamiętaj aby dobrać odpowiednie silniki(aby robot dał radę ruszyć z miejsca).
Pamiętaj również aby zrobić wystarczająco dużą platformę musisz na niej wszystko zmieścić.

Krok 2:

Teraz należy wszystko podłączyć. W moim robocie zastosowałem sterownik silników TB6612FNG
ale jest to obojętne możesz zastosować każdy. A o to jak należy
wszystko podłączyć:

(U-czujnik ultradźwiękowy, S-serwo)
-Trig(U)--> 2 pin arduino
-Echo(U)--> 1 pin arduino
-VCC(U) --> 5V arduino
-GND(U) --> GND arduino
-GND(S) --> GND arduino
-VCC(S) --> 5V arduino
-Dane(S)--> 9 pin arduino

A teraz sterownik silników:
-Wszystkie masy(GND) do masy w adruino
-VCC -->5V arduino
-A01 --> silnik1 masa
-A02 --> silnik1 zasilanie
-B02 --> silnik2 masa
-B01 --> silnik2 zasilanie
-VMOT--> VIN arduino
-PWMA--> 6 pin arduino
-AIN1 --> 8 pin arduino
-AIN2 --> 7 pin arduino
-BIN2 --> 4 pin arduino
-BIN1 --> 3 pin arduino
-PWMB--> 5 pin arduino

Krok 3:

kiedy wszystko połączysz czas przyczepić to do podwozia. Ponieważ ja kupiłem podwozie mam
już tam wywiercone dziurki aby przykręcić róźne rzeczy (np. Arduino).
Jeśli sam zrobiłeś podwozie wywierć dziurki i przykręć arduino. Pamiętaj aby zrobić
jakieś dystanse żeby arduino nie dotykało podwozia(jeśli jest metalowe) w przeciwnym
wypadku może wystąpić zwarcie a przez to arduino może ulec uszkodzeniu.
Płytkę stykową umieściłem na arduino, czujnik ultradźwiękowy przykleiłem taśmom
dwustronną do serwa, a serwo również taśmom przykleiłem do podwozia.
Kabelki aby były jakoś ułożone spiołem drucikiem.

prosty robot arduino prosty robot arduino prosty robot arduino prosty robot arduino prosty robot arduino

Krok 4:

Czas na program. A więc na dole wklejam program w komentarzach znajduje się wyjaśnienie
całego kodu.
/*####################################################
Nikodem Bartnik June 2014
http://www.arduinopolska.cba.pl/
######################################################
*/

#define trig 2
#define echo 1
#include <Servo.h> 
 
 //definicja serwa
Servo myservo;  
//definicja pinów dla steronika silników
int pwmMotorA=6;
int pwmMotorB=5;
int ForwardA=8;
int BackA=7;
int ForwardB=3;
int BackB=4;

/*liczby dla czujnika ultra dźwiękowego
dist1-lewy pomiar
dist2-środek 
dist3-prawy pomiar
*/
int czas, dist2, dist1, dist3;

void setup() {    



  myservo.attach(9);
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);   
  
  //Wyjście PWM kanału A
  pinMode(pwmMotorA, OUTPUT); 
  
  //Wyjście cyfrowe AIN1
  pinMode(ForwardA, OUTPUT); 
  //Wyjście cyfrowe AIN2
  pinMode(BackA, OUTPUT);   
  
  //Wyjście PWM kanału B
  pinMode(pwmMotorA, OUTPUT);
  
  //Wyjście cyfrowe BIN1
  pinMode(ForwardB, OUTPUT); 
  //Wyjście cyfrowe BIN2
  pinMode(BackB, OUTPUT); 
  
  
  //ustawienie prędkości obrotowej silników
  analogWrite(pwmMotorA, 255);
  analogWrite(pwmMotorB, 255);

}
//skręt w lewo
void Left(){
  digitalWrite(ForwardA, LOW); 
  digitalWrite(BackA, HIGH);
  
  //Ustawienie kierunku obrotów B
  digitalWrite(ForwardB, HIGH); 
  digitalWrite(BackB, LOW);
  delay(1000);
}

//skręt w prawo
void Right(){
  
  digitalWrite(ForwardA, HIGH); 
  digitalWrite(BackA, LOW);
  
  
  digitalWrite(ForwardB, LOW); 
  digitalWrite(BackB, HIGH);
  
  delay(1000);
}

//jazda prosto
void Forward(){
  
  digitalWrite(ForwardA, HIGH); 
  digitalWrite(BackA, LOW);
  
  //Ustawienie kierunku obrotów B
  digitalWrite(ForwardB, HIGH); 
  digitalWrite(BackB, LOW);
}

//cofanie
void Back(){
  digitalWrite(ForwardA, LOW); 
  digitalWrite(BackA, HIGH);
  
  //Ustawienie kierunku obrotów B
  digitalWrite(ForwardB, LOW); 
  digitalWrite(BackB, HIGH);
  
}

//pomiar przodu
void ScanForward(){
  
  delay(50);
    digitalWrite(trig, HIGH);
    delayMicroseconds(1000);
    digitalWrite(trig, LOW);
    czas = pulseIn(echo, HIGH);
    dist2 = (czas/2) /29.1;
}

pomiar lewej strony
void ScanLeft(){
  myservo.write(160);
  delay(1000);
  delay(50);
    digitalWrite(trig, HIGH);
    delayMicroseconds(1000);
    digitalWrite(trig, LOW);
    czas = pulseIn(echo, HIGH);
    dist1 = (czas/2) /29.1;
}

//zatrzymanie
void Stop(){
  
  digitalWrite(ForwardA, LOW); 
  digitalWrite(BackA, LOW);
  
  //Ustawienie kierunku obrotów B
  digitalWrite(ForwardB, LOW); 
  digitalWrite(BackB, LOW);
}

//pomiar prawej strony
void ScanRight(){
  myservo.write(20);
  delay(1000);
  delay(50);
    digitalWrite(trig, HIGH);
    delayMicroseconds(1000);
    digitalWrite(trig, LOW);
    czas = pulseIn(echo, HIGH);
    dist3 = (czas/2) /29.1;
}


//pętla wykonująca wszystkie czynności
void loop() {
  Stop();
  delay(20);
  ScanForward();
  
 
  
  if(dist2<=17){
    
    ScanRight();
    ScanLeft();
    myservo.write(90);
    
    if(dist1>=dist3){
 Back();
 delay(1000);
 Right();
    }
    else{
      Back();
      delay(1000);
      Left();
  }
  }
  
  else{
   
    Forward();
    delay(400);
  }

}

Krok 5:

Niektórzy być może zauważyli, że w kodzie jest napisane, że robot ma się zatrzymywać
na w sumie 0.07s. Zrobiłem tak ponieważ kiedy silniki pracują, na bateriach
nie ma potrzebnego dla czujnika 5V więc nie działa poprawnie. Kiedy się zatrzymuje
napięcie wzrasta i czujnik działa poprawnie. Jego zatrzymanie jest tak krótkie,
że prawie go nie widać. Jeśli u ciebie nie występuje taki problem wystarczy z
początku pętli usunąć "stop();" i "delay(20);" i wszystko będzie normalnie.

Poniżej wklejam link do youtube możesz zobaczyć jak wyszedł mój robot
http://youtu.be/JCRbaAKQXSs

Jeśli masz z czymś problem lub jakieś pytania napisz: nikodem.bartnik@gmail.com