Budujemy robota Mecanum z M5Stack

Czas czytania: 3 min.

Społeczność M5Stack to prawdziwa kopalnia makerskich wspaniałości. Wykorzystamy komunikację Bluetooth do zaprogramowania wielokierunkowych sekwencji ruchów dla malca z M5Stack.

Oryginalny projekt na portalu hackster.io w języku angielskim opublikował Hans-Günther Nusseck. Kody i komendy w formie gotowej do skopiowania i wklejenia oraz w formie plików, a także repozytorium Bluetooth-RoverC, znajdziecie w sekcji dolnej na końcu artykułu.

Roboty kołowe Mecanum. Założenia projektowe

Fascynujące dzięki niezwykłej swobodzie ruchu koło Mecanum, albo inaczej koło szwedzkie, jest konstrukcją koła bez opony do poruszania się pojazdu lądowego w dowolnym kierunku. Czasami nazywane jest kołem Ilon od nazwiska jego wynalazcy, Bengta Erlanda Ilona. 

Lista zakupów:

 

Do projektu wykorzystamy Rover C, który jest kontrolowany przez M5Stack M5StickC (ESP32) i czyni całość stosunkowo łatwą w realizacji. Opiera się na zaprogramowanym rozwiązaniu – będą to sekwencje ruchów z urządzenia mobilnego lub komputera. Projekt powstał jako pomysł gry, w której robot porusza się wokół przeszkód. Jednak dzieje się to nie za pomocą pilota, ale po zaprogramowaniu komendy ruchu przez Bluetooth. Dzięki kołom szwedzkim nasz RoverC może poruszać się w każdym kierunku bez obracania się. Sterowanie kołami jeszcze szczegółowo opiszemy. 

Pełny zakres ruchu bez skręcania.

Wartość polecenia dla określonego kierunku powoduje, że łazik porusza się w tym kierunku przez określony czas. Pozwala to na zaprogramowanie sekwencji ruchów za pomocą sekwencji wartości kierunkowych. Brzmi skomplikowanie, ale jest to całkiem proste. Moduł umieścimy bezpośrednio na robocie niczym wieżyczkę łazika. Patrzcie. 

Przykładowa arena robota z modułem M5Stack

Aby bohater mógł dotrzeć do celu bez najeżdżania na przeszkody, zaprogramujemy dla niego sekwencję ruchów. 

Sekwencja ruchu może być zaprogramowana na Roverze za pomocą terminala szeregowego Bluetooth, który jest dostępny dla smartfonów lub komputerów PC.

Komunikacja i komendy

Nawiązanie połączenia szeregowego Bluetooth z ESP32 to dołączenie headera BluetoothSerial.h i zdefiniowanie obiektu BluetoothSerial:

				
					#include <BluetoothSerial.h>
// Bluetooth serial object
BluetoothSerial SerialBT;
uint64_t chipid;
char chipname[256];
				
			

Potrzebujemy nazwy dla urządzenia Bluetooth. Może zostać pobrana z Chip ID urządzenia ESP. Z tym ID BluetoothSerial może zostać uruchomiony i natychmiast oczekiwać na połączenie od klienta.

				
					//Stwórz Bluetooth ID.
//Chip ID to adres MAC (długość: 6 bitów)
chipid = ESP.getEfuseMac();
sprintf( chipname, "M5StickC_%04X", (uint16_t)(chipid >> 32));
// uruchomienie Bluetooth
if(SerialBT.begin(chipname))
    tb_display_print_String("[OK] Bluetooth Init\n");
else
    tb_display_print_String("[ERR] Unable to start Bluetooth!\n");
				
			

Kod wykorzystuje bibliotekę tb_display oryginalnego autora projektu do łatwego tworzenia wyjścia tekstowego na M5StickC.Program oczekuje na przychodzące znaki z interfejsu szeregowego Bluetooth. Znaki te są zbierane i za każdym razem, gdy odbierany jest znak spacji, wartość, która została wysłana, jest zapisywana jako komenda. Znak gwiazdki (lub timeout wynoszący 5 sekund) kończy tryb odbioru i rozpoczyna sekwencję ruchu.

				
					while(SerialBT.available()){
int data = SerialBT.read();
// tylko wartości liczbowe
if(isDigit(data)){
read_String += (char)data;
}
// spacja jest separatorem kodów kierunku
if(data == ' ' || (data == '*' && read_String != "")){
int value = read_String.toInt();
if(value >=0 && value <= 360){
code_queue_add(value);
}
read_String = "";
}
// symbol * rozpoczyna komendę w sekwencji ruchów
if(data == '*'){
tb_display_print_String("\n-START-\n");
process_state = ps_run_program;
}
}
				
			

Do zapisywania komend użyto kolejki ze standardowej biblioteki C++. Znajduje się ona w osobnych plikach .h i.cc, aby uniknąć konfliktów z przestrzenią nazw.

				
					
// definiujemy queue object
std::queue<int> Command_queue;
				
			

Podczas sekwencji ruchów górny element jest pobierany z kolejki jako nowe polecenie, aż kolejka będzie pusta:

				
					// usuń wszystkie komendy z kolejki
// code_queue_get() zwraca false, jeśli kolejka jest pusta
while(code_queue_get(&value)){
    snprintf(String_buffer, sizeof(String_buffer), "--> %i\n", value);
    tb_display_print_String(String_buffer);
    // Funkcja move_rover() zawiera także przyśpieszenie
    // W związku z tym wykonanie może zająć więcej czasu
    move_rover(value, 50);
    // Pozwólmy łazikowi poruszać się przez  250ms  (z wyłączeniem fazy przyspieszania)
    delay(250);
}
rover_stop();
tb_display_print_String("\n-FINISH-\n");
				
			

Połączenie robota

Najpierw należy pobrać i zainstalować aplikację Bluetooth Serial Terminal na komputerze lub smartfonie. Zróbmy to i można wracać do poradnika. Następnie parujemy nasze urządzenie z M5StickC tak, jak robimy to z każdym innym urządzeniem Bluetooth. Teraz uruchamiamy terminal szeregowy Bluetooth, łączymy się z robotem i wysyłamy komendy ruchu oddzielone spacjami i gwiazdką na końcu listy.

Przesyłanie komend za pomocą Bluetooth Serial Terminal

Ruch robota

Podczas obracania się do przodu, tradycyjne koło znane wytwarza siłę, która jest skierowana dokładnie w kierunku jazdy. Ze względu na rozmieszczenie poszczególnych bębnów szwedzkie koło mecanum wytwarza zaś siłę, która jest skierowana ukośnie pod kątem 45 stopni do przodu. To samo dotyczy obrotów do tyłu, jak można zobaczyć tutaj:

Cały rozkład dla kół prezentuje się tak:

Potrzebujemy teraz funkcji, która obliczy wartości dla czterech prędkości silnika na podstawie pożądanego kierunku ruchu i pożądanej prędkości. Aby to zrobić, musimy rozbić pożądany kierunek ruchu na składowe vx i vy.

Jeśli teraz spojrzymy ponownie na wynikowe kierunki sił w kołach w odniesieniu do podstawowego układu współrzędnych, możemy obliczyć wymaganą prędkość dla każdego silnika.

I to by było na tyle! Jedyną rzeczą, która pozostała do rozważenia, jest krzywa przyspieszenia dla silników – profiler prędkości. Jeśli przełączymy silniki bezpośrednio z 0 na 100, robot będzie skakał i na pewno zgubi założony tor jazdy. W kodzie prosta funkcja takiej rampy będzie przyśpieszać naszego robota powoli, dzięki czemu będzie lepiej trzymał się swoich ram ruchu.

Jak oceniasz ten wpis blogowy?

Kliknij gwiazdkę, aby go ocenić!

Średnia ocena: 5 / 5. Liczba głosów: 3

Jak dotąd brak głosów! Bądź pierwszą osobą, która oceni ten wpis.

Podziel się:

Picture of Oskar Pacelt

Oskar Pacelt

Fan dobrej literatury i muzyki. Wierzy, że udany tekst jest jak list wysłany w przyszłość. W życiu najbardziej interesuje go prawda, pozostałych zainteresowań zliczyć nie sposób. Kocha pływać.

Zobacz więcej:

Dodaj komentarz

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

Ze względów bezpieczeństwa wymagane jest korzystanie z usługi Google reCAPTCHA, która podlega Polityce Prywatności oraz Warunkom użytkowania.