Budowa robota mobilnego #2 – oprogramowanie

Ostatnio dowiedzieliśmy się, czym jest robot mobilny, omówiliśmy moduł HC-05, połączyliśmy wszystkie moduły elektroniczne oraz przygotowaliśmy konstrukcję robota z kartonu. Dzisiaj natomiast zajmiemy się napisaniem programu dla Arduino.

Jak to wszystko będzie działać?

Jeżeli jesteś początkującym, to na pewno nasunęło Ci się już pytanie: Jak to wszytko będzie działało?… Już spieszę z odpowiedzią. Wszystkie dane przesyłane będą z wykorzystaniem bluetooth (=technologia bezprzewodowej komunikacji krótkiego zasięgu pomiędzy różnymi urządzeniami elektronicznymi).

Wpierw nasz telefon (za pomocą przygotowanej przez nas aplikacji) połączy się z modułem HC-05, od tego momentu będą one w stanie parowania (nie chodzi mi tu oczywiście o popularne zjawisko fizyczne 😉 ). Załóżmy, że chcemy włączyć silnik. W takim wypadku klikniemy buton „ON’ w telefonie, następnie smartphone korzystając z bluetooth wyśle do HC-05 zaprogramowaną wcześniej liczbę (np. 1). Moduł odbierze informację i przekaże ją do Arduino, a ono włączy diodę, ponieważ wcześniej zaprogramujemy je tak, aby po odebraniu „1” uruchomiło stan wysoki na pinie x. Proste! 😀

Sterownik silników L298

Zanim jednak przejdziemy do pisania kodu dla Arduino, musimy poznać zasadę działania jednego z elementów naszej elektroniki, a mianowicie modułu sterownika silników L298. Standardowo zacznijmy od zajrzenia do specyfikacji.

Moduł dwukanałowego sterownika silników L298
Moduł dwukanałowego sterownika silników L298

Specyfikacja

  • Napięcie zasilania części logicznej: 5 V
  • Wbudowany regulator napięcia 5 V do zasilania części logicznej z możliwością jego odłączenia przy pomocy zworki
  • Maksymalny prąd wyjściowy: 2 A na kanał
  • Moduł umożliwia sterownia dwoma silnikami prądu stałego lub jednym silnikiem krokowym
  • Wyjścia dla silników oraz wejścia zasilające zostały wyprowadzane na złączą śrubowe ARK
  • Piny wejściowe części logicznej dostępne są na złączach goldpin – raster 2,54 mm
  • Na płytce znajdują się, wszystkie niezbędne do poprawnej pracy sterownika elementy pasywne
  • Układ posiada zamontowany radiator

Z racji, iż sterowanie naszym elementem nie jest wcale takie proste postanowiłem przygotować specjalną tabelę, w której opisana jest zasada działania modułu. Możecie się z niej dowiedzieć, jaki stan należy ustawić na dane piny, aby uzyskać pożądany efekt. Przykładowo (przy tej konfiguracji), jeżeli chcielibyśmy, żeby nasz robot poruszał się ciągle do przodu, to wystarczy, że na piny IN2 i IN 3 podamy 5V, natomiast IN1 i IN4 podłączymy do masy.

IN1 IN2 IN3 IN4 Działanie
LOW HIGH HIGH  LOW Robot porusza się do przodu (wszystkie silniki pracują w tym samym kierunku)
HIGH LOW LOW HIGH Robot porusza się do tyłu (wszystkie silniki pracują w tym samym kierunku)
LOW HIGH LOW HIGH Robot skręca w prawo (prawe koła kręcą się w tył, natomiast lewe w przód)
HIGH LOW HIGH LOW Robot skręca w lewo (lewe koła kręcą się w tył, natomiast prawe w przód)
LOW LOW LOW LOW Robot stoi w miejscu (silniki wyłączone)

Teraz gdy znamy już zasadę działania modułu i wiemy, jak nim sterować możemy przejść do sedna dzisiejszej części, czyli programowania.

Zacznijmy programowanie!

Z racji, że na Mechatrobocie jest już kurs programowania Arduino (język C) wydaje mi się, iż nie ma potrzeby powtarzania tych samych informacji. Jeżeli jesteś początkującym w dziedzinie programowania w C, proponuję Ci zapoznać się przynajmniej z pierwszą częścią wyżej wspomnianej publikacji.

Nie będę po kolei omawiał każdej funkcji, parametru itd. – postaram się tylko ogólnie zaprezentować za co dana część kodu odpowiada, jakie ma zadanie.

Zaczynamy od przygotowania zmiennych, z których będziemy potem korzystać:

int data; // w zmiennej data będziemy zapisywać dane przychodzące z modułu bluetooth
int IN1 = 2; // wejście sterownika 1
int IN2 = 3; // wejście sterownika 2
int IN3 = 4; // wejście sterownika 3
int IN4 = 5; // wejście sterownika 4

Po co nam zmienne z pinami? Wyobraź sobie sytuację, że musisz zmienić połączenie i np. z jakiś powodów chcesz przełożyć przewód podłączony do IN1 do pinu 7. – w takim wypadku musisz zmienić w programie numer pinu w kilkunastu miejscach! Dzięki zastosowaniu zmiennych możesz „konfigurować” wszystko w jednym miejscu.

Przechodzimy teraz do funkcji void setup: Zaczynamy od poinformowania Arduino, o tym, że będziemy chcieli skorzystać z UART. Podajemy przy tym prędkość transmisji (baud rate). W tym wypadku jest to 9600.

void setup() {
  Serial.begin(9600); // ustawienie odpowiedniej prędkości

Musimy teraz ustawić wszystkie potrzebne nam piny jako wyjścia. Korzystamy przy tym z funkcji pinMode.

 pinMode(IN1, OUTPUT);
 pinMode(IN2, OUTPUT);
 pinMode(IN3, OUTPUT);
 pinMode(IN4, OUTPUT);
 pinMode(led, OUTPUT);

}

Wszystkie ustawienia zakończone, więc ze spokojem możemy przejść do głównej części programu – funkcji void loop. Jeżeli do naszego Arduino zostaną dostarczone jakieś dane, ono rozpocznie działanie i zapisze je w zmiennej data.

void loop() {
  if (Serial.available() > 0) { // jeżeli czeka jakaś wartość do odczytania...
  data=Serial.read(); // odczytane dane = dat

Teraz gdy odczytaliśmy już informację możemy zaprogramować, co ma się dziać w odpowiednich wypadkach. Aby kod był czytelny i prosty użyjemy do tego celu specjalne funkcje, które za chwilę utworzymy.

   if(data=='1') { //jeżeli przesłane dane będą równe 1, to robot pojedzie do przodu...
    przod(); } //inicjujemy funkcję przod
   if(data=='2') {
    tyl(); }
   if(data=='3') {
    lewo(); }
   if(data=='4') {
    prawo(); }
   if(data=='5') {
    no(); } 
  delay(30); // zanim ponownie przejdziemy przez pętlę czekamy 30 milisekund
 } // zamykamy otwarte nawiasy klamrowe
}

Zamykamy wszystkie otwarte nawiasy klamrowe i przechodzimy do tworzenia poszczególnych funkcji.

void przod () {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW); }
  
void tyl () {
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH); }
  
void lewo () {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH); }
  
void prawo () {
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW); }
  
void no () {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW); }

Ostateczny efekt – pełen program

Na tym kończymy pisanie oprogramowania dla naszego robota! To już wszystko. Jeżeli podany poniżej (lub utworzony z powyższych materiałów) kod wgramy do Arduino, będziemy mogli (za pomocą znaków przesyłanych przez UART) sterować ruchem silników, a co za tym idzie i całą konstrukcją. Poniżej prezentuję końcowy uzyskany program.

>> UWAGA! Pamiętaj, aby podczas programowania Arduino odłączyć moduł bluetooth od pinu 0 i 1. <<

int data;
int IN1 = 2;
int IN2 = 3;
int IN3 = 4;
int IN4 = 5;

void setup() {
 Serial.begin(9600);
 pinMode(IN1, OUTPUT);
 pinMode(IN2, OUTPUT);
 pinMode(IN3, OUTPUT);
 pinMode(IN4, OUTPUT);
}

void loop() {
 if (Serial.available() > 0) { 
 data=Serial.read();
 if(data=='1') {
 przod(); }
 if(data=='2') {
 tyl(); }
 if(data=='3') {
 lewo(); }
 if(data=='4') {
 prawo(); }
 if(data=='5') {
 no(); } 
 delay(30);
 }
}

void przod () {
 digitalWrite(IN1, LOW);
 digitalWrite(IN2, HIGH);
 digitalWrite(IN3, HIGH);
 digitalWrite(IN4, LOW); }
 
void tyl () {
 digitalWrite(IN1, HIGH);
 digitalWrite(IN2, LOW);
 digitalWrite(IN3, LOW);
 digitalWrite(IN4, HIGH); }
 
void lewo () {
 digitalWrite(IN1, LOW);
 digitalWrite(IN2, HIGH);
 digitalWrite(IN3, LOW);
 digitalWrite(IN4, HIGH); }
 
void prawo () {
 digitalWrite(IN1, HIGH);
 digitalWrite(IN2, LOW);
 digitalWrite(IN3, HIGH);
 digitalWrite(IN4, LOW); }
 
void no () {
 digitalWrite(IN1, LOW);
 digitalWrite(IN2, LOW);
 digitalWrite(IN3, LOW);
 digitalWrite(IN4, LOW); }

Skopiuj lub przepisz powyższy kod do Arduino IDE, a następnie wgraj go na płytkę. Jeżeli już to zrobiłeś przejdź do kolejnego rozdzialiku. Pamiętaj o odłączeniu przewodów z pinu 0 i 1 (po zakończeniu wgrywania możesz z powrotem je podłączyć.

Test sterowania

Niecierpliwisz się? Chciałbyś już wypróbować swojego robota? Możesz spróbować samodzielnie „pobawić się” w bycie aplikacją. 😀 Wystarczy, że pobierzesz na swój smartphone lub tablet program Bluetooth Terminal. Włącz robota, a po uruchomieniu aplikacji połącz się z modułem HC-05. Wysyłając cyfry od 1 do 5 będziesz mógł bezprzewodowo kontrolować własną konstrukcję.

Podsumowanie

Napisaliśmy dzisiaj program dla Arduino, dzięki któremu będzie ono wiedziało, co ma robić, natomiast w kolejnej części zajmiemy się przygotowaniem własnej aplikacji mobilnej na Androida! Nasz robot ma już oprogramowanie, pozostało nam tylko przygotowanie programu, który pomoże nam w komunikacji.

Karol Wojsław

Karol Wojsław -- licealista, założyciel i redaktor Mechatrobot.pl. Interesuje się robotyką i elektroniką oraz informatyką. Z racji swojego wieku nie ma ogromnej wiedzy, ale wytrwale dąży do tego, aby artykuły, które publikuje były coraz lepsze.