
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/)