L289N Motor Driver z Arduino
Moduł sterownika silników na układzie L298N – patrz fotki poniżej. Jest to popularny i chyba jeden z najtańszych, gotowych takich układów jakie można dosyć łatwo kupić (również na Allegro). Sterownik ten, może wysterować niezależnie dwa silniki prądu stałego (kierunek, i prędkość – PWM) lub jeden silnik krokowy. W poniższym przykładzie użyłem 2 silników z mechanizmu przewijania filmu, ze starych (analogowych) aparatów fotograficznych – spokojnie działają przy zasilaniu 5V i mają zintegrowaną przekładnię. Shield na płytce Arduino, w moim układzie, to ten sam Shield LCD, który wykorzystuję w poprzednich projektach (zdjęty wyświetlacz), a z którego tutaj wykorzystuję tylko mikroswitch`e – do sterowania kierunkiem obrotu silników. Switche (SW1-SW4) podpięte są do portów I/O – 0,1,2,3. Przy tych miniaturowych silnikach całość działa na zasilaniu dostarczonym z komputera po USB.
Podstawowe parametry sterownika :
- układ – L298N Dual H Bridge DC Motor Driver
- zakres napęcia sterującego silniki +5 V ~ +35 V
- max. prąd sterujący silnik – 2 A
- zasilanie części logicznej Vss: +5 V ~ +7 V
- max. pobór mocy : 20 W (przy temp. T = 75 ℃)
- wymiary : 55mm * 60mm * 30mm
Podłączenie sterownika do Arduino, oraz sposób podpięcia silników :
//******** przypisanie portow ************************
int ENA = 5; // Enable A - port 5 (PWM)
int ENB = 6; // Enable B - port 6 (PWM)
int IN1 = 10; // port 10 - kierunek - motor A - LED1
int IN2 = 11; // port 11 - kierunek - motor A - LED2
int IN3 = 12; // port 12 - kierunek - motor B - LED3
int IN4 = 13; // port 13 - kierunek - motor B - LED4
int SW1 = 0; // switch 0 - port 0
int SW2 = 1; // switch 1 - port 1
int SW3 = 2; // switch 2 - port 2
int SW4 = 3; // switch 3 - port 3
//******** zmienne przechowujace stan przyciskow ****
int SWITCH1;
int SWITCH2;
int SWITCH3;
int SWITCH4;
//******** definicja funkcji portow *****************
void setup()
{
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(SW1, INPUT);
pinMode(SW2, INPUT);
pinMode(SW3, INPUT);
pinMode(SW4, INPUT);
//******* ustalenie stanu portow z przyciskami ******
//******* HIGH rezystory podciagajace wlaczone ******
digitalWrite(SW1, HIGH);
digitalWrite(SW2, HIGH);
digitalWrite(SW3, HIGH);
digitalWrite(SW4, HIGH);
}
//******* glowna petla programu ********************
void loop()
{
//*** odczyt stanow portow z przyciskami *********
SWITCH1 = digitalRead(SW1);
SWITCH2 = digitalRead(SW2);
SWITCH3 = digitalRead(SW3);
SWITCH4 = digitalRead(SW4);
//*** podjecie decyzji w zaleznosci od stanu portu
if (SWITCH1 == LOW)
{
Motor_A_Lewo();
}
else if (SWITCH2 == LOW)
{
Motor_A_Prawo();
}
else if (SWITCH3 == LOW)
{
Motor_B_Lewo();
}
else if (SWITCH4 == LOW)
{
Motor_B_Prawo();
}
else
{
Zatrzymaj();
}
}
//**************************************************
void Motor_A_Lewo()
{
digitalWrite(ENA, HIGH);
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
}
//**************************************************
void Motor_A_Prawo()
{
digitalWrite(ENA, HIGH);
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
}
//*************************************************
void Motor_B_Lewo()
{
digitalWrite(ENB, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
//**************************************************
void Motor_B_Prawo()
{
digitalWrite(ENB, HIGH);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}
//***************************************************
void Zatrzymaj()
{
digitalWrite(ENA, LOW);
digitalWrite(ENB, LOW);
}