Enkoder Iduino SE055 i sterowanie silnikiem DC12V LM298N Arduino Mega | V-SLOT Polska Tutorial Część 6

Enkoder Iduino SE055 i sterowanie silnikiem DC12V LM298N Arduino Mega | V-SLOT Polska Tutorial #6

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!

IDuino-tutorial

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: 

Arduino_IDuino_encoder

dcmotor-iduino-arduino-lm-driver

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!

Pliki (4)

do góry
Sklep jest w trybie podglądu
Pokaż pełną wersję strony
Sklep internetowy Shoper.pl