środa, 19 września 2018

Moduł sterownika silników DC MX1508

Opisywany moduł można znaleźć na AliExpress raczej pod tytułem "moduł sterownika silników DC L298N". Dopiero po zakupie okazało się, że w module nie jest użyty L298N, a właśnie MX1508. W sieci można znaleźć podstawowe informacje o układzie, ale ze znalezieniem dokumentacji producenta układu jest już problem. Wygląda na to, że jest to układ jakiejś azjatyckiej produkcji (1).


Moduł MX1508
Specyfikacja
  • napięcie:
    • zasilania 2 - 10V
    • sygnału wejściowego (sterującego) 1.8-7V
  • prąd wyjściowy:
    • ciągły 1,5A
    • chwilowy 2,5A
    • w trybie czuwania mniej niż 0,1uA
  • tryby pracy:
    • ruch do przodu
    • ruch do tyłu
    • stop
    • czuwanie
  • zabezpieczenie termiczne
  • wymiary: 24,7x21x5mm

Moduł ma dwa piny mniej niż w przypadku L298N wymagane do sterowania (czyli cztery). Z drugiej strony jednak wymaga użycia 4 pinów PWM (a L298N dwóch), a tych nie ma za wiele w Arduino. Z kolei porównując ten układ z TB6612FNG, zdecydowanie mniej słychać buczenie silników (przy niskim poziomie wypełnienia PWM). Niepokoić może jedno zdanie ze źródła (2) "There is some discussion on some forums where people describe a few problems with reverse EMF voltage spikes coming back through the system and confusing their micro-controllers".

Piny modułu

Pin(y) Opis
+ Plus zasilania 2 - 10V
- (GND) Minus zasilania (masa)
IN1, IN2 Sterowanie kierunkiem silnika kanału A (sygnał PWM)
IN3, IN4 Sterowanie kierunkiem silnika kanału B (sygnał PWM)
MOTOR-A Wyjścia kanału A silnika
MOTOR-B Wyjścia kanału B silnika


Sterowanie modułem (H - stan wysoki, L - stan niski, PWM - sygnał PWM)

IN1/IN3 IN2/IN4 Działanie silnika
H/PWM L Maksymalna prędkość określona przez sygnał PWM na wejściu IN1/IN3 zgodnie ze wskazówkami zegara na wyjściu MOTOR-A/MOTOR-B (ruch do przodu)
L H/PWM Maksymalna prędkość określona przez sygnał PWM na wejściu IN2/IN4 przeciwnie do ruchu wskazówek zegara (ruch do tyłu)
H H Hamowanie
L L Tryb czuwania


Uruchomienie
Tym razem nie znalazłem żadnej biblioteki na githubie, więc napisałem własny kod w katalogu projektu. Docelowo wyniosę go do odrębnej biblioteki. Poniżej zamieszczam przykładowy kod uruchomieniowy, natomiast całość (wraz z kodem obsługi mostka) zamieściłem w repie na bitbukecie. Mostkiem steruje Arduino Uno, natomiast na wyjściu dodane są dwa silniki o dopuszczalnym napięciu zasilania 9V. Na potrzeby układu i własnej wygody, zasilanie modułu czerpię z Arduino (5V). Normalnie jednak powinno to być inne źródło zasilania.

Schemat połączeń
Kod jest raczej prosty. Na początku jest zdefiniowanych kilka stałych, które określają użyte piny Arduino i regulują pewne przedziały czasów pracy silników (poruszania się i zatrzymania). Stała TURN_WITH_BOTH_MOTORS określa czy skręt ma być wykonywany przez jeden silnik (drugi nie pracuje) (wartość 0) lub też czy oba silniki pracują tyle że w przeciwnych kierunkach (wartość 1).  W pierwszym przypadku jest po prostu łagodniejszy skręt.

#include "MX1508.h"

#define IN1 9
#define IN2 10
#define IN3 5
#define IN4 6

#define TURN_WITH_BOTH_MOTORS   0
#define MOVE_TIME               2000
#define STOP_TIME               4000
#define MOVE_SPEED              150

MX1508 leftMotor = MX1508(IN1, IN2);
MX1508 rightMotor = MX1508(IN3, IN4);

void setup()
{
    Serial.begin(9600);
    motorsStandby();
}

void loop()
{
    motorsForward(MOVE_SPEED);
    delay(MOVE_TIME);
    motorsBackward(MOVE_SPEED);
    delay(MOVE_TIME);
    motorsStop();
    delay(STOP_TIME);
    motorsTurnLeft(MOVE_SPEED);
    delay(MOVE_TIME);
    motorsTurnRight(MOVE_SPEED);
    delay(MOVE_TIME);
    motorsStop();
    delay(STOP_TIME);
}

void motorsForward(int speed)
{
    Serial.print(F("motorsForward: "));
    Serial.println(speed);
    forward(leftMotor, rightMotor, speed);
}

void motorsBackward(int speed)
{
    Serial.print(F("motorsBackward: "));
    Serial.println(speed);
    backward(leftMotor, rightMotor, speed);
}

void motorsTurnLeft(int speed)
{
    Serial.print(F("motorsTurnLeft: "));
    Serial.println(speed);
    left(leftMotor, rightMotor, speed, TURN_WITH_BOTH_MOTORS);
}

void motorsTurnRight(int speed)
{
    Serial.print(F("motorsTurnRight: "));
    Serial.println(speed);
    right(leftMotor, rightMotor, speed, TURN_WITH_BOTH_MOTORS);
}

void motorsStop()
{
    Serial.println(F("boatStop"));
    brake(leftMotor, rightMotor);
}

void motorsStandby()
{
    standby(leftMotor, rightMotor);
}


Uruchomiony moduł


Logi z terminala
Moduł wykorzystałem w praktyce przy konstruowaniu zdalnie sterowanej łódki.


Źródła:
1) Prawdopodobna specyfikacja MX1508 ;)
2) TUTORIAL FOR ARDUINO MINI DC MOTOR DRIVER DUAL H-BRIDGE PWM CONTROL (L293D)

Brak komentarzy:

Prześlij komentarz