Sterowanie silnikiem za pomocą L293D i Arduino

Jak podłączyć i sterować silnikiem DC za pomocą układu L239D i Arduino

Wstęp

Sterownik silnika DC

Część z nas w swoich projektach planuje użycie małych silników DC. Można się z nimi spotkać w zabawkach, małych modelarskich wiertarkach, czy na giełdach elektronicznych gdzie leżą ich niekiedy całe kartony. Oczywiście najprościej jest podłączyć taki silniczek do baterii bądź zasilacza, dorzucić śmigiełko i cieszyć chłodnym powiewem świeżego powietrza. Do tego celu użyjemy układu L293D.
Co jeśli byśmy chcieli, aby taki nasz wiatraczek kręcił się z różnymi prędkościami obrotowymi, albo myślimy nad zrobieniem urządzenia dmuchającego bądź wysysającego dym bądź inne opary.

Rozwiązania

Jak zawsze możemy sięgnąć po gotowe rozwiązania, zapłacić ekipie za montaż i cieszyć się z nowego nabytku. Może by jednak spróbować samemu zrobić taki sterownik. Z pomocą przyjdzie nam oczywiście niezawodne Arduino i parę elementów. Dla małych silniczków, tzn. dla silniczków o małym poborze prądu możemy wykorzystać tranzystor 2N2222 bądź, a dla większego prądu układ L293D. Do tego dorzucimy sobie potencjometr, jakiś przycisk, opornik i diodę 1N4001.

L293D

Zacznijmy od większego kalibru, czyli od układu L293D. Na nim zrobimy prosty sterownik, w którym prędkość będzie regulowana za pomocą potencjometru, a po naciśnięciu przycisku, nasz silnik zmieni kierunek obrotu. Aby nie wyważać otwartych drzwi, skorzystamy z gotowego kodu i pomysłu stworzonego przez Adafruita. Oczywiście zachęcamy do zagłębiania się w schematy, noty katalogowe i do przeglądania stron internetowych, ponieważ nie zawsze możemy znaleźć gotowe rozwiązanie, bądź znalezione rozwiązanie nie spełnia naszych oczekiwań. W tym przypadku mamy gotowy projekt, który w późniejszym czasie każdy z powodzeniem jest w stanie dopasować do własnych potrzeb.

Schemat

Schemat sterownika silnika DC

Tak jak wspomniałem wcześniej nie potrzeba wielu elementów. Układ L293D będzie naszym sterownikiem odpowiedzialnym za prędkość obrotową oraz kierunek obrotów. Potencjometrem będziemy regulować nasze obroty, a przycisk będzie służył do zmiany kierunku. Osoby które miały już doświadczenie z silnikami mogą zwrócić uwagę na brak diody. Oczywiście w powyższym przypadku na jednej diodzie by się to nie skończyło, ponieważ silnik ma się obracać w obydwu kierunkach. Z pomocą nam przyjdzie nota katalogowa od L293 i poniższy schemat:

Układ L293

Po lewej stronie widać silnik, który kręci się w dwie strony, natomiast po prawej silniki kręcące się w jednym kierunku. Widzicie różnicę w ilości diód? To dlatego, że taka dioda ma za zadanie przepuszczać zasilanie tylko w jednym kierunku i zapobiega powstania impulsu zwrotnego po zatrzymaniu silnika. Dla naszego silnika zrobiony został mostek prostowniczy, dlatego , że nasz silnik będzie się kręcił w obydwu kierunkach.

Pamiętajmy, że układ L293D posiada wbudowane diody chroniące tranzystory mostka H. Tu warto zajrzeć do noty katalogowej dla układu L293D, a nie L293.

Układ L293D

Wracając do naszego przykładu, podłączamy wszystko tak jak na schemacie, a następnie przechodzimy do wgrywania kodu.

Kod

Kod nie jest długi, ani zbyt skomplikowany. Piny zostają zdefiniowane na początku, a ich tryby w funkcji “setup”. W instrukcji “loop” wartość prędkości obrotowej silnika jest odczytywana z wejścia analogowego, a następnie dzielona przez 4. Dzieje się tak dlatego, że odczyt będzie się zawierać pomiędzy 0 a 1023, a na wyjściu analogowym potrzebujemy zakresu od 0 do 255.

Układ L293 na płytce stykowej
/*
Adafruit Arduino - Lesson 15. Bi-directional Motor
*/

int enablePin = 11;
int in1Pin = 10;
int in2Pin = 9;
int switchPin = 7;
int potPin = 0;

void setup()
{
  pinMode(in1Pin, OUTPUT);
  pinMode(in2Pin, OUTPUT);
  pinMode(enablePin, OUTPUT);
  pinMode(switchPin, INPUT_PULLUP);
}

void loop()
{
  int speed = analogRead(potPin) / 4;
  boolean reverse = digitalRead(switchPin);
  setMotor(speed, reverse);
}

void setMotor(int speed, boolean reverse)
{
  analogWrite(enablePin, speed);
  digitalWrite(in1Pin, ! reverse);
  digitalWrite(in2Pin, reverse);
}

W przypadku naciśnięcia przycisku, silnik będzie się kręcił zgodnie ze wskazówkami zegara, inaczej będzie się kręcił przeciwnie. Wartość zmiennej “reverse” jest przypisana do wartości odczytanej z pinu przycisku. W związku z tym, jeśli przycisk jest wciśnięty, to wartość będzie “False”, w innym przypadku “True”.
Odczytane wartości są przekazywane następnie do funkcji “setMotor”, która ustawi odpowiednie piny w układzie L293D kontrolującym silnik.

void setMotor(int speed, boolean reverse)
{
  analogWrite(enablePin, speed);
  digitalWrite(in1Pin, ! reverse);
  digitalWrite(in2Pin, reverse);
}

Prędkość obrotową ustawiamy używając “analogWrite” na pinie “enable” (pin nr.1 L293D). Pin ten ma za zadanie włączać i wyłączać silnik w zależności od stanów wejść in1 oraz in2. W celu kontroli kierunku obrotów, piny in1 oraz in2 muszą mieć przeciwne wartości. Jeśli in1 ma stan wysoki (H) a in2 niski (L), to silnik będzie się kręcić w jednym kierunku. W przypadku przeciwnych wartości na in1 oraz in2 silnik będzie się kręcić w przeciwnym kierunku.
Komenda “!” oznacza “nie” lub w ang. “not”. Funkcja “DigitalWrite” dla in1 jest zawsze przeciwna do wartości “reverse”, czyli jeśli “reverse” jest ustawione jako H to funkcja ustawia L i odwrotnie. Druga funkcja “DigitalWrite” dla in2 ustawia pin dla takiej wartości jaką ma “reverse”. Oznacza to, że wartość ta będzie zawsze przeciwna do wartości in1.

Podsumowanie

Układ L293D-piny

Układ L293D posiada dwa piny +V (8 i 16). Pin nr.8 (+Vmotor) odpowiada za doprowadzenie zasilania do silników, natomiast pin 16 (+V) do logiki układu. Oba te piny podłączyliśmy do pinu +5V w Arduino. Jeśli jednak macie zamiar użyć mocniejszego silnika, bądź na większe zasilanie, zalecane jest, aby pin 8 podłączony był do zewnętrznego zasilacza, a masy zasilacza oraz Arduino były połączone ze sobą.

Uruchomiony projekt

Odnośniki