Programowanie Arduino z użyciem MATLAB i Simulink

Programowanie Arduino z użyciem MATLAB i Simulink

MATLAB zapewnia wiele potężnych narzędzi idealnych do projektowania robotów mobilnych. Czy można użyć MATLABAa do wygenerowania kodu i bezpośredniego zaprogramowania robota?

Dzięki temu darmowemu dodatkowi do Simulinka można programować Arduino stosując intuicyjne bloki i diagramy przepływu stanu!

Samodzielna budowa robota mobilnego wymaga przygotowania zarówno warstwy sprzętowej jak i oprogramowania. W dziedzinie sprzętu mamy do wyboru szeroką gamę platform, które pozwalają na realizację zaawansowanych programów sterujących i obsługę różnego rodzaju czujników czy elementów wykonawczych. Dla wielu z nich, jak Arduino czy Raspberry Pi, dostępne są także liczne materiały pomocne w pracy nad projektem.

Jeśli chodzi o oprogramowanie, potrzebne są narzędzia, które pozwolą wykonać implementację programu sterującego robotem. Środowisko MATLAB i Simulink daje możliwości prostej i szybkiej implementacji projektu oraz uruchomienia go na platformie docelowej.

Wykorzystywany sprzęt

Do wykonania robota mobilnego wybrana została platforma sprzętowa Arduino Due. Jest to platforma wyposażona w 32-bitowy mikroprocesor ARM, 54 wejścia/wyjścia cyfrowe oraz 12 wejść analogowych. Pozwala to na realizację dość zaawansowanych algorytmów sterowania oraz obsługę licznych peryferii. Właściwości układu Arduino Due poszerzone zostały poprzez zastosowanie Arduino Motor Shield, który daje możliwości sterownia silnikami DC.

Projekt bazuje na podwoziu wyposażonym w dwa silniki prądu stałego z przekładniami, koła, podporę oraz zestaw baterii zasilających. Całość uzupełniona została czujnikami odległości, enkoderami dla pomiaru prędkości silników oraz przyciskiem pozwalającym na manualne uruchomienie lub zatrzymanie robota.

Robot mobilny wykorzystujący Arduino Due.

Oprogramowanie

Do zaprojektowania i implementacji algorytmu kontrolującego pracę robota użyte zostały narzędzia firmy MathWorks, które pozwalają na realizację pełnego projektu w oparciu o model wykonany w Simulinku. Wykorzystana została również funkcjonalność oprogramowania w dziedzinie identyfikacji silników i doboru ich regulatorów (System Identification Toolbox, Simulink Control Design, Simulink Design Optimization). Pomocna okazała się również możliwość integracji w modelu diagramów Stateflow, które są wygodnym sposobem reprezentacji logiki w projekcie.

Poza generacją programu sterującego dla Arduino, mamy również możliwość uruchamiania go bezpośrednio z Simulinka, a także modyfikacji parametrów i podglądu sygnałów w trakcie pracy robota. Współpraca z Arduino jest możliwa dzięki pakietowi wsparcia sprzętowego dedykowanego dla tej platformy. Jest on darmowym dodatkiem dla użytkowników Simulinka. Więcej informacji można znaleźć na stronie producenta.

Współprace oprogramowania MATLAB i Simulink ze sprzętem zapewniają dedykowane pakiety wsparcia (Hardware Support Packages).

Zastosowane oprogramowanie pozwoliło szybko zrealizować projekt. Decydując się na rozwiązanie bazujące na modelu w Simulinku uzyskaliśmy również czytelną reprezentację programu sterującego. Ułatwia to przekazanie zrealizowanego zadania innej osobie czy też kontynuację pracy w późniejszym terminie.

Program sterujący robotem mobilnym

Całość systemu sterowania robotem została zrealizowana na bazie modelu przedstawionego poniżej. Do wykonania projektu wykorzystane zostały możliwości budowy modeli hierarchicznych.

W widoku głównym widzimy tylko dwa podsystemy. Pierwszy z nich reprezentuje układ sterowania, a drugi obiekt, czyli robota mobilnego. Wewnątrz tego podsystemu umieszczone zostały bloki odpowiedzialne za bezpośrednie sterownie silników, obsługę czujników czy pomiary prędkości. Wyniki uzyskane w tej części modelu zwracane są do pierwszego podsystemu, który na ich podstawie wyznacza aktualne sterowanie.

W ten sposób zrealizowana została pętla sprzężenia zwrotnego. Każdy z wymienionych podsystemów zawiera w sobie inne elementy, w tym także kolejne podsystemy. Pełna struktura modelu jest widoczna po lewej stronie okna w Model Browser. W ten sposób można realizować złożone projekty przy jednoczesnym zachowaniu przejrzystości i czytelności modelu.

Model główny, prezentujący program przeznaczony do pracy na Arduino.

Obiekt  Plant_mobile_robot zawiera w sobie podsystemy odpowiedzialne za:

  • odczyt informacji z czujników odległości i przycisku Stop/Start,
  • algorytm wyliczający prędkości kół, na podstawie sygnałów odczytanych z enkoderów,
  • odometrię, która pozwala na wyznaczenie położenia i kąta obrotu robota na podstawie informacji o prędkości kół.

Cześć poświęcona sterowaniu (widoczna na poniższym rysunku) zawiera kolejne podsystemy:

  • układy regulacji prędkością obu silników wykorzystujące regulatory PID,
  • wstępną obróbkę sygnałów pochodzących z sensorów,
  • układ logiczny decydujący o trybie pracy robota oraz jego ruchu.

Zawartość podsystemu odpowiedzialnego za sterowanie.

Interface sprzętowy

Projektant tworzący rozwiązanie w Simulinku nie musi pisać ręcznie kodu C. Dotyczy to także sterowników sprzętowych. W systemie wykorzystywane są wejścia i wyjścia cyfrowe, wejścia analogowe, a także wyjścia PWM. Ich obsługa realizowana jest z wykorzystaniem bloków, które są dostarczane przez pakiet wsparcia dla Arduino.

Konfiguracja bloku odbywa się przez przygotowany interfejs. Parametry dostępne do modyfikacji różnią się w zależności od typu wejścia/wyjścia. W przypadku, widocznej na poniższym rysunku, konfiguracji wejścia cyfrowego dostępne paramenty to numer wejścia oraz czas próbkowania (jego wartość określa zmienna Ts, będąca globalną wartością czasu próbkowania dla modelu).

Interfejs sprzętowy zrealizowany z wykorzystaniem bloków z pakietu Arduino Support from Simulink (otwarte okno konfiguracji wejścia cyfrowego).

Gotowe sterowniki w postaci bloków Simulinka znacznie przyspieszają i ułatwiają prace nad projektem. Bloki sprzętowe mogę być wykorzystane zarówno do wdrożenia rozwiązania, jak i do prototypowania, w czasie którego mamy podgląd sygnałów w Simulinku.

Logika sterująca ruchem

Głównym elementem decydującym o zachowaniu robota jest układ logiczny, wykonany z wykorzystaniem diagramu Stateflow. Realizacja tego układu widoczna jest na kolejnym rysunku.

Dwa podstawowe stany umieszczone w diagramie to power_on i power_off, odpowiadające stanom pracy i wyłączenia robota. Stanem początkowym jest power_off, który wewnątrz zawiera instrukcje ustawiające prędkości silników na 0.

Wewnątrz stanu power_on widoczne są trzy stany realizujące poszczególne elementy ruchu robota. Są to kolejno:

  • start – prędkość kół wynosi 0, a robot czeka na informacje z czujników,
  • goFurther – prędkość kół ustawiona na 8 [rad/s] oraz kierunek ruchu do przodu,
  • goBack – prędkość kół ustawiona na 8 [rad/s] oraz kierunek ruchu do tyłu.

Przejścia pomiędzy ruchem naprzód, a stanem początkowym oraz ruchem wstecz, a stanem początkowym odbywają się w zależności od wartości forward i backward. Zmienne te są wejściami do diagramu. Ich wartość zależna jest od informacji przesłanych przez czujnik odległości. Jeśli odległość od przeszkody wynosi więcej niż 20 cm następuje ruch naprzód, jeśli odległość jest mniejsza niż 12 ruch wstecz.

Dzięki temu, że stan power_on jest nadrzędny względem stanów decydujących o ruchu robota, w każdej chwili możliwe jest przejście do power_off, jeśli tylko nastąpi naciśnięcie przycisku. Tak wykonana logika pozwala osiągnąć efekt ruchu robota, który utrzymuje dystans do przeszkody (np. ręki) w przedziale 12-20 cm.

. Układ logiczny decydujący o ruchu robota został wykonany z wykorzystaniem Stateflow.

Realizacja logiki zarządzającej ruchem robota jest prostsza i bardziej przejrzysta w przypadku zastosowania diagramu Stateflow, niż realizacja z wykorzystaniem języka C. Dodatkową zaletą jest też możliwość uruchomienia modelu w trybie symulacji External. Pozwala to na wykonywanie programu na platformie sprzętowej przy jednoczesnej obserwacji aktualnie aktywnych stanów.

Implementacja na sprzęcie

Na etapie projektu, w którym potrzebna będzie implementacja rozwiązania na Arduino, należy przeprowadzić konfigurację modelu. Ma to na celu wskazanie platformy sprzętowej, dla której ma zostać wygenerowany kod. Poza określeniem platformy docelowej mamy możliwość podglądu implementacji poszczególnych typów danych czy modyfikacji opcji uruchomienia programu na Arduino. Okno konfiguracyjne widoczne jest poniżej.

Konfiguracja modelu do uruchomienia na platformie Arduino Due.

Opisany projekt jest prostym przykładem, który pozwala zobaczyć jak narzędzia MATLAB i Simulink pozwalają na przyspieszenie i ułatwienie pracy nad projektami robotycznymi czy mechatronicznymi. Funkcjonalności oprogramowania pozawalają się skupić na takich elementach projektu jak logika działania czy algorytmika, jednocześnie oszczędzając czas poświęcany na implementację. Duże znaczenie mają także możliwości prototypowania czy testowania rozwiązania (m.in. tryb ‘External’).

Więcej przykładów użycia oprogramowania MATLAB i Simulink można znaleźć w poniższej serii poradników wideo oraz na stronie: http://makerzone.mathworks.com/

Autor: Rafał Płatek

OPROGRAMOWANIE NAUKOWO-TECHNICZNE
ul. Pod Fortem 19
31-302 Kraków
http://www.ont.com.pl

arduino, mathworks, matlab, programowanie, simulink