Shield L293D dla Arduino UNO obsługa i podłączenie silników

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.

Budowa Motor Shield dla Arduino UNO

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.
elementy Motor Shielda L293D

Wyjścia nakładki:

Schemat podłączenia silników

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.

Jak podłączyć silnik DC do motor shielda?

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:

podłączenie silnika krokowego do motor shield Arduino UNO

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

podłączenie NEMA17 do Motor Shield Arduino UNO
#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.

jak sterować serwem z Motor Shielda?

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.

FACEBOOK – <— klik!

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

  1. Michał
    Odpowiedz

    Bardzo dobry artykuł, niestety nie wyświetla się obraz pokazujący połączenie z silnikiem DC.

Odpowiedz

Twój adres e-mail nie zostanie opublikowany