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°.
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.
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.
- 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.
- 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.
Ekipa, sve je to super, ali ja i dalje nemam pojma kako da napravim Servo.h library
Nema potrebe da se pravi samo se uveze u program. Samim pisanjem sledećeg koda ste uvezli već gotovu biblioteku kao standardnu za Arduino.
#include
#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”….