This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:projects:arduino [2015/12/28 10:48] – kaupo.raid | et: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 | ||
| * 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> | ||
| === 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, |
| // | // | ||
| digitalWrite(LED, | digitalWrite(LED, | ||
| 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), | sensVal = map(analogRead(POTPIN), | ||
| sensM.write(sensVal); | sensM.write(sensVal); | ||
| + | } | ||
| + | if (i == 3) { | ||
| + | sensLeftSide = map(analogRead(POTPIN), | ||
| + | sensM.write(sensLeftSide); | ||
| + | } | ||
| + | if (i == 4) { | ||
| + | sensRightSide = map(analogRead(POTPIN), | ||
| + | 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 |
| - | | + | |
| leftM.write(leftVal); | leftM.write(leftVal); | ||
| rightM.write(rightVal); | rightM.write(rightVal); | ||
| Line 120: | Line 127: | ||
| EEPROM.update(R_MOTOR_STOP, | EEPROM.update(R_MOTOR_STOP, | ||
| EEPROM.update(S_MOTOR_CENTR, | EEPROM.update(S_MOTOR_CENTR, | ||
| + | EEPROM.update(S_MOTOR_LEFT, | ||
| + | EEPROM.update(S_MOTOR_RIGHT, | ||
| EEPROM.update(L_MOTOR_FWD, | EEPROM.update(L_MOTOR_FWD, | ||
| EEPROM.update(R_MOTOR_FWD, | EEPROM.update(R_MOTOR_FWD, | ||
| - | //Kalibratsiooni lõpp. Indikaatori tuli kustub. | + | //Calibration end inidicator LOW |
| digitalWrite(LED, | digitalWrite(LED, | ||
| //Print out values | //Print out values | ||
| Line 147: | Line 156: | ||
| </ | </ | ||
| - | 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 | + | * 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 mootorit. Kui 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 | + | * Roboti mõlemad mootorid hakkavad pöörlema maksimum kiirusel. |
| + | * 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 | ||
| + | * 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, | digitalWrite(LED, | ||
| Line 240: | Line 256: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| === 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:// | + | * [[http:// |
| + | Programm on tükeldatud mitmeteks funktsioonideks, | ||
| <code c> | <code c> | ||
| Line 250: | Line 269: | ||
| #include < | #include < | ||
| - | // | + | // |
| - | #define SONARDIFF 10 // | + | |
| #define TURNDLY 800 //90deg turn delay | #define TURNDLY 800 //90deg turn delay | ||
| - | #define SMIN 40 //distance from which to activate small turns | + | #define SMIN 0 //distance from which to activate small turns |
| #define SMAX 200 //distance from which to deactivate small turns | #define SMAX 200 //distance from which to deactivate small turns | ||
| - | // | + | // |
| Servo leftM, rightM, sensM; | Servo leftM, rightM, sensM; | ||
| - | //Sonari 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 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); | ||
| - | //Funktsiooni 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() { | ||
| - | // | + | // |
| 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, | pinMode(POTPIN, | ||
| pinMode(IRSENS, | pinMode(IRSENS, | ||
| Line 315: | Line 339: | ||
| 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); | ||
| - | // | + | // |
| while (digitalRead(SWITCH) == HIGH) { | while (digitalRead(SWITCH) == HIGH) { | ||
| digitalWrite(LED, | digitalWrite(LED, | ||
| Line 333: | Line 356: | ||
| //check if something is blocking way | //check if something is blocking way | ||
| frontWall = digitalRead(IRSENS); | frontWall = digitalRead(IRSENS); | ||
| - | //Sweeping motion | + | |
| - | if(millis() - lastSweep > 400){ | + | |
| + | if(millis() - lastSweep > 350){ | ||
| sweepRun(sweepPos, | sweepRun(sweepPos, | ||
| if(sweepPos == -1 || sweepPos == 1) scanDone = 1; | if(sweepPos == -1 || sweepPos == 1) scanDone = 1; | ||
| Line 345: | Line 369: | ||
| sweepRun(sweepPos, | sweepRun(sweepPos, | ||
| lastSweep = millis(); | lastSweep = millis(); | ||
| + | |||
| + | Serial.print(" | ||
| + | Serial.print(sonarDist[0]); | ||
| + | Serial.print(" | ||
| + | Serial.print(sonarDist[1]); | ||
| + | Serial.print(" | ||
| + | Serial.println(sonarDist[2]); | ||
| } | } | ||
| - | | + | |
| if (frontWall == 0) { | if (frontWall == 0) { | ||
| motorStop(0); | motorStop(0); | ||
| Line 354: | Line 385: | ||
| lastTurn = millis(); | lastTurn = millis(); | ||
| } | } | ||
| - | else if(sonarDist[0] > 0 && sonarDist[2] > 0 && | + | else if(scanDone == 1 && (millis() - lastTurn > 2000)) |
| - | { | + | { |
| - | | + | |
| - | sonarDiff = sonarDist[0] | + | |
| - | + | ||
| - | if (sonarDiff > SONARDIFF) { | + | |
| motorStop(0); | motorStop(0); | ||
| - | motorTurn(-1, 200); | + | motorTurn(1, |
| } | } | ||
| - | else if(sonarDiff | + | else if(sonarDist[2] |
| motorStop(0); | motorStop(0); | ||
| - | motorTurn(1, | + | motorTurn(-1, 200); |
| } | } | ||
| scanDone = 0; | scanDone = 0; | ||
| Line 375: | Line 403: | ||
| } | } | ||
| } | } | ||
| + | //Motors stopping function | ||
| void motorStop(int wheel){ | void motorStop(int wheel){ | ||
| if(wheel == 0){ | if(wheel == 0){ | ||
| Line 388: | Line 416: | ||
| } | } | ||
| } | } | ||
| + | //Forward moving function | ||
| void motorFwd(void){ | void motorFwd(void){ | ||
| leftM.write(leftFwd); | leftM.write(leftFwd); | ||
| rightM.write(rightFwd); | rightM.write(rightFwd); | ||
| } | } | ||
| + | //Robot on the spot turning function | ||
| void motorTurn(int dir, int dly){ | void motorTurn(int dir, int dly){ | ||
| //left | //left | ||
| Line 407: | Line 435: | ||
| delay(dly); | delay(dly); | ||
| } | } | ||
| + | //Sonar sweeping function for servo motor movement | ||
| int sweepRun(int pos, int moveOnly){ | int sweepRun(int pos, int moveOnly){ | ||
| if(pos == 2){ | if(pos == 2){ | ||
| Line 413: | 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 428: | 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 434: | 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(); | ||