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

Projekty klientów: AdaLight 50 kanałów

Od jakiegoś czasu w ofercie mamy taśmę diod RGB, każda sterowana oddzielnie. Do czego może ona służyć? Np do budowy AdaLight. Jak pisze jeden z naszych klientów:

Projekt adalight wymaga:

  • zasilacza 5v/2a,
  • kabel usb A/B,
  • arduino (w bodajże jakiejkolwiek wersji),
  • ledy adalight 25 szt. lub więcej – paski się raczej nie nadają ze względu na potrzebę montowania ledów w różnych odległościach na krawędziach czy rogach lcd w zależności od rozmiaru ekranu czy ilości użytych ledów,
  • jakieś luźne kabelki żeby wszystko pospinać,

Dla sprawnego elektronika uruchomienie projektu zajmie nie więcej niż 30-45 min, ja się kompletnie na tym nie znam i dałem radę w 2h.
Montaż ledów za tv to już kilka godzin roboty, najlepiej zrobić pod ledy stelaż z listewek i przymocować go na tylnej części obudowy tak żeby zachować równą odległość ledów między sobą i od ściany.

Widziałem również lcd philips z systemem spectra 2 i 3 w akcji i proszę mi wierzyć – adalight jest dużo dokładniejszy, szybszy i ogólnie lepszy od systemu philipsa (i nieporównywalnie tańszy). Jedyny minus adalight to taki, że działa tylko z komputerem przez usb.
Czas spędzony przy “produkcji” zaliczam do plusów 🙂 .

AdaLight potrzebuje:

software pod windowsa i linuxa –
http://code.google.com/p/lightpack/downloads/list    –  jest on z rosyjskiego projektu lightpack (maksymalnie 10 stref i 30 ledów), ale obsługuje również adalight (od 25 do 50 stref i tyle samo ledów). Testowałem wcześniej również projekt lightpack (wersja z 30 ledami) jednak efekty były jak dla mnie niezadowalające i zdecydowałem się na adalight (i nie żałuję;).

A jak AdaLight wygląda w akcji? Oto właśnie AdaLight 50 kanałów wykonana przez naszego klienta:

PS.
Tym postem chcę zacząć serię Projekty klientów. Jeżeli zrobiłeś coś związane z Arduino i chcesz się tym pochwalić – napisz do mnie.

Nowy produkt – Minty Boost Kit od Adafruit

Od dziś, możesz do swojego iPhone mieć zapasowe baterie. I to w formacie AA! Dzięki legendarnemu Minty Boost Kit od Adafruit możesz ładować dowolne urządzenie przez USB, zasilając je z baterii (akumulatorków) w formacie paluszków.

Jaki tego sens? Jeżeli jesteś daleko od najbliższego gniazdka a Twój smartfon nie ma dodatkowej baterii – Minty Boost Kit i kilka naładowanych akumulatorków AA pozwoli długo korzystać z urządzenia.

Uwaga – w sprzedawanym przez nas komplecie nie ma metalowego pudełka po miętówkach, sam musisz znaleźć pasujące.