Řízení elektomotoru

Kód:

// Definice pinů pro Hallovy senzory, motor a tlačítko
const int pinHall1 = 2;  // Pin pro Hallův senzor 1
const int pinHall2 = 3;  // Pin pro Hallův senzor 2
const int pinMotorPWM = 10;  // PWM pin pro řízení rychlosti motoru
const int pinMotorDir1 = 8;  // Směrový pin 1 pro motor
const int pinMotorDir2 = 9;  // Směrový pin 2 pro motor
const int pinSTBY = 4;       // Pin pro STBY (aktivace driveru)

volatile int hallPulses = 0;  // Počet impulzů z Hallových senzorů
const int pulsesPerRotation = 448;  // Počet pulzů na jednu otáčku hřídele

void setup() {
  Serial.begin(9600);  // Zahájení komunikace přes Serial Monitor

  // Nastavení pinů pro Hallovy senzory
  pinMode(pinHall1, INPUT);
  pinMode(pinHall2, INPUT);

  // Nastavení pinů pro motor
  pinMode(pinMotorPWM, OUTPUT);
  pinMode(pinMotorDir1, OUTPUT);
  pinMode(pinMotorDir2, OUTPUT);
  pinMode(pinSTBY, OUTPUT);

  // Aktivace motorového driveru
  digitalWrite(pinSTBY, HIGH);  // STBY musí být HIGH, aby driver fungoval

  // Přerušení pro čtení impulsů z Hallových senzorů
  attachInterrupt(digitalPinToInterrupt(pinHall1), countPulse, RISING);
  attachInterrupt(digitalPinToInterrupt(pinHall2), countPulse, RISING);

  Serial.println("Test motoru a Hallových senzorů spuštěn");
}

void loop() {
  // Resetujeme počet impulzů
  hallPulses = 0;

  // Otočení doprava o 448 pulzů
  otocMotorDoprava(pulsesPerRotation);

  // Krátká pauza
  delay(1000);

  // Resetujeme počet impulzů
  hallPulses = 0;

  // Otočení doleva o 448 pulzů
  otocMotorDoleva(pulsesPerRotation);

  // Další pauza před opakováním
  delay(1000);
}

// Funkce pro přerušení při zachycení impulsu z Hallových senzorů
void countPulse() {
  hallPulses++;
}

// Funkce pro otočení motoru doprava o daný počet pulzů
void otocMotorDoprava(int targetPulses) {
  Serial.println("Otočení doprava");
  digitalWrite(pinMotorDir1, HIGH);
  digitalWrite(pinMotorDir2, LOW);
  analogWrite(pinMotorPWM, 150);  // Nastavení rychlosti motoru

  while (hallPulses < targetPulses) {
    // Čekáme, dokud nedosáhneme cílového počtu impulzů
  }

  analogWrite(pinMotorPWM, 0);  // Zastavení motoru
  Serial.println("Otočení doprava dokončeno.");
  Serial.print("Počet impulzů: ");
  Serial.println(hallPulses);
}

// Funkce pro otočení motoru doleva o daný počet pulzů
void otocMotorDoleva(int targetPulses) {
  Serial.println("Otočení doleva");
  digitalWrite(pinMotorDir1, LOW);
  digitalWrite(pinMotorDir2, HIGH);
  analogWrite(pinMotorPWM, 150);  // Nastavení rychlosti motoru

  while (hallPulses < targetPulses) {
    // Čekáme, dokud nedosáhneme cílového počtu impulzů
  }

  analogWrite(pinMotorPWM, 0);  // Zastavení motoru
  Serial.println("Otočení doleva dokončeno.");
  Serial.print("Počet impulzů: ");
  Serial.println(hallPulses);
}

Použité součástky:

1. Arduino Nano
2. Motor GM25-370 9V 150rpm s převodovkou a enkodérem (https://www.laskakit.cz/motor-gm25-370-9v-150rpm-s-prevodovkou-a-enkoderem-/)
3. Dvoumotorový řadič TB6612FNG (https://www.laskakit.cz/dvoumotorovy-radic-tb6612fng/)
4. Rotační encoder s tlačítkem a RC s filtrem (https://www.laskakit.cz/rotacni-encoder-s-tlacitkem-a-rc-s-filtrem/)