ESP 32 – Kontroler

https://hr.szks-kuongshun.com/info/mastering-the-esp32-a-comprehensive-guide-88876427.html

Kako koračni motor radi:

https://cnc-centar.ba/aktuelnosti/sta-je-step-koracni-motor/

Simulator za stepper motore:

https://wokwi.com/projects/433915938304722945

const int dirPin = 4;
const int stepPin = 5;
const int stepsPerRevolution = 200;
 
void setup()
{
  // Declare pins as Outputs
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
}
void loop()
{
  // Set motor direction clockwise
  digitalWrite(dirPin, HIGH);
 
  // Spin motor slowly
  for(int x = 0; x < stepsPerRevolution; x++)
  {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(2000);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(2000);
  }
  delay(1000); // Wait a second
  
  // Set motor direction counterclockwise
  digitalWrite(dirPin, LOW);
 
  // Spin motor quickly
  for(int x = 0; x < stepsPerRevolution; x++)
  {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(1000);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(1000);
  }
  delay(1000); // Wait a second
}
const int dirPin = 2;
const int stepPin = 3;
const int stepsPerRevolution = 200;
 
void setup()
{
  // Declare pins as Outputs
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
}
void loop()
{
  // Set motor direction clockwise
  digitalWrite(dirPin, HIGH);
 
  // Spin motor slowly
  for(int x = 0; x < stepsPerRevolution; x++)
  {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(2000);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(2000);
  }
  delay(1000); // Wait a second
  
  // Set motor direction counterclockwise
  digitalWrite(dirPin, LOW);
 
  // Spin motor quickly
  for(int x = 0; x < stepsPerRevolution; x++)
  {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(1000);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(1000);
  }
  delay(1000); // Wait a second
}

Izrada robota kontroler i stepper motor:

https://how2electronics.com/control-stepper-motor-with-a4988-driver-arduino/

Instalacija kontrolera:

Pokretanje robota

#include <AccelStepper.h>

// Pinovi za prvi motor
#define dirPin1 25
#define stepPin1 26

// Pinovi za drugi motor
#define dirPin2 27
#define stepPin2 14

// Tip drajvera (1 = DRIVER)
#define motorInterfaceType 1

// Kreiranje objekata za oba motora
AccelStepper motor1(motorInterfaceType, stepPin1, dirPin1);
AccelStepper motor2(motorInterfaceType, stepPin2, dirPin2);

void setup() {
  // Postavi maksimalnu brzinu za oba motora
  motor1.setMaxSpeed(1000);
  motor2.setMaxSpeed(1000);

  // Postavi istu brzinu naprijed za oba motora
  motor1.setSpeed(300);
  motor2.setSpeed(300);
}

void loop() {
  // Pokreni oba motora unaprijed
  motor1.runSpeed();
  motor2.runSpeed();
}

Kretanje robota i skretanje

#include <AccelStepper.h>
#include <math.h>

// Motor pinovi i postavke
#define dirPinLeft 25
#define stepPinLeft 26
#define dirPinRight 27
#define stepPinRight 14
#define motorInterfaceType 1

AccelStepper motorLeft(motorInterfaceType, stepPinLeft, dirPinLeft);
AccelStepper motorRight(motorInterfaceType, stepPinRight, dirPinRight);

// Parametri robota
const float promjerKotaca = 6.4; // cm
const float opsegKotaca = 3.1416 * promjerKotaca;
const int koraciPoOkretaju = 200;
const int mikrostep = 16;
const float koraciPoCm = (koraciPoOkretaju * mikrostep) / opsegKotaca;
const float razmakIzmeduKotaca = 12.0; // cm

// Trenutna pozicija robota
float pozX = 0.0, pozY = 0.0, orijentacija = 0.0;

void setup() {
  motorLeft.setMaxSpeed(1000);
  motorRight.setMaxSpeed(1000);
}

void loop() {
  idiDo(0, 20);   // Idi naprijed 20 cm
  delay(1000);

  idiDo(20, 20);  // Skreni desno i idi 20 cm
  delay(1000);

  idiDo(20, 0);   // Skreni opet i idi dolje
  delay(5000);
}

void idiNaprijed(float cm) {
  long koraci = cm * koraciPoCm;

  motorLeft.setCurrentPosition(0);
  motorRight.setCurrentPosition(0);

  motorLeft.setSpeed(300);     // naprijed
  motorRight.setSpeed(-300);   // naprijed (zrcalno)

  while (abs(motorLeft.currentPosition()) < koraci || abs(motorRight.currentPosition()) < koraci) {
    if (abs(motorLeft.currentPosition()) < koraci) motorLeft.runSpeed();
    if (abs(motorRight.currentPosition()) < koraci) motorRight.runSpeed();
  }
}

void skreniDesno(float stupnjeva) {
  float putanja = (3.1416 * razmakIzmeduKotaca) * (stupnjeva / 360.0);
  long koraci = putanja * koraciPoCm;

  motorLeft.setCurrentPosition(0);
  motorRight.setCurrentPosition(0);

  motorLeft.setSpeed(300);    // naprijed
  motorRight.setSpeed(300);   // unatrag (zrcalno montiran)

  while (abs(motorLeft.currentPosition()) < koraci || abs(motorRight.currentPosition()) < koraci) {
    if (abs(motorLeft.currentPosition()) < koraci) motorLeft.runSpeed();
    if (abs(motorRight.currentPosition()) < koraci) motorRight.runSpeed();
  }
}

void skreniLijevo(float stupnjeva) {
  float putanja = (3.1416 * razmakIzmeduKotaca) * (stupnjeva / 360.0);
  long koraci = putanja * koraciPoCm;

  motorLeft.setCurrentPosition(0);
  motorRight.setCurrentPosition(0);

  motorLeft.setSpeed(-300);   // unatrag
  motorRight.setSpeed(-300);  // naprijed (zrcalno montiran)

  while (abs(motorLeft.currentPosition()) < koraci || abs(motorRight.currentPosition()) < koraci) {
    if (abs(motorLeft.currentPosition()) < koraci) motorLeft.runSpeed();
    if (abs(motorRight.currentPosition()) < koraci) motorRight.runSpeed();
  }
}

void idiDo(float x, float y) {
  float dx = x - pozX;
  float dy = y - pozY;
  float d = sqrt(dx * dx + dy * dy);
  float kut = atan2(dx, dy) * 180.0 / 3.1416;

  float deltaKut = kut - orijentacija;
  while (deltaKut > 180) deltaKut -= 360;
  while (deltaKut < -180) deltaKut += 360;

  if (deltaKut > 0) {
    skreniDesno(deltaKut);
    orijentacija += deltaKut;
  } else {
    skreniLijevo(-deltaKut);
    orijentacija += deltaKut;
  }

  while (orijentacija < 0) orijentacija += 360;
  while (orijentacija >= 360) orijentacija -= 360;

  idiNaprijed(d);

  pozX = x;
  pozY = y;
}

Ultrazvučni senzor

#include <AccelStepper.h>

// Pinovi za motore
#define DIR_L 25
#define STEP_L 26
#define DIR_R 27
#define STEP_R 14

AccelStepper motorL(1, STEP_L, DIR_L);
AccelStepper motorR(1, STEP_R, DIR_R);

// Ultrazvučni senzor
#define TRIG 32
#define ECHO 13

const int brzina = 300;         // Konstantna brzina kretanja
const float prag = 15.0;        // Prag udaljenosti u cm

void setup() {
  Serial.begin(115200);
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);

  motorL.setMaxSpeed(brzina);
  motorR.setMaxSpeed(brzina);
}

float izmjeriUdaljenost() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);

  long trajanje = pulseIn(ECHO, HIGH);
  return trajanje * 0.034 / 2;
}

void loop() {
  float udaljenost = izmjeriUdaljenost();
  Serial.print("Udaljenost: ");
  Serial.print(udaljenost);
  Serial.println(" cm");

  if (udaljenost > prag) {
    motorL.setSpeed(brzina);
    motorR.setSpeed(brzina); // Oba motora naprijed
  } else {
    motorL.setSpeed(0);
    motorR.setSpeed(0);      // Zaustavi se
  }

  motorL.runSpeed();
  motorR.runSpeed();
}
#include <AccelStepper.h>

// Pinovi za motore
#define DIR_L 25
#define STEP_L 26
#define DIR_R 27
#define STEP_R 14

AccelStepper motorL(1, STEP_L, DIR_L);
AccelStepper motorR(1, STEP_R, DIR_R);

// Ultrazvučni senzor
#define TRIG 32
#define ECHO 13

const int brzina = 1000;        // Konstantna brzina kretanja
const float prag = 15.0;        // Prag udaljenosti u cm

void setup() {
  Serial.begin(115200);
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);

  motorL.setMaxSpeed(brzina);
  motorR.setMaxSpeed(brzina);
}

float izmjeriUdaljenost() {
  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);

  long trajanje = pulseIn(ECHO, HIGH);
  return trajanje * 0.034 / 2;
}

void loop() {
  float udaljenost = izmjeriUdaljenost();
  Serial.print("Udaljenost: ");
  Serial.print(udaljenost);
  Serial.println(" cm");

  if (udaljenost > prag) {
    motorL.setSpeed(brzina);
    motorR.setSpeed(brzina); // Ide ravno naprijed
  } else {
    motorL.setSpeed(0);
    motorR.setSpeed(0);
  }

  motorL.runSpeed();
  motorR.runSpeed();
}
#include <AccelStepper.h>

// PINS za motore
#define dirPin1 25
#define stepPin1 26
#define dirPin2 27
#define stepPin2 14

// Ultrazvučni senzor
const int trigPin = 32;
const int echoPin = 13;

// Parametri za motor
#define motorInterfaceType 1
AccelStepper motorDesni(motorInterfaceType, stepPin1, dirPin1);
AccelStepper motorLijevi(motorInterfaceType, stepPin2, dirPin2);

// Parametri robota
const float korakaPoOkr = 200.0;
const float promjerKotacaCM = 6.4;
const float opsegKotaca = 3.1416 * promjerKotacaCM;

// Senzor udaljenosti
#define SOUND_SPEED 0.034
#define SAFE_DISTANCE_CM 20.0  // minimalna udaljenost za zaustavljanje

long duration;
float distanceCm;

// Pretvori cm u korake
int cmUKorake(float cm) {
  return int(cm * korakaPoOkr / opsegKotaca);
}

// Funkcija za mjerenje udaljenosti
float mjeriUdaljenostCm() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
 
  duration = pulseIn(echoPin, HIGH, 20000); // Timeout 20ms
  float udaljenost = duration * SOUND_SPEED / 2;
  return udaljenost;
}

// Idi naprijed s provjerom udaljenosti
void idiNaprijedSigurno(float cm, int brzina = 500) {
  int koraci = cmUKorake(cm);
  motorDesni.setSpeed(brzina);
  motorLijevi.setSpeed(brzina);
  for (int i = 0; i < koraci; i++) {
    distanceCm = mjeriUdaljenostCm();
    if (distanceCm < SAFE_DISTANCE_CM) {
      motorDesni.setSpeed(0);
      motorLijevi.setSpeed(0);
      Serial.println("? Prepreka detektirana! Zaustavljanje.");
      break;
    }
    motorDesni.runSpeed();
    motorLijevi.runSpeed();
  }
}

// Postavi okretanje, bez provjere udaljenosti
void okreniLijevo(int koraka, int brzina = 500) {
  motorDesni.setSpeed(brzina);
  motorLijevi.setSpeed(-brzina);
  for (int i = 0; i < koraka; i++) {
    motorDesni.runSpeed();
    motorLijevi.runSpeed();
  }
}

void okreniDesno(int koraka, int brzina = 500) {
  motorDesni.setSpeed(-brzina);
  motorLijevi.setSpeed(brzina);
  for (int i = 0; i < koraka; i++) {
    motorDesni.runSpeed();
    motorLijevi.runSpeed();
  }
}

void setup() {
  Serial.begin(115200);
  motorDesni.setMaxSpeed(1000);
  motorLijevi.setMaxSpeed(1000);

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  Serial.println("? Pokretanje robota...");
}

void loop() {
  Serial.println("➡️ Krećem naprijed 100 cm");
  idiNaprijedSigurno(100);  // pokušaj ići 100 cm naprijed, ali stani ako ima prepreka
  delay(1000);

  Serial.println("↪️ Okret udesno");
  okreniDesno(cmUKorake(10));
  delay(1000);
}
#include <AccelStepper.h>

// Motor pinovi
#define dirPinLeft 25
#define stepPinLeft 26
#define dirPinRight 27
#define stepPinRight 14
#define motorInterfaceType 1

AccelStepper motorLeft(motorInterfaceType, stepPinLeft, dirPinLeft);
AccelStepper motorRight(motorInterfaceType, stepPinRight, dirPinRight);

// Ultrazvučni pinovi
const int trigPin = 32;
const int echoPin = 13;

// Parametri motora i kotača
const int koraciPoOkretaju = 200;
const int mikrostep = 4;          // prilagodi mikrostep postavku
const float promjerKotaca = 6.4;  
const float opsegKotaca = 3.1416 * promjerKotaca;
const float koraciPoCm = (koraciPoOkretaju * mikrostep) / opsegKotaca;

// Brzina i prag za zaustavljanje
const int brzinaKoraka = 1500;
const float pragUdaljenostiCm = 15.0;  // robot staje ako je prepreka bliže od 15 cm

long duration;
float distanceCm;

void setup() {
  Serial.begin(115200);

  motorLeft.setMaxSpeed(brzinaKoraka);
  motorLeft.setAcceleration(1500);

  motorRight.setMaxSpeed(brzinaKoraka);
  motorRight.setAcceleration(1500);

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

float izmjeriUdaljenost() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);
  distanceCm = duration * 0.034 / 2;
  return distanceCm;
}

void loop() {
  float udaljenost = izmjeriUdaljenost();
  Serial.print("Udaljenost: ");
  Serial.print(udaljenost);
  Serial.println(" cm");

  if (udaljenost > pragUdaljenostiCm) {
    motorLeft.setSpeed(brzinaKoraka);
    motorRight.setSpeed(-brzinaKoraka);
  } else {
    motorLeft.setSpeed(0);
    motorRight.setSpeed(0);
  }
  
  motorLeft.runSpeed();
  motorRight.runSpeed();
}
#include <AccelStepper.h>
#include <math.h>

// Motor pinovi i postavke
#define dirPinLeft 25
#define stepPinLeft 26
#define dirPinRight 27
#define stepPinRight 14
#define motorInterfaceType 1

AccelStepper motorLeft(motorInterfaceType, stepPinLeft, dirPinLeft);
AccelStepper motorRight(motorInterfaceType, stepPinRight, dirPinRight);

// Parametri robota
const float promjerKotaca = 6.4; // cm
const float opsegKotaca = 3.1416 * promjerKotaca;
const int koraciPoOkretaju = 200;
const int mikrostep = 16;
const float koraciPoCm = (koraciPoOkretaju * mikrostep) / opsegKotaca;
const float razmakIzmeduKotaca = 12.0; // cm

// Trenutna pozicija robota
float pozX = 0.0, pozY = 0.0, orijentacija = 0.0;

void setup() {
  motorLeft.setMaxSpeed(1000);
  motorRight.setMaxSpeed(1000);
}

void loop() {
  idiDo(0, 20);   // Idi naprijed 20 cm
  delay(1000);

  idiDo(20, 20);  // Skreni desno i idi 20 cm
  delay(1000);

  idiDo(20, 0);   // Skreni opet i idi dolje
  delay(5000);
}

void idiNaprijed(float cm) {
  long koraci = cm * koraciPoCm;

  motorLeft.setCurrentPosition(0);
  motorRight.setCurrentPosition(0);

  motorLeft.setSpeed(300);     // naprijed
  motorRight.setSpeed(-300);   // naprijed (zrcalno)

  while (abs(motorLeft.currentPosition()) < koraci || abs(motorRight.currentPosition()) < koraci) {
    if (abs(motorLeft.currentPosition()) < koraci) motorLeft.runSpeed();
    if (abs(motorRight.currentPosition()) < koraci) motorRight.runSpeed();
  }
}

void skreniDesno(float stupnjeva) {
  float putanja = (3.1416 * razmakIzmeduKotaca) * (stupnjeva / 360.0);
  long koraci = putanja * koraciPoCm;

  motorLeft.setCurrentPosition(0);
  motorRight.setCurrentPosition(0);

  motorLeft.setSpeed(300);    // naprijed
  motorRight.setSpeed(300);   // unatrag (zrcalno montiran)

  while (abs(motorLeft.currentPosition()) < koraci || abs(motorRight.currentPosition()) < koraci) {
    if (abs(motorLeft.currentPosition()) < koraci) motorLeft.runSpeed();
    if (abs(motorRight.currentPosition()) < koraci) motorRight.runSpeed();
  }
}

void skreniLijevo(float stupnjeva) {
  float putanja = (3.1416 * razmakIzmeduKotaca) * (stupnjeva / 360.0);
  long koraci = putanja * koraciPoCm;

  motorLeft.setCurrentPosition(0);
  motorRight.setCurrentPosition(0);

  motorLeft.setSpeed(-300);   // unatrag
  motorRight.setSpeed(-300);  // naprijed (zrcalno montiran)

  while (abs(motorLeft.currentPosition()) < koraci || abs(motorRight.currentPosition()) < koraci) {
    if (abs(motorLeft.currentPosition()) < koraci) motorLeft.runSpeed();
    if (abs(motorRight.currentPosition()) < koraci) motorRight.runSpeed();
  }
}

void idiDo(float x, float y) {
  float dx = x - pozX;
  float dy = y - pozY;
  float d = sqrt(dx * dx + dy * dy);
  float kut = atan2(dx, dy) * 180.0 / 3.1416;

  float deltaKut = kut - orijentacija;
  while (deltaKut > 180) deltaKut -= 360;
  while (deltaKut < -180) deltaKut += 360;

  if (deltaKut > 0) {
    skreniDesno(deltaKut);
    orijentacija += deltaKut;
  } else {
    skreniLijevo(-deltaKut);
    orijentacija += deltaKut;
  }

  while (orijentacija < 0) orijentacija += 360;
  while (orijentacija >= 360) orijentacija -= 360;

  idiNaprijed(d);

  pozX = x;
  pozY = y;
}
Scroll to Top