Jak sterować silnikami DC i serwomechanizmami

Czas czytania: 5 min.

Arduino jest wykorzystywane do sterowania napędami praktycznie od zawsze. Przykład stanowią silniki DC, serwomechanizmy i silniki krokowe. Dzisiaj zajmiemy się dwoma spośród tych napędów – silnikami DC i serwomechanizmami, które z uwagi na prostotę i funkcjonalność zdążyły rozpowszechnić się wśród hobbystów elektroniki. 

Sprawdzimy:

  • czym jest silnik DC,
  • jak kontrolować silnik DC za pomocą Arduino Motor Shield,
  • jak kontrolować silnik DC za pomocą Arduino Motor Driver,
  • czym jest serwomechanizm,
  • jak kontrolować serwomechanizm za pomocą Arduino.
Zaczynajmy.
 

Czym jest silnik DC

Zgodnie z obietnicą – przyjrzyjmy się najpierw, czym on tak właściwie jest. Motor DC (od ang. Direct Current, prąd stały) zamienia jedną postać energii na inną – konwertuje energię elektryczną na energię mechaniczną. Podczas przepływu prądu biegunowość dwóch pól magnetycznych wewnątrz motoru – będziemy stosować motor zamienne z określeniem silnik – wprawi go w ruch obrotowy w jednym kierunku na tak długo, jak będzie płynąć prąd. Silniki DC nie mają biegunowości (chyba, że oznaczono je [+]i [-]), co oznacza, że można zmienić kierunek ruchu motora za pomocą przewodów. Silnik DC składa się z:

  • stojana/statora,
  • twornika,
  • rotora, 
  • komutatora/przełącznika.

Silniki DC stosuje się powszechnie. Można je znaleźć m.in. w odkurzaczach, suszarkach, windach i elektrycznych szybach. Z uwagi na wysoki początkowy moment obrotowy dobrze radzą sobie z absorbowaniem nagłych zmian ładunku i wstrząsami. W porównaniu do innych napędów są stosunkowo proste i wydajne.

Kontrola silnika DC z Arduino Motor Shield

Arduino Motor Shield to moduł sterujący dla napędów, który pozwala na używanie Arduino w celu sterowania szybkoscią i kierunkiem pracy silnika. Opiera się na chipie Dual Full-Bridge Drive L298, dzięki któremu możemy kontrolować aż dwa silniki DC albo silnik krokowy. 

Więcej o L298 można znaleźć na blogu Seeedstudio.

Do kontroli silnika DC z Arduino Motor Shield potrzebne będą:

Instrukcja krok po kroku

Krok 1: Ustaw SEN_A i SEN_B i połącz pozostałe dwa piny kablem rozruchowym.

Krok 2: Połącz kablem rozruchowym MB_EN – nie będziemy używać zewnętrznego źródła zasilania.

Krok 3:

  • Połącz silnik DC z Chanel 0 (OUT1 i OUT2) i podłącz Motor Shield do Arduino.
  • Podłącz Arduino do PC przewodem USB.
  • Twoje połączenie powinno wyglądać tak:
setup Arduino

Krok 4: Pobierz bibliotekę dla Motor Shield i zainstaluj ją.
Poradnik instalacji biblioteki znajdziesz tutaj.

Krok 5: Wprowadź poniższy kod do Seeeduino:

//  Demo function:The application method to drive the DC motor.
//  Author:Loovee (luweicong@seeed.cc)
//  2016-3-11

#include "MotorDriver.h"

MotorDriver motor;

void setup()
{
    // initialize
    motor.begin();
}

void loop()
{
    motor.speed(0, 100);            // set motor0 to speed 100
    delay(1000);
    motor.brake(0);                 // brake
    delay(1000);
    motor.speed(0, -100);           // set motor0 to speed -100
    delay(1000);
    motor.stop(0);                  // stop
    delay(1000);
}
// END FILE

Twój silnik powinien teraz: ruszyć na 1 sekundę, zatrzymać się na 1 sekundę, ruszyć na 1 sekundę, zatrzymać się na 1 sekundę i zapętlić

Jeżeli tak się nie stało, to upewnij się, czy:

  • Kod został wprowadzony prawidłowo,
  • Silnik został podłączony prawidłowo,
  • Wskaźnik LED świeci poprawnie. 

To już wszystko! 😀 Uruchomiłeś silnik DC z Arduino Motor Shield w pięciu prostych krokach.

Kontrola silnika DC z Arduino Motor Driver

Grove – I2C Motor Driver V1.3. (najnowsza wersja) pozwala na bezpośrednie sterowanie silnikiem DC lub silnikiem krokowym. Jego filarem jest sterownik L298N, który radzi sobie z napięciem 2 A na kanał. Jest kontrolowany przez Atmel ATmega8L – mikrokontroler, który odpowiada za komunikację z platformą poprzez magistralę i2c.

Więcej o L298N można znaleźć na blogu Seeedstudio.

Obydwa silniki mogą pracować przy ustawieniu różnej prędkości i kierunku pracy oraz zasilać dwa napędy DC lub jeden cztero-przewodowy, dwufazowy silnik krokowy. 

Będziemy potrzebować: 

Instrukcja krok po kroku

Krok 1: Ustaw adres za pomocą dip switcha (nowa funkcja w V1.3.). Zwróć uwagę na to, aby adres w programie zgadzał się z adresem w sterowniku silnika I2C. Domyślny adres w programie to 0x0f.

Krok 2: Podłącz sterownik silnika do portu I2C Grove-Base Shield i podłącz Grove-Base Shield do Seeeduino. Jeżeli nie posiadasz Grove Base Shield, możesz połączyć sterownik z Seeeduino bezpośrednio:

5V – czerwony
GND – czarny
SDA – biały
SCL – żółty

Krok 3: Połącz Seeeduino z PC przewodem USB. Twoje połączenie powinno wyglądać tak:

setup Arduino

Krok 4: Pobierz bibliotekę Grove I2C Motor Driver V.1.3. z Github i zainstaluj ją.

Poradnik instalacji biblioteki znajdziesz tutaj

Krok 5: Wprowadź poniższy kod do Arduino IDE:

// default I2C address is 0x0f
#define I2C_ADDRESS 0x0f

void setup()
{
    Motor.begin(I2C_ADDRESS);
}

W ten sposób udało Ci się połączyć ze sobą silnik DC, sterownik i Arduino. Oto dwie funkcje, które możesz zastosować do sterowania swoimi silnikami DC:

// Set the speed of a motor, speed is equal to duty cycle here
void speed(unsigned char motor_id, int _speed);

// Stop one motor
void stop(unsigned char motor_id);

Z funkcją speed() możesz sterować pojedynczym silnikiem z dowolnie wybraną prędkością.

  • Motor_id okresla, który silnik jest używany – MOTOR1 lub MOTOR2,
  • _speed określa ustawioną prędkość pracy. Możesz wstawić tutaj wartości -100~100.

Przy _speed>0 silnik pracuje zgodnie z ruchem wskazówek zegara. 
Przy _speed<0 pracuje przeciwnie do ruchu wskazówek zegara

Im wyższa wartość absolutna parametru _speed, tym szybciej pracuje silnik DC. 

Z funkcją stop() – tak, zgadłeś – możesz zatrzymać pracujący silnik DC. 

Czym jest serwomechanizm (Servo Motor)

Serwomechanizm to rotacyjny aktuator (mówiąc prosciej: uruchamiacz), który pozwala na precyzyjną kontrolę pozycji kątowej. Czyni go to użytecznym w systemach typu closed-loop, gdzie wymagana jest precyzyjna kontrola pozycji. Serwomechanizmy jako część tych systemów stanowią samodzielne urządzenia elektryczne, które obracają elementami maszyny z wysoką wydajnoscią i niezrównaną precyzją. Składają się na nie:

Serwomechanizmy są montowane przy pomocy śrub do obudowy, a samo połączenie np. z kołem odbywa się poprzez nałożenie na wał. Silnik jest kontrolowany analogowym lub cyfrowym sygnałem elektrycznym, co określa wielkości ruchu, które to z kolei reprezentują końcową, zadaną pozycję. Z uwagi na wysoką wydajność i moc stosuje się je m.in. w robotach, samolotach, przemyśle i sektorze usług – wszędzie tam, gdzie wymagana jest precyzyjna kontrola pozycji.

Kontrola serwomechanizmu z Arduino

Poniższy poradnik będzie nieco krótszy – setup współpracy pomiędzy serwomechanizmem a Arduino zamknęliśmy w trzech prostych krokach. Będziemy potrzebować:

  • wspomnianej już Seeeduino V4.2 (płytki kompatybilnej z Arduino UNO) 
  • Grove-Servo
  • wspomnianej Base Shield v2 – dla łatwiejszego połączenia

Krok 1: Podłącz Servo do Seeeduino

  • Servo ma trzy przewody: power, ground i signal.
  • Power jest zwykle czerwony – połącz go pinem 5V na płytce Arduino/Seeeduino.
  • Ground jest zwykle czarny lub brązowy – połącz go tym pinem (ground) na płytce Arduino.
  • Signal jest zwykle żółty, pomarańczowy lub biały – połącz go do D5 na płytce Arduino.

Możesz zmieniać porty cyfrowe wedle uznania – tylko nie zapomnij wówczas o zmianie numeru portu w kodzie.

Krok 2: Podłącz moduł do PC 

  • Połącz moduł z portem D5 na Base Shield
  • Podłącz Grove-Base Shield do Arduino
  • Połącz Arduino z PC przewodem USB.

Krok 3: Oprogramowanie
Spróbujemy wykonać obrót  w dwie strony o 180 stopni przy użyciu biblioteki Arduino Servo Library. Otwórz kod ze ścieżki: File > Examples > Servo > Sweep.

biblioteka Arduino
/* Sweep
 by BARRAGAN <http://barraganstudio.com>
 This example code is in the public domain.

 modified 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Sweep
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(5);  // attaches the servo on pin 5 to the servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

Sukces! Wszystko gotowe. Po dodaniu kodu Servo powinien zatańczyć jak należy. 

Zastosowanie Arduino do wprawiania silników w ruch zawsze było popularne i jest tak nadal. Zajęliśmy się tylko dwoma rodzajami silników – DC i servo. Na tym jednak zastosowania Arduino się nie kończą. W razie pytań zapraszamy Was do sekcji komentarzy. Powodzenia!

Dodaj komentarz