Adafruit Motor Shield v2 i silnik krokowy

Niedawno napisała do nas Roksana z pytaniami dotyczącymi sterowania silnikami krokowymi przez moduł Adafruit Motor Shield v2. W e-mailu wymieniłem tyle informacji, że warto podzielić się nimi z Tobą.

image

Do modułu można podłączyć 2 silniki krokowe. Pierwszy do złącz M1, M2, drugi do wyprowadzeń M3, M4.

image

Zdjęcie pochodzi ze strony Adafruit.com

Jeśli chodzi o część elektryczną to tyle.

Biblioteki sterujące silnikiem można pobrać ze strony Adafruit

Przykładowy program do sterowania silnikiem krokowym wygląda tak:

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_PWMServoDriver.h"

Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 

Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);

void setup() {
  AFMS.begin();  
  myMotor->setSpeed(10);
}

void loop() {
  myMotor->step(100, FORWARD, SINGLE); 
  myMotor->step(100, BACKWARD, SINGLE); 

  myMotor->step(100, FORWARD, DOUBLE); 
  myMotor->step(100, BACKWARD, DOUBLE);
  
  myMotor->step(100, FORWARD, INTERLEAVE); 
  myMotor->step(100, BACKWARD, INTERLEAVE); 
  
  myMotor->step(50, FORWARD, MICROSTEP); 
  myMotor->step(50, BACKWARD, MICROSTEP);
}

Najpierw w programie wybierane są biblioteki używane do sterowania silnikiem:

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_PWMServoDriver.h"

Wire.h – to biblioteka magistrali TWI/i2c, bo sterownik silnika tak się komunikuje z Arduino.
Adafruit_MotorShield.h – biblioteka obsługi shieldu
utility/Adafruit_PWMServoDriver.h – pomocnicza biblioteka obsługująca sterownik silnika

Potem tworzone są obiekty reprezentujące shield i podłączony do niego silnik.

Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 

Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);

Obiekt AFMS reprezentuje shield, wskaźnik obiektu *myMotor reprezentuje podłączony do niego silnik.
Argumenty metody zwracającej obiekt silnika są następujące:

AFMS.getStepper(200, 2);

Pierwszy to inlość kroków silnika na jeden obrót. W tym przypadku jest to 200 kroków na obrót.
Silniki mają różne oznaczenia. Czasem jest to ilość kroków na obrót, a czasem kąt obrotu na jeden krok.
Jeśli nasz silnik ma podany ten drugi parametr to obliczamy go następująco. Wiadomo, że cały obrót to 360 stopni. Jeśli jeden krok to 1,3 stopnia, to na cały obrót przypadnie 360 / 1,3 = około 277 kroków.

Drugim argumentem jest numer silnika. Jeśli byłaby tam wartość 1, to znaczy, że chcemy obiekt silnika podłączony do zacisków M1, M2. Wartość 2 odpowiada silnikowi podłączonemu do zacisków M3, M4.

W funkcji setup wykorzystywane są następujące elementy:
AFMS.begin() aktywuje shield. Domyślnie nie ma argumentu, ale można mu podać, jeśli się chce. Argument to częstotliwość impulsów PWM sterujących silnikiem. Domyślnie jest to 1600 Hz. Ale możesz wybrać liczby z zakresu od 23 do 2034 Hz.

myMotor->setSpeed(10) to ustawienie prędkości z jaką ma się poruszać silnik. W tym wypadku jest to 10 obrotów na minutę.

W funkcji loop znajdują się metody uruchamiające silnik.
myMotor->step(100, FORWARD, SINGLE) przekręca oś silnika o 100 kroków, zgodnie z obrotem wskazówek zegara, przy użyciu jednej cewki.

Pierwszy argument to liczba kroków obrotu. Jeśli silnik ma 200 kroków, to 100 oznacza połowę obrotu osi.

Drugi argument to kierunek obrotu.
FORWARD to zgodnie z obrotem wskazówek zegara
BACKWARD to ruch odwrotny, przeciwny ruchom wskazówek zegara

Ostatni argument to tryb pracy silnika
SINGLE to sterowanie za pomocą jednej cewki. W ten sposób można uzyskać największą szybkość obrotu. Ale za to silnik pracuje z mniejszą siłą.

DOUBLE to normalna praca silnika. Do obrotu wykorzystywane są 2 cewki, silnik porusza się ze standardową prędkością i używa maksymalnej siły momentu obrotowego.

INTERLEAVE to praca z przeplotem. Silnik wykorzystuje sztuczkę w której tworzy się dodatkowy krok między cewkami (gdy zasili się je na raz). W ten sposób mamy 2x więcej kroków. Kosztem tej sztuczki jest to, że ten krok pomiędzy ma siłę 70% mocy silnika.

MICROSTEP to praca silnika w której cewki są sterowane przez impulsy PWM. Mogą dzięki temu tworzyć dużą ilość kombinacji zasilania cewek. W ten sposób tworzy się dużo kroków pośrednich, zwiększając płynność obrotu silnika.
Biblioteka domyślnie ma wbudowane 16 mikrokroków.
Wadą tego rozwiązania jest to, że niektóre mikrokroki zapewniają dużo mniejszy moment obrotowy (nawet 10% mocy silnika), co może spowodować mniej dokładny ruch ciaśniejszych maszyn napędzanych silnikiem.

To tyle jeśli chodzi o bibliotekę. Teraz sztuczki.
Grzebiąc w plikach biblioteki można ustalić ilość mikrokroków. Do wyboru jest 8 lub 16. Wszystko zależy od twoich preferencji, czy bardziej płynny ruch i zmniejszenie siły niektórych kroków do 10%, czy mniej dokładny ruch, ale minimalna siła zmniejszona do 20%.

Opcja zmiany znajduje się w pliku biblioteki Adafruit_motorShield.h w linii 26. Ustawia się przez zmianę liczby przy definicji MICROSTEPS na 8 lub 16.

Ponieważ Arduino komunikuje się ze sterownikiem przy pomocy dość powolnej magistrali TWI/I2C, przy dużej ilości mikrokroków cięzko uzyskać dużą szybkość silnika. Arduino domyślnie ustawia prędkość magistrali TWI na 100 kHz. Można ją bez problemu przyspieszyć 4-krotnie.
W tym celu trzeba otworzyć plik biblioteki Wire.h, znajdujący się w
hardware/libraries/Wire/utility/twi.h
i zmieniasz w nim linię odpowiedzialną za prędkość z
#define TWI_FREQ 100000L

na
#define TWI_FREQ 400000L

Od tej chwili możesz cieszyć się zwiększoną prędkością przesyłania danych o obrotach do sterownika.

Moduł Adafruit Motor Shield v2 jak i silniki krokowe znajdziesz w Nettigo:

sprae