[ARDUINO, EAGLE i TY] Biblioteki Arduino dla sterownika H silnika elektrycznego
W artykule opisałem sposób przygotowania płytki drukowanej integrującej moduły: sterownika silników oraz Arduino Nano. W tym artykule skupię się na prezentacji przygotowania oprogramowania w środowisku Arduino, testy zostaną przeprowadzone na robocie NesPiDi który startował w tegorocznych zawodach Robomaticon.
Aby rozpocząć pracę nad programem powinniśmy zaopatrzyć się następujące podzespoły:
- Moduł Arduino Nano
- Moduł sterownika silników z układem TB6612
- Płytkę stykową
- Zestaw kabli
- Silniki wraz z mocowaniami, kołami i ogumieniem
- Akumulator (w moich projektach wykorzystuję Li-Poly 7,4V)
- Podwozie robota wykonane z dowolnego materiału
Poprzedzając pisanie programu powinniśmy wykonać połączenia zgodnie z rysunkiem 1.
Rys. 1. Schemat połączeń elektrycznych niezbędnych do przetestowania tworzonych bibliotek
Do sterowania pracą silnika wykorzystamy następujące porty:
- sterowanie prędkościami silników: pwmA port 3 oraz pwmB port 5,
- sterowanie kierunkiem pracy silników: silnik A porty 6 i 7 oraz silnik B porty 8 i 9.
Sygnał PWM jest sygnałem z regulowaną wartością wypełnienia. Dla przykładu na rysunku 2 pokazano kilka charakterystycznych wartości.
Rys. 2. Sygnały PWM o różnych wartościach współczynnika wypełnienia
Po podłączeniu poniższego układu rozpoczynamy programowanie. W nagłówku programu umieszczamy adresy wszystkich portów, z których będziemy korzystać podczas dalszej części. Sygnały PWM zostały podłączone do portów cyforwych c oraz 5. Ta informacja w kodzie będzie wyglądać w sposób następujący:
int pwmA=3; //pin portu pwm sterującego prędkością silnika A int pwmB=5; //pin portu pwm sterującego prędkością silnika B
Sterowanie kierunkami pracy silników odbywać się będzie przy wykorzystaniu portów cyfrowych, 6 i 7 dla silnika A oraz 8 i 9 dla silnika B. W związku z uproszczeniem kodu oraz możliwości modyfikacji adresu portów zostały one zapisane w postaci tablicy.
Zapis w kodzie:
int sterowanie_silnikami[4]={6,7,8,9}; //sterowanie_silnikami[1]i[2] przypisane do silnika A //sterowanie_silnikami[3]i[4] przypisane do silnika B
Kolejnym etapem jest ustawienie opisanych portów jako wyjścia. Do tego celu wykorzystamy funkcję pinMode.
void setup() { pinMode(sterowanie_silnikami[0],OUTPUT); pinMode(sterowanie_silnikami[1],OUTPUT); pinMode(sterowanie_silnikami[2],OUTPUT); pinMode(sterowanie_silnikami[3],OUTPUT); pinMode(pwmA,OUTPUT); pinMode(pwmB,OUTPUT); //ustawienie wszystkich portów sterujących jako wyjścia }
Tab. 1. Tabela prawdy działania sterownika silników
Przy pierwszych projektach najważniejszymi nastawami będą oznaczone kolorem zielonym na rysunku trzecim. Kierunek do przodu oraz kierunek przeciwny uzyskamy wykorzystując następujący kod:
void loop() { digitalWrite(sterowanie_silnikami[0],LOW); digitalWrite(sterowanie_silnikami[1],HIGH); //dla silnika A digitalWrite(sterowanie_silnikami[2],LOW); digitalWrite(sterowanie_silnikami[3],HIGH); //dla silnika B delay(10); }
Powyższy kod umożliwia jedynie ustawienie kierunku pracy silnika. Nie nadaje mu jednak prędkości. Aby silniki poruszały się z odpowiednią prędkością należy na port pwm podać wartość z przedziału (0;255). Dokonamy tego w następujący sposób:
void loop() { int predkosc; digitalWrite(sterowanie_silnikami[0],LOW); digitalWrite(sterowanie_silnikami[1],HIGH); analogWrite(pwmA, predkosc); //dla silnika A digitalWrite(sterowanie_silnikami[2],LOW); digitalWrite(sterowanie_silnikami[3],HIGH); analogWrite(pwmB, predkosc); //dla silnika B delay(10); }