Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
et:projects:arduino [2015/12/28 11:49] kaupo.raidet:projects:arduino [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 6: Line 6:
   * 2 standard suurusega servo mootorit (360 kraadi pöörlemisega)   * 2 standard suurusega servo mootorit (360 kraadi pöörlemisega)
   * mini servo (180 kraadi pöörlemine)   * mini servo (180 kraadi pöörlemine)
-  * Infrapuna kaugusandur  10-80cm (analoog) 
   * Infrapuna lähedusandur 3-80 cm (digitaal)   * Infrapuna lähedusandur 3-80 cm (digitaal)
   * Ultraheliandur HC-SR04 2-500cm   * Ultraheliandur HC-SR04 2-500cm
Line 14: Line 13:
   * 6-AA patarei pesa   * 6-AA patarei pesa
   * mõõdud: 15,5 x 12 x 10 cm   * mõõdud: 15,5 x 12 x 10 cm
-  * kaal: 425 g+  * kaal: 350 g
  
 ===== Robotplatvormi kokkupanek ===== ===== Robotplatvormi kokkupanek =====
Line 20: Line 19:
  
 ===== Lisamoodulid ===== ===== Lisamoodulid =====
-  * Jooneandur QTR-8A +  * Jooneandur QTR-3A
-  * +
  
 ===== Näiteprogrammid ===== ===== Näiteprogrammid =====
 +
 +{{youtube>4LQQmu8EffI?medium}}
  
 === Mootorite kalibreerimine === === Mootorite kalibreerimine ===
Line 48: Line 48:
 #define L_MOTOR_FWD 3 #define L_MOTOR_FWD 3
 #define R_MOTOR_FWD 4 #define R_MOTOR_FWD 4
 +#define S_MOTOR_LEFT 5
 +#define S_MOTOR_RIGHT 6
  
 void setup() { void setup() {
Line 65: Line 67:
  
 void calibMotors() { void calibMotors() {
-  int leftVal, rightVal, sensVal, fwdLeft, fwdRight;+  int leftVal, rightVal, sensVal, fwdLeft, fwdRight, sensLeftSide, sensRightSide;
   //Calibration in progress inidicator HIGH   //Calibration in progress inidicator HIGH
   digitalWrite(LED, HIGH);   digitalWrite(LED, HIGH);
Line 71: Line 73:
   delay(200);   delay(200);
  
-  for (int i = 0; i < 3; i++) {+  for (int i = 0; i < 5; i++) {
     while (digitalRead(SWITCH) == HIGH) {     while (digitalRead(SWITCH) == HIGH) {
       if (i == 0) {       if (i == 0) {
Line 84: Line 86:
         sensVal = map(analogRead(POTPIN), 0, 1023, 30, 150);         sensVal = map(analogRead(POTPIN), 0, 1023, 30, 150);
         sensM.write(sensVal);         sensM.write(sensVal);
 +      }
 +      if (i == 3) {
 +        sensLeftSide = map(analogRead(POTPIN), 0, 1023, 0, 180);
 +        sensM.write(sensLeftSide);
 +      }
 +      if (i == 4) {
 +        sensRightSide = map(analogRead(POTPIN), 0, 1023, 0, 180);
 +        sensM.write(sensRightSide);
       }       }
     }     }
Line 94: Line 104:
   while (digitalRead(SWITCH) == HIGH);   while (digitalRead(SWITCH) == HIGH);
   delay(1000);   delay(1000);
-  if (digitalRead(IRSENS) == 1) { 
     while (digitalRead(SWITCH) == HIGH) {     while (digitalRead(SWITCH) == HIGH) {
       fwdLeft = 0;       fwdLeft = 0;
Line 100: Line 109:
       rightM.write(fwdRight);       rightM.write(fwdRight);
     }     }
-  } +    delay(1000);
-  else {+
     while (digitalRead(SWITCH) == HIGH) {     while (digitalRead(SWITCH) == HIGH) {
       fwdRight = 180;       fwdRight = 180;
Line 107: Line 115:
       leftM.write(fwdLeft);       leftM.write(fwdLeft);
     }     }
-  +  //Stop motors
-  //Peata mootorid+
   leftM.write(leftVal);   leftM.write(leftVal);
   rightM.write(rightVal);   rightM.write(rightVal);
Line 120: Line 127:
   EEPROM.update(R_MOTOR_STOP, rightVal);   EEPROM.update(R_MOTOR_STOP, rightVal);
   EEPROM.update(S_MOTOR_CENTR, sensVal);   EEPROM.update(S_MOTOR_CENTR, sensVal);
 +  EEPROM.update(S_MOTOR_LEFT, sensLeftSide);
 +  EEPROM.update(S_MOTOR_RIGHT, sensRightSide);
   EEPROM.update(L_MOTOR_FWD, fwdLeft);   EEPROM.update(L_MOTOR_FWD, fwdLeft);
   EEPROM.update(R_MOTOR_FWD, fwdRight);   EEPROM.update(R_MOTOR_FWD, fwdRight);
-  //Kalibratsiooni lõpp. Indikaatori tuli kustub.+  //Calibration end inidicator LOW
   digitalWrite(LED, LOW);   digitalWrite(LED, LOW);
   //Print out values   //Print out values
Line 147: Line 156:
 </code> </code>
  
-Programmi töö selgitus: +**Programmi töö selgitus:** 
-  * Vajutada korraks nuppu +  * Vajutada korraks nuppu. 
-  * Keerata potentsiomeetrit kuni vasak mootor jääb seisma +  * Keerata potentsiomeetrit kuni vasak mootor jääb seisma. 
-  * Vajutada korraks nuppu +  * Vajutada korraks nuppu. 
-  * Keerata potentsiomeetrit kuni parem mootor jääb seisma +  * Keerata potentsiomeetrit kuni parem mootor jääb seisma. 
-  * Vajutada korraks nuppu+  * Vajutada korraks nuppu.
   * Keerata potentsiomeetrit kuni ultrahelianduri servo on võimalikult otse suunatud.   * Keerata potentsiomeetrit kuni ultrahelianduri servo on võimalikult otse suunatud.
-  * Vajutada korraks nuppu +  * Vajutada korraks nuppu. 
-  * Paigutada robot maha ja vaadata kummale poole robot kaldub. Kui kaldub vasakule, siis tuleb korrigeerida parema mootori kiirustTeisel juhul vastupidi+  * Keerata potentsiomeetrit kuni ultrahelianduri servo on suunatud umbes 60 kraadi roboti keskteljest vasakule. 
-  * Vajutada korraks nuppu (Kui hoida kätt digitaalse infrapunaanduri ees, siis korrigeeritakse vasakut mootoritKui anduril takistust ees ei ole, siis korrigeeritakse paremat mootorit.) +  * Vajutada korraks nuppu. 
-  * Keerata potentsiomeetrit kuni robot sõidab enamvähem otse +  * Keerata potentsiomeetrit kuni ultrahelianduri servo on suunatud umbes 60 kraadi roboti keskteljest paremale. 
-  * Vajutada korraks nuppu +  * Vajutada korraks nuppu. 
-  * Kalibratsioon on lõpule jõudnud ja väärtused EEPROM mällu salvestatud. Kalibratsiooni väärtusi on võimalik näha kui Arduino IDE-s avada juba kalibratsiooni alguses jadapordi monitor.+  * Roboti mõlemad mootorid hakkavad pöörlema maksimum kiirusel. Paigutada robot maha ja vaadata kummale poole robot kaldub. Kui kaldub vasakule, siis tuleb võtta vasaku mootori kiirus maksimum kiiruseks, et robot liiguks otseVastasel juhul parema mootori kiirus. Vajadusel võib aeglasemaks liikumiskiiruseks mõlema mootori kiirust vähendada
 +  * Vajutada korraks nuppu. 
 +  * Keerata potentsiomeetrit kuni mootori pöörlemiskiirus on sobiv. 
 +  * Vajutada korraks nuppu
 +  * Keerata potentsiomeetrit kuni roboti teine mootor liigub sama kiirusega ja roboti trajektoor on sirge. 
 +  * Vajutada korraks nuppu. 
 +  * Kalibratsioon on lõpule jõudnud ja väärtused EEPROM mällu salvestatud. Kalibratsiooni väärtusi on võimalik näha kui Arduino IDE-s avada enne kalibratsiooni algust jadapordi monitor ja see jätta lahti kogu kalibrerimise ajaks. 
 +  * Kalibratsiooni lõpus on võimalik potentsiomeetriga testida ultrahelianduri servo liikumist.
  
 === Lihtne navigeerimine === === Lihtne navigeerimine ===
Line 213: Line 229:
   rightM.write(rightStop);   rightM.write(rightStop);
   sensM.write(sensCentr);   sensM.write(sensCentr);
-  //Wait for switch press to start+  //Ootab kuni lülitit vajutatakse
   while (digitalRead(SWITCH) == HIGH) {   while (digitalRead(SWITCH) == HIGH) {
     digitalWrite(LED, HIGH);     digitalWrite(LED, HIGH);
Line 240: Line 256:
 } }
 </code> </code>
 +
  
 === Keerukas navigeerimine === === Keerukas navigeerimine ===
-Programm näeb ette roboti navigeerimist labürindis. Robot jälgib pidevalt kolme suunda: vasak, otse, parem. Lisaks jälgib otse suunda pidevalt infrapuna lähedusandur. Ultrahelianduri lugemiseks on vaja eelnevalt alla tõmmata NewPing teek.+Programm näeb ette roboti navigeerimist labürindis. Robot jälgib pidevalt kolme suunda: vasak, otse, parem. Lisaks jälgib otse suunda pidevalt infrapuna lähedusandur. Ultrahelianduri lugemiseks on vaja eelnevalt alla tõmmata NewPing teek. 
   * [[http://playground.arduino.cc/Code/NewPing|NewPing teek Arduinole]]   * [[http://playground.arduino.cc/Code/NewPing|NewPing teek Arduinole]]
 +Programm on tükeldatud mitmeteks funktsioonideks, et oleks lihtsam koostada algoritmi. Programmi põhitsükkel kontrollib pidevalt, et ees poleks ühtegi objekti.
 +
  
 <code c> <code c>
Line 250: Line 269:
 #include <NewPing.h> #include <NewPing.h>
  
-//Parameetrid +//Parameters 
-#define SONARDIFF 10 //miinimum kahe suuna vahe, et teha väikest pööret +#define TURNDLY 800 //90deg turn delay 
-#define TURNDLY 800 //90 kraadise pöörde tegemise viide +#define SMIN //distance from which to activate small turns 
-#define SMIN 40 //kaugus millest alates aktiveerida väikse pöörde tegemine +#define SMAX 200 //distance from which to deactivate small turns
-#define SMAX 200 //kaugus, millest alates lõpetada väikse pöörde tegemine+
  
-//Servo objektide loomine+//Servo objects create
 Servo leftM, rightM, sensM; Servo leftM, rightM, sensM;
-//Ultrahelianduri(Sonar) objekti loomine ja viikude määramine+//Sonra distance sensor pins reference and object create
 #define TRIG 12 #define TRIG 12
 #define ECHO 11 #define ECHO 11
 NewPing sonar(TRIG, ECHO, 200); NewPing sonar(TRIG, ECHO, 200);
-//Roboti osadele viikude määramine+//Define constants for pin reference
 #define LED 13 #define LED 13
 #define POTPIN A0 #define POTPIN A0
Line 270: Line 288:
 #define R_SERVO 9 #define R_SERVO 9
 #define S_SERVO 8 #define S_SERVO 8
-//EEPROM bitid+//EEPROM bytes
 #define L_MOTOR_STOP 0 #define L_MOTOR_STOP 0
 #define R_MOTOR_STOP 1 #define R_MOTOR_STOP 1
Line 276: Line 294:
 #define L_MOTOR_FWD 3 #define L_MOTOR_FWD 3
 #define R_MOTOR_FWD 4 #define R_MOTOR_FWD 4
 +#define S_MOTOR_LEFT 5
 +#define S_MOTOR_RIGHT 6
  
-//Globaalsed muutujad+//Global variables
 const int leftStop = EEPROM.read(L_MOTOR_STOP); const int leftStop = EEPROM.read(L_MOTOR_STOP);
 const int rightStop = EEPROM.read(R_MOTOR_STOP); const int rightStop = EEPROM.read(R_MOTOR_STOP);
 const int sensCentr = EEPROM.read(S_MOTOR_CENTR); const int sensCentr = EEPROM.read(S_MOTOR_CENTR);
 +const int sensLeft = EEPROM.read(S_MOTOR_LEFT);
 +const int sensRight = EEPROM.read(S_MOTOR_RIGHT);
 const int leftFwd = EEPROM.read(L_MOTOR_FWD); const int leftFwd = EEPROM.read(L_MOTOR_FWD);
 const int rightFwd = EEPROM.read(R_MOTOR_FWD); const int rightFwd = EEPROM.read(R_MOTOR_FWD);
 +
 +
 int sonarDist[3]; int sonarDist[3];
 void motorTurn(int dir); void motorTurn(int dir);
  
-//Funktsioonide prototüübid+//Functions prototypes
 int sweepRun(int pos ,int moveOnly); int sweepRun(int pos ,int moveOnly);
 void motorStop(int servo); void motorStop(int servo);
Line 292: Line 316:
  
 void setup() { void setup() {
-  //Servo objekti ja viigu sidumine+  //Servo object to Arduino pin setup
   leftM.attach(L_SERVO);   leftM.attach(L_SERVO);
   rightM.attach(R_SERVO);   rightM.attach(R_SERVO);
   sensM.attach(S_SERVO);   sensM.attach(S_SERVO);
-  //Jadaliidese käivitamine+  //Serial port setup
   Serial.begin(9600);   Serial.begin(9600);
-  //viikude seadistamine+  //Pins direction setup
   pinMode(POTPIN, INPUT);   pinMode(POTPIN, INPUT);
   pinMode(IRSENS, INPUT);   pinMode(IRSENS, INPUT);
Line 306: Line 330:
 } }
  
 +//Main program loop
 void loop() { void loop() {
-  //Lokaalsed muutujad+
   int frontWall;   int frontWall;
   int fwdTime = 1000;   int fwdTime = 1000;
   int sweepPos = 0;   int sweepPos = 0;
-  int sweepDir = -1;  // -1 vasakule ja paremale+  int sweepDir = -1;  // -1 left and right
   unsigned long lastSweep = 0;   unsigned long lastSweep = 0;
   int scanDone = 0;   int scanDone = 0;
-  int sonarDiff; 
   unsigned long lastTurn = 0;   unsigned long lastTurn = 0;
      
-  //Kirjuta servodele algväärtused+  //Write initial values to servos
   leftM.write(leftStop);   leftM.write(leftStop);
   rightM.write(rightStop);   rightM.write(rightStop);
   sensM.write(sensCentr);   sensM.write(sensCentr);
-  //Wait for switch press to start+  //Wait until switch is pressed
   while (digitalRead(SWITCH) == HIGH) {   while (digitalRead(SWITCH) == HIGH) {
     digitalWrite(LED, HIGH);     digitalWrite(LED, HIGH);
Line 328: Line 352:
     delay(100);     delay(100);
   }   }
-  //Algoritmi lõputu tsükkel+  //Algorithm main loop
   while (1) {   while (1) {
-    //Loe ees oleva infrapunaanduri väärtus+    //check if something is blocking way
     frontWall = digitalRead(IRSENS);     frontWall = digitalRead(IRSENS);
-    //Ultraheliandur käib edasi tagasi, et pidevalt vaadata kolme suunda +     
-    if(millis() - lastSweep > 400){+    //Sweeping motion distance measure 
 +    if(millis() - lastSweep > 350){
       sweepRun(sweepPos, 0);       sweepRun(sweepPos, 0);
       if(sweepPos == -1 || sweepPos == 1) scanDone = 1;       if(sweepPos == -1 || sweepPos == 1) scanDone = 1;
Line 344: Line 369:
       sweepRun(sweepPos, 1);       sweepRun(sweepPos, 1);
       lastSweep = millis();       lastSweep = millis();
 +
 +    Serial.print("V: ");
 +    Serial.print(sonarDist[0]);
 +    Serial.print("K: ");
 +    Serial.print(sonarDist[1]);
 +    Serial.print("P: ");
 +    Serial.println(sonarDist[2]);
     }     }
-    +
     if (frontWall == 0) {     if (frontWall == 0) {
       motorStop(0);       motorStop(0);
Line 353: Line 385:
       lastTurn = millis();       lastTurn = millis();
     }     }
-    else if(sonarDist[0] > 0 && sonarDist[2] > 0 && scanDone == 1 && sonarDist[1] > SMIN && sonarDist[1] < SMAX && (millis() - lastTurn > 2000)) +    else if(scanDone == 1 && (millis() - lastTurn > 2000)) 
-    { +    {   
-      //calculate sonar sensors distance difference +      if (sonarDist[0] < 25) {
-      sonarDiff = sonarDist[0] - sonarDist[2]; +
-     +
-      if (sonarDiff > SONARDIFF) {+
         motorStop(0);         motorStop(0);
-        motorTurn(-1, 200);+        motorTurn(1, 200);
       }       }
-      else if(sonarDiff -1*SONARDIFF){ +      else if(sonarDist[2] 25){ 
         motorStop(0);         motorStop(0);
-        motorTurn(1, 200);+        motorTurn(-1, 200);
       }       }
       scanDone = 0;       scanDone = 0;
Line 374: Line 403:
   }   }
 } }
- +//Motors stopping function
-//Mootorite koos või eraldi peatamise funktsioon+
 void motorStop(int wheel){ void motorStop(int wheel){
   if(wheel == 0){   if(wheel == 0){
Line 388: Line 416:
   }   }
 } }
- +//Forward moving function
-//Otse liikumise funktsioon+
 void motorFwd(void){ void motorFwd(void){
     leftM.write(leftFwd);     leftM.write(leftFwd);
     rightM.write(rightFwd);     rightM.write(rightFwd);
 } }
- +//Robot on the spot turning function
-//Pööramise funktsioon+
 void motorTurn(int dir, int dly){ void motorTurn(int dir, int dly){
   //left   //left
Line 409: Line 435:
   delay(dly);   delay(dly);
 } }
- +//Sonar sweeping function for servo motor movement
-//Ultrahelianduri lugemise funktsioon+
 int sweepRun(int pos, int moveOnly){ int sweepRun(int pos, int moveOnly){
   if(pos == 2){   if(pos == 2){
Line 416: Line 441:
     delay(400);     delay(400);
     sonarDist[1] = sonar.ping_cm();     sonarDist[1] = sonar.ping_cm();
-    sensM.write(180);+    sensM.write(sensLeft);
     delay(400);     delay(400);
     sonarDist[0] = sonar.ping_cm();     sonarDist[0] = sonar.ping_cm();
-    sensM.write(0);+    sensM.write(sensRight);
     delay(800);     delay(800);
     sonarDist[2] = sonar.ping_cm();     sonarDist[2] = sonar.ping_cm();
Line 431: Line 456:
   }   }
   else if(pos == -1){   else if(pos == -1){
-    sensM.write(180);+    sensM.write(sensLeft);
     if(moveOnly) return 0;     if(moveOnly) return 0;
     sonarDist[0] = sonar.ping_cm();     sonarDist[0] = sonar.ping_cm();
Line 437: Line 462:
   }   }
   else if(pos == 1){   else if(pos == 1){
-    sensM.write(0);+    sensM.write(sensRight);
     if(moveOnly) return 0;     if(moveOnly) return 0;
     sonarDist[2] = sonar.ping_cm();     sonarDist[2] = sonar.ping_cm();
Line 445: Line 470:
 } }
 </code> </code>
- 
-Programmi töö seletus: 
-Programm on tükeldatud mitmeteks funktsioonideks, et oleks lihtsam koostada algoritmi. Programmi põhitsükkel kontrollib pidevalt, et ees poleks ühtegi objekti. 
- 
et/projects/arduino.1451303346.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0