- Wybór części do samobalansującego robota
- Drukowanie 3D i montaż naszego samobalansującego robota
- Schemat obwodu
- Kod samobalansującego robota
- Działanie samobalansującego robota Arduino
Zainspirowany silnikami RYNO i innymi samobalansującymi skuterami Segway, zawsze chciałem zbudować coś własnego, własnego robota Arduino Segway. Zastanawiając się nad tym, postanowiłem zbudować samobalansującego robota za pomocą Arduino. W ten sposób byłbym w stanie uchwycić podstawową koncepcję wszystkich tych skuterów, a także dowiedzieć się, jak działa algorytm PID.
Kiedy zacząłem budować, zdałem sobie sprawę, że zbudowanie tego bota jest wyzwaniem. Jest tak wiele opcji do wyboru, a zatem nieporozumienia zaczynają się od wyboru silników i pozostają do dostrojenia wartości PID. Jest tak wiele rzeczy do rozważenia, jak typ akumulatora, położenie akumulatora, przyczepność koła, typ sterownika silnika, utrzymanie środka ciężkości (CoG) i wiele więcej.
Ale pozwól, że ci to wyjaśnię, kiedy już ją zbudujesz, zgodzisz się, że nie jest to tak trudne, jak się wydaje. Więc spójrzmy prawdzie w oczy, w tym samouczku udokumentuję moje doświadczenie w budowaniu samobalansującego robota. Możesz być absolutnym początkującym, który dopiero zaczyna lub wylądowałeś tutaj po długiej frustracji związanej z niemożnością uruchomienia bota. To miejsce ma być twoim ostatecznym celem. Więc zacznijmy……
Wybór części do samobalansującego robota
Zanim opowiem o wszystkich opcjach budowania bota, pozwolę sobie wymienić elementy, których użyłem w tym samobalansującym się projekcie robota
- Arduino UNO
- Motoreduktory DC (w kolorze żółtym) - 2 nr
- Moduł sterownika silnika L298N
- MPU6050
- Para kół
- Akumulator litowo-jonowy 7,4 V.
- Przewody łączące
- Korpus z nadrukiem 3D
Możesz mieszać i wybierać dowolne z powyższych komponentów w zależności od dostępności, aby stworzyć własny samobalansujący zestaw robota, po prostu upewnij się, że komponenty spełniają następujące kryteria.
Kontroler: Kontroler, którego tutaj użyłem, to Arduino UNO, dlaczego, ponieważ jest po prostu łatwy w użyciu. Możesz również użyć Arduino Nano lub Arduino mini, ale polecam pozostanie przy UNO, ponieważ możemy go zaprogramować bezpośrednio bez zewnętrznego sprzętu.
Silniki: Najlepszym wyborem silnika, którego można użyć dla robota samobalansującego, bez wątpienia będzie silnik krokowy. Ale żeby wszystko było proste, użyłem motoreduktora DC. Tak, posiadanie steppera nie jest obowiązkowe; bot działa również dobrze z tymi tanimi powszechnie dostępnymi żółtymi silnikami z przekładnią DC.
Sterownik silnika: Jeśli wybrałeś motoreduktory prądu stałego, takie jak mój, możesz użyć modułu sterownika L298N, takiego jak ja, lub nawet L293D powinien działać dobrze. Dowiedz się więcej o sterowaniu silnikiem DC za pomocą L293D i Arduino.
Koła: Nie lekceważ tych facetów; Trudno mi było dojść do wniosku, że problem dotyczy moich kół. Dlatego upewnij się, że koła dobrze trzymają się podłogi, której używasz. Uważnie obserwuj, twoja przyczepność nie powinna nigdy pozwolić, aby koła ślizgały się po podłodze.
Akcelerometr i żyroskop: najlepszym wyborem akcelerometru i żyroskopu dla twojego bota będzie MPU6050. Więc nie próbuj budować go za pomocą zwykłego akcelerometru, takiego jak ADXL345 lub coś podobnego, po prostu nie zadziała. Dlaczego dowiesz się na końcu tego artykułu. Możesz również zapoznać się z naszym dedykowanym artykułem na temat korzystania z MPU6050 z Arduino.
Bateria: Potrzebujemy baterii, która jest tak lekka, jak to tylko możliwe, a napięcie robocze powinno być większe niż 5 V, abyśmy mogli zasilać nasze Arduino bezpośrednio bez modułu doładowania. Dlatego idealnym wyborem będzie akumulator litowo-polimerowy 7,4 V. Tutaj, ponieważ miałem łatwo dostępny akumulator litowo-jonowy 7,4 V, korzystałem z niego. Ale pamiętaj, że Li-po jest korzystniejszy niż Li-ion.
Podwozie: Innym miejscem, w którym nie powinieneś iść na kompromis, jest podwozie botów. Możesz używać kartonu, drewna, plastiku wszystkiego, z czym jesteś dobry. Ale po prostu upewnij się, że podwozie jest solidne i nie powinno się poruszać, gdy bot próbuje zrównoważyć. Zaprojektowałem własne podwozie w Solidworks na podstawie innych botów i wydrukowałem go w 3D. Jeśli masz drukarkę, możesz również wydrukować projekt, pliki projektu zostaną dołączone w nadchodzącym nagłówku.
Drukowanie 3D i montaż naszego samobalansującego robota
Jeśli zdecydowałeś się wydrukować w 3D to samo podwozie, którego używam do budowy mojego bota, pliki STL można pobrać z Thingsiverse. Dodałem również pliki projektowe wraz z nim, dzięki czemu można go również modyfikować zgodnie z preferencjami personelu.
Części nie mają wystających struktur, dzięki czemu można je łatwo wydrukować bez żadnych podpór, a wypełnienie w wysokości 25% będzie działało dobrze. Projekty są dość proste i każda podstawowa drukarka powinna sobie z tym poradzić. Użyłem oprogramowania Cura do pokrojenia modelu i wydrukowania za pomocą mojego Tevo Tarantula, ustawienie pokazano poniżej.
Musiałbyś wydrukować część ciała, a także cztery części mocujące silnik. Montaż jest dość prosty; użyj nakrętek i śrub 3 mm, aby zabezpieczyć silnik i płyty na miejscu. Po złożeniu powinien wyglądać jak na poniższym obrazku.
Rzeczywisty projekt został zaplanowany z modułem napędowym L298N w dolnej szafie, Arduino i baterią na górze, jak pokazano powyżej. Jeśli wykonujesz tę samą kolejność, możesz przykręcić płytkę bezpośrednio do przewidzianych otworów i użyć przywieszki do przewodu do baterii Li-po. Ten układ również powinien działać, z wyjątkiem super gładkich kół, które musiałem później zmienić.
W moim bocie zamieniłem położenie baterii i płyty Arduino UNO dla ułatwienia programowania, a także musiałem wprowadzić płytkę perf do wykonania połączeń. Więc mój bot nie wyglądał tak, jak planowałem na początkowym etapie. Po zakończeniu testów programowania okablowania i wszystkim, mój robot dwukołowy w końcu wygląda tak
Schemat obwodu
Wykonanie połączeń dla tego samobalansującego robota opartego na Arduino jest dość proste. Jest to samobalansujący robot korzystający z Arduino i MPU6050, więc musimy połączyć MPU6050 z Arduino i podłączyć silniki przez moduł sterownika silnika. Całość zasilana jest z akumulatora litowo-jonowego 7,4V. Schemat obwodu tego samego pokazano poniżej.
Arduino i moduł sterownika silnika L298N są zasilane bezpośrednio odpowiednio przez pin Vin i terminal 12V. Wbudowany regulator na płycie Arduino zamieni wejście z 7,4V na 5V, a układy ATmega IC i MPU6050 będą przez niego zasilane. Silniki prądu stałego mogą pracować przy napięciu od 5 V do 12 V. Ale będziemy podłączać dodatni przewód 7,4 V z akumulatora do zacisku wejściowego 12 V modułu sterownika silnika. Dzięki temu silniki będą działać przy napięciu 7,4 V. W poniższej tabeli przedstawiono sposób połączenia modułu sterownika silnika MPU6050 i L298N z Arduino.
Pin komponentu |
Pin Arduino |
MPU6050 |
|
Vcc |
+ 5V |
Ziemia |
Gnd |
SCL |
A5 |
SDA |
A4 |
INT |
D2 |
L298N |
|
W 1 |
D6 |
W 2 |
D9 |
IN3 |
D10 |
IN4 |
D11 |
MPU6050 komunikuje się z Arduino poprzez interfejs I2C, więc używamy pinów SPI A4 i A5 Arduino. Silniki prądu stałego są podłączone odpowiednio do pinów PWM D6, D9 D10 i D11. Musimy podłączyć je do pinów PWM, ponieważ będziemy sterować prędkością silnika prądu stałego, zmieniając cykl pracy sygnałów PWM. Jeśli nie jesteś zaznajomiony z tymi dwoma komponentami, zaleca się przeczytanie instrukcji obsługi interfejsu MPU6050 i sterownika silnika L298N.
Kod samobalansującego robota
Teraz musimy zaprogramować naszą płytkę Arduino UNO, aby zrównoważyć robota. Tutaj dzieje się cała magia; koncepcja stojąca za tym jest prosta. Musimy sprawdzić, czy robot pochyla się do przodu, czy do tyłu za pomocą MPU6050 i wtedy, jeśli przechyla się do przodu, musimy obracać koła do przodu, a jeśli przechyla się do tyłu, musimy obracać koła w odwrotnym kierunku.
Jednocześnie musimy też kontrolować prędkość, z jaką obracają się koła, jeśli robot jest nieco zdezorientowany z pozycji środkowej, koła obracają się powoli, a prędkość rośnie w miarę oddalania się od środkowej pozycji. Aby osiągnąć tę logikę, używamy algorytmu PID, którego położenie środkowe jest wartością zadaną, a poziom dezorientacji jako wyjście.
Aby poznać aktualną pozycję bota, używamy MPU6050, czyli połączonego 6-osiowego akcelerometru i czujnika żyroskopowego. Aby uzyskać wiarygodną wartość położenia z czujnika, musimy użyć wartości zarówno akcelerometru, jak i żyroskopu, ponieważ wartości z akcelerometru mają problemy z szumami, a wartości z żyroskopu mają tendencję do dryfowania w czasie. Musimy więc połączyć oba i otrzymać wartość odchylenia i przechylenia naszego robota, z których będziemy korzystać tylko z wartości odchylenia.
Brzmi kręcenie głową, prawda? Ale nie martw się, dzięki społeczności Arduino mamy łatwo dostępne biblioteki, które mogą wykonać obliczenia PID, a także uzyskać wartość odchylenia od MPU6050. Biblioteka jest rozwijana odpowiednio przez br3ttb i jrowberg. Przed kontynuowaniem pobierz ich biblioteki z poniższego łącza i dodaj je do katalogu bibliotek Arduino.
github.com/br3ttb/Arduino-PID-Library/blob/master/PID_v1.h
github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Teraz, gdy mamy biblioteki dodane do naszego Arduino IDE. Zacznijmy programować dla naszego samobalansującego robota. Jak zawsze kompletny kod robota wyważającego MPU6050 znajduje się na końcu tej strony, tutaj wyjaśniam tylko najważniejsze fragmenty kodu. Jak wspomniano wcześniej, kod jest zbudowany na podstawie przykładowego kodu MPU6050, po prostu zoptymalizujemy kod do naszych celów i dodamy PID i technikę sterowania dla naszego samobalansującego robota.
Najpierw dołączamy biblioteki wymagane do działania tego programu. Obejmują one wbudowaną bibliotekę I2C, bibliotekę PID i bibliotekę MPU6050, które właśnie pobraliśmy.
#include „I2Cdev.h” #include
Następnie deklarujemy zmienne, które są wymagane do pobrania danych z czujnika MPU6050. Odczytujemy zarówno wektor grawitacji, jak i wartości kwaternionów, a następnie obliczamy nachylenie odchylenia i wartość przechyłu bota. YPR tablica pływak odbędzie wynik końcowy.
// Zmienne kontroli / stanu MPU bool dmpReady = false; // ustawia wartość true, jeśli inicjalizacja DMP zakończyła się pomyślnie uint8_t mpuIntStatus; // przechowuje aktualny bajt statusu przerwania z MPU uint8_t devStatus; // zwraca status po każdej operacji urządzenia (0 = sukces ,! 0 = błąd) uint16_t packetSize; // oczekiwany rozmiar pakietu DMP (domyślnie 42 bajty) uint16_t fifoCount; // liczba wszystkich bajtów w FIFO uint8_t fifoBuffer; // bufor pamięci FIFO // zmienne orientacji / ruchu Quaternion q; // kontener kwaternionu VectorFloat gravity; // wektor grawitacji float ypr; // kontener odchylenie / nachylenie / przechylenie i wektor grawitacji
Następnie pojawia się bardzo ważny segment kodu, w którym będziesz spędzać dużo czasu na strojeniu odpowiedniego zestawu wartości. Jeśli twój robot jest zbudowany z bardzo dobrym środkiem ciężkości, a komponenty są rozmieszczone symetrycznie (co w większości przypadków nie jest), to wartość nastawy będzie wynosić 180. W przeciwnym razie podłącz bota do monitora szeregowego Arduino i przechylaj go do znajdziesz dobrą pozycję wyważenia, odczytaj wartość wyświetlaną na monitorze szeregowym i to jest twoja wartość zadana. Wartość Kp, Kd i Ki musi być dostosowana do twojego bota. Żadne dwa identyczne boty nie będą miały takich samych wartości Kp, Kd i Ki, więc nie ma ucieczki przed tym. Obejrzyj film na końcu tej strony, aby dowiedzieć się, jak dostosować te wartości.
/ ********* Dostrój te 4 wartości dla swojego BOT ********* / double setpoint = 176; // ustawia wartość, gdy bot jest prostopadły do ziemi za pomocą monitora szeregowego. // Przeczytaj dokumentację projektu na circuitdigest.com, aby dowiedzieć się, jak ustawić te wartości double Kp = 21; // Ustaw to pierwsze podwójne Kd = 0.8; // Ustaw tę drugą podwójną Ki = 140; // Na koniec ustaw to / ****** Ustawienie końca wartości ********* /
W następnym wierszu inicjalizujemy algorytm PID, przekazując zmienne wejściowe wejście, wyjście, wartość zadaną, Kp, Ki i Kd. Spośród nich ustawiliśmy już wartości nastaw Kp, Ki i Kd w powyższym fragmencie kodu. Wartość na wejściu będzie bieżącą wartością odchylenia, odczytywaną z czujnika MPU6050, a wartością wyjściową będzie wartość obliczona przez algorytm PID. Zasadniczo algorytm PID da nam wartość wyjściową, której należy użyć do skorygowania wartości wejściowej, aby była zbliżona do wartości zadanej.
PID pid (& wejście, & wyjście, & nastawa, Kp, Ki, Kd, DIRECT);
Wewnątrz funkcji void setup inicjalizujemy MPU6050, konfigurując DMP (Digital Motion Processor). Pomoże nam to w połączeniu danych akcelerometru z danymi żyroskopu i zapewni wiarygodne wartości odchylenia, nachylenia i przechylenia. Nie będziemy się w to zbytnio zagłębiać, ponieważ będzie to daleko poza tematem. W każdym razie jeden segment kodu, który musisz sprawdzić w funkcji konfiguracji, to wartości przesunięcia żyroskopu. Każdy czujnik MPU6050 ma własne wartości przesunięć, możesz użyć tego szkicu Arduino, aby obliczyć wartość przesunięcia czujnika i odpowiednio zaktualizować następujące linie w programie.
// podaj tutaj własne przesunięcia żyroskopów, wyskalowane dla minimalnej czułości mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1688);
Musimy również zainicjować piny Digital PWM, których używamy do podłączenia naszych silników. W naszym przypadku jest to D6, D9, D10 i D11. Więc inicjalizujemy te piny, ponieważ piny wyjściowe powodują, że są one domyślnie LOW.
// inicjalizacji silnika outpu kołki pinMode (6 WYJŚCIE); pinMode (9, WYJŚCIE); pinMode (10, WYJŚCIE); pinMode (11, WYJŚCIE); // Domyślnie wyłącz oba silniki analogWrite (6, LOW); analogWrite (9, LOW); analogWrite (10, LOW); analogWrite (11, LOW);
Wewnątrz funkcji pętli głównej sprawdzamy, czy dane z MPU6050 są gotowe do odczytu . Jeśli tak, używamy go do obliczenia wartości PID, a następnie wyświetlamy wejściową i wyjściową wartość PID na monitorze szeregowym, aby sprawdzić, jak reaguje PID. Następnie na podstawie wartości wyjścia decydujemy, czy bot ma poruszać się do przodu, do tyłu, czy też stać w miejscu.
Ponieważ zakładamy, że MPU6050 zwróci 180, gdy bot będzie wyprostowany. Otrzymamy wartości korekty dodatnie, gdy bot spada do przodu, a ujemne, jeśli bot spada do tyłu. Sprawdzamy więc ten stan i wywołujemy odpowiednie funkcje, aby przesunąć bota do przodu lub do tyłu.
while (! mpuInterrupt && fifoCount <packetSize) { // brak danych mpu - wykonywanie obliczeń PID i wyjście do silników pid.Compute (); // Wydrukuj wartość wejścia i wyjścia na monitorze szeregowym, aby sprawdzić, jak to działa. Serial.print (wejście); Serial.print ("=>"); Serial.println (wyjście); if (input> 150 && input <200) {// Jeśli bot spada if (output> 0) // Falling into front Forward (); // Obróć koła do przodu else if (wyjście <0) // Opadając do tyłu Reverse (); // Obróć koła do tyłu } else // Jeśli Bot nie spada Stop (); // Nie ruszaj kół }
Zmienna wyjściowa PID decyduje także szybkość, z jaką silnik musi być obrócony. Jeśli bot ma właśnie spaść, dokonujemy drobnej korekty, powoli obracając kołem. Jeśli te drobne poprawki nie zadziałają i nadal jeśli bot spada to zwiększamy prędkość silnika. O wartości szybkości obracania się kół decyduje algorytm PI. Zauważ, że w przypadku funkcji Reverse pomnożyliśmy wartość wyjścia przez -1, abyśmy mogli przekonwertować wartość ujemną na dodatnią.
void Forward () // Kod do obracania koła do przodu { analogWrite (6, wyjście); analogWrite (9,0); analogWrite (10, wyjście); analogWrite (11,0); Serial.print („F”); // Informacje o debugowaniu } void Reverse () // Kod obracający koło do tyłu { analogWrite (6,0); analogWrite (9, wyjście * -1); analogWrite (10,0); analogWrite (11, wyjście * -1); Serial.print („R”); } void Stop () // Kod zatrzymujący oba koła { analogWrite (6,0); analogWrite (9,0); analogWrite (10,0); analogWrite (11,0); Serial.print („S”); }
Działanie samobalansującego robota Arduino
Gdy będziesz gotowy ze sprzętem, możesz przesłać kod na swoją płytę Arduino. Upewnij się, że połączenia są prawidłowe, ponieważ używamy akumulatora litowo-jonowego, wymagana jest szczególna ostrożność. Dlatego dokładnie sprawdź, czy nie ma zwarć i upewnij się, że zaciski nie wejdą w kontakt, nawet jeśli twój bot doświadcza niewielkich uderzeń. Włącz moduł i otwórz monitor szeregowy, jeśli Arduino może pomyślnie komunikować się z MPU6050 i jeśli wszystko działa zgodnie z oczekiwaniami, powinieneś zobaczyć następujący ekran.
Tutaj widzimy wartości wejściowe i wyjściowe algorytmu PID w formacie input => output . Jeśli bot jest idealnie zbalansowany, wartość wyjścia będzie wynosić 0. Wartość wejściowa to aktualna wartość z czujnika MPU6050. Alfabet „F” oznacza, że bot porusza się do przodu, a „R” oznacza, że bot porusza się do tyłu.
Na początkowych etapach PID zalecam pozostawienie kabla Arduino podłączonego do bota, aby można było łatwo monitorować wartości wejść i wyjść, a także łatwo było skorygować i przesłać program pod kątem wartości Kp, Ki i Kd. Poniższy film pokazuje pełną pracę bota, a także pokazuje, jak poprawić wartości PID.
Mam nadzieję, że pomoże to w zbudowaniu własnego samobalansującego robota, jeśli masz jakiś problem z uruchomieniem go, a następnie zostaw swoje pytania w sekcji komentarzy poniżej lub skorzystaj z forum, aby uzyskać bardziej techniczne pytania. Jeśli chcesz więcej zabawy, możesz użyć tej samej logiki do zbudowania robota wyważającego piłki.