Masz w planach zrobić własny pojazd albo składasz nowego robota? Najwygodniej będzie wykorzystać do tego Motor Shield L293D dedykowany do Arduino UNO i kompatybilny z MEGA2560. Jest to jeden z najprostszych i zarazem najtańszych sposobów do sterowania silnikami w projektach robotów i CNC. Shield pozwala sterować:
- 4 x silnik DC dwu kierunkowy z kontrolą prędkości 8-bit (0-255) lub
- 2 x silnik krokowy (unipolarnymi i bipolarnymi) z jedną i dwoma cewkami lub
- 2 x serwo
Budowa Motor Shieldu
L293D to dwukanałowy moduł mostka H pozwalający sterować jednym silnikiem krokowym lub dwoma silnikami DC. Shield posiada dwa L293D dzięki czemu pozwala na sterowanie 4 silnikami DC, a to idealny zestaw do napędzania 4 kołowej platformy pojazdu lub robota.
Mamy wbudowane 4-mostki H, a każdy z nich może dostarczyć prąd 0.6A do silnika. Dodatkowo na środku znajduje się rejestr przesuwny 74HC595 pozwalający rozszerzyć 4 wyjścia Arduino i sterować 8 wyjściami Motor Shielda odpowiadającymi za kierunek obrotu silników.

Zasilanie Motor Shield:
Zasilanie można rozwiązać na 3 sposoby:
- Zasilanie Arduino przez port DC lub zasilanie przez złącze zewnętrznego zasilania EXT_PWR w Motor Shield. Zworka PWRJ powinna być założona. Pamiętaj, że w tym przypadku ograniczenie napięcia to 12V!
- Zasilanie Arduino z USB, a Motor Shielda osobno z gniazda zewnetrznego zasilania EXT_PWR (REKOMENDOWANE) Pamiętaj by wyjąć zworkę PWRJ łączącą linie zasilania Arduino i Shielda.
- Zasilanie Arduino przez port DC i zasilanie Shielda z gniazda EXT_PWR. Zworka musi zostać wyjęta.
PAMIĘTAJ BY NIE ZASILAĆ MOTOR SHIELDA NAPIĘCIEM POWYŻEJ 12V KIEDY ZWROKA ŁĄCZĄCA LINIE ZASILANIA ARDUINO I MOTOR SHIELD JEST ZAŁOŻONA!
Na płytce znajdziemy również:
- diodę – pokazującą czy moduł prawidłowo pracuje – jeśli świeci na zielono możesz być spokojny o poprawną pracę
- rezystory obniżające – dzięki temu silniki nie pracują gdy podpinamy zasilanie do płytki
- Przycisk RESET – to przycisk RESET od Arduino wyprowadzony na Shieldzie dla wygodniejszego dostępu.

Wyjścia nakładki:

Wyjścia do podłączenia silników znajdują się na krańcach płytki i są zakończone terminalami ze śrubkami dla wygodniejszego mocowania przewodów. Możesz podpiąć 4 silniki DC w wyprowadzenia M1, M2, M3, M4. Lub 2 silniki krokowe podpinając jeden w M1 – M2 , i drugi w M4 – M4.
Każdy silnik może pracować z napięciem od 4.5V do 25V i pobierać do 0.6A na kanał.
Dla 2 serw zastosowano wyprowadzenia dające na każdym z nich sygnał PWM 16-bitowy.
Nakładka nie wykorzystuje cyfrowych pinów 2 i 13 oraz analgowych od A0 do A5. Możesz spokojnie wykorzystać je do podłączenia innych peryferii.
Jak zaprogramować to w Arduino IDE?
Zalecamy wykorzystać do tego celu bibliotekę od Adafruit. Należy przejść do Narzędzia -> Zarządzaj Bibliotekami
Kolejno wpisać w wyszukiwarce Motor Shield i zainstalować biblioteke od adafruit dla Shielda w wersji V1. Środkowe pole na poniższym screenie:

Teraz zaprezentuję przykładowy kod dla różnych typów silników oraz wyjaśnię linijka po linijce co tam się dzieje.
Jak podłączyć silnik DC do Motor Shielda i nim sterować?
Przykładowy kod sterowania silnikiem DC z Motor Shielda znajdziesz poniżej. Zakłada on podpięcie się pod wyjście M4. Wpinamy nasza nakładkę na górę Arduino. Arduino będzie zasilane z przewodu USB, Motor Shield z osobnego zasilania 9V ponieważ tyle potrzebuje nasz silniczek. Zworka pozostaje zdjęta.

Teraz napiszmy kod, który zademonstruje jak regulować prędkość oraz kierunek obrotu silnika.
#include <AFMotor.h> //dodajemy bibliotekę AFMotor AF_DCMotor motor(4); //tworzymy obiekt motor i przypisujemy mu wyjście M4 void setup() { //ustawiamy prędkość początkową i stan silnika jako spoczynek motor.setSpeed(200); motor.run(RELEASE); //release oznacza zatrzymanie kręcenia } void loop() { uint8_t i; // Włączamy silnik motor.run(FORWARD); //obracanie do przodu // Przyspieszamy od 0 do prędkości maksymalnej wykorzystując pętle FOR for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } // zmniejszamy prędkość silnika od MAX do 0 for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } // Zmieniamy kierunek obrotu motor.run(BACKWARD); //obroty w tył // przyspieszamy for (i=0; i<255; i++) { motor.setSpeed(i); delay(10); } // zwalniamy for (i=255; i!=0; i--) { motor.setSpeed(i); delay(10); } // wyłączamy silnik motor.run(RELEASE); delay(1000); }
Większość kodu została wytłumaczona komentarzami wewnątrz. Jednak dla uściślenia w drugiej linijce tworzymy obiekt AF_DCMotor motor(motorPort#) w naszym przypadku motor port ustawiamy na 4 bo korzystamy z wyjścia M4. Jeśli podepniesz więcej silników dla każdego z osobna musisz zadeklarować obiekt odpowiadający później danemu silnikami, a każdy z nich musi mieć unikalną nazwę. Będzie to przykładowo:
- AF_DCMotor motor1 (1); dla silnik na porcie 1
- AF_DCMotor motor2 (2); dla silnika na porcie 2
- itp…
Funkcja setSpeed(prędkość); pozwala ustawić prędkość z zakresu od 0 do 255. Możesz podać tam dowolną liczbę przykładowo 120 aby silniczek obracał się z połową możliwej prędkości. Wartość 0 jest równoznaczna z całkowitym zatrzymaniem silnika.
Funkcja run(kierunek) może przyjmować następujące parametry:
FORWARD – kierunek obrotu zgodny z ruchem wskazówek zegara
BACKWARD – kierunek przeciwny do ruchu wskazówek zegara
RELEASE – zatrzymanie – równoznaczne z setSpeed(0);
Jak podłączyć silnik krokowy do Motor Shield?
Weźmiemy za przykład 2 najpopularniejsze wśród początkujących silniki. Pierwszy to silnik krokowy 28BYJ-48 znajdziesz go w naszym sklepie zarówno w wersji zasilanej 5V jak i 12V. Kolejnym będzie NEMA17 najczęściej wykorzystywany w druku 3D i urządzeniach CNC
Silnik unipolarny 28BYJ-48
Jeśli wykorzystujesz ten silnik musisz wiedzieć, że do pełnego obrotu potrzeba mu 48 kroków, podłącz go jak na schemacie poniżej:

Silnik bipolarny NEMA17
Podłączenie silnika NEMA17 wskazuje poniższy schemat. Silnik ten do pełnego obrotu potrzebuje 200 kroków. Nasz zasilamy napięciem 12V

#include <AFMotor.h> // Ilość kroków dla podpiętego silnika według jego specyfikacji const int stepsPerRevolution = 48; // podłączamy pod M3 i M4 zatem będzie to port #2 AF_Stepper motor(stepsPerRevolution, 2); void setup() { Serial.begin(9600); Serial.println("test silnika krokowego!"); motor.setSpeed(10); // ustawiamy prędkość na 10 obrotów na minutę } void loop() { Serial.println("Single coil"); motor.step(100, FORWARD, SINGLE); motor.step(100, BACKWARD, SINGLE); delay(1000); Serial.println("Double coil"); motor.step(100, FORWARD, DOUBLE); motor.step(100, BACKWARD, DOUBLE); delay(1000); Serial.println("Interleave coil"); motor.step(100, FORWARD, INTERLEAVE); motor.step(100, BACKWARD, INTERLEAVE); delay(1000); Serial.println("Micrsostep steps"); motor.step(100, FORWARD, MICROSTEP); motor.step(100, BACKWARD, MICROSTEP); }
Powyższy kod musisz dopasować pod siebie w zależności gdzie podepniesz silnik i czy będzie to jeden czy 2 silniki. W przypadku podpięcia w M1 i M2 wskazujesz port 1, dla M3 i M4 port 2 jak w naszym przykładzie. Deklarując obiekt motor dla silnika krokowego czeka on na 2 parametry: ilość kroków i port. Ilość kroków przypisujemy do stałej stepsPerRevolution i jest ona zależna od rodzaju podpiętego silnika.
Funkcja step oczekuja następujacych parametrów:
step(ilośćKroków, kierunek, typkroków) – ilośc kroków determinuje to o ile kroków ma się ruszyć silnik, kierunek określa kierunek, a typ kroków może być następujący:
- SINGLE – uruchamiana jest pojedyncza cewka za jednym zamachem
- DOUBLE – uruchamiane są 2 cewki w tym samym czasie dla lepszego ciągu.
- INTERLEAVE – cewka 1 i 2 są przełączane naprzemiennie by zrobić pół kroku – powoduje to zwiększenie czasu pełnego obrotu x2.
- MICROSTEP – dzięki temu silnik wykonuje mikro kroki co sprawia, że ruch jest dokładniejszy i płynniejszy lecz moment obrotowy silnika się zmniejsza przez co jest słabszy.
Sterowanie Serwem przy pomocy Motor Shielda
Sterowanie Serwami jest równie proste co silnikami.
Serwo wpinamy w 3 piny w rogu płytki, możemy podpiąć jednocześnie 2 serwa. Piny cyfrowe przypisane do sterowania serwami too D9 i D10.

W tym wypadku zasilamy tylko Arduino. Serwo potrzebuje napięcia 5V. Do sterowania wykorzystamy wbudowaną w IDE bibliotekę Servo.h
#include <Servo.h> //dołączamy bibliotekę Servo Servo myservo; // tworzymy obiekt o nazwie myservo int pos = 0; // tworzymy zmienną do przechowywania pozycji serwa void setup() { // przypisujemy port do którego wpięliśmy serwo w naszym przypadku jest to pin 10 myservo.attach(10); } void loop() { // ruszamy ramieniem od 0 do 180 stopni w pętli FOR for(pos = 0; pos <= 180; pos += 1) { myservo.write(pos); delay(15); } // ruszamy ramieniem od 180 do 0 stopni for(pos = 180; pos>=0; pos-=1) { myservo.write(pos); delay(15); } }
Jak widzicie kod jest tutaj banalny nie ma co tłumaczyć.
Jeśli ten przewodnik wydał Ci się pomocny nie zapomnij polubić nas na Facebooku, dzięki temu zobaczysz w przyszłości informację o innych ciekawych wpisach.
Wymienione w poradniku części możesz zakupić w naszym sklepie internatowym w przystępnych cenach i z błyskawiczną dostawą kolejnego dnia!
One Comment
Zostaw komentarz
Michał
Bardzo dobry artykuł, niestety nie wyświetla się obraz pokazujący połączenie z silnikiem DC.