Witajcie, entuzjaści DIY i robotyki! W kolejnej, szóstej odsłonie serii tutoriali V-SLOT Polska, przechodzimy do zaawansowanego poziomu sterowania silnikiem DC. W tym artykule pokażemy, jak wykorzystać enkoder z przyciskiem oraz moduł L298N do precyzyjnego sterowania kierunkiem i prędkością silnika przy użyciu Arduino Mega 2560. Dołączcie do naszego przewodnika i odkryjcie, jak samodzielnie zbudować zaawansowany system sterowania!

Co Się Dowiecie: W tym poradniku skupimy się na integracji enkodera z przyciskiem oraz modułu L298N z silnikiem DC, aby zapewnić precyzyjne i intuicyjne sterowanie. Oto, czego się nauczycie:
- Jak podłączyć enkoder z przyciskiem do Arduino.
- Jak zintegrować moduł L298N z Arduino i silnikiem DC.
- Jak napisać kod do kontrolowania kierunku i prędkości silnika w oparciu o odczyty z enkodera.
- Jak zresetować ustawienia enkodera za pomocą przycisku, aby uzyskać pełną kontrolę nad systemem.
Schemat Podłączenia:


Praktyczna Demonstracja: Aby w pełni zrozumieć, jak wszystko działa razem, zachęcamy do obejrzenia naszego tutorialu wideo, gdzie krok po kroko demonstrujemy budowę i programowanie systemu. Zobaczcie, jak przygotować układ, zaprogramować Arduino i przetestować działanie systemu sterowania silnikiem.
Produkty i Narzędzia: W realizacji tego projektu wykorzystano następujące elementy dostępne w sklepie V-SLOT Polska:
Kod Arduino (do pobrania na końcu wpisu):
Zapewniamy kompletny kod źródłowy użyty w tutorialu, który pozwoli Wam na eksperymentowanie i dostosowanie projektu do własnych potrzeb.
Oto kod Arduino służący do testowania enkodera:
// Definicja pinów
const int pinCLK = 3; // Pin dla CLK
const int pinDT = 4; // Pin dla DT
const int pinSW = 2; // Pin dla przycisku SW
// Zmienne do przechowywania stanu i pozycji enkodera
int lastCLKState;
int encoderValue = 0;
// Stan przycisku
int buttonState;
int lastButtonState = HIGH;
void setup() {
// Inicjalizacja pinów
pinMode(pinCLK, INPUT);
pinMode(pinDT, INPUT);
pinMode(pinSW, INPUT_PULLUP);
lastCLKState = digitalRead(pinCLK);
// Rozpoczęcie komunikacji szeregowej
Serial.begin(9600);
}
void loop() {
// Odczyt stanów enkodera
int CLKState = digitalRead(pinCLK);
int DTState = digitalRead(pinDT);
// Sprawdzenie, czy nastąpiła zmiana stanu na CLK
if (CLKState != lastCLKState){
// Jeśli stan DT jest inny niż stan CLK, to kierunek jest CW
if (DTState != CLKState) {
encoderValue++;
} else {
encoderValue--;
}
Serial.print("Wartość enkodera: ");
Serial.println(encoderValue);
}
lastCLKState = CLKState;
// Sprawdzenie przycisku
int readButton = digitalRead(pinSW);
if (readButton != lastButtonState) {
if (readButton == LOW) {
Serial.println("Przycisk naciśnięty!");
}
lastButtonState = readButton;
}
// Opóźnienie dla stabilizacji
delay(1);
}
Kompletny kod:
// Definicja pinów
const int pinCLK = 3; // Pin dla CLK
const int pinDT = 4; // Pin dla DT
const int pinSW = 2; // Pin dla przycisku SW
const int pinIN1 = 5; // L298N IN1
const int pinIN2 = 6; // L298N IN2
const int pinENA = 7; // L298N ENA
int lastCLKState;
int encoderValue = 0;
int buttonState;
int lastButtonState = HIGH;
int motorSpeed = 0;
void setup() {
pinMode(pinCLK, INPUT);
pinMode(pinDT, INPUT);
pinMode(pinSW, INPUT_PULLUP);
pinMode(pinIN1, OUTPUT);
pinMode(pinIN2, OUTPUT);
pinMode(pinENA, OUTPUT);
lastCLKState = digitalRead(pinCLK);
Serial.begin(9600);
}
void loop() {
int CLKState = digitalRead(pinCLK);
int DTState = digitalRead(pinDT);
// Odczytanie kierunku enkodera
if (CLKState != lastCLKState){
if (DTState != CLKState) {
encoderValue++;
} else {
encoderValue--;
}
Serial.print("Wartość enkodera: ");
Serial.println(encoderValue);
controlMotor(); // Kontroluj silnik na podstawie wartości enkodera
}
lastCLKState = CLKState;
// Zerowanie enkodera po naciśnięciu przycisku
int readButton = digitalRead(pinSW);
if (readButton != lastButtonState) {
if (readButton == LOW) {
Serial.println("Resetowanie enkodera");
encoderValue = 0;
controlMotor(); // Zatrzymaj silnik
}
lastButtonState = readButton;
}
delay(1);
}
void controlMotor() {
// Obliczenie prędkości silnika
motorSpeed = map(abs(encoderValue), 0, 40, 0, 255);
motorSpeed = constrain(motorSpeed, 0, 255);
// Ustawienie kierunku obrotu
if (encoderValue > 0) {
digitalWrite(pinIN1, HIGH);
digitalWrite(pinIN2, LOW);
} else if (encoderValue < 0) {
digitalWrite(pinIN1, LOW);
digitalWrite(pinIN2, HIGH);
} else {
// Silnik zatrzymuje się
digitalWrite(pinIN1, LOW);
digitalWrite(pinIN2, LOW);
}
// Ustawienie prędkości silnika
analogWrite(pinENA, motorSpeed);
}
Podsumowanie: Dziękujemy za śledzenie naszej serii tutoriali. Mamy nadzieję, że ten artykuł poszerzył Wasze horyzonty i zainspirował do dalszego eksplorowania fascynującego świata elektroniki i robotyki. Pamiętajcie, że z odpowiednim podejściem i narzędziami, możecie tworzyć niesamowite i funkcjonalne projekty w zaciszu własnego domu. Zachęcamy do eksperymentowania, uczenia się i dzielenia się swoimi projektami. Dołączcie do naszej społeczności V-SLOT Polska, aby być na bieżąco z najnowszymi poradnikami, produktami i inspiracjami dla twórców!