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 12:40] – kaupo.raid | et:projects:arduino [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 22: | Line 22: | ||
| ===== Näiteprogrammid ===== | ===== Näiteprogrammid ===== | ||
| + | |||
| + | {{youtube> | ||
| === Mootorite kalibreerimine === | === Mootorite kalibreerimine === | ||
| Line 46: | 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 63: | Line 67: | ||
| void calibMotors() { | void calibMotors() { | ||
| - | int leftVal, rightVal, sensVal, fwdLeft, fwdRight; | + | int leftVal, rightVal, sensVal, fwdLeft, fwdRight, sensLeftSide, |
| // | // | ||
| digitalWrite(LED, | digitalWrite(LED, | ||
| Line 69: | 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 82: | 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 92: | 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 98: | Line 109: | ||
| rightM.write(fwdRight); | rightM.write(fwdRight); | ||
| } | } | ||
| - | } | + | delay(1000); |
| - | else { | + | |
| while (digitalRead(SWITCH) == HIGH) { | while (digitalRead(SWITCH) == HIGH) { | ||
| fwdRight = 180; | fwdRight = 180; | ||
| Line 105: | Line 115: | ||
| leftM.write(fwdLeft); | leftM.write(fwdLeft); | ||
| } | } | ||
| - | | + | //Stop motors |
| - | | + | |
| leftM.write(leftVal); | leftM.write(leftVal); | ||
| rightM.write(rightVal); | rightM.write(rightVal); | ||
| Line 118: | 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 145: | 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 === | ||
| - | Programm näeb ette roboti navigeerimist ruumis. Robot sõidab otse kuni ette tuleb sein, siis robot pöörab vasakule ja jätkab otse sõitu. | + | Programm näeb ette roboti navigeerimist ruumis. Robot sõidab otse kuni ette tuleb sein, siis robot pöörab vasakule ja jätkab otse sõitu. |
| <code c> | <code c> | ||
| Line 211: | 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 251: | Line 269: | ||
| #include < | #include < | ||
| - | //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 0 //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 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 271: | Line 288: | ||
| #define R_SERVO 9 | #define R_SERVO 9 | ||
| #define S_SERVO 8 | #define S_SERVO 8 | ||
| - | // | + | // |
| #define L_MOTOR_STOP 0 | #define L_MOTOR_STOP 0 | ||
| #define R_MOTOR_STOP 1 | #define R_MOTOR_STOP 1 | ||
| Line 277: | 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 293: | 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 307: | 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 1 paremale | + | int sweepDir = -1; // -1 left and 1 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); | ||
| - | // | + | // |
| while (digitalRead(SWITCH) == HIGH) { | while (digitalRead(SWITCH) == HIGH) { | ||
| digitalWrite(LED, | digitalWrite(LED, | ||
| Line 329: | 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){ | + | |
| + | 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 | |
| - | //Mootorite koos või eraldi peatamise funktsioon | + | |
| void motorStop(int wheel){ | void motorStop(int wheel){ | ||
| if(wheel == 0){ | if(wheel == 0){ | ||
| Line 389: | 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 410: | 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 417: | 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 432: | 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 438: | 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(); | ||