Wstęp
![](1.jpg)
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
![](Silnik_l293d.jpg)
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:
![](l293d.jpg)
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.
![](L293D_diody.png)
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.
![](2.jpg)
/*
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
![](L293d_chip.jpg)
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ą.
![](3.jpg)