Kolekcjonujemy roboty samobieżne na Arduino. Gotowe roboty Arduino Do wykonania tarczy potrzebne będą

Porozmawiajmy o tym, jak wykorzystać Arduino do stworzenia robota, który balansuje jak Segway.

Segway z języka angielskiego. Segway to dwukołowy pojazd stojący wyposażony w napęd elektryczny. Nazywa się je również żyroskopami lub hulajnogami elektrycznymi.

Czy zastanawiałeś się kiedyś, jak działa Segway? W tym samouczku postaramy się pokazać, jak zbudować robota Arduino, który utrzymuje równowagę jak Segway.

Aby robot zrównoważył, silniki muszą przeciwdziałać upadkowi robota. To działanie wymaga informacji zwrotnej i elementów korygujących. Element sprzężenia zwrotnego - , który zapewnia zarówno przyspieszenie, jak i obrót we wszystkich trzech osiach (). Arduino wykorzystuje to do poznania aktualnej orientacji robota. Elementem korygującym jest połączenie silnika i koła.

Efekt końcowy powinien wyglądać mniej więcej tak:

Schemat robota

Moduł sterownika silnika L298N:

Silnik przekładniowy prądu stałego z kołem:

Robot samobalansujący to zasadniczo odwrócone wahadło. Można go lepiej wyważyć, jeśli środek masy jest wyżej w stosunku do osi kół. Wyższy środek masy oznacza większy moment bezwładności masy, co odpowiada mniejszemu przyspieszeniu kątowemu (wolniejszemu opadaniu). Dlatego umieściliśmy akumulator na górze. Wysokość robota została jednak dobrana w oparciu o dostępność materiałów 🙂

Gotową wersję robota samobalansującego można zobaczyć na powyższym rysunku. Na górze znajduje się sześć akumulatorów Ni-Cd zapewniających zasilanie płytka drukowana. Pomiędzy silnikami sterownik silnika wykorzystuje akumulator 9 V.

Teoria

W teorii sterowania utrzymanie jakiejś zmiennej (w tym przypadku pozycji robota) wymaga specjalnego kontrolera zwanego PID (Proportional Całkowanie Derivative). Każdy z tych parametrów ma „wzmocnienie”, powszechnie określane jako Kp, Ki i Kd. PID zapewnia korektę pomiędzy wartością żądaną (lub wartością wejściową) a wartością rzeczywistą (lub wartością wyjściową). Różnica między wejściem a wyjściem nazywa się „błędem”.

Regulator PID redukuje błąd do najmniejszej możliwej wartości poprzez ciągłą regulację mocy wyjściowej. W naszym samobalansującym robocie Arduino wejście (czyli pożądane nachylenie w stopniach) jest ustawiane przez oprogramowanie. MPU6050 odczytuje aktualne nachylenie robota i wprowadza je do algorytmu PID, który wykonuje obliczenia w celu sterowania silnikiem i utrzymania robota w pozycji pionowej.

PID wymaga ustawienia wartości Kp, Ki i Kd na wartości optymalne. Inżynierowie używają oprogramowanie, takie jak MATLAB, aby automatycznie obliczyć te wartości. Niestety w naszym przypadku nie możemy zastosować MATLAB-a, gdyż jeszcze bardziej skomplikuje to projekt. Zamiast tego dostroimy wartości PID. Oto jak to zrobić:

  1. Ustaw Kp, Ki i Kd na zero.
  2. Dostosuj Kp. Zbyt małe Kp spowoduje upadek robota, ponieważ naprawa nie wystarczy. Za dużo Kp powoduje, że robot wariuje tam i z powrotem. Dobre Kp sprawi, że robot będzie się trochę przechylał do przodu i do tyłu (lub trochę oscylował).
  3. Po ustawieniu Kp należy wyregulować Kd. Dobra wartość Kd zmniejszy oscylacje, aż robot będzie prawie stabilny. Ponadto odpowiednie Kd utrzyma robota nawet po naciśnięciu.
  4. Na koniec zainstaluj Ki. Po włączeniu robot będzie oscylował, nawet jeśli ustawione są Kp i Kd, ale z czasem ustabilizuje się. Właściwa wartość Ki ​​skróci czas potrzebny do stabilizacji robota.

Zachowanie robota można zobaczyć poniżej na filmie:

Kod Arduino dla robota samobalansującego

Do stworzenia naszego robota potrzebowaliśmy czterech zewnętrznych bibliotek. Biblioteka PID ułatwia obliczanie wartości P, I i D. Biblioteka LMotorController służy do sterowania dwoma silnikami za pomocą modułu L298N. Biblioteka I2Cdev oraz biblioteka MPU6050_6_Axis_MotionApps20 przeznaczone są do odczytu danych z MPU6050. Możesz pobrać kod wraz z bibliotekami w tym repozytorium.

#włączać #włączać #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #define MIN_ABS_SPEED 20 MPU6050 mpu; // Sterowanie MPU/status vars bool dmpReady = false; // ustaw true, jeśli inicjacja DMP zakończyła się pomyślnie uint8_t mpuIntStatus; // przechowuje aktualny bajt stanu przerwania z MPU uint8_t devStatus; // zwraca status po każdej operacji na urządzeniu (0 = sukces, !0 = błąd) uint16_t packageSize; // oczekiwany rozmiar pakietu DMP (domyślnie 42 bajty) uint16_t fifoCount; // liczba wszystkich bajtów aktualnie w FIFO uint8_t fifoBuffer; // Bufor pamięci FIFO // orientacja/ruch vars Quaternion q; // kontener kwaternionowy VectorFloat grawitacyjny; // pływak wektora grawitacji ypr; // odchylenie/pochylenie/przechylenie kontenera i wektor grawitacji //podwójny oryginalny PID wartość zadana = 173; podwójna wartość zadana = pierwotna wartość zadana; podwójne ruchomeAngleOffset = 0,1; podwójne wejście, wyjście; //dostosuj te wartości do własnego projektu podwójne Kp = 50; podwójne Kd = 1,4; podwójne Ki = 60; PID pid(&wejście, &wyjście, &nastawa, Kp, Ki, Kd, ​​​​DIRECT); podwójny silnikSpeedFactorLeft = 0,6; podwójny silnikSpeedFactorRight = 0,5; //STEROWNIK SILNIKA int ENA = 5; int IN1 = 6; int IN2 = 7; int IN3 = 8; int IN4 = 9; int ENB = 10; LMotorController motorController(ENA, IN1, IN2, ENB, IN3, IN4, motorSpeedFactorLeft, motorSpeedFactorRight); lotny bool mpuInterrupt = false; // wskazuje, czy pin przerwania MPU osiągnął wysoki poziom void dmpDataReady() ( mpuInterrupt = true; ) void setup() ( // dołącz do magistrali I2C (biblioteka I2Cdev nie robi tego automatycznie) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin( ); TWBR = 24; // Zegar I2C 400 kHz (200 kHz, jeśli procesor ma 8 MHz) #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif mpu.initialize(); devStatus = mpu.dmpInitialize(); // podaj tutaj własne przesunięcia żyroskopu, skalowane dla minimalnej czułości mpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); // Domyślne ustawienie fabryczne 1688 dla mojego testu chip // upewnij się, że zadziałało (zwraca 0, jeśli tak) if (devStatus == 0) ( // włącz DMP, teraz gdy jest gotowy mpu.setDMPEnabled(true); // włącz wykrywanie przerwań Arduino załącznikInterrupt(0 , dmpDataReady , RISING); mpuIntStatus = mpu.getIntStatus(); // ustaw naszą flagę gotowości DMP, aby główna funkcja pętli() wiedziała, że ​​można jej użyć dmpReady = true; // uzyskaj oczekiwany rozmiar pakietu DMP do późniejszego porównania packageSize = mpu.dmpGetFIFOPacketSize(); //ustaw PID pid.SetMode (AUTOMATYCZNY); pid.SetSampleTime(10); pid. SetOutputLimits(-255, 255); ) else ( // BŁĄD! // 1 = początkowe ładowanie pamięci nie powiodło się // 2 = aktualizacja konfiguracji DMP nie powiodła się // (jeśli nastąpi awaria, zwykle kod będzie 1) Serial.print(F("Inicjalizacja DMP nie powiodło się (kod ")); Serial.print(devStatus); Serial.println(F(")")); ) ) void pętli() ( // jeśli programowanie się nie powiodło, nie próbuj nic robić, jeśli (!dmpReady ) return; // czekaj na przerwanie MPU lub dodatkowe pakiety dostępne podczas (!mpuInterrupt && fifoCount< packetSize) { //no mpu data - performing PID calculations and output to motors pid.Compute(); motorController.move(output, MIN_ABS_SPEED); } // reset interrupt flag and get INT_STATUS byte mpuInterrupt = false; mpuIntStatus = mpu.getIntStatus(); // get current FIFO count fifoCount = mpu.getFIFOCount(); // check for overflow (this should never happen unless our code is too inefficient) if ((mpuIntStatus & 0x10) || fifoCount == 1024) { // reset so we can continue cleanly mpu.resetFIFO(); Serial.println(F("FIFO overflow!")); // otherwise, check for DMP data ready interrupt (this should happen frequently) } else if (mpuIntStatus & 0x02) { // wait for correct available data length, should be a VERY short wait while (fifoCount < packetSize) fifoCount = mpu.getFIFOCount(); // read a packet from FIFO mpu.getFIFOBytes(fifoBuffer, packetSize); // track FIFO count here in case there is >Dostępny 1 pakiet // (pozwala nam to od razu przeczytać więcej bez czekania na przerwanie) fifoCount -= rozmiar pakietu; mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&grawitacja, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); wejście = ypr * 180/M_PI + 180; ) )

Wartości Kp, Ki, Kd mogą działać lub nie. Jeśli tak się nie stanie, wykonaj powyższe kroki. Należy pamiętać, że pochylenie w kodzie jest ustawione na 173 stopnie. Jeśli chcesz, możesz zmienić tę wartość, ale pamiętaj, że jest to kąt, który robot musi podtrzymywać. Ponadto, jeśli silniki są zbyt szybkie, możesz dostosować wartości motorSpeedFactorLeft i motorSpeedFactorRight.

To wszystko na teraz. Do zobaczenia.

W tym artykule zbudujemy naszego robota od podstaw. Co otrzymamy, patrz zdjęcie poniżej. Robot będzie jeździł zarówno samodzielnie, jak i pod kontrolą smartfona. Przyjrzymy się także budowie od podstaw własnego robota mobilnego.

3 DDrukarka

Jeśli chcę zbudować robota, muszę zdecydować się na platformę, na której zainstaluję silniki, płytki, akumulatory. Oczywiście mogę kupić gotową wersję, ale ciekawsze jest samodzielne wykonanie platformy. Taka platforma z pewnością spełni Twoje wymagania. Platformę można wykonać z org. Szkło, sklejka, a ja zrobię to z plastiku.

Można powiedzieć, że samodzielne wykonanie platformy jest niewygodne i będziesz potrzebować wielu narzędzi, od stempla po maszyna do mielenia. A ja mówię, że potrzebna jest wyobraźnia i drukarka 3D.

drukarka 3d? Każdy zapewne zna zwykłą drukarkę biurową, która może wydrukować potrzebny nam tekst na formacie A4. Zatem drukarka 3D to drukarka, która może wydrukować żądaną część. Istnieją różne drukarki 3D. Posiadam drukarkę z technologią FDM (osadzanie warstwa po warstwie). Jakie inne technologie druku 3d są dostępne, można znaleźć w Internecie.

Wiele drukarek 3D działa na Arduino. Jeśli chcesz, możesz zbudować własną drukarkę 3D. Główną ideą drukarki 3D jest to, że możesz wydrukować absolutnie wszystko, ale my wydrukujemy ciało robota.

Najpierw zdefiniujmy opis platformy. Chcę, aby platforma była dwukołowa i musiała zmieścić Arduino, zasilanie, silniki i niektóre czujniki.

Teraz musisz narysować układ platformy na papierze i umieścić na nim niezbędne komponenty. Na przykład tak.

Gdy układ będzie już gotowy, konieczne będzie wykonanie modelu 3D platformy. Jest do tego wiele programów. Zwykle używam. Nie będę uczył, jak pracować z Kompasem, ale jeśli jesteś zainteresowany, możesz zajrzeć do Internetu lub poprosić w komentarzach o lekcję na temat Kompasu.

To jest platforma, którą wymyśliłem.

Następnie należy przekonwertować model 3D na kod G zrozumiały dla drukarki 3D. W tym celu istnieją specjalne programy - krajalnice. Używam programu Repetier-Host z fragmentatorem Sli3er. Oto jak wygląda część gotowa do druku.

A oto wydrukowany model.

Dopiero niedawno wpadliśmy na pomysł, a gotowa część już przed nami. Za pomocą drukarki 3D możesz stworzyć niepowtarzalne rzeczy w pojedynczych egzemplarzach. Drukarka 3D jest świetna. Radzę wszystkim!

Motoryzacja

Teraz musimy pomyśleć o tym, jak będzie się poruszał nasz robot mobilny. Pierwsze co przychodzi na myśl to koła. Więc zróbmy to.

Jeśli ktoś pamięta, próbowaliśmy już podłączyć silnik do Arduino. Kto nie pamięta, nie wie lub nie czytał – spójrzcie. Podłączenie silnika za pomocą MOSFET-u ma istotne wady - nie można szybko zmienić prędkości i kierunku obrotu. Czas nauczyć Arduino prawdziwego sterowania silnikami!

Aby to zrobić, możesz użyć układu L293D. L293D pozwala na sterowanie dwoma silnikami jednocześnie, prądem 600 mA na kanał i prądem szczytowym do 1000 mA, a w przypadku połączenia kanałów to do 1200 mA i 2000 mA prądu szczytowego. Poniżej opowiem o stowarzyszeniu.

Na początek, jak zawsze, powinieneś zajrzeć do arkusza danych, aby dowiedzieć się, gdzie i co podłączyć. Jeśli nie wiesz o mikroukładach, warto przeczytać artykuł.

Zacznijmy. Złóżmy prosty schemat z jednym silnikiem i sterujmy nim. Zwróć uwagę na schemat montażu.

Jeśli nie znasz języka angielskiego lub po prostu nie rozumiesz arkusza danych, oto opis połączenia. Mam nadzieję, że wszyscy znają numerację mikroukładów lub nauczyli się z artykułu o mikroukładach.

  • Pin 1 - Odpowiedzialny za prędkość obrotową silnika. Podobny jest na pinie 9. Przyjmuje wartości od 0 do 255, co można łatwo uporządkować za pomocą PWM. EN podłączyłem do piątego pinu Arduino, które obsługuje PWM.
  • Piny 2 i 7 - Odpowiadają za kierunek ruchu silnika. Podobne są na pinach 10 i 15. Przyłożenie logicznej jedynki do jednego z tych pinów spowoduje, że silnik będzie kręcił się w jednym kierunku (w zależności od podłączenia silnika), natomiast dołożenie logicznej jedynki do drugiego spowoduje, że silnik będzie się obracał przeciwny kierunek.
  • Piny 3 i 6 - Trzeba do nich podłączyć silnik. Polaryzacja nie jest istotna, jedynie kierunek obrotu będzie zależał od połączenia. Podobnie - na pinach 11 i 14.
  • Piny 4 i 5 są uziemione. Myślę, że nie trzeba tego wyjaśniać. Podobne - 12 i 13.
  • Pin 8 - Zasilanie silników. Musi być zasilany napięciem z zakresu od 4,5 do 36 woltów.
  • Pin 16 - zasilana jest do niego jednostka logiczna z Arduino. 5 woltów, jeśli w ogóle.

Świetnie! Silnik jest podłączony. Teraz możesz kodować.

#define FRW_BUT 7 //Przycisk Do przodu #define BCW_BUT 6 //Przycisk Wstecz #define SPD 5 //Kontrola prędkości obrotowej... #define FRW 4 //...kierunek obrotu (do przodu)... # zdefiniuj BCW 3 / /...kierunek obrotu (do tyłu) #define SPD_POT A5 int xspeed = 0; //Zmienna określająca prędkość obrotową silnika int frw_move = 0; //Zmienna dla polecenia „do przodu” int bcw_move = 0; //Zmienna dla polecenia „wstecz” void setup() ( //Projekt pinów pinMode(SPD, OUTPUT); pinMode(FRW, OUTPUT); pinMode(BCW, OUTPUT); pinMode(SPD_POT, INPUT); pinMode(FRW_BUT, INPUT_PULLUP ); pinMode(BCW_BUT, INPUT_PULLUP); ) void pętli() ( //Odczytaj odczyty z potencjometru //i sprowadź je do żądanego zakresu - od 0 do 255 //Potem - przekaż go na pin kontroli prędkości xspeed = analogRead(SPD_POT); constraint(xspeed, 0, 1023); xspeed = map(xspeed, 0, 1023, 0, 255); //Określ naciśnięcie przycisku „do przodu” if(!digitalRead(FRW_BUT)) ( frw_move = 1; ) else ( frw_move = 0; ) //Określ naciśnięcie przycisku „wstecz” if(!digitalRead(BCW_BUT)) ( bcw_move = 1; ) else ( bcw_move = 0; ) //Wywołaj funkcję, aby wysłać dane do L293D motor(); ) void motor() ( //Wyślij dane do L293D analogWrite(SPD, xspeed); digitalWrite(FRW, frw_move); digitalWrite(BCW,bcw_move); )

Jak to działa? To działa po prostu. Po naciśnięciu lewego przycisku koło obraca się w jednym kierunku, a po naciśnięciu prawego przycisku – w drugim kierunku. Obracając pokrętłem potencjometru można regulować prędkość obrotową silnika. Działanie naszego stanowiska do badania silników pokazano na filmie.

Z.Y. Tak, wiem, że jakość filmu nie jest najlepsza, ale postaram się jak najszybciej znaleźć porządny aparat i zorganizować miejsce do nagrywania.

Teraz o połączeniu kanałów L293. Jeśli chcesz podłączyć mocniejszy silnik, możesz połączyć kanały.

Pierwszy sposób polega na równoległym połączeniu analogicznych wyjść mikroukładu, co dwukrotnie zwiększy maksymalne natężenie prądu. Minus - do jednego mikroukładu można podłączyć tylko jeden silnik.

Drugi sposób polega na przylutowaniu kolejnego L293 na L293. Bierzemy i lutujemy pin 1 do pinu 1, pin 2 do pinu 2 i tak dalej. Metoda ta również daje dwukrotne zwiększenie siły prądu, lecz w odróżnieniu od pierwszej pozostawia możliwość sterowania dwoma silnikami jednocześnie. Być może masz pomysł - czy powinienem przylutować jeszcze kilka L293? Niestety późniejsze lutowanie mikroukładów nie doprowadzi do wzrostu natężenia prądu o kolejne 600 mA. Podwyżka będzie niewielka.

„Ech, będę musiał posprzątać mój 12-woltowy silnik…” Nie denerwuj się. W przypadku mocniejszych silników odpowiedni jest starszy brat L293 - L298, ale teraz nie będziemy tego rozważać. Zrobimy to trochę później.

Silnik Tarcza

Zgadzam się, że przy takiej wiązce przewodów wszystko wygląda niezbyt dobrze. Aby się go pozbyć można wlutować obwód z L293 na płytkę drukowaną lub płytkę stykową do lutowania, ale co jeśli nie chce się lutować lub nie wiem jak? Do tego istnieją rozwiązania pod klucz w postaci nakładki np. dla Arduino. Opowiem o jednym z nich – Motor Shield V1 firmy DK Electronics.

Tutaj faktycznie jest zdjęcie tarczy.

Tarcza ta posiada dwa L293D, co pozwala na sterowanie czterema silnikami jednocześnie. Istnieją również dwa styki dla serwomotorów. Zasilanie dostarczane jest albo do listwy zaciskowej, albo po założeniu zworki, z zasilacza Arduino. Zworka umożliwia także przejęcie zasilania Arduino z tarczy. Istnieje specjalna biblioteka do pracy z tą tarczą. Możesz go pobrać.

Do minusów planszy. Do współpracy z tarczą wykorzystywane są prawie wszystkie piny cyfrowe, za wyjątkiem 0, 1, 2, 13. Jak wiemy, piny 0 i 1 są wykorzystywane przez Arduino do oprogramowania, więc lepiej ich nie używać.

Jest też dobra strona. Jeśli nie podłączysz serwa np. piny 9 i 10 zostaną zwolnione, a jeśli nie będziesz używać żadnego z silników, to zwolnione zostaną piny 3, 5, 6, 11, w zależności od nieużywanego silnika. I dalej. Nadal mamy do dyspozycji sześć wyjść analogowych, które w razie potrzeby można wykorzystać jako cyfrowe.

Zacznijmy podłączać silniki. Na potrzeby eksperymentu zrobimy robota, który porusza się do przodu, do tyłu, a także obraca się wokół własnej osi. Jako platformę przyjąłem własny rozwój opisany powyżej. Możesz wziąć wszystko, czego dusza zapragnie, najważniejsze jest to, że jest odpowiedni pod względem cech.

Będziemy potrzebować

  • Arduino UNO — można zastosować dowolny inny format Arduino UNO. Na przykład Leonardo czy Iskra.
  • Osłona silnika — inne wersje tej osłony będą działać.
  • Silniki na 6 V - Możesz wziąć dowolne, które odpowiadają charakterystyce osłony silnika.
  • Koła 42 mm – koła pasujące do silników i platformy
  • Mocowania silnika — silniki muszą być przymocowane do platformy. Weź ten, który Ci odpowiada.
  • Zasilanie - wziąłem akumulator i wyszło około 5 V, co nie wystarcza do zasilenia silników i Arduino, więc podłączyłem przetwornicę DC/DC i podniosłem napięcie do 9 V. Jeśli nie ma konwertera, możesz użyć zwykłej korony, podłączając ją do zasilacza Arduino.

Czas złożyć naszego robota.

Krok 1

Łączymy Arduino i Motor Shield.

Krok 2

Montujemy silniki i mocujemy je do platformy.

Krok 3

Energię zbieramy poprzez konwerter podwyższający.

Dla tych, którzy mają Cronę. Nie zapomnij o swetrze!

Krok 4

Mocujemy silniki do Motor Shield za pomocą Arduino.

Krok 5

Dodajemy jedzenie.

Krok 6 (opcjonalnie)

Załóż pokrywkę - dla estetyki.

Mamy gotowego robota. Teraz czas go zaprogramować. Spójrzmy na kod.

//Dołącz bibliotekę do pracy z Motor Shield #include //Określ lewy silnik na listwie zaciskowej numer 2 AF_DCMotor l_motor(2); //Zdefiniuj odpowiedni silnik do listwy zaciskowej numer 3 AF_DCMotor r_motor(3); //Zmienne określające prędkość //i czas ruchu int spd = 50; czas całkowity(1000); void setup() ( //Ustaw prędkość początkową i wyłącz silniki l_motor.setSpeed(spd); l_motor.run(RELEASE); r_motor.setSpeed(100); r_motor.run(RELEASE); ) void pętla() ( // Jedź do przodu l_motor.run(FORWARD); r_motor.run(FORWARD); l_motor.setSpeed(spd); r_motor.setSpeed(spd); opóźnienie(czas); // Jedź do tyłu l_motor.run(BACKWARD); r_motor. run(BACKWARD ); l_motor.setSpeed(spd); r_motor.setSpeed(spd); opóźnienie(czas); // Obróć przeciwnie do ruchu wskazówek zegara l_motor.run(FORWARD); r_motor.run(BACKWARD); l_motor.setSpeed(spd); r_motor .setSpeed(spd); opóźnienie(czas); // Obróć zgodnie z ruchem wskazówek zegara r_motor.run(FORWARD); l_motor.run(BACKWARD); l_motor.setSpeed(spd); r_motor.setSpeed(spd); opóźnienie(czas); )

Świetnie! Czas sprawdzić. Oto film z mojego testu. Co z tobą?

„Wspominałeś coś o tablicach robotyki?” - mogą powiedzieć ci, którzy przeczytali lekcję wprowadzającą części 2 kursu. Tak, są takie opłaty. Rozważ platformę robotyczną Strela.

Sen o robotyce. (Prawie). Opisałem zalety deski. Od razu do rzeczy.

Na nim zainstalowany jest starszy brat L293 - L298. A piny są wyświetlane potrójnie, co jest w sam raz do podłączenia wielu czujników.

Płytkę tę można podłączyć zamiast Arduino UNO i Motor Shield. Dodatkowo chłopaki z Amperki napisali bibliotekę do pracy z Arrowem, co sprawia, że ​​sterowanie silnikami jest zadaniem raczej banalnym.

Tym, którzy nie wiedzą, powiem. Każda normalna biblioteka ma przykłady jej użycia, a biblioteka Arrow nie jest wyjątkiem. Aby je znaleźć przejdź do zakładki Plik -> Przykłady -> Strela. Tam wybieramy przykład StrelaMotors, w którym wykonywany jest szkic podobny do szkicu przy użyciu osłony silnika. Nawiasem mówiąc, istnieją również przykłady Motor Shield. Jeśli jesteś zainteresowany, zajrzyj.

Co jeszcze możesz zrobić ze Arrowem – zobacz poniżej.I przechodzimy do komunikacji bezprzewodowej poprzez Bluetooth.

Bluetooth

Robot, który sam jeździ po pomieszczeniu jest oczywiście dobry, ale chciałbym sam nim sterować. Aby to zrobić, musisz zorganizować połączenie pomiędzy Arduino a urządzeniem sterującym.

Jako urządzenie sterujące wybrałem smartfon. Komunikację zorganizujemy za pomocą protokołu Bluetooth, zatem czas na zapoznanie się.

To jest moduł HC-06. Nie będę wdawał się w szczegóły, ale jeśli jesteś zainteresowany, przejdźmy dalej. Naszym celem jest sterowanie robotem ze smartfona. Może zacznijmy.

Najpierw musisz podłączyć HC-06 do Arduino. Połączymy się za pomocą oprogramowania Serial. Ta biblioteka pozwala emulować port szeregowy na potrzebnych nam pinach. Dla eksperymentu spróbujmy to zrobić na pinach A0(RX) i A1(TX). Po co? Pamiętaj, co mówiłem o Motor Shield.

Łączymy w ten sposób:

  • Vcc - do 5 V
  • GND do GND
  • RX do TX
  • TX do RX

Podłączę HC-06 do robota, który zbudowaliśmy powyżej. Aby to zrobić, użyjemy trzech pasków na tarczy silnika.

Robot jest gotowy. Pozostaje go zaprogramować.

Zanim przeczytasz kod, musisz wiedzieć kilka rzeczy. Silniki nie są idealne, jak wszystko inne na tym świecie. Nawet dwa silniki z tej samej partii następujące po sobie będą się nieco różnić co będzie miało wpływ na różnicę w liczbie obrotów przy tym samym napięciu. Jeśli silniki zostaną po prostu podłączone do osłony silnika i zostanie do nich przyłożona ta sama prędkość i to samo napięcie, wówczas robot nie pojedzie prosto, ale trochę lub dużo w bok. Można to zobaczyć na powyższym filmie.

Aby tego uniknąć, zastosujemy współczynniki korygujące. Moje lewe koło kręci się znacznie szybciej niż prawe, więc dla kompensacji zastosowałem współczynnik 0,62. Wartość współczynnika dobierana jest eksperymentalnie.

// Dołącz biblioteki do pracy z osłoną silnika i numerem seryjnym oprogramowania #include #włączać //Określ piny dla emulacji SoftwareSerial mySerial(A0, A1); // RX, TX //Zdefiniuj lewy silnik do zacisku nr 2 AF_DCMotor l_motor(2); //Zdefiniuj odpowiedni silnik do listwy zaciskowej nr 3 AF_DCMotor r_motor(3); //Zmienne do określenia prędkości //i regulacji obrotów float spd = 70.0; float corr_l = 0,62; float corr_r = 1; pływak = 50,0; void setup() ( //Ustaw prędkość początkową i wyłącz silniki l_motor.setSpeed(spd); l_motor.run(RELEASE); r_motor.setSpeed(spd); r_motor.run(RELEASE); //Ustanów połączenie z HC-06 mySerial .begin(9600); ) void pętli() ( //Jeśli istnieją dane, //wywołaj funkcję sterującą if (mySerial.available()) ( drive(); ) ) void drive() ( //Zmienna dla dane przychodzące char control = mySerial.read(); //Ustaw najpierw prędkość if (((control - „0”) >= 0) && ((control - „0”)<= 9)) { spd = (control - "0") * 25.0; //сохраняем новое значение скорости } else if (control == "q") { spd = 255.0; } //Сравниваем команды, пришедшие со смартфона else if (control == "S") //Если пришла команда "S", стоим { l_motor.run(RELEASE); r_motor. run(RELEASE); } else if (control == "F") //Если пришла команда "F", едем вперед { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r); r_motor.run(FORWARD); l_motor.run(FORWARD); } else if (control == "B") //Если пришла команда "B", едем назад { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r); r_motor.run(BACKWARD); l_motor.run(BACKWARD); } else if (control == "I") //Если пришла команда "I", едем вперёд и направо { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r + rot); r_motor.run(FORWARD); l_motor.run(FORWARD); } else if (control == "J")//Если пришла команда "J", едем назад и направо { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r + rot); r_motor.run(BACKWARD); l_motor.run(BACKWARD); } else if (control == "G") //Если пришла команда "G", едем вперёд и налево { l_motor.setSpeed(spd * corr_l + rot); r_motor.setSpeed(spd * corr_r); r_motor.run(FORWARD); l_motor.run(FORWARD); } else if (control == "H") //Если пришла команда "H", едем назад и налево { l_motor.setSpeed(spd * corr_l + rot); r_motor.setSpeed(spd * corr_r); r_motor.run(BACKWARD); l_motor.run(BACKWARD); } else if (control == "R") //Если пришла команда "R", крутимся вправо { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r); r_motor.run(FORWARD); l_motor.run(BACKWARD); } else if (control = "L") //Если пришла команда "L", крутимся влево { l_motor.setSpeed(spd * corr_l); r_motor.setSpeed(spd * corr_r); l_motor.run(FORWARD); r_motor.run(BACKWARD); } }

Zapytano robota. Weźmy teraz smartfon.

Kontroler RC

Istnieje wiele różnych aplikacji umożliwiających połączenie Arduino ze smartfonem poprzez Bluetooth. W wyszukiwaniu słowami kluczowymi będą: Arduino, Bluetooth, RC.

Wybrałem aplikację o nazwie Bluetooth RC Controller. Jest idealny do naszych celów. Po naciśnięciu przycisku aplikacja wysyła wartość char do HC-06, który z kolei przekazuje przychodzącą wartość do Arduino. Wartość wysyłana po kliknięciu przycisku jest ustawiana automatycznie.

Aby nawiązać połączenie z robotem należy kliknąć na zębatkę i wybrać „Ustawienia”. W „Ustawieniach” należy upewnić się, że przyciski odpowiadają wysłanym znakom, lub zmienić kod Arduino.

Po ustawieniu znaków można nawiązać połączenie z HC-06. Kliknij koło zębate i przejdź do „Połącz z samochodem”. Otworzy się okno ze sparowanymi urządzeniami. Wybieramy w nim HC-06. Jeśli go tam nie ma, szukamy go za pomocą „Skanuj w poszukiwaniu urządzeń”. Jeśli urządzenie zostanie znalezione, ale nie chce się sparować, przejdź do Bluetooth w swoim smartfonie i sparuj w zwykły sposób. Domyślne hasło to 1234. Następnie przejdź do „Skanuj w poszukiwaniu urządzeń” i połącz się.

Po nawiązaniu połączenia zielona lampka na górze zaświeci się, a HC-06 przestanie migać. Możesz zacząć jeździć. Pasek na górze odpowiada za szybkość ruchu.

Wróćmy do Arrowa. Kolejną zaletą Arrowa jest możliwość instalacji formatu Bluetooth XBee, a plusem jest to, że pozostałe piny pozostają wolne. A ponieważ istnieje gotowa biblioteka dla Arrowa, która pomaga zredukować kod do sterowania silnikami, bardzo warto wykorzystać Arrow do sterowania robotem poprzez Bluetooth.

W tym celu należy podłączyć XBee do Streli, sflashować go szkicem z przykładów o nazwie „ArduinoBluetoothRCCarOnStrela” i połączyć się z XBee poprzez kontroler RC.

Porada

Mój robot jest gotowy i nawet jeździ na polecenie ze smartfona. Ale nie wszystko może pójść gładko. Opowiem o niektórych problemach i ich rozwiązaniach, a także udzielę kilku rad początkującym robotykom.

Koła kręcą się w złym kierunku- problem ten można łatwo wyeliminować przestawiając przewody w listwach zaciskowych lub programowo.

Moduł Bluetooth nie działa- należy sprawdzić obecność świecącej się czerwonej diody LED na module. Jeśli nie świeci, sprawdź, czy moduł Bluetooth jest prawidłowo podłączony. Jeśli dioda świeci, ale połączenie zostało nawiązane, należy upewnić się, że RX modułu jest podłączone do TX płytki i odwrotnie, a także spróbować metody sparowania modułu z Arduino poprzez standard Interfejs Bluetooth.

Robot nie jedzie prosto- Opisałem ten problem nieco wyżej, gdy mówiłem o Bluetooth i Motor Shield.

Podczas jazdy robot nagle się zatrzymuje i traci połączenieHC-06- Wystąpił problem z zasilaniem. Wiemy, że Arduino do stabilnej pracy potrzebuje co najmniej 7V, wiemy też, że silniki jedzą bardzo dobrze. Jeśli przyłożysz sondy multimetru do zacisków zasilania i zmierzysz napięcie przy wyłączonych silnikach, a następnie je włączysz, zobaczysz, że napięcie na multimetrze spadnie. Co więcej, napięcie może spadać na różne sposoby.

Jeśli podłączony zostanie zasilacz, który nie jest w stanie zapewnić wystarczającej ilości prądu dla silników, napięcie może znacznie spaść, na przykład z 9 do 5 woltów, a 5 V nie będzie już wystarczające dla Arduino i uruchomi się ponownie. Rozwiązaniem jest podłączenie mocniejszego zasilacza. Jak obliczyć, powiem poniżej.

Jeśli podłączysz mocniejsze źródło zasilania, spadek napięcia może trwać tylko kilka milisekund, ale może wystarczyć do ponownego uruchomienia sterownika. Rozwiązaniem jest zainstalowanie kondensatora o pojemności co najmniej 1000 uF równolegle z przewodami zasilającymi, pojemność można określić eksperymentalnie. Ustawiłem kondensator na 3300 uF i na 16 V. Nie zapomnij spojrzeć na maksymalne napięcie kondensatora.

Gdy zasilacz jest wystarczająco mocny, spadek napięcia nie przekracza 0,2 V.

Kilka wskazówek dla początkujących robotyków

Rozpoczynając układanie robota, pierwszą rzeczą, którą należy zrobić, to zająć się obliczeniem mocy jednostki napędowej i wyborem odpowiedniego źródła zasilania. Szkoda by było, gdyby 4 baterie AAA nie zasiliły Twoich 4 silników 6V, a na większy zasilacz nie byłoby już miejsca.

Aby obliczyć moc, szukamy charakterystyk silników, płytek, czujników. Z fizyki wiemy, że moc można obliczyć ze wzoru P = IU, gdzie I to natężenie prądu, U to napięcie. Korzystając z tego wzoru i charakterystyki, łatwo jest obliczyć pobór mocy gotowego urządzenia, a znając pobór mocy i napięcie robocze zasilacza, można znaleźć optymalną siłę prądu wymaganą do działania urządzenia, znając prąd siłę, możesz określić wymaganą pojemność akumulatora i czas pracy urządzenia z wybranego akumulatora.

Jak mówiłem, zawsze należy wyznaczyć konkretny cel, po osiągnięciu którego projekt można uznać za zakończony. Ta myśl ma swoje niuanse. Jeśli projekt jest wystarczająco duży, to dotarcie do celu nie jest takie proste, szczególnie przy pisaniu kodu. Kiedy już napisałem duży kod, pomyślałem: „Teraz napiszę wszystko i sprawdzę! ' podczas próby skompilowania kodu nie udało się go od razu skompilować, ponieważ wystąpiło kilka błędów. Usunąłem błędy, lecz jedynie kod nie działał tak jak chciałem. Musiałem wszystko napisać od nowa niemal od zera, stopniowo dodając kod i sprawdzając powstały kod pod kątem funkcjonalności. Dlatego radzę ci zrobić to samo.

Jeśli celem jest utworzenie „hasła” składającego się z trzech znaków, nie należy programować wszystkich trzech na raz. Lepiej jest utworzyć hasło z jednego znaku, sprawdzić je, następnie z dwóch, a po weryfikacji - z trzech. Pomaga mi.

Robot powstaje metodą prób i błędów. Nie da się jednorazowo zaprogramować, aby akcja została wykonana perfekcyjnie. Na kołach są te same współczynniki tuningu, więc nie należy się poddawać, jeśli coś nie wyjdzie, a jeśli w ogóle nie wyjdzie, to możesz zwrócić się do życzliwych ludzi na forach lub napisać do mnie, my na pewno pomoże!

Wniosek

Robotyka jest niesamowita! Myślę, że wkrótce roboty zajmą, a nawet już zagościły w życiu ludzi. Zrobiliśmy najprostszego robota-samochodu sterowanego ze smartfona, później zajmiemy się poważniejszymi projektami, ale na razie - do zobaczenia!

Naukę Arduino rozpoczynają od tworzenia prostych robotów. Dzisiaj opowiem o najprostszym robocie na arduino uno, który niczym pies będzie podążał za Twoją ręką lub jakimkolwiek innym obiektem odbijającym światło podczerwone. Ponadto ten robot będzie bawić dzieci. Mój 3-letni siostrzeniec chętnie bawił się robotem :)

Zacznę od wyszczególnienia części, które będą potrzebne przy budowie – Arduino UNO;

Dalmierze na podczerwień;

- Silniki 3 V ze skrzyniami biegów i kołami;

- złącza do akumulatorów 3A;

-bateria (jeśli nie ma wystarczającej liczby baterii);

- Przekaźnik do sterowania silnikami;

No i inne materiały, które będą potrzebne w procesie tworzenia.
Najpierw robimy podstawę. Postanowiłem zrobić go z drewna. Przeciąłem drewnianą deskę w taki sposób, aby silniki idealnie pasowały do ​​szczelin


Następnie mocuję silniki za pomocą drewnianej deski, przykręcając ten pręt

W dalszej części obudowy umieściłem Arduino, przekaźnik, płytkę mózgową, dalmierze, a pod podstawą podwozia obrotowy

Teraz łączymy wszystko zgodnie ze schematem

Na koniec wczytujemy do Arduino następujący szkic:

Stała int R = 13; //piny do których podłączone są dalmierze IR const int L = 12; int silnik L = 9; //piny do których podłączony jest przekaźnik int motorR = 11; int stan przycisku = 0; void setup() ( pinMode(R,INPUT); pinMode(L,INPUT); pinMode(motorR,OUTPUT); pinMode(motorL,OUTPUT); ) void pętli() ( ( ButtonState = digitalRead(L); if (buttonState == WYSOKI)( digitalWrite(motorR,HIGH); ) else ( digitalWrite(motorR,LOW); ) ) (( przyciskState = digitalRead(R); if (buttonState == WYSOKI)( digitalWrite(motorL,HIGH); ) else ( digitalWrite(silnikL, NISKI); ) ) ) )

Zasada działania jest bardzo prosta. Lewy dalmierz odpowiada za prawe koło, a prawy za lewe

Aby było to jaśniejsze, możesz obejrzeć film przedstawiający proces tworzenia i działanie robota

Ten robot jest bardzo prosty i każdy może go zbudować. Pomoże Ci zrozumieć, jak działają moduły takie jak przekaźniki i dalmierze IR oraz jak najlepiej z nich korzystać.

Mam nadzieję, że podobało Ci się to rzemiosło. Pamiętaj, że rękodzieło jest fajne!

Końcowa część artykułu dotyczy małego robota, który montujemy na podwoziu - pokrywce plastikowego pojemnika na żywność. Mózgiem naszego robota jest płytka Arduino UNO, płytka Driver Motor Shield steruje silnikami i serwonapędem, czujnikiem przeszkód – Sonar ultradźwiękowy – oczy niczym Wally (z kreskówki) – „HC-SR04 Ultrasonic Sensor”. , . Jak stworzyć robota na Arduino?

9. Podłączenie akumulatora i silników

Podłączając akumulator trzeba mieć absolutną pewność, że polaryzacja jest prawidłowa, jak to mówią zmierzyć 7 razy, podłączyć raz. Staraj się przestrzegać tej zasady - czerwony przewód to zawsze + zasilanie, czarny przewód to masa, to minus, to GND. Producenci starają się przestrzegać tych samych zasad. Dlatego podłączamy przewody wychodzące z komory akumulatora do bloku + M i GND na płycie sterującej silnika. Podłączamy przewody od silników napędowych do bloków M1, M2 płytki sterującej silnika. Lewa strona w kierunku jazdy połączona jest z blokiem M1, prawa strona z blokiem M2. Nie powinieneś się jeszcze martwić polaryzacją silników, można ją zmienić, jeśli podczas testu coś pójdzie nie tak.

10. Sprawdź polaryzację i poprawność podłączenia modułów

Bardzo ważnym i kluczowym momentem w montażu mikrorobota jest sprawdzenie poprawności instalacji, połączeń, modułów zgodnie ze schematem blokowym, obejrzenie oznaczeń na płytkach, sprawdzenie testerem polaryzacji zasilacza, który ma tester.

11. Krok programowania Arduino

Program wgrywamy do mikrokontrolera Arduino z komputera za pomocą kabla USB oraz specjalnego programu – środowiska do programowania i edycji szkiców (programów) – Arduino IDE. Program można pobrać ze strony arduino.cc, sekcja Download, skąd zawsze można pobrać najnowszą, najnowszą wersję programu. Po zainstalowaniu środowiska programistycznego pozostaje jedynie wybrać z menu programu sterownika, dla której płytki chcesz skorzystać - w naszym przypadku Arduino UNO oraz port COM, przez który Arduino jest podłączone poprzez emulację USB. Jest mnóstwo różnego rodzaju instrukcji na ten temat, dlatego pomijamy ten etap (na wszelki wypadek - menu Narzędzia > Port szeregowy).

Program dla mikro robota dostępny jest na naszej stronie internetowej, choć dopiero po rejestracji, żartem Mini Robot na Arduino. Aby program działał potrzebne są dodatkowe biblioteki - AFMotor.h, Sevo.h, NewPing.h, wszystkie są w archiwum, należy rozpakować archiwum do folderu zainstalowany program ArduinoIDE. Dla mnie jest to katalog c: Program Files (x86) Arduino, biblioteki należy umieścić w folderze c: Program Files (x86) Arduino. Następnie przejdź do katalogu c:Program Files (x86)ArduinolibrariesAPC_4_ROBOT i kliknij dwukrotnie APC_4_ROBOT.ino to jest sam szkic, następnie uruchomi się środowisko programistyczne. Podłączamy gołą płytkę Arduino Uno (czyli bez podłączonych modułów) poprzez kabel USB do komputera, wciskamy przycisk ze strzałką w prawo, program rozpocznie wgrywanie do sterownika. Cały proces trwa kilka sekund i jeśli wszystko jest prawidłowo podłączone, to nie powinny się zaświecić żadne czerwone napisy, a wskaźnik w prawym dolnym rogu zakończy swój ruch w 100%. Program dla Arduino instalowany jest w kontrolerze Atmega328.

12. Uruchomienie robota

Mini robot na Arduino - gotowy do ruchu. Robota Wally’ego

Istnieje możliwość wykonania pierwszego, jeszcze próbnego uruchomienia naszego robota. Nasz robot nie chodził prawidłowo, jedno koło kręciło się prawidłowo, a drugie w przeciwnym kierunku. Musiałem zmienić polaryzację przewodów silnika na bloku M2. Ale wtedy nasz mały robot z honorem poradził sobie ze wszystkimi zakamarkami i przeszkodami w pomieszczeniu.

Artykuł ten dedykuję wszystkim początkującym, którzy decydują się na naukę Arduino. Dalszą naukę można kontynuować od pierwszej lekcji - miganie diody LED. Materiał z robotem jest bardzo ciekawy i żeby Was zainteresować postanowiłem zacząć od tego jak zbudować robota omijającego przeszkody. Reszta będzie znacznie łatwiejsza i pójdzie jak w zegarku. Ten robot naprawdę działa. Powodzenia wszystkim!

P.S. Było to w miarę swobodne tłumaczenie artykułu znalezionego kiedyś na rozległych połaciach Internetu, bardziej oczywiście gag, bo wszystko było zrobione w nowy sposób, rysunki zostały sfinalizowane, nie było wzmianki o źródle , ponieważ dokument był dokumentem programu Word.

W górę