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!
1 Comments
Zostaw komentarz
Michał
Bardzo dobry artykuł, niestety nie wyświetla się obraz pokazujący połączenie z silnikiem DC.