Dzisiaj opowiem Wam jak zrobić prosty algorytm sterowania prędkością silnika krokowego za pomocą Arduino. Mówiłem już o sterowanie kierunkiem obrotów silnika prądu stałego za pomocą Arduino, Matlab i NI LabVIEW. Ponadto, omówiłem również sterowanie prędkością obrotów silnika prądu stałego za pomocą Arduino, Matlab i LabView. Jeśli pracujemy nad silnikiem krokowym, musimy rzucić okiem na sterowanie kierunkiem silnika krokowego za pomocą Arduino, sterowanie kierunkiem silnika krokowego przy użyciu Matlaba oraz Sterowanie kierunkiem silnika krokowego przy użyciu NI LabVIEW. Z kolei, w tym poradniku wyjaśnię program, który będzie pomocny w kontroli prędkości silnika krokowego przy użyciu Arduino. Zanim przejdziemy do szczegółów tego poradnika, należy przejrzeć poprzednie poradniki, ponieważ używamy tego samego sprzętu. Będą one zatem bardzo pomocne w lepszym zrozumieniu tego poradnika.
W tym poradniku wyjaśnię jak stworzyć program dla Arduino służący do sterowania prędkością obrotu silnika krokowego za pomocą Arduino przy użyciu komunikacji szeregowej. Jeśli silnik krokowy obraca się z maksymalną prędkością i ciągle wysyłamy komendę przez port szeregowy, aby zmniejszyć jego prędkość, to jego prędkość będzie zmniejszana proporcjonalnie do liczby komend wysyłanych przez port szeregowy. Analogicznie ta sama procedura zostanie zastosowana do zwiększenia prędkości silnika krokowego.
Sterowanie prędkością obrotów silnika krokowego za pomocą Arduino
W poradniku dot. sterowania kierunkiem obrotu silnika krokowego za pomocą Arduino, wyjaśnię jak stworzyć algorytm do uruchamiania silnika krokowego z różną prędkością. Jeśli silnik krokowy już pracuje z maksymalną prędkością i chcemy jeszcze go przyspieszyć, to nic się nie stanie z jego prędkością. Jeżeli silnik krokowy obraca się powoli i zwiększymy jego prędkość, to prędkość silnika wzrośnie proporcjonalnie do ilości komend przyspieszających wysłanych przez port szeregowy.
Schemat blokowy
Zrobiłem schemat blokowy, aby można było łatwo zrozumieć cały algorytm, ponieważ czasami trudno jest zrozumieć algorytm z pomocą kodu źródłowego.
Schemat przepływu sterowania prędkością obrotu silnika krokowego za pomocą Arduino jest pokazany na poniższym rysunku.
Przede wszystkim musimy uruchomić port szeregowy, aby nasza komunikacja mogła się rozpocząć.
Istnieje metoda sprawdzania prędkości. Jeżeli prędkość jest większa niż maksymalna prędkość silnika krokowego to program będzie czekał na następną komendę.
Jeśli silnik krokowy nie obraca się z maksymalną prędkością to możemy jego prędkość zwiększyć.
Podobnie jeśli osiągnięta zostanie minimalna prędkość silnika krokowego, program będzie się przechodził do kolejnych komend.
Jeśli minimalna granica prędkości silnika krokowego nie zostanie osiągnięta to mamy możliwość dalszego jej zmniejszenia.
Na koniec powinniśmy zamknąć port szeregowy, aby uniknąć wymiany zbędnych komend.
Schemat blokowy
Schemat blokowy będzie pomocny w celu lepszego zrozumienia wymiany informacji.
Mówi nam, jak informacja jest wymieniana sekwencyjnie pomiędzy wszystkimi używanymi komponentami.
Schemat blokowy został przedstawiony na poniższym rysunku.
Arduino UNO komunikuje się z kontrolerem silnika L298, aby kontrolować prędkość silnika krokowego.
Sterownik silnika L298 manipuluje poleceniami Arduino i zaczyna kontrolować prędkość silnika krokowego.
Opis kodu Arduino
W tej części poradnika dot. kontroli prędkości obrotu silnika krokowego przy użyciu Arduino, zamierzam omówić kod źródłowy Arduino.
Stworzyłem dwie różne funkcje do zwiększania (przyspieszania) prędkości obrotów silnika krokowego i odpowiednio do jej zmniejszania (spowolnienia).
Zadeklarowałem zmienną o nazwie count (odliczanie).
W funkcji Accelerate (przyspiesz) należy wysłać polecenie H przez port szeregowy, aby zwiększyć prędkość silnika krokowego.
W tej funkcji stale zwiększamy wartość count, tzn. prędkość silnika krokowego będzie wzrastać w sposób ciągły, tyle razy, ile wyślemy komendę H.
Poniżej znajduje się kod źródłowy funkcji Accelerate.
void Accelerate_Motor()
{
count=count+10; //Prędkość będzie wzrastać w sposób ciągły, gdy będziemy kontynuować wciskanie H
if (count>120) //Prędkość nie może być większa niż 120
{
count=120;
}
Serial.println("Accelerating"); //wyświetlanie na porcie szeregowym
Serial.println("");//wyświetl pustą linię na porcie szeregowym
myStepper.step(stepsPerRevolution);//obrót w kierunku przeciwnym do ruchu wskazówek zegara
myStepper.setSpeed(count); //Uaktualnianie prędkości silnika
lcd.setCursor(3,0);//ustawienie kursora LCD
lcd.print("Przyspieszenie"); //wyświetlanie na LCD
}
W funkcji Decelerate (zwolnij) należy wysłać polecenie L przez port szeregowy, aby zmniejszyć prędkość silnika krokowego.
W tej funkcji stale zmniejszamy wartość count, tzn. prędkość silnika krokowego będzie maleć w sposób ciągły, tyle razy, ile wyślemy komendę L.
Kod źródłowy funkcji Decelerate jest podany poniżej.
void Deaccelerate()
{
count=count-10; //zmniejszanie prędkości silnika
if (count<20) //prędkość silnika nie może być mniejsza niż 20
{
count=20;
}
Serial.println("Decelerating"); //wyświetlanie na porcie szeregowym
Serial.println("");//wyświetl pustą linię na porcie szeregowym
myStepper.step(stepsPerRevolution);
myStepper.setSpeed(count); //Uaktualnianie prędkości silnika
lcd.setCursor(3,0); //ustawienie kursora na LCD
lcd.print("Decelerating"); //wypisuje polecenie na LCD
}
W głównym źródle wewnątrz pętli wywołuję obie funkcje, Accelerate i Decelerate.
Wykonane komendy będą również wyświetlane na wyświetlaczu ciekłokrystalicznym (LCD).
Główny kod źródłowy jest podany poniżej.
#include <LiquidCrystal.h>//Biblioteka dla LCD
#include <Stepper.h> //Biblioteka dla silnika krokowego
const int stepsPerRevolution = 255;
// Inicjalizacja biblioteki silnika krokowego na pinach
Stepper myStepper(stepsPerRevolution, 4, 5, 6, 7);
char data;
int count = 120;
//Przypisanie pinów LCD
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
void setup() {
// ustawić prędkość obrotową na 60 obr
myStepper.setSpeed(60);
// inicjalizacja portu szeregowego:
Serial.begin(9600);// szybkość, z jaką komunikuje się Arduino
lcd.begin(20, 4);//Typ LCD
lcd.setCursor(3,0);//ustawienie kursora LCD i wyświetlanie na nim
lcd.print("Stepper Motor");
lcd.setCursor(6,1);
lcd.print("Speed");
lcd.setCursor(5,2);
lcd.print("Control");
lcd.setCursor(2,3);
lcd.print("via Arduino UNO");
delay(3000);
lcd.clear ();//Wyczyszczenie ekranu LCD
lcd.setCursor(0,2);
lcd.print("www.TheEngineering");
lcd.setCursor(4,3);
lcd.print("Projects.com");
}
void loop() {
if(Serial.available())
{
data = Serial.read(); //Odczyt danych z portu szeregowego
}
if(data == 'C'){Clockwise();} //Obrót zgodny z ruchem wskazówek zegara
if(data == 'A'){AntiClockwise();} //Obrót przeciwny do ruchu wskazówek zegara
if(data == 'S') //zatrzymanie silnika krokowego
{
data = 0;
lcd.setCursor(3,0);
lcd.print("No rotation");
Serial.println("No rotation”);//wyświetlanie na porcie szeregowym
}
if(data == 'H'){Accelerate_Motor();}
if(data == 'L'){Decelerate();}
}
Kompletna konfiguracja sprzętu
W tej części poradnika pokażę kompletną konfigurację sprzętową, której użyłem do tego projektu.
Sprzęt składa się z zasilacza 12 V, Arduino UNO oraz sterownika silnika L298.
Po wgraniu kodu na płytkę Arduino, układ będzie wyglądał jak na poniższym zdjęciu.
Po naciśnięciu przycisku H aby zwiększyć prędkość silnika krokowego, na wyświetlaczu pojawi się komunikat Accelerating (przyspieszanie).
Wykonana komenda jest wyświetlana na LCD i przedstawiona na poniższym zdjęciu.
Po naciśnięciu przycisku L aby zmniejszyć prędkość silnika krokowego, na wyświetlaczu pojawi się komunikat Decelerating (zwalnianie).
Wykonana komenda jest wyświetlana na LCD i przedstawiona na poniższym zdjęciu.
To już wszystko jeśli chodzi o poradnik sterowania prędkością obrotu silnika krokowego za pomocą Arduino. Mam nadzieję, że poradnik się podobał. W wypadku napotkania jakichkolwiek problemów, można mnie w każdej chwili bez wahania pytać. Postaram się jak najlepiej rozwiązać nadsyłane kwestie, w lepszy sposób, jeśli to możliwe. Będę odkrywał Arduino poprzez tworzenie kolejnych projektów i podzielę się nimi z Wami w moich późniejszych poradnikach.