123D circuits – Symulacja arduino część 3 (serwomechanizmy, silniki)

W trzeciej już części zaczniemy trochę poruszać elementami, dzisiaj przedstawię jak symulować sterowanie w arduino silników i serwomechanizmów. Jako, że serwomechanizmy są niezwykle proste do sterowani, to zacznę od nich.

Sterowanie serwomechanizmu 

Najpierw trochę teorii, serwomechanizm to układ który ustawia się zależnie od zadanego sygnału i utrzymuje tą pozycje. Typowy serwomechanizm modelarski może obracać się w zakresie 180°. Do sterowania służy jedno wejście serwomechanizmu, na które musimy podawać impulsy z częstotliwością 50Hz, a czas trwania tych impulsów musi wynosić 1,5 – 2,5 ms. Zależnie od czasu trwania impulsu serwo ustawi się pod odpowiednim kątem. Jeżeli impulsy nie będą pojawiały się co 20ms (50Hz) to serwomechanizm przestanie utrzymywać ustawioną pozycję.

W arduino na szczęście mamy gotową bibliotekę do obsługi serwomechanizmów, więc całe to kontrolowanie impulsów nam odpada. Aby wypróbować działanie skonstruujmy taki układ:

1

Serwo zasilamy prosto z arduino, a linie sygnałową podpinamy do wyjścia PWM, w tym przypadku do 9. Program będzie miał za zadanie ruszać serwem od jednego skrajnego wychylenia do następnego. I tak w kółko.

#include <Servo.h> 
 
Servo servo; 
                
int pos = 0;   
 
void setup() 
{ 
  servo.attach(9);  
} 
 
 
void loop() 
{ 
  for(pos = 0; pos < 180; pos += 1) 
  {                                
    servo.write(pos);             
    delay(15);                    
  } 
  for(pos = 180; pos>=1; pos-=1)     
  {                                
    servo.write(pos);             
    delay(15);                  
  } 
} 

Pierwsza linia do dołączenie biblioteki Servo.h, następnie tworzymy zmienną servo i zmienną pos służącą do przechowywania położenia serwomechanizmu. W funkcji setup() do zmiennej serwo dołączamy pin 9, robimy to przy pomocy funkcji attach(). Funkcja loop() zbudowana jest z dwóch pętli for,  jedna zlicza w górę, a druga w duł. wewnątrz przy pomocy funkcji write() wpisujemy pozycję na jaką ma się ustawić serwo, a następnie czekamy 15 ms, aż serwomechanizm wykona zadany ruch. Poniżej przedstawiam efekt działania.

Teraz spróbujmy sterować serwomechanizmem przy pomocy potencjometru, a dla większego rozbudowania dajmy dwa serwomechanizmy.

Układ będzie podobny do tego co był przy sterowaniu diodą RGB w pierwszej części cyklu.

2

Potencjometry to zwykłe dzielniki napięcia. Serwa wpięte są wpięte w wyjścia PWM o numerach 9 i 10. Program nawet jest prostszy niż poprzednio.

#include <Servo.h> 
 
Servo servo1; 
Servo servo2; 
 
int pot1 = 0;
int pot2 = 1;

int val1;
int val2;
 
void setup() 
{ 
  servo1.attach(9);
  servo2.attach(10);
} 
 
void loop() 
{ 
  val1 = analogRead(pot1); 
  val2 = analogRead(pot2);
  
  val1 = map(val1, 0, 1023, 0, 179);
  val2 = map(val2, 0, 1023, 0, 179);
  
  servo1.write(val1);
  servo2.write(val2);
  
  delay(15);
} 

Początek jest standardowy, tworzymy zmienne i mówimy gdzie co jest,a w funkcji setup() dopinamy piny do serwomechanizmów. W funkcji loop() odczytujemy wartości z wejść analogowych, następnie przekształcamy przy użyciu funkcji map() i wysyłam do serwomechanizmów wyliczoną pozycję. Na koniec tylko odczekanie 15 ms na ustawienie się serwa z zadane miejsce.

Na powyższym przykładzie widać, że sterowanie serwomechanizmem może być naprawdę łatwe. Warto pamiętać, że w rzeczywistości serwa nie mają idealnych parametrów i zakres ruchów jest zależny od konkretnego modelu. Teraz przejdźmy do sterowania silnikami prądu stałego.

Silniki prądu stałego DC

Silniki prądu stałego mają bardzo duże zastosowanie w urządzeniach z którymi spotykamy się na co dzień, między innymi dla tego, że ich prędkość obrotowa jest proporcjonalna do napięcia zasilania, a kierunek obrotów można zmienić dzięki zmianie polaryzacji zasilania. I właśnie w pierwszym przykładzie o silnikach to zasymiluję.

3

W układzie niema żadnego mikrokontrolera, a do sterowania służą przełączniki, które zależnie od położenia dają na silnik plus albo minus. Kiedy przełączniki są w tej samej pozycji to różnica potencjałów pomiędzy jednym a drugim wejściem silnika wynosi 0V, więc nie przepływa prąd i nie wytwarza się siła. W efekcie silnik stoi w miejscu. Układ tego typu nazywa się mostkiem h (h-bridge) i jest podstawowym układem służącym do sterowania silnikami DC. W dalszej części przedstawię bardziej rozwinięte mostki h scalone w jednym układzie. Efekt pracy tego mostka jest taki:

Jak widać po zmianie przełączników zmienia się kierunek obrotów silnia, a po zmianie napięcia zasilania przez silnik przepływa większy prąd a jego obroty rosną. Niestety w symulatorze prędkość obrotów nie jest proporcjonalna do rzeczywistej, więc proponuje się sugerować wskaźnikiem na środku wirnika.

Sterowanie silnika DC przy pomocy tranzystora

Ten przykład pokarze jak sterować z arduino silnikiem, a dokładniej jak zmieniać jego prędkość obrotową. Do regulacji wykorzystamy oczywiście PWM, a będzie to wyglądało bardzo podobnie jak przy diodzie, z tym, że będziemy sterować prądem bazy tranzystora i w ten sposób zmieniać napięcie dla silnika, czyli jego prędkość obrotową. Aby to wykonać musimy posiadać taki układ:

4

A program to dokładnie to samo, co przy diodzie LED regulowanej PWM.

int pot = 0;

int motor = 3;

int val = 0;

void setup() 
{
  pinMode(motor, OUTPUT);
  pinMode(pot, INPUT);  
}

void loop() 
{
  
  val = analogRead(pot);  
  analogWrite(motor, val);                 
}

A poniższy film przedstawia jak to działa.

Regulacja kierunku obrotów, czyli wstawiamy mostek H

W tym przykładzie będziemy regulować przy pomocy kontrolera prędkość obrotową silnika. Jak o mostka cha użyjemy układu L293D, który jest chyba najpopularniejszym układem tego typu. Poniżej przedstawiam układ jaki trzeba zmontować.

5

A do sterowania prosty program, który co sekundę będzie zmieniał kierunek obrotów silnika.

int out1 = 12;
int out2 = 13;

int enable = 9;


void setup() 
{
  pinMode(out1, OUTPUT);
  pinMode(out2, OUTPUT);
  pinMode(enable, OUTPUT);
}

void loop() 
{
  digitalWrite(enable, HIGH);
  
  digitalWrite(out1, HIGH);
  digitalWrite(out2, LOW); 
  delay(1000);     
  digitalWrite(out1, LOW);
  digitalWrite(out2, HIGH);  
  delay(1000);     
}

Zmienne out1, out2 i enable przechowują numery pinów do których jest podpięty mostek H, Następnie sutawiamy te piny jako wyjście. W funkcji loop() w pierwszej linii ustawiamy enable na stan wysoki, a następnie w odstępach 1s zmieniamy stany na wyjściach sterujących sinikiem.

Teraz ostatnim krokiem jest sterowanie prędkością obrotową przy pomocy kontrolera, oczywiści wykorzystamy do tego PWM i wejście enable mostka H. Do schematu dokładamy tylko potencjometr, którym będziemy zadać prędkość obrotów.

6

W programie musimy dołączyć sterowanie PWM na wyjście enable, a dla lepszego zobrazowania działania ustawiamy silnik na obroty tylko w jedną stronę.

int out1 = 12;
int out2 = 13;

int enable = 9;

int pot = 0;
int val = 0;


void setup() 
{
  pinMode(out1, OUTPUT);
  pinMode(out2, OUTPUT);
  pinMode(enable, OUTPUT);
  
  pinMode(pot, INPUT);
}

void loop() 
{
  val = analogRead(pot);
  val = map(val, 0, 1023, 0, 255);
  
  analogWrite(enable, val);
  
  digitalWrite(out1, HIGH);
  digitalWrite(out2, LOW); 
}

A poniższy film pokazuje jak to wszystko razem działa.

O silnikach i serwomechanizmach to tyle. W następnej części opiszę obsługę czujników dostępnych w 123DCircuits.

Komentarz do „123D circuits – Symulacja arduino część 3 (serwomechanizmy, silniki)

  1. Super artykuł. Niestety jeszcze nie ma w 123DCircuits funkcji „VarSpeedServo” dla serwo motorku. A szkoda bo przydatna funkcja. Pozdrawiam.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.