naslovna kako_da_napravite_vas_prvi_robot_koriscenjem_arduino_razvojnog_sistema_projekti_mehatronika_automatika.rsOvo je nastavak projekta u kome pravimo robot korišćenjem Arduino open source razvojne platforme. U prvom delu projekta koji ste mogli da pročitate ovde, bavili smo se delovima robota, konstrukcijom, načinom sklapanja itd. Ovde ćemo reći nešto više o samom programiranju jednog ovakvog robota, a videćete i snimke na kojima je prikazano kretanje robota.

 Pre nego što krenete sa programiranjem, potrebno je najpre da na vašem računaru instalirate i podesite softver za vaš Arduino. Softver možete pronaći ovde, a step-by-step uputstvo kako da povežete vaš Arduino razvojni sistem sa računarom možete pronaći ovde. Kada ste sve podesili možete krenuti sa programiranjem.
 Kao što znate, u prošlom tekstu smo rekli da senzor nećemo postaviti na servo motor, jer moramo utvrditi, gde se nalazi sredina opsega našeg servoa (90°). Najpre ćemo to uraditi. Pre svega, proverite da li ste ispravno povezali napajanje. Pokrenite vaš Arduino softver i kopirajte kod koji se nalazi u nastavku, a zatim ga upload-ujte.

#include <Servo.h>                // includes the servo library
Servo myservo;                       // creates a servo objectvoid setup()
{
myservo.attach(8);          // attaches the servo to digital pin 8
}
void loop()
{
myservo.write(90);          // moves the servo to 90 degree.
delay(700);                    // wait for the servo to finish its rotation
}

Ovaj kod će pomeriti servo u sredinu njegovog opsega. Sada možete postaviti senzor na servo. Za spajanje možete iskoristiti obostranu lepljivu traku. Senzor okrenite tako da “gleda” ispred robota. Kada postavite senzor, možete se poigrati sa vašim servoom, tako što ćete mu zadavati različite vrednosti uglova između 0° i 180°.

Sada možete kopirati kod koji sledi.

int sensorpin = 0;                                // analog pin used to connect the sharp sensor
int val = 0;                                         // variable to store the values from sensor(initially zero)

void setup()
{
Serial.begin(9600);                     // starts the serial monitor
}

void loop()
{
val = analogRead(sensorpin);        // reads the value of the sharp sensor
Serial.println(val);                        // prints the value of the sensor to the serial monitor
}


Pomoću ovog koda možete primati informacije sa Sharp senzora. Nakon učitavanja ovog koda u kontroler, otvorite u Arduino softveru Serial Monitor i videćete kako se vrednosti koje se dobijaju sa senzora menjaju kada ispred senzora postavite neku prepreku. Postavite svoju ruku ili neki predmet i videćete kako se vrednosti koje se očitavaju, menjaju. Opseg vrednosti je od 0 do 1023. Što su manje vrednosti to je rastojanje senzora i prepreke veće i obrnuto.

Pomoću koda koji sledi, pokrenućemo pogonske motore našeg robota.

int motor_pin1 = 4;                                //define the pins to which motor wires are connected
int motor_pin2 = 5;
void setup ()
{
pinMode(motor_pin1,OUTPUT);    // set the motor pins as output
pinMode(motor_pin2,OUTPUT);
}

void loop()
{
digitalWrite(motor_pin1,HIGH);
digitalWrite(motor_pin2,LOW);
}


Ovim kodom pokrenućemo motor u jednom smeru (smrove ćemo označiti kao “Napred” i “Nazad”, u odnosu na to kako će se robot kretati). Smer obrtanja motora ćemo promeniti ako u funkciji loop motor_pin1 uzme vrednost LOW, a motor_pin2 uzme vrednost HIGH. Kako bismo pokrenuli i drugi motor, moramo dodati deo koda koji sledi u nastavku.


int motor_pin3 = 6;                                //define the pins to which motor wires are connected
int motor_pin4 = 7;
void setup ()
{
pinMode(motor_pin3,OUTPUT);    // set the motor pins as output
pinMode(motor_pin4,OUTPUT);
}

void loop()
{
digitalWrite(motor_pin3,HIGH);
digitalWrite(motor_pin4,LOW);
}


Kako bismo drugi motor pokrenuli u suprotnom smeru, služićemo se istom logikom, kao kod prvog motora. Za zaustavljanje oba motora sve motor_pin promenljive (motor_pin1, motor_pin2, motor_pin3 i motor_pin4) moraju uzeti vrednost LOW.

 Sigurno se pitate kako će robot skretati levo ili desno. Koristićemo metod upravljanja klizanjem. Usled okretanja pogonskih motora u suprotnim smerovima, dolazi do klizanja te i okretanja robota. Pravila su sledeća:
  • Skretanje robota u levo: desni motor se okreće napred, a levi nazad;
  • Skretanje robota u desno: levi motor se okreće napred, a desni nazad;
  • Kretanje robota u napred: oba motora se okreću napred;
  • Kretanje robota u nazad: oba motora se okreću nazad.

  Sada ćemo videti i jednostavan kod za robot, pomoću kog će on izbegavati prepreke. Učitajte ovaj kod i vaš robot će “oživeti”.


#include <Servo.h>            //includes the servo library

int motor_pin1 = 4;
int motor_pin2 = 5;
int motor_pin3 = 6;
int motor_pin4 = 7;
int servopin = 8;
int sensorpin = 0;
int dist = 0;
int leftdist = 0;
int rightdist = 0;
int object = 500;                //distance at which the robot should look for another route

Servo myservo;

void setup ()
{
pinMode(motor_pin1,OUTPUT);
pinMode(motor_pin2,OUTPUT);
pinMode(motor_pin3,OUTPUT);
pinMode(motor_pin4,OUTPUT);
myservo.attach(servopin);
myservo.write(90);
      delay(700);
}
void loop()
{
      dist = analogRead(sensorpin); //reads the sensor

if(dist < object) {       //if distance is less than 550
      forward();       //then move forward
}
if(dist >= object) {       //if distance is greater than or equal to 550
      findroute();
}
}

void forward() {       // use combination which works for you
      digitalWrite(motor_pin1,HIGH);
      digitalWrite(motor_pin2,LOW);
      digitalWrite(motor_pin3,HIGH);
      digitalWrite(motor_pin4,LOW);
      return;
}

void findroute() {
      halt(); // stop
      backward();      //go backwards
      lookleft();         //go to subroutine lookleft
      lookright();       //go to subroutine lookright

if ( leftdist < rightdist )
{
      turnleft();
}
else
{
      turnright ();
}
}

void backward() {
      digitalWrite(motor_pin1,LOW);
      digitalWrite(motor_pin2,HIGH);
      digitalWrite(motor_pin3,LOW);
      digitalWrite(motor_pin4,HIGH);
      delay(500);
      halt();
      return;
}

void halt () {
      digitalWrite(motor_pin1,LOW);
      digitalWrite(motor_pin2,LOW);
      digitalWrite(motor_pin3,LOW);
      digitalWrite(motor_pin4,LOW);
      delay(500);       //wait after stopping
      return;
}

void lookleft() {
      myservo.write(150);
      delay(700);       //wait for the servo to get there
      leftdist = analogRead(sensorpin);
      myservo.write(90);
      delay(700);       //wait for the servo to get there
      return;
}

void lookright () {
      myservo.write(30);
      delay(700);       //wait for the servo to get there
      rightdist = analogRead(sensorpin);
      myservo.write(90);
      delay(700);       //wait for the servo to get there
      return;
}

void turnleft () {
      digitalWrite(motor_pin1,HIGH);       //use the combination which works for you
      digitalWrite(motor_pin2,LOW);       //right motor rotates forward and left motor backward
      digitalWrite(motor_pin3,LOW);
      digitalWrite(motor_pin4,HIGH);
      delay(1000);       // wait for the robot to make the turn
      halt();
      return;
}

void turnright () {
      digitalWrite(motor_pin1,LOW);       //use the combination which works for you
      digitalWrite(motor_pin2,HIGH);       //left motor rotates forward and right motor backward
      digitalWrite(motor_pin3,HIGH);
      digitalWrite(motor_pin4,LOW);
      delay(1000);       // wait for the robot to make the turn
      halt();
      return;
}


Pomoću ovog koda, robot će se kretati unapred ako je vrednost koju dobija sa senzora manja od 500. To znači da će robot smatrati da ispred sebe nema prepreku. Ova vrednost se može promeniti. Ako robot sa senzora dobije vredsnot jedaku ili veću od 500, potražiće drugi put. Najpre će se zaustaviti, vratiti se malo unazad, ponovo se zaustaviti. Nakon toga, servo će se okrenuti u levo, očitaće se vrednost sa senzora, zatim će se servo okrenuti u desnu stranu i ponovo će se učitati vrednost sa senzora. Ove dve vrednosti sa senzora će se uporediti i robot će krenuti u onu srtranu na kojoj je vrednost sa senzora bila manja. Ovakvo ponašanje će se nastaviti dok ne isključite napajanje robotu.

  Napomene
  • Ako vam se desi da se mikrokontroler resetuje kada motori počnu da se okreću, povežite jedan elektrolitski kondenzator od 10μF na napajanje od 6V.
  • Kašnjenje korišćeno u turnleft, turnright i halt subrutinama treba izabrati u s obzirom na veličinu vašeg robota. Što je robot veći, ovo kašnjenje treba da bude veće i obrnuto.
  • U kodu, servo okrenut u levu stranu je pod uglom manjim od 90°, a u desnu stranu pod uglom većim od 90°. Kod vas se može desiti supreotna situacija, u slučaju da ste servo okrenuli suprotno.
  • Rastojanje između omnidirekcionog točka i pogonskih točkova treba da je što manje.

U nastavku možete pogledati video na kom je prikazan način funkcionisanja i kretanja robota.

 Arduino razvojne sisteme možete pronaći ovde.

3 KOMENTARA

  1. #include …zagrada znak manje od… Servo.h … zagrada znak veće od

    Nekim slučajem nije moguće upisati liniju koda koji opisuje “uvoz servo biblioteke”
    onaj deo gde počinje sa #include pa zatim “Servo.h” u zagradama koje su kao znaci za “veće od” i “manje od”….

POSTAVI ODGOVOR

Please enter your comment!
Please enter your name here

This site uses Akismet to reduce spam. Learn how your comment data is processed.