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); }