Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'Robotyka'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - DIY
    • Projekty - DIY roboty
    • Projekty - DIY (mini)
    • Projekty - DIY (początkujący)
    • Projekty - DIY w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Imię


Strona

  1. Cześć, zbudowałem robota kroczącego składającego się z 12 serw. 4x serwo typu medium (Power HD HD-1160A z plastikowymi przekładniami) i 8x serwo typu micro (MG-90S z metalowymi przekładniami), serwa zasilane są battery Packiem (4x bateria AA 1,5V) 6V oraz Arduino mega, które zasilam 5V. Po wykonaniu dwóch kroków robot się zapada i serwa medium się wyłączają (serwa umieszczone na ramie robota) a serwa micro działają i wykonują dalsze ruchy nogi. Podejrzewam, że problem leży przy zasilaniu robota, battery pack dodaje masy do robota i może być niezbyt optymalnym źródłem prądu. Po podłączeniu woltomierza, miernik pokazywał ~5V zamiast wymaganego 6V. Drugim problemem mogą być serwera medium, jakich używam, przy 6V ruch obrotowy serwa wynosi 2,7 kg*cm a serwa micro nogi mają 2,2 kg*cm również przy 6V. Po ściągnięciu battery packa, robot działał dobrze do pewnego momentu, gdy się zawalił, serwa przestały być „naprężone” co wynikało by z braku odpowiedniego zasilania. Czy ktoś z Was wie, gdzie może leżeć przyczyna problemu? Z góry dziękuje. Film z działania robota oraz zdjęcie nogi w załącznkiu poniżej:
  2. Dzień dobry, Sprzedam platformę jezdną pod robota Dagu Wild Thumper 6WD wraz z silnikami z przekładnią 75:1. Do tego dorzucam sterownik do silników MDD20A od firmy Cytron. Również załączam w zestawie ramię zasilane dwoma serwami 9g sg90 i czujnik ultradźwiękowy HC-SR04. Idealna podstawa pod programowanie jezdnego robota, wystarczy dorzucić rasberry czy inną płytkę oraz zasilanie i mamy gotowego robota. Wszystko jest porzadnie podłączone i połączone. Wyprowadziłem również opcje montażu baterii LiPo poprzez zwykły Plug-In. Dorzucam również GRATIS dwa dodatkowe koła. Cena jaka mnie interesuje to 1400 zł. Mogę wystawić poprzez platformę sprzedażową. W innym wypadku płatność tylko i wyłącznie z góry. Pozdrawiam!
  3. Witam Mam pytanie odnośnie doboru części do robota. Sytuacja wygląda tak mam zakupione podwodzie do robota z kołami mecanum, silnikami DC z przekładnią jeden do 1:48, Napięcie zasilania 3V-6V, Pobór prądu 170 mA. W robocie mam zamiar użyć Arduino i sterować nim z telefonu przez Bluetooth. Pytanie pierwsze: Czy jeśli chce użyć sterowników L298N do sterowania silnikami to potrzebuję jakiś przetwornic step down, żeby nie spalić silników i sterowników, jeżeli wymagane źródło napięcia okazałoby się większe niż 6V? Pytanie drugie: Jakiego źródła zasilania najlepiej użyć do tego przedsięwzięcia? Pytanie Trzecie: Jakiego modułu Bluetooth użyć do tego najlepiej (chodzi mi o to żeby sterować silnikami z telefonu)? Widziałem że większość projektów z Arduino, bo korzysta z HC-05. Czy HC-05 to dobory wybór dla laika?
  4. Cześć, niedawno zacząłem budowę łazika z napędem na 6 kół (każde z nich skrętne, stąd 6 serw), całość będzie drukowana w 3D i sterowana przez Arduino Uno. Podczas projektowania obwodu napotkałem problem dotyczący zasilania, poniżej wklejam schemat (bez połączenia przewodów sygnałowych do L298N). Silniki to mocniejsze odpowiedniki tych małych żółtych silników. Producent podaje napięcie 3V-6V (sam myślałem żeby je troszkę zwiększyć, ponieważ w moim układzie będą dość mocno obciążone) a pobór prądu to (przy zatrzymanym wale) do 1,2A. Dlatego wybrałem takie sterowniki. Serwa to Tower Pro MG90S (są to serwa typu micro). A do sterowania całością planuję użyć Arduino Uno. I tu pojawia się problem ponieważ L298N mają spadek napięcia 2V. Więc akumulator/bateria 6V odpada. Myślałem nad tym żeby serwa osobno były zasilane z 4x AA. A silniki z 6x AA. Tylko czy z takich 6 baterii można pobrać max ok. 7A. A z 4 do ok. 5. Do silników można było by użyć też jakiś ogniw, takich jak np. w bateriach do laptopów. Pozostaje jeszcze zasilanie Arduino. Jak wy byście to rozwiązali? Mnie najbardziej przekonują baterie. Z góry dziękuje za pomoc Filip
  5. Cześć, chcemy przedstawić wam projekt robota kroczącego Honey Badger. Na początek powiemy krótko o tym kim jesteśmy, naszej historii i czym się zajmujemy, następnie przedstawimy naszą najnowszą konstrukcję. Od razu dodamy, że jeśli będziecie mieli jakieś pytania to śmiało zadawajcie je w komentarzach - postaramy się na wszystkie odpowiedzieć 😄 MAB Robotics założyliśmy z myślą o komercjalizacji technologii robotów mobilnych i technologii napędowych dla robotyki w 2019. Sam pomysł i prace nad budową robotów kroczących rozpoczęliśmy już w trakcie studiów na Politechnice Poznańskiej gdy byliśmy członkami koła naukowego KN Mechatron. Pierwszy prototyp robota pokazał, że tego typu konstrukcje, w niektórych warunkach mają lepsze możliwości ruchowe niż dotychczas najpopularniejsze na lądzie roboty jeżdżące. Z pomocą dr inż. Krzysztofa Walasa (wykładowcy robotyki na Politechnice Poznańskiej), zdobyliśmy finansowanie z Akademickiego Inkubatora PP i w efekcie w 2019 roku powstała spółka MAB Robotics. Rok później zainwestował w nas fundusz inwestycyjny YouNick Mint co pozwoliło na przejście ze studenckiego projektu w firmę zajmującą się zaawansowanymi pracami badawczo rozwojowymi w obszarze robotyki i rozpoczęcie działań związanych z komercjalizacją opracowanych technologii. Dużą motywacją do działań był udział i nagrody jakie zdobywaliśmy w zawodach robotycznych w Polsce i za granicą - głównie w kategorii freestyle. Z naszymi robotami byliśmy m.in. na RoboticArena we Wrocławiu, Trójmiejskim Turnieju Robotów w Gdańsku, Sumo Challenge w Łodzi, Robomaticon w Warszawie, ROBOCOMP w Krakowie czy Robot Challenge w Pekinie. Niemal wszędzie zdobywaliśmy nagrody, zawsze poznawaliśmy ciekawych ludzi i gromadziliśmy bezcenne doświadczenie. Dziś pracujemy nad systemem inspekcyjnym, którego jedną z części jest robot Honey Badger. System rozwijany jest z myślą o prowadzeniu prac inspekcyjnychi serwisowych wewnątrz podziemnych sieci jakie występują pod ulicami każdego miasta. Obecnie wykorzystywane technologie, oparte najczęściej o jeżdżące platformy nie pozwalają dostać się wszędzie, mają stosunkowo niewielki zasięg i są drogie w użyciu. Dzięki przejściu z kół na nogi roboty MAB Robotics będą w stanie wejść niemal w każde miejsce, niosąc na grzbiecie sensory analizujące stan techniczny instalacji oraz narzędzia umożliwiające wykonywanie drobnych prac naprawczych od wewnątrz - pozwala to ograniczyć wykopy i prace drogowe w na ulicach miast. Teraz ta, pewnie ciekawsza część dotycząca technologii, którą zaczniemy od krótkiej prezentacji najnowszego robota: Zaprezentowany robot Honey Badger posiada 12 stopni swobody - po 3 na każdą z nóg. Napędy zbudowane są z silnika bezszczotkowego, przekładni planetarnej i sterownika silnika MD80. Taki rodzaj napędu dostarcza wystarczającego momentu obrotowego aby unieść robota i jednocześnie zapewnia wysoką dynamikę umożliwiającą np. podskoki. Istotnym aspektem jest wirtualna podatność napędu realizowana przez sterowanie impedancyjne. Dzięki odpowiedniemu sterowaniu, silnik symuluje dynamikę sprężyny. Korpus robota jest wodo i pyłoszczelny, dzięki czemu robot może pracować w trudnym środowisku nieprzyjaznym dla elektroniki - utrudnia to jednak chłodzenie układów. Wewnątrz znajduje się komputer sterujący lokomocją robota oraz dodatkowa jednostka umożliwiająca przetwarzanie danych z sensorów takich jak np. kamera głębi lub lidar. W korpus wbudowana jest również bateria, moduł komunikacyjny, moduł zarządzania energią i AHRS. Cała konstrukcja mechaniczna i wszystkie moduły elektroniczne zostały zaprojektowane przez zespół MAB. Elementy mechaniczne wykonane są metodami obróbki CNC aluminium i włókna węglowego dla elementów przenoszących obciążenia oraz druku 3D dla elementów stylistycznych oraz nieprzynoszących dużych obciążeń jak np. prowadniki przewodów wewnątrz korpusu. Wymiary robota to 0.25-0.5x0.4x0.6 [m] (HxWxL), a jego masa to 10kg. Robot ma gabaryty niewielkiego psa lub dużego kota, zależnie od preferencji 🙂 Robot do swojej pracy wykorzystuje kilka sensorów. W napędy wbudowane są enkodery zwracające pozycję kątową napędu oraz elektronika, która pozwala na estymację momentu obrotowego generowanego przez napęd - wiemy dzięki temu z jaką siłą stopa robota naciska na podłoże. Dodatkowo, moduł AHRS wewnątrz korpusu wskazuje pozycję kątową oraz pozwala określić przemieszczenia i prędkości korpusu względem świata. Podstawą oprogramowania jest firmware mikrokontrolerów we wszystkich modułach robota. Odpowiada m.in. za sterowanie silnikami, kontrolę zasilania oraz komunikację między układami - napisany jest w języku C, na platformie STM32. Następny poziom to software sterujący pracą robota - tutaj liczone jest jak robot ma poruszać nogami by podążać w wyznaczonym kierunku z zadaną prędkością zachowując równowagę. Najwyższy poziom to oprogramowania wyznacza ścieżkę ruchu robota, analizuje otoczenie i interpretuje polecenia operatora. Dwa ostatnie poziomy wykorzystują ROS2 co bardzo ułatwia pracę i daje wiele możliwości, wykorzystujemy tutaj C++. Na zakończenie ostatni filmik 🙂 Mamy nadzieję, że temat jest dla was ciekawy, trochę dowiedzieliście się z tego krótkiego wpisu i zmotywowaliśmy was do dalszej (lub rozpoczęcia) pracy z robotami. Jeśli macie pytania to chętnie na nie odpowiemy! Serdecznie zapraszamy: - do zwiedzenia naszej strony internetowej: MAB Robotics, - na nasz kanał na YouTube, gdzie wrzucamy dłuższe filmy, - na nasze social media: instagram, facebook i twitter.
  6. Robot który zbudowałem na sobotnie zawody okazało się że w losowych momentach na trasie przestaje jechać. Zatrzymuje się na kilka sekund i czasem rusza znowu a czasem słychać tylko pyknięcie, robot minimalnie drgnie i dalej się zawiesza. Podczas tych zawieszeń diody rx, tx i wbudowana przestają migać, świeci się dioda ON oraz diody sygnalizujące prawidłowy przepływ prądu w 2 miejscach na 2 płytkach. Zwykle pomaga reset ale muszę rozwiązać problem jak najszybciej bo zawody są już w tą sobotę a muszę jeszcze przeprowadzić testy. Więcej o robocie: Typowa konstrukcja z dwoma kołami z tyłu i platformą z 8 czujnikami z przodu Silniki to polulu hp micro z przekładnią file:///C:/Users/Admin/Downloads/Photo-1.jpeg1:10 Zasilane akumulatorem lipo 500mah 11,1V po stabilizatorze na 6V Użyty jest sterownik silników 2-kanałowy sparkfun Algorytm to zwykły PID (po odkryciu problemu zredukowany do samego P i sprawdzony, problem raczej nie leży po stronie programu) Sprawdziłem: po podpięciu przez kabel (bez akumulatora) - działa gdy koła są w powietrzu- działa gdy zablokuję koła- działa gdy zablokuję koła i przyłożę do podłoża czujniki- nie działa PS testy powyżej są dla bardzo niskiej prędkości, około 25% maksymalnej prędkości silników. Po zwiększeniu zadanej prędkości silniki kompletnie odmawiają współpracy.
  7. Siemanko! Przychodzę do was z takim tematem. Wraz z kolegą planujemy zbudować pierwszego robota, którym ma być linefollower. Jak wspomniałem będzie to pierwszy nasz projekt tego typu no i właśnie. Czy macie jakieś rady dla nowicjuszy? Na co uważać, co polecacie itd. Jeśli chodzi o uC myślałem nad STM32F7 lub G4, ale narazie to tylko plany. Jestem otwarty na sugestie i chętnie pogadam z bardziej doświadczonymi. Pozdroo💪
  8. Witam, Jestem w 8 klasie (co pewnie da się wyczuć 🙂 ) i robię robota, który omijałby przeszkody i wracał na trasę z wykorzystaniem HC-SR04 i MPU-6050. Używam też shielda od forbota, omawianego w kursie robotyki. Nieruchomy czujnik działa prawidłowo, ale kiedy obraca się na serwie, w pozycjach około prostopadłych do tylnej osi daje odczyt 0 cm. Pozostałe odczyty są poprawne, samo podłączenie czujnika też jest w porządku, bo działa bardzo dobrze będąc nieruchomym. Założenie jest takie, żeby czujnik zamontowany na serwie wykonywał pomiary odległości wokół robota, a następnie aby serwo obróciło się tam, gdzie odległość była najmniejsza (to pozwala cały czas monitorować najbliższą przeszkodę). Cały ,,układ" jest bardzo prosty, w zasadzie można go zreplikować w 5 minut i potestować z moim kodem. Poza tym, zamieszczony plik .zip to minutowy film, który pokazuje zarówno ruchy serwa, jak i odczyty podawane na port szeregowy (Forobot nie pozwala na przesyłanie .mp4). Cały kod zdaje się działać dobrze, jedynym problemem jest to, że pomiary bywają zerowe, co sprawia, że czujnik zachowuje się bez sensu. Myślałem nad dodaniem prostego warunku: ,,Jeżeli zmierzona odległość byłaby mniejsza od minimalnej i jednocześnie większa od zera, wtedy zapisujemy ją jako nową minimalną wartość". W moim kodzie wyglądałoby to tak: if (odleglosci[x] < min_odleglosc && odleglosci[x] > 0) min_odleglosc = odleglosci[x]; Niestety, w tym przypadku robot zupełnie nie wykrywałby przeszkód bezpośrednio naprzeciwko niego, bo otrzymywałby tam pomiary 0 cm (rysunek w załącznikach). Czy ktoś wie, jak naprawić kod/elektronikę? Z góry dziękuję za pomoc. Połączenia czujnik - Arduino: Vcc - 5V Gnd - Gnd trig - D8 echo - D7 //w przod - (R_DIR, 1), (L_DIR, 0). Min. predkosc silnikow to 20 w funkcji Left- i Rightmotor. RightMotor - słabszy //w accelerate dodac zczytywanie obecnej v i porownywac z poprzednia v, plynnie zwalniac //tak naprawde wystarcza dwie zmienne: aktualna_odleglosc i max_odleglosc. Jezeli aktualna_odleglosc > max_odleglosc, staje sie max_odleglosc. Jesli nie, w ogole jej nie potrzebujemy #define L_PWM 5 #define L_DIR 4 #define R_PWM 6 #define R_DIR 9 #define PWM_MAX 165 #define v_min 20 #define trig 8 #define echo 7 #define SERWO_PIN 11 #include <Servo.h> Servo serwo; float odleglosc; float LeftMotorMargin = 5; int max_odleglosc_global = 0; int min_odleglosc_global = 100; int min_odleglosc = 100; int max_odleglosc = 0; int odleglosci [20]; int powtorzenia = 0; int v_previous = 0; int j, x; int do_usuniecia = 0; int poprzedni_kat_serwa; int czestotliwosc_obrotu_serwa = 18; int int_numer_pomiaru; void LeftMotor (int v)//funkcja sterująca silnikiem lewym z jednym argumentem, prędkością. { if (v>0) //jeżeli podana wartość jest dodatnia { v+=LeftMotorMargin; v = map(v,0,100,0,PWM_MAX);//zmieniamy wartość podaną w programie na PWM digitalWrite (L_DIR, 0);//wyznaczamy kierunek - do przodu analogWrite (L_PWM, v);//PWM równy temu, co wyznaczył uzytkownik } else//jeżeli podana liczba jest ujemna { v = abs(v);//zamieniamy liczbę na dodatnią v+=LeftMotorMargin; //v = v - LeftMotorMargin; v = map(v,0,100,0,PWM_MAX);//zmieniamy podaną wartość na PWM digitalWrite (L_DIR, 1);//wyznaczamy kierunek - do tyłu analogWrite (L_PWM, v);//PWM równy temu, co wyznaczył użytkownik } } void RightMotor (int v)//analogiocznie do lewego silnika { if (v>0) { v = map(v,0,100,0,PWM_MAX); digitalWrite (R_DIR, 1); analogWrite (R_PWM, v); } else { v = abs(v); v = map(v,0,100,0,PWM_MAX); digitalWrite (R_DIR, 0); analogWrite (R_PWM, v); } } void stopMotors()//zatrzymanie silników { analogWrite(L_PWM, 0); analogWrite(R_PWM,0); } void accelerate (int v)//funkcja na płynne przyspieszanie i zwalnianie { if (abs(v)<20)//jeżeli podana liczba jest mniejsza niż 20 { v=20; //prędkość równa się 20 (unikamy prędkości zbyt małych, by ruszyć). } Serial.println (v); if (v>v_previous)//jeżeli przyspieszamy { for (int i = v_previous; i<v; i++)//zacznij od poprzedniej wartości, zwiększaj do wyznaczonej do wyznaczonej { RightMotor(i);//do przodu LeftMotor(i); delay(50); } } if (v<v_previous)//jeżeli zwalniamy { for (int i=v_previous; i>v; i--)//zacznij od wartości poprzedniej, zmniejszaj do wyznaczonej { RightMotor(i); LeftMotor(i); delay(50); } } v_previous = v;//zapisz obecną wartość jako wyznaczoną } float pomiar_odleglosci () { float odleglosc, czas; digitalWrite (trig, LOW); delayMicroseconds (2); digitalWrite (trig, HIGH); delayMicroseconds (10); digitalWrite (trig, LOW); czas = pulseIn (echo, HIGH); odleglosc = czas / 58; return odleglosc; } void serwo_right () { min_odleglosc = 100; for (int i = poprzedni_kat_serwa; i>0; i--) { serwo.write(i); delay(10); //czujnik wychyla sie w prawo, resetujemy min_odleglosc } poprzedni_kat_serwa = serwo.read(); } void serwo_left () { odleglosci[x] = pomiar_odleglosci (); Serial.println ("odleglosc prawa"); Serial.println (x); Serial.println (odleglosci[x]); x++;//wykonujemy pierwszy pomiar (w innym wypadku miałby on miejsce dopiero po wychyleniu serwa o czestotliwosc_obrotu_serwa, czyli 18 stopni) for (int i = poprzedni_kat_serwa; i<=180; i++) { //posuwamy sie az do skrajnie lewego wychylenia (zaczynamy ze skrajnie prawego) if (x>180/czestotliwosc_obrotu_serwa) x=0; //jezeli wykonalismy pelen cykl pomiarow resetujemy ich licznik if (j>=czestotliwosc_obrotu_serwa)//kiedy czujnik skrecil o kat podany jako czestotliwosc_pomiaru (kiedy trzeba wykonac pomiar) { j=0; //resestujemy licznik umozliwiajacy wykonanie pomiaru co czestotliwosc_pomiaru odleglosci[x] = pomiar_odleglosci();//wykonujemy pomiar if (odleglosci[x]>max_odleglosc)//jezeli aktualna odleglosc jest wieksza od zapisanej jako najwieksza odleglosc, staje sie nowa najwieksza odlegloscia max_odleglosc = odleglosci[x]; if (odleglosci[x]<min_odleglosc)//jezeli aktualna odleglosc jest mniejsza od zapisanej jako najmniejsza odleglosc min_odleglosc = odleglosci[x]; if (i < 90)//kiedy czujnik jest wychylony w lewo { Serial.println ("odleglosc prawa");//wypisujemy aktualna odleglosc Serial.println (x); Serial.println (odleglosci[x]); }else //kiedy czujnik jest wychylony w prawo { Serial.println ("odleglosc lewa"); //wypisujemy aktualna odleglosc Serial.println (x); Serial.println (odleglosci[x]); } x++; //zwiekszamy licznik pomiarow } //Serial.print ("Kat serwa = "); opcjonalnie mozna odkomentowac, pozwala zobaczyc kat serwa //Serial.println (serwo.read()); serwo.write(i);//przesuwamy serwo j++;//zmieniamy licznik przesuniec, dzieki temu mozemy robic pomiary kiedy osiognie wartosc = czestotliwosc_pomiaru delay(10); } poprzedni_kat_serwa = serwo.read();//zapisujemy obecny kat obrotu jako poprzedni_kat_serwo, co pomaga w wykonywaniu innych obrotow } void serwo_mid ()//kierujemy serwo do pozycji prostopadlej do tylnej do osi { if (poprzedni_kat_serwa > 90)//jezeli serwo jest zwrocone w lewo { for (int i = poprzedni_kat_serwa; i>90; i--)//zmniejszamy, czyli idziemy do prawej { serwo.write(i); } }else //kiedy serwo jest zwrocone w lewo { for (int i = poprzedni_kat_serwa; i<90; i++)//zwiekszamy, czyli idziemy do lewej { serwo.write(i); } } poprzedni_kat_serwa = serwo.read();//zapisujemy obecny kat obrotu jako poprzedni_kat_serwo, co pomaga w wykonywaniu innych obrotow } void zadany_obrot (int kat)//obrot serwa do zadanego katu { if (poprzedni_kat_serwa > kat)//jezeli zadany kat jest na prawo od obecnego { for (int i = poprzedni_kat_serwa; i>kat; i--)//skrecamy serwo w prawo { serwo.write(i); } }else //jezeli zadany kat jest na lewo od obecnego { for (int i = poprzedni_kat_serwa; i<kat; i++)//skrecamy serwo w lewo { serwo.write(i); } } poprzedni_kat_serwa = serwo.read();//zapisujemy obecny kat obrotu jako poprzedni_kat_serwo, co pomaga w wykonywaniu innych obrotow } int numer_pomiaru ()//zczytujemy tablice odleglosci[] (wyniki pomiarow) i szukamy tego, ktory jest najmniejszy { for (int i = 0; i <180/czestotliwosc_obrotu_serwa; i++)//przeszukujemy wszystkie pomiary { if (odleglosci[i] == min_odleglosc)//jezeli odleglosc o numerze 'i' jest najmniejsza { return i;//zwracamy numer pomiaru } } } float pomiar_odleglosci_serwo()//uzywamy trzech wyzej opisanych funkcji do zrobienia pomiaru odleglosci { serwo_right(); serwo_left(); serwo_mid(); return min_odleglosc; } void setup() { //definicja pinow, start komunikacji pinMode(L_DIR, OUTPUT); pinMode(R_DIR, OUTPUT); pinMode(L_PWM, OUTPUT); pinMode(R_PWM, OUTPUT); pinMode (trig, OUTPUT); pinMode (echo, INPUT); serwo.attach(SERWO_PIN); Serial.begin (9600); serwo_mid(); } void loop() { //wypisywanie wynikow pomiarow w porcie szeregowym Serial.println ("Pomiar odleglosci"); min_odleglosc_global = pomiar_odleglosci_serwo();//sprawdzamy odleglosci od przeszkod wokol robota delay(1000); int_numer_pomiaru = numer_pomiaru();//znajdujemy najmniejszy pomiar Serial.println ("numer pomiaru"); Serial.println (int_numer_pomiaru); Serial.println ("min_odleglosc"); Serial.println (min_odleglosc_global); delay(1000); Serial.println ("zadany obrot"); zadany_obrot(int_numer_pomiaru*czestotliwosc_obrotu_serwa);//obracamy serwo do kata, na ktorym byl najmniejszy pomiar Serial.println ("kat"); Serial.println (int_numer_pomiaru*czestotliwosc_obrotu_serwa); } film z dzialania robota.zip
  9. Witam, Robię robota, który ma omijać przeszkody i wracać na trasę dzięki HC-SR04 i MPU6050. Podpiąłem piny 3 i 7 odpowiednio do trig i echo na czujniku, 5V do Vcc i G do GND (na zdjęciach, przepraszam za złą jakość 😞 ). Niestety, czujnik daje odczyt 0 cm niezależnie od okoliczności. Czy ktoś wie jak pomóc? Z góry dziękuję #define trigPin 3 #define echoPin 7 void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście pinMode(echoPin, INPUT); //a echo, jako wejście } void loop() { Serial.print(zmierzOdleglosc()); Serial.println(" cm"); delay(500); } int zmierzOdleglosc() { long czas, dystans; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); czas = pulseIn(echoPin, HIGH); dystans = czas / 58; return dystans; }
  10. Chciałbym dodać do swojego obwodu 2 serwa wymagające napięcia 7,2V (prawa część schematu powyżej, L298 i silniki już działają). Kontroler którego chcę użyć to PCA9685 od AdaFruit - jak na schemacie powyżej. Posiada on wejścia na zasilanie dla serw - ale obsługuje niestety tylko napięcia do 5V. Z tego powodu zakładam, że serwa muszę zasilić bezpośrednio - czy taki schemat ma sens? Czy wymagane jest uziemienie pomiędzy serwami a RaspberryPI? Zasilania bateryjne to 6x1.2V Czeka mnie sporo lutowania, zanim wykonam taki obwód, to mój pierwszy projekt związany z robotyką, nie chcę też niczego spalić, dlatego proszę o poradę 🙂 Dzięki!
  11. Zapraszamy do współpracy osoby, posiadające doświadczenie w pracy z Arduino, pasjonujące się nowoczesnymi technologiami i lubiącymi pracę z dziećmi. Robocode to młoda, progresywna firmą, oferująca szkolenia dla dzieci i młodzieży w wieku od 8 do 16 lat w zakresie robotyki, programowania i myślenia projektowego 🚀 🤖 W związku z otwarciem pierwszej w Katowicach szkoły poszukujemy nauczycieli/instruktorów zajęć, pragnących rozwijać ją razem z nami! Nauczyciel w Robocode odpowiada za: Przeprowadzanie zajęć w interesujący i zrozumiały sposób, Znalezienie wspólnego języka z dziećmi, Śledzenie trendów innowacji w IT, Bieżącą współpracę z menedżerem szkoły i zespołem. 😎 Instruktor Robocode jest ekspertem, przyjacielem i mentorem, więc jeśli czujesz, że chodzi o Ciebie, jeśli lubisz dzielić się wiedzą oraz jesteś aktywną, dobrze zorganizowaną i nastawioną na rozwój osobą, dołącz do nas! Zapewniamy niezbędne materiały oraz szkolenia dla efektywnej pracy i rozwoju Twoich kompetencji, proponujemy system podwyższenia stawki początkowej. Wymiar pracy dostosowany jest do Twojej dyspozycyjności. Brzmi interesująco? A w rzeczywistości wygląda jeszcze ciekawiej! 📩 📩 📩 Osoby zainteresowane prosimy o przesłanie CV z aktualną klauzulą RODO oraz kilku zdań o sobie na adres poland.robocode@gmail.com. Więcej o nas przeczytać można na stronie robocode.pl. Czekamy na Ciebie w naszym super zespole! 😊
  12. SZTUCZNA INTELIGENCJA W SŁUŻBIE MOTORYZACJI Cz.1. (Trochę przydługi) Wstęp. Sztuczna inteligencja to ostatnio temat na topie. Wydaje się, że na dobre zostawiliśmy za sobą tzw. „wieki ciemne” , kiedy to, zaraz po wynalezieniu i udowodnieniu działania sieci neuronowych w końcówce lat ‘50 ubiegłego wieku, cała społeczność naukowców zniechęcona „fałszywymi obietnicami” uznała, że sieci, owszem działają, ale nie można ich nauczyć niczego pożytecznego i zgodnie zapomnieli o nich na paręnaście dobrych lat[1]. Dzisiaj nikogo nie trzeba przekonywać, że sieci działają, do tego w wielu przypadkach działają skuteczniej niż człowiek oraz inne „konwencjonalne” metody. Każdy z nas, chcąc nie chcąc, odczuwa działanie sztucznej inteligencji jeśli jest zalogowany na jakimkolwiek większym portalu społecznościowym. Sam niejednokrotnie byłem pełen podziwu dla algorytmów polecających w serwisach Youtube, czy Facebook. Akcjonariusze serwisów społecznościowych i instagramowe modelki pewnie się ze mną nie zgodzą, ale zawsze uważałem, że potencjał sztucznej inteligencji jest marnowany na algorytmy polecające albo upiększające zdjęcia. Jako inżynier transportu naturalnie widzę miejsce dla sieci neuronowych w transporcie motoryzacyjnym. Rynek pokazuje, że na pewno nie jestem w tym, ani jedyny, ani nawet pierwszy. Amerykański producent samochodów elektrycznych Tesla zdaje się być o krok od wypuszczenia na rynek całkowicie autonomicznego samochodu (Full Self-Driving) opartego w znacznej mierze na sieciach neuronowych, jednak również pozostali producenci aut z powodzeniem stosują rozwiązania sztucznej inteligencji w celu poprawienia bezpieczeństwa i komfortu jazdy (system monitorowania koncentracji kierowcy, system rozpoznawania znaków drogowych)[2]. Ten artykuł bierze udział w naszym konkursie! 🔥 Na zwycięzców czekają karty podarunkowe Allegro, m.in.: 2000 zł, 1000 zł i 500 zł. Potrafisz napisać podobny poradnik? Opublikuj go na forum i zgłoś się do konkursu! Czekamy na ciekawe teksty związane z elektroniką i programowaniem. Sprawdź szczegóły » Samochody autonomiczne to temat szalenie interesujący zarówno z punktu widzenia technicznego (duh!) jak i prawnego (w razie wypadku z winy pojazdu autonomicznego, kto powinien być pociągnięty do odpowiedzialności? Kierowca czy producent pojazdu?). Rozważania nad tymi zagadnieniami zachęciły mnie w końcu do podjęcia próby stworzenia własnego samochodu autonomicznego w małej skali (na razie 😉 ). Pojazdy autonomiczne do tego, aby odnaleźć siebie i innych uczestników ruchu drogowego w przestrzeni, wykorzystują różne technologie, a różnice między producentami są widoczne gołym okiem (sieć autonomicznych taksówek Waymo działających na terenie San Francisco wykorzystuje do nawigacji charakterystyczne, umiejscowione na dachach pojazdów LIDARy oraz bardzo dokładną mapę 3D terenu, tymczasem Tesla woli korzystać ze zwykłych kamer 2D i wspierać się sieciami neuronowymi). Cz.2. Założenia projektu, czyli co ja robię?! W czasie kiedy zaczynałem pracę nad tym projektem byłem już dobrze zaznajomiony z technikami analizy obrazu, biblioteką OpenCV i miałem jako-takie (podparte praktyką) pojęcie o sieciach neuronowych. Ponieważ byłem w tym czasie w trakcie lektury „Superinteligencji” Nicka Bostroma i moje myśli nieustannie krążyły w ogół sztucznej inteligencji, zacząłem się zastanawiać, czy to możliwe, żeby mój pojazd potrafił się poruszać po drodze wykorzystując TYLKO I WYŁĄCZNIE sieci neuronowe. Postanowiłem, że tworząc pojazd będę próbował używać sieci neuronowych do realizacji wszystkich założeń projektu, posiłkując się klasyczną analizą obrazu tylko w ostateczności, w sytuacji kiedy moje sieci polegną. Poniżej przedstawiam założenia projektu: pojazd do poruszania się ma wykorzystywać tylko kamery i sieci neuronowe, żadne inne sensory nie są dozwolone, pojazd ma poruszać się po narysowanej na ziemi 2-pasmowej drodze, pojazd na respektować zasadę ruchu prawostronnego, zjazd na przeciwległy pas uznawany jest jako błąd, pojazd ma stosować się do znaków drogowych i sygnalizacji świetlnej, pojazd ma mieć możliwość rozpoznawania pieszych, I na koniec zadanie z gwiazdką: pojazd ma posiadać możliwość przejazdu przez skrzyżowanie w dowolnym kierunku. W tym miejscu chciałbym dodać również, że moim zamiarem było osiągnięcie tego, nie nadwyrężając znacznie mojego budżetu. Do listy założeń wypada zatem dodać: osiągnąć powyższe minimalizując wydatki. Cz.3. Najmniej znaczy ZERO? Od początku wiedziałem, że bazą do projektu będzie robot, którego używałem zaczynając swoją przygodę z programowaniem Arduino, znany zapewne użytkownikom robot z kursu budowy robotów Forbot’a. Pozostał wybór kamer i komputera. Wahałem się między Jetsonem Nano, a Raspberry Pi, jednak urządzenia te nie należą do najtańszych, a trzeba też brać pod uwagę koszt kamery. Do głowy przyszła mi następująca myśli: "najmniej PLN to chyba będzie zero, prawda?". A gdyby tak wykorzystać stacjonarny komputer jako jednostkę obliczeniową i w jakiś sposób przesyłać obraz z kamery na pojeździe do komputera, a następnie odsyłać informacje o sterowaniu do jednostki wykonawczej, czyt. Arduino? A gdyby tak wykorzystać do tego smartfona? Pomysł spodobał mi się ze względu na to, że w razie porażki, nie wydałbym na projekt ani złotówki. Postanowiłem spróbować, mając z tyłu głowy, że w każdej chwili mogę zmienić podejście i dokonać zakupu mini komputera pokładowego. Pojazd użyty do projektu. Cz.4. Kontekst. Celem niniejszego artykułu (czy to nie powinno być w pierwszym akapicie?) jest ukazanie potęgi sieci neuronowych. Nie ma tu miejsca na szczegółowe opisywanie całego projektu. Niemniej jednak czytelnikom należy się wyjaśnienie, w jaki sposób doprowadziłem do tego, że mój pojazd jeździ i w jaki sposób komunikuje się z komputerem. Pozwolę sobie dokonać lakonicznego przedstawienia mojego systemu. Z chęcią dokładniej opiszę poszczególne elementy, jeśli artykuł będzie cieszył się dużym zainteresowaniem 🙂. Robot, którego używałem posiada 2 silniki napędzające niezależnie 2 przednie koła oraz jedno koło nienapędzane (typu kółko od wózka w super-markecie). Na pokładzie znajduje się telefon połączony kablem OTG-USB z Arduino. Pojazd nie ma osi skrętnej, mamy tu do czynienia ze sterowaniem typu "czołg" - jeśli chcemy wykonać skręt to jedno koło musi się kręcić wolniej od drugiego. Zainteresowanych budową robota odsyłam do kursu, jest bezpłatny. Teraz pora na tor sygnałowy. Na telefonie zainstalowana jest aplikacja do przesyłania obrazu typu ipwebcam, nazywa się DroidCam. Obraz jest przesyłany prosto z aplikacji do komputera za pośrednictwem sieci Wi-Fi (lokalnie). Na komputerze skrypt Pythona dokonuje analizy obrazu (każda klatka zostaje przepuszczona przez sieci, o czym opowiem w następnym rozdziale). Wyniki sieci są interpretowane i skrypt odsyła informację o sterowaniu na telefon, tym razem do specjalnej aplikacji w Javie (tą niestety musiałem napisać już sam) i dalej kablem USB do Arduino. Mikrokontroler podaje informacje na koła i jazda! Schemat toru sygnałowego. Cz.5. Sieć sieci nie równa. W końcu dochodzimy do sedna. Kiedy już miałem potrzebne narzędzia przyszła pora na tworzenie sieci i trening. Jest to etap nad którym spędziłem najwięcej czasu, eksperymentując z różnymi modelami sieci, optymizerami, rozważając sens zastosowania wstecznej propagacji błędów i tak dalej. W następnych akapitach chciałbym przedstawić moje osobiste odkrycie roku jakim jest biblioteka FastAi zbudowana na Pytorchu. Dla niezorientowanych spieszę z wyjaśnieniami. W świecie sieci neuronowych 90% użytkowników jako języka programowania używa Python’a. Dlaczego? Czy to ze względu na czytelność kodu, łatwość w programowaniu, intuicyjność? Czy może dlatego, że (całkiem przypadkiem) dwie największe biblioteki do uczenia maszynowego(TensorFlow i Pytorch) zostały napisane dla Pythona? W tym momencie ciężko powiedzieć, co było pierwsze, jajko czy kura? Jedno wiadomo na pewno, niska prędkość kompilacji i wykonywania kodu nie ma większego znaczenia w procesie trenowania sieci. Gorzej oczywiście z pracą w czasie rzeczywistym, ale należy pamiętać, że gotowe modele można konwertować i zaprzęgać do pracy w wielu innych językach. Rozpoczynając przygodę z sieciami neuronowymi zacząłem pracę z biblioteką TensorFlow (w tamtym czasie właśnie dla tej biblioteki w internecie było najwięcej informacji i tutoriali) i myślę, że wyrażę opinię wielu mówiąc, że było to doświadczenie nieprzyjemne. Jako, że o nieprzyjemnych rzeczach najlepiej nie mówić, wraz z nowym projektem zdecydowałem się na zmianę biblioteki na Pytorch (do zmiany nakłonił mnie również film na Youtubie w, którym szef ekipy od jazdy autonomicznej Tesli chwali się, że właśnie tej biblioteki używają). Odnośnie TensorFlow powiem tylko, że problemy jakie napotkałem próbując zainstalować tą bibliotekę na mojej maszynie powracają w koszmarach po dziś dzień. Ale co z tym FastAi? FastAi jest biblioteką zbudowaną na Pytorchu. Ułatwia korzystanie z Pytorch, dzięki niemu tworzenie i trenowanie sieci neuronowych staje się dziecinną igraszką. Każdemu, kto chce zacząć przygodę z sieciami neuronowymi, ale nie ma śmiałości polecam FastAi i serię tutoriali na Youtube współtwórcy tej biblioteki - Jeremy’ego Howarda. Dodatkową zaletą FastAi jest jej poziomowość. Można trenować naprawdę dobre modele, odpowiednio jedynie przygotowując dane i korzystając z gotowych ustawień, jednak wszystkie funkcje Pytorch są stale pod ręką. Jeszcze jedna pozytywna rzecz wynikła dla mnie z tego projektu. FastAi dosłownie wymusza pracowanie w Jupyter Notebooks, który zawsze z jakiegoś powodu mnie odstraszał. Teraz widzę, że jego używanie bywa uzasadnione, każdemu kto nie miał do czynienia z jupyterem polecam spróbowanie. Jest to świetne narzędzie dla eksperymentatorów (chwała wykonywaniu pojedynczych komórek kodu!). Minusy? FastAi działa tylko na Linuxie, ale kto jest zainteresowany sieciami z pewnością od dawna już korzysta z tego systemu operacyjnego. Cz.6. Sieć czy może sieci? Niemal od początku pracy miałem w głowie koncepcję na to w jaki sposób wykorzystać sieci, żeby sterować robotem. W realnej sytuacji (prawdziwy pojazd na prawdziwej drodze jako prawdziwy uczestnik prawdziwego ruchu drogowego) obraz z kamery/wielu kamer jest zapisywany razem z korespondującymi danymi o stanie pojazdu w tym o WIELKIEJ TRÓJCY do której należą: kąt skrętu kierownicą, stopień wciśnięcia pedału gazu, stopień wciśnięcia pedału hamulca. Potem wystarczy stworzyć model, który jako daną wejściową dostaje obraz z kamery, a wypluwa te trzy wartości. Proste prawda? Szkopuł w tym, że aby porządnie wytrenować sieć neuronową potrzeba dużej ilości danych. Sieci dosłownie żywią się danymi. Bez nich dają marne predykcje, choć są sposoby na poprawienie wyników sieci bez zwiększania ilości danych, ale o tym później. W realnej sytuacji (prawdziwy pojazd na prawdziwej drodze…) w celu zebrania danych do trenowania sieci wystarczy zapisywać normalne zachowania kierowców, jednak dla mnie oznaczało by to długie i mozolne jeżdżenie moim robotem po przygotowanym torze, a ciężko jest określić na początku, ile danych tak naprawdę potrzebuje sieć (chociaż z dużą pewnością można stwierdzić, że czym więcej tym lepiej 🙂 ). W dodatku wyniki sieci zależą oczywiście od jakości wprowadzonych danych, zatem musiałbym jeździć po torze bardzo precyzyjnie. Jeśli ktoś kiedykolwiek bawił się samochodem zdalnie sterowanym to wie, że precyzyjna jazda nie jest wcale taka łatwa. Musiał zatem istnieć jakiś sposób na zautomatyzowanie procesu zbierania danych. Ah, gdyby istniał taki samochód autonomiczny, który by zbierał te informacje… W końcu wpadłem na pomysł. Wykorzystałem odrobinę wiedzy z zakresu cyfrowej analizy obrazu, bibliotekę OpenCV i jedną dodatkową kamerę, którą umieściłem nad torem jazdy, tuż przy suficie. Na robocie przymocowałem zielony znacznik, który później wyodrębniłem na komputerze z tła. W Paint'cie narysowałem drogę po której ma się poruszać pojazd, i połączyłem te dwa obrazy. Miałem teraz współrzędne zielonego znacznika i niebieski tor. Z pomocą funkcji pointPolygonTest z OpenCV mogłem wyznaczyć odległość znacznika od najbliższego punktu na torze. Jeden warunek: tor musi stanowić zamknięty kształt. Mi to nawet było na rękę, dzięki temu pojazd mógł jeździć w kółko i zbierać dane. Teraz tylko prosty regulator PID i gotowe. Dla ułatwienia postanowiłem, że robot będzie jeździł ze stałą prędkością, więc zbierane dane miały postać: obraz z kamery w danym momencie oraz odchylenie znacznika od toru. Prosta sieć klasyfikująca. Wpada obraz z kamery (na GIF-ie poniżej dolny lewy róg), a wypada „odchylenie” od toru jazdy. Stworzyłem kilka wirtualnych "tras" na torze i zacząłem zbieranie danych. W międzyczasie rozregulowałem nieco PID, aby robot łapał trochę więcej skrajnych pozycji. Po godzinie jazdy uznałem, że mam wystarczająco danych do rozpoczęcia trenowania sieci (ostatecznie jeździłem nieco dłużej, w celu pobrania informacji o miejscach, w których robot mylił się najczęściej). Zbieranie danych. Cz.7. Można oszukiwać. Jak wspomniałem są sposoby na poprawienie wyników sieci bez zwiększania ilości danych. Jednym z nich jest tzw. „transfer learning” polegający na użyciu gotowego modelu sieci (w moim przypadku ResNet50), wytrenowanego na milionach zdjęć, którego skuteczność została udowodniona na „ogólnych” obiektach (odróżnia jabłko od gruszki, psa od kota) i dotrenowanie zaledwie kilku ostatnich warstw tak, żeby model lepiej odpowiadał na nasze dane. Przyspiesza to trenowanie i zwiększa dokładność predykcji. W trakcie pracy eksperymentowałem z różnymi gotowymi modelami jak i wieloma wartościami, głównie z wielkością zdjęcia (znacząco wpływa to na czas trenowania) jak i z ilością epok, typem optymizerów. Mimo, że zdarzało mi się zostawiać komputer włączony całą noc, a treningi trwały nieraz ponad 14 godzin, ostateczny model został wytrenowany w około 2 godziny (na karcie graficznej GTX 1660). Trenowanie modelu. Niektóre próby trwały ponad 14 godzin. Jak ze skutecznością predykcji? Zaledwie 60%. A jednak robot jeździ po torze prawie bezbłędnie. Jak to możliwe skoro 4 na 10 razy się myli? Kluczem nie jest w tym przypadku skuteczność, tylko skala błędu. W większości przypadków komputer popełniał bardzo niewielkie pomyłki, które nie miały wpływu na jazdę. Analizując zdjęcia jestem pod wrażeniem działania tego modelu, sam dla zabawy próbowałem odgadnąć jakie odchyły przypadają do jakich zdjęć. Poniżej przedstawiam kilka, spróbujcie odgadnąć sami (wartości od -15 do 15): Od lewej: 6,-11, 15 (pikseli odchyłu od idealnego toru jazdy). Kiedy przekonałem się, że robot jeździ po prostej drodze, nadszedł czas na coś bardziej skomplikowanego niż zwykła klasyfikacja obrazu(np.: na zdjęciu jest pies!) mianowicie na detekcję (np.: na zdjęciu jest pies i znajduje się on tutaj!). Wykorzystałem do tego system detekcji YOLO (You only look once) stworzony przez Josepha Redmona. YOLO znane jest w internecie z bardzo niskiego czasu detekcji (detekcja trwa dłużej niż klasyfikacja). Redmon udostępnia swój algorytm za darmo wraz z instrukcją jak trenować sieć pod detekcję własnych obiektów. Na początku próbowałem wykorzystać bazę zdjęć i etykiet Open Images Dataset, ale szybko przekonałem się, że lepiej zastosować własne zdjęcia. Nie pozostało mi nic innego jak odpalić program do etykiet (LabelImg) i ręcznie oznaczyć ok. 20 tyś zdjęć przedstawiających znaki drogowe, sygnalizację świetlną i pieszych. Zajęło to parę dni, ale było warto, wskaźnik detekcji poprawił się znacznie, głównie ze względu na to, że niektóre zdjęcia które zdecydowałem się oznaczać były bardzo niewyraźne, albo słońce świeciło bezpośrednio w kamerę, co odzwierciedlało prawdziwe sytuacje. Etykietowanie danych było mozolnym procesem, ale efekt był więcej niż zadowalający. Cz.8. Mądrzej, szybciej, lepiej. Ostatecznie projekt spełnił moje oczekiwania, muszę przyznać, że na początku nie spodziewałem się tak dobrych rezultatów. Finalnym potwierdzeniem działania robota powinien być przejazd po nieznanym torze. Dla utrudnienia tor testowy postanowiłem zrobić w innym kolorze (nie posiadał on również przerywanych linii), na dodatek w testowym przejeździe postarałem się, aby słońce świeciło w kamerę. Wyniki przejazdu można zobaczyć na załączonym GIF-ie 🙂 . Pozwoliłem sobie na zachowanie tajemnicy w kwestii przedstawionego na początku "zadania z gwiazdką" czyli jazdy przez skrzyżowanie. Dla dociekliwych na końcu artykułu umieściłem link do GitHuba, kto będzie chciał, dojdzie w jaki sposób realizuję to zadanie 🙂 . Jazda po nowym torze. Jest wiele sposobów na usprawnienie robota. Warto zaznaczyć, że czas przesyłu danych po Wi-Fi zajmuje niemal tyle samo czasu co detekcja i klasyfikacja. Umieszczenie algorytmów na komputerze pokładowym umożliwiłoby przetwarzanie większej ilości klatek na sekundę tym samym zwiększając dokładność i być może maksymalną prędkość pojazdu. Należy również zaznaczyć, że projekt był eksperymentem mającym na celu sprawdzenie możliwości sieci neuronowych i mam nadzieję, że nikt nie pomyśli, że neguję sens stosowania klasycznej analizy obrazu. Poniżej załączam film przedstawiający działanie robota. Aha, nie wspomniałem chyba, że można nim sterować za pomocą kierownicy komputerowej, która w trybie autonomicznym odzwierciedla ruchy pojazdu? Wystarczy nacisnąć przycisk na kierownicy i jesteśmy w trybie jazdy autonomicznej. Cały kod znajduje się na GitHubie. W razie niejasności służę pomocą, w przypadku dużego zainteresowania tematem chętnie stworzę bardziej szczegółowe wpisy. Pozdrawiam i zachęcam do dyskusji w komentarzach. Rafał [1] Bostrom, Nick. Superinteligencja. Wydawnictwo Helion 2016. ISBN 978-83-283-1934-9. [2] Zdaję sobie sprawę, że pojęcia "sieci neuronowe" i "sztuczna inteligencja" nie są tożsame, używam uproszczenia jako, że sieci stanowią jak na razie główny kierunek rozwoju SI.
  13. Witam, chciałbym zrobić mini linię produkcyjną (mini taśmociąg) , którą sterowałbym przez Arduino. Z napisaniem programu sobie poradzę. Mam pytanie odnośnika silników, jakie najlepiej zastosować, żeby można było nimi sterować z Arduino ? Z góry dziękuję za odpowiedź.
  14. Witam! Mam może głupie pytanie ale co zrobić aby sterownik dawał 6V na kanał? Jakie musi być zasilanie. Może jakaś przetwornica?
  15. Zbudowałem jeżdzącego robota na bazie standardowego podwozia, który ma jeździć zdalnie rozpoznawać obrazy Cieszę się bo było to pierwszy kontakt z technologią Tensorflow Lite i widzę jak fajne możliwości daje to na urządzeniach drobnych, niepodłączonych do internetu. Oryginalny wpis z mojego bloga znajdziecie tu: https://lukaszkuczynski.github.io/Machina-ze-slaboscia/ Github z projektem jest tu: https://github.com/lukaszkuczynski/rpi80b3 Dlaczego samochód? Od kiedy kupiłem pojedynczy silnik krokowy musiał odczekać swoje. Przeleżał dobre kilka tygodni w pudełku. Ale potem przemyślałem sprawę i zanim zaprojektowałem kolejny system z sensorem pomyślałem - jakie miałem myślenie w dzieciństwie? Zrobić autko, którym da się sterować. Zdalnie sterować. A dziś radio jest już wszędzie, wszystkie nasze mniejsze i większe urządzenia “chodzą po BT / WIFI”. A gdzieś na półce leżał czarny i zakurzony mały komputerek - Raspberry 3B. Machina działa w dwóch trybach pracy. Możliwe jest zdalne sterowanie i obserwowanie w kamerze gdzie jadę. Brak jakiejkolwiek stabilizacji więc obraz jakiego doświadczam wygląda mniej więcej tak. Jest tak zapewne dlatego że mocowanie to kawałek kartoniku. Gdy tylko dobiorę się do drukarki 3D albo z kolegą zaprojektuje mały stelaż będzie na pewno lepiej. Mogę też badać działanie uczenia maszynowego. Oczywiście nie trenowałem sieci neuronowej samemu bo choć bawiłem się już ML to nie miałem doświadczenia z badaniem obrazów - Computer Vision. Dlatego podstawiłem gotowy model w Tensorflow, który jest już wytrenowany na przykładowych obiektach. Oparty jest na zbiorze COCO . Aktualnie program jest tak ustawiony że gdy wykryty zostanie obiekt typu pomarańcz to pojazd wykonuje kilkusekundowy krótką jazdę wprost. Nie ma tu na razie logiki, która dostosowywała by tor jazdy do tego gdzie dokładnie ta pomarańcz stoi. Program do sterowania zdalnego to prosta aplikacja we Flasku. Komunikacja z silnikami odbywa się poprzez nadawanie sygnału PWM. Z kamerą mam dwie opcje do wyboru. Pierwszą jest zwyczajne przekierowanie obrazu na streaming HTML. Drugą jest detekcja obrazu. Jak to już wcześniej zaznaczyłem Tensorflow odwala tutaj brudną robotę. Detekcja polega na prostym klasyfikowaniu obrazów pochodzących z kamery z gotowym modelem zaczytanym z repozytorium. W moim wypadku jest tutaj klasyczny model COCO z 90 klasami obiektów. Cele na przyszłość: więcej czujników - np detekcja przeszkód korzystając z ładniejsza obudowa 🙂 mniej baterii / zasilić wszystko z 1 źródła po detekcji obiektu zmierzać do obiektu, mądrze regulacja prędkości ładniejsza aplikacja webowa
  16. Witam 🙂 Od około półtora roku interesuję się sztuczną inteligencją, zwłaszcza zastosowaną w robotyce. Jest to dla mnie niezwykle ciekawy temat 🙂 Kilka miesięcy temu zacząłem pracować nad moim prywatnym projektem, który cały czas jest w fazie rozwoju. Pewne elementy, takie jak uczenie się poprzez rozmowę z człowiekiem są gotowe, więc postanowiłem nagrać poniższe filmy: AgeBot podłączony jest do internetu. Platforma to gotowa konstrukcja - AlphaBot-PI. Użyłem jej, aby szybciej skupić się na oprogramowaniu. W ostatnim czasie domykałem widoczne na filmach możliwości robota i w międzyczasie zacząłem pracę nad wykorzystaniem kamery (aktualny stan to ~30%). W bliskiej przyszłości platformę mam zamiar wymienić na coś bardziej zaawansowanego lub zbudować swoją, ponieważ ta zaczyna mnie powoli ograniczać (pod względem hardware'u). Jej specyfikacja dostępna jest w internecie (np. na stronie firmy Waveshare), więc nie będę kopiował 😉 Jak już zauważyliście - używam Raspberry PI. Oprogramowanie na malinkę napisałem w C++, pozostała część to C++ oraz Python. Systemem jest Raspbian. Do zautomatyzowania instalacji niektórych zależności w systemie (akurat w przypadku samej malinki) używam narzędzia Ansible, a o te krytyczne dla działania aplikacji dba manager pakietów (apt, buduję paczki .deb). Do przetwarzania tekstu użyłem biblioteki Tensorflow, natomiast w procesie uczenia się, robotowi asystuje wnioskowanie. Kamera i przetwarzanie obrazu otworzy wiele nowych drzwi, ułatwi również pracę przy kolejnej domenie - planowaniu zadań. Sam robot jest stosunkowo małą częścią projektu, ale o tym... w przyszłości 😉 Każdy feedback mile widziany 🙂 Pozdrawiam PS: W ciągu kilku dni napiszę posta z trochę bardziej szczegółowymi informacjami odnośnie przetwarzania tekstu - czatowania z robotem
  17. Cześć, jestem tutaj nowy. Zbieram obecnie materiały odnośnie mojej pracy dyplomowej związanej z analizą modeli współpracy robotów mobilnych. Czy ktoś z Was pisał lub interesuje się tym zagadnieniem i zna jakieś ciekawe materiały na ten temat? Byłbym bardzo wdzięczny za jakiekolwiek wskazówki. Pozdrawiam
  18. Witam, jestem nowym użytkownikiem forum i mam pytanie do osób które przeszły trochę w życiu i mają większe doświadczenie niż ja. A mianowicie w jakim kierunku się uczyć i rozwijać aby zdobyć większe doświadczenie w robotyce i dziedzinach pokrewnych. Ogarniam proste układy elektroniczne, arduino bez problemu, i mam też doświadczenie w programowaniu zarówno robotów mobilnych jak i c++ i języków webowych. Jakiś czas temu robiłem na konkurs prototyp robota wiercącego w lodzie. Chciałby zacząć robić jeszcze bardziej zaawansowane roboty i projekty ale jest tyle dziedzin które sumują się na robotykę, że ciężko mi ustalić kierunki od których zacząć poszerzanie wiedzy i umiejętności.
  19. Witam, Mam do zrobienia robota mobilnego (pojazd zdalnie sterowany). Muszę do niego policzyć wymaganą siłę pociągową (może chodzić o siłę ciągu) oraz moment dynamiczny (moment wymagany do rozpędzenia pojazdu). Na podstawie tych wartości muszę dobrać napędy. Pojazd będzie posiadał 4 silniki i będzie sterowany przy pomocy Raspberry Pi. Niestety szukanie wzorów, czy sposobów na wyliczenie tego idzie mi dość topornie, także liczę na pomoc. Dane: · Szacowana masa pojazdu: M ≤ 0,5 kg · Zakładana rampa: α = 25° · Zakładana prędkość: v = 2,0 m/s · Zakładane przyspieszenie: a = 2,5 m/s2 Do obliczenia: · Wymagana siła pociągowa (siła ciągu) · Moment dynamiczny Z góry dziękuję za jakąkolwiek pomoc
  20. Witam, wybieram się na Air na Wydziale Elektrotechniki i Automatyki w Gdańsku, okazało się, że my zajęcia będziemy mieli zdalnie, łącznie z laboratoriami... Na wydziale elektroniki, telekomunikacji i informatyki wszystko rusza normalnie co jest zdecydowanie nie fair. Zacząłem rozmyślać nad zmianą kierunku, tyle że tu pojawia się problem. Czym to się dokładnie różni. Szukałem w internecie już od dawna, ale nie mogłem znaleźć jednoznacznej odpowiedzi. Z góry dziękuję za pomoc 🙂
  21. Cześć, jestem początkujący, jestem w trakcie budowy czteronożnego robota kroczącego, używam Arduino Uno oraz 16 kanałowego sterownika PWM do sterowania 12 serwomechanizmami Tower Pro 9g. Problem pojawił się z doborem odpowiedniego zasilania dla serw. Potrzebuję w miarę kompaktowego zasilania 5/6 V oraz 4/5 A. Bardzo proszę o pomoc. Zastanawiam się nad użyciem dwóch ogniw litowo-jonowych 18650 (3,7V maksymalny prąd rozładowania 4A), tylko w jaki sposób doprowadzić do odpowiedniego napięcia,?
  22. Więc jestem zupełnie świeży w sprawach arduino jednak już mam kilka fajnych pomysłów jak mógłbym je wykorzystać. Zapoznałem się już jako tako z programowaniem ale dalej kuleje w kwestii sprzętu i urządzeń jakie można wykorzystać z arduino. Do mojego pierwszego większego projektu potrzebowałbym silnika o momencie obrotowym 9.5 lub 10. Przeszukując Bootland zdałem sobie sprawę że taki silnik nie jest polecany do budowy robotów oraz ma napięcie zasilające 12 lub 6V. Tutaj pojawia się moje pytanie. Czy istnieje silnik który spełni założenie dużego momentu obrotowego jednocześnie będąc kompatybilnym z arduino czy może istnieje jakiś sposób na sterowanie większym silnikiem ? Może można jakoś obejść napięcie zasilania ? Za każdą pomoc będę wdzięczny i mam nadzieję że znajdę na tym forum pomoc :).
  23. Witam chciałem przedstawić wam mój projekt który ostatnio zbudowałem jest to prosta ręka robota oparta o 3 serwach sg90 są to proste serva modelarskie pozwalające na precyzyjne ruchy oraz są stosunkowo tanie. do sterowania układem zastosowałem Arduino Uno Rev3 ale może być to każdy inny moduł, w moim projekcje zastosowałem również moduł bluetooth, przydadzą się również płytka stykowa i kable połączeniowe. Dodatkowo postanowiłem wykonać pudełko drewnianych patyczków. Cały projekt przedstawia się następująco: Teraz trochę o podłączeniu Same podłączenie nie powinno stanowić problemu. Trzeba jednak pamiętać, że pin TX na arduino do pinu RX na module bluetooth a RX do TX Uwaga!!! jeśli macie płytkę Arduino Uno musicie podłączyć konwerter napięć gdyż posiada ono informacje na 5V a moduł bluetooth przyjmuje 3,3V ale możecie drobić taki z dwóch rezystorów przestawiony po niżej, ważne by te rezystory wynosiły minimum 10kΩ Dzielnik napięć Schemat projektu Kod projektu #include<Servo.h> // dodajemy bibliotekę do sterowania serwomechanizmem Servo servo; Servo servo2; // twożymy 3 obiekty klasy servo Servo servo3; void setup() { Serial.begin(9600); //rospoczynamy komunikację z prętkością 9600 botów servo.attach(2); servo2.attach(3); servo3.attach(4);// podpisujemy serva pod odpowiednie piny servo3.write(0); // ustawiamy servo 3 do poziomu startowego } char cmd[100]; byte cmdIndex; // przechwytujemy znaki z telefonu void execmd(){ if(cmd[0] =='a') // dla indeksu a wykonujemy poniższe polecenia { unsigned int val = atof(cmd+2); servo.write(val); // w zależności od zmiennej z indeksem a obracamy servem } if(cmd[0] =='b') { unsigned int val = atof(cmd+2); servo2.write(val); } if(cmd[0] =='c') { servo3.write(180); } if(cmd[0] =='d') { servo3.write(0); }} void loop() { if(test==0){ if(Serial.available() >0) { char c =(char)Serial.read(); if (c == '\n') { cmd[cmdIndex]=0; execmd(); cmdIndex=0; }else{ cmd[cmdIndex]=c; if(cmdIndex<99){cmdIndex++;} } } } } Aplikacja Do obsługi ramienia użyłem aplikacji RoboRemoFree jest to darmowa aplikacja ze sklepu play poniżej przesyłam konfigurację tej aplikacji Myślę ze każdy może wykonać taki projekt nie jest to trudne a nauczy nas trochę o samej komunikacji bluetooth z arduino. PS. jest to mój 1 post tutaj więc jeśli ktoś ma jakieś sugestię lub uwagi to był bym wdzięczy z konstruktywną krytykę
  24. Witam, jakiś czas temu kupiłem MeArm dla Arduino: https://allegro.pl/oferta/ramie-robota-mearm-dla-arduino-niebieskie-8209373621?item=8209373621 Szukam kodu do arduino który pozwoli na nowo sterować ramieniem przez joysticki. W grałem na płytkę swój kod, przez utraciłem wcześniejsza konfiguracje i nie mogę sterować przez joysticki. Wiecie może gdzie mogę ten "orygnialny" code znaleźć ?
  25. Słowem wstępu, wyobraźmy sobie że jesteśmy na słonecznej, piaszczystej plaży wzdłuż której rosną wysokie, bogate w orzechy kokosowe palmy. Pod jedną z nich stoi lokalny, doświadczony, zbieracz kokosów, u którego mamy zamiar nauczyć się tego ciężkiego rzemiosła. Jako zaledwie początkujący adepci tej trudnej sztuki, nie mamy jednak zielonego pojęcia jak się do tego zabrać. Dlatego nasz nowy mentor musi nam wytłumaczyć co i jak powinniśmy zrobić. Może on nam wytłumaczyć wszystko krok po kroku. Opisać dokładne pozycje naszych kończyn, prędkość z jaką będziemy się wspinać i sposób odbierania kokosu. Oczywiście opisanie nam tego na tyle dokładnie, byśmy mogli bezbłędnie przystąpić do pracy wymagałoby dużo czasu i energii. Zamiast tego, może pokazać nam osobiście jak to zrobić i dać nam przystąpić do pracy. W krótkim i bogatym w informacje czasie, będziemy wiedzieli jak przystąpić do pracy. Ten wpis brał udział konkursie na najlepszy artykuł o elektronice lub programowaniu. Sprawdź wyniki oraz listę wszystkich prac » Partnerem tej edycji konkursu (marzec 2020) był popularny producent obwodów drukowanych, firma PCBWay. Po tym ciut przydługawym wstępie, którym starałem się nakreślić pewien problem, możemy przystąpić do właściwego omówienia tematu. Istnieje wiele metod programowania robotów przemysłowych (manipulatorów). Wykonują one precyzyjne prace, wymagające wielu skomplikowanych ruchów. Jednak poza nimi, roboty mogą też wykonywać mniej skomplikowane ruchy np. podczas zmiany pozycji lub przełączenia między poszczególnymi pracami. O ile do wykonania operacji precyzyjnych niezbędny jest szczegółowo opracowany program, o tyle podczas ruchów mniej skomplikowanych czas programowania można ukrócić do metod Online Programming. Krótki film przedstawiający podział metod programowania Metody te pozwalają operatorowi manualnie lub za pomocą odpowiedniego kontrolera ustawić poszczególne pozycje robota, które zostaną przez niego zapamiętane w czasie bieżącym oraz odtworzone w postaci pożądanego przez nas ruchu. Programowanie robota spawalniczego przy pomocy metody teach-in Programowanie robota Festo BionicCobot przy pomocy metody play-back Programowanie play-back opiera się na sczytywaniu przez oprogramowanie pozycji robota, zapisywanie ich oraz odtwarzanie poprzez bezpośrednie poruszanie jego konstrukcją. Aby było to możliwe, każdy stopień swobody robota musi posiadać sensor umożliwiający określenie jego dokładnej pozycji. Oprócz tego napęd robota musi działać w wyrachowany i delikatny sposób, aby konstrukcja była jednocześnie sztywna i można było nią poruszać ręcznie. Programowanie teach-in z kolei polega na ustawieniu robota w ustalonych pozycjach za pomocą odpowiedniego kontrolera, za pomocą którego te pozycje zostaną zapisane a następnie odtworzone. Odtwarzanie kolejno zapisanych pozycji daje w efekcie płynny, ciągły ruch maszyny. Wyżej wspomniane metody omówimy na realnym przykładzie. Za pomocą kontrolera będziemy mogli stosować na prostym manipulatorze metodę teach-in. Robot napędzany jest serwami modelarskimi oraz wykonany w technice druku 3D. Serwa posiadają wbudowane potencjometry sczytujące pozycje kątowe wałów, jednak bez ingerencji w ich budowę ciężko będzie korzystać z tych potencjometrów do określania pozycji robota. Dlatego manualne ustawienie pozycji manipulatora metodą play-back wypada z puli naszych opcji. Poza tym istniałaby duża szansa na uszkodzenie stosowanych w robocie serw. Zamiast tego, posłużymy się kontrolerem, który będzie kinetycznym modelem naszego manipulatora i pozwoli także zahaczyć o ideę play-back. Ramię manipulatora wydrukowane w 3D, poniżej link do źródła https://www.thingiverse.com/thing:1015238 Kontroler odpowiada kinematyce prezentowanego robota i ma umieszczone potencjometry w każdym jego punkcie swobody. Poruszając nim, możemy ustalić rzeczywistą pozycję naszego manipulatora. Budując r obota o mniej skomplikowanej budowie, możemy pozostać przy samych potencjometrach np. zamontowanych na płytce stykowej. Jednak w przypadku tego robota korzystanie z tego rozwiązania byłoby trudniejsze i mniej wygodne w użytku. Model kinematyczny manipulatora Znając już budowę kontrolera oraz manipulatora, należy je już tylko do siebie podłączyć. Oprócz tego do układu dodane zostaną przyciski nagrywania oraz odtwarzania ruchu. Elektronika opiera się o mikrokontroler atmega328p. Zasilanie układu odbywa się z sieci napięciem 230 V. W obudowie znajduje się układ prostujący, przetwornica step-down zasilająca serwomechanizmy oraz płytka arduino ze wspomnianym wcześniej mikrokontrolerem. Dla wygody wszystkie piny arduino zostały wyprowadzone na zewnątrz obudowy. Cały schemat przedstawianej konstrukcji znajduje się poniżej: Schemat układu Lista opisanych komponentów: -S1 – włącznik główny, -S2 – przycisk nagrywania, -S3 – przycisk odtwarzania, -D1 – mostek Graetza 400V ; 4A, -D2 – zielona dioda LED, -C1 – kondensator elektrolityczny 1000µF ; 50V, -C2 – kondensator elektrolityczny 220µF ; 25V, -C3 – kondensator elektrolityczny 22µF ; 25V, -C4 – kondensator ceramiczny 100nF, -C5 – kondensator ceramiczny 22pF, -C6 – kondensator ceramiczny 22pF, -C7 – kondensator ceramiczny 100nF, -R1 – rezystor 150 Ω, -R2, R3, R4 – rezystor 1 kΩ, -POT 1, POT 2, POT 3, POT 4, - 10 kΩ, -Stabilizator napięcia LM7805, -Przetwornica step-down LM2596, -X1 – kwarc 16 MHz, Połączenie układu Po podłączeniu całej elektroniki można przystąpić do omówienia kodu arduino. Program ten został już zaopatrzony w bogatą ilość komentarzy, które na pewno pomogą osobom dopiero rozpoczynającym swoją przygodę z arduino: //biblioteka umożliwiająca nie tylko sterowanie serwami, ale także ich prędkością //nie jest ona koniecznością, wystarczy standardowa biblioteka <servo.h> oraz pozbycie się zmiennej 'predkosc' z koduć #include <VarSpeedServo.h> //definiujemy serwa używane w robocie: VarSpeedServo servo1; VarSpeedServo servo2; VarSpeedServo servo3; VarSpeedServo servo4; //definiujemy przyciski nagrywania i odtwarzania: const int przycisk_A = 2; const int przycisk_B = 3; //definiujemy wartości dla wciśniętych przycisków nagrywania i odtwarzania: int przycisk_A_ON = 0; boolean przycisk_B_ON = false; //definiujemy potencjometry: const int potencjometr1 = A0; const int potencjometr2 = A1; const int potencjometr3 = A2; const int potencjometr4 = A3; //definiujemy zmienne służące do odczytu wartości napięć z potencjometrów: int potencjometr_1_odczyt; int potencjometr_2_odczyt; int potencjometr_3_odczyt; int potencjometr_4_odczyt; //definiujemy zmienne służące do zapisu wartości kąta położenia poszczególnego serwa: int potencjometr_1_zapis; int potencjometr_2_zapis; int potencjometr_3_zapis; int potencjometr_4_zapis; //definiujemy tablice zapisujące położenie serwa: int Pozycja_serva1[]={1,1,1,1,1}; int Pozycja_serva2[]={1,1,1,1,1}; int Pozycja_serva3[]={1,1,1,1,1}; int Pozycja_serva4[]={1,1,1,1,1}; void setup() { //definiujemy piny do których podłączone są serwa: servo1.attach(6); servo2.attach(9); servo3.attach(10); servo4.attach(11); //definiujemy piny wejściowe przycisków nagrywania i odtwarzania: pinMode(przycisk_A, INPUT_PULLUP); pinMode(przycisk_B, INPUT_PULLUP); //inicjalizacja portu szeregowego do podglądu działania programu: Serial.begin(9600); } void loop() { //ustalanie prędkości serw w zakresie od 0 do 180: int predkosc = 90; //zapis formuły umieszczania odczytanej z potencjometrów wartości do tabeli: potencjometr_1_odczyt = analogRead(potencjometr1); potencjometr_1_zapis = map (potencjometr_1_odczyt, 0, 1023, 20, 175); potencjometr_2_odczyt = analogRead(potencjometr2); potencjometr_2_zapis = map (potencjometr_2_odczyt, 0, 1023, 5, 175); potencjometr_3_odczyt = analogRead(potencjometr3); potencjometr_3_zapis = map (potencjometr_3_odczyt, 0, 1023, 5, 175); potencjometr_4_odczyt = analogRead(potencjometr4); potencjometr_4_zapis = map (potencjometr_4_odczyt, 0, 1023, 20, 160); //serwa przyjmują pozycje zapisane w tabelach: servo1.write(potencjometr_1_zapis, predkosc); servo2.write(potencjometr_2_zapis, predkosc); servo3.write(potencjometr_3_zapis, predkosc); servo4.write(potencjometr_4_zapis, predkosc); //przy kolejnym wciśnięciu przycisku nagrywania tabela każdego serwa zostanie //nadpisana, zapamiętując obecną pozycję serwa: if(digitalRead(przycisk_A) == HIGH) { przycisk_A_ON++; switch(przycisk_A_ON) { case 1: Pozycja_serva1[0] = potencjometr_1_zapis; Pozycja_serva2[0] = potencjometr_2_zapis; Pozycja_serva3[0] = potencjometr_3_zapis; Pozycja_serva4[0] = potencjometr_4_zapis; Serial.println("Pozycja pierwsza zapisana"); break; case 2: Pozycja_serva1[1] = potencjometr_1_zapis; Pozycja_serva2[1] = potencjometr_2_zapis; Pozycja_serva3[1] = potencjometr_3_zapis; Pozycja_serva4[1] = potencjometr_4_zapis; Serial.println("Pozycja druga zapisana"); break; case 3: Pozycja_serva1[2] = potencjometr_1_zapis; Pozycja_serva2[2] = potencjometr_2_zapis; Pozycja_serva3[2] = potencjometr_3_zapis; Pozycja_serva4[2] = potencjometr_4_zapis; Serial.println("Pozycja trzecia zapisana"); break; case 4: Pozycja_serva1[3] = potencjometr_1_zapis; Pozycja_serva2[3] = potencjometr_2_zapis; Pozycja_serva3[3] = potencjometr_3_zapis; Pozycja_serva4[3] = potencjometr_4_zapis; Serial.println("Pozycja czwarta zapisana"); break; case 5: Pozycja_serva1[4] = potencjometr_1_zapis; Pozycja_serva2[4] = potencjometr_2_zapis; Pozycja_serva3[4] = potencjometr_3_zapis; Pozycja_serva4[4] = potencjometr_4_zapis; Serial.println("Pozycja piąta zapisana"); break; } } //po wciśnięciu przycisku odtwarzania serwa będą przyjmować zapisane w tabelach pozycje //z odczekaniem 1.5 sekund w każdej pozycji: if(digitalRead(przycisk_B) == HIGH) { przycisk_B_ON = true; } if(przycisk_B_ON) { for(int i=0; i<5; i++) { servo1.write(Pozycja_serva1[i],predkosc); servo2.write(Pozycja_serva2[i],predkosc); servo3.write(Pozycja_serva3[i],predkosc); servo4.write(Pozycja_serva4[i],predkosc); Serial.println("Odtwórz ruchy"); delay(1500); } } //czas opóźnienia działania programu, od jego nastawy zależy płynnośc pracy robota: delay(200); } Program działa w sposób następujący: Po uruchomieniu programu, za pomocą modelu kinematycznego będzie można bezpośrednio kontrolować ruch manipulatora, Jeżeli wciśniemy przycisk S2 (nagrywania), obecnie ustawiona pozycja robota zostanie zapisana, Program umożliwia zapisanie pięciu różnych pozycji, Jeżeli wybierzemy przycisk S3 (odtwarzania), robot zacznie odtwarzać wybrane przez nas pozycje w nieskończonej pętli, Aby wytyczyć nową sekwencję ruchów należy zresetować układ. Efekt działania powyższego kodu przedstawia się następująco: Dzięki funkcji monitora szeregowego w arduino można obserwować pracę manipulatora bezpośrednio: Przepraszam wszystkich czytelników za jakość nagrań wideo, niestety ograniczały mnie możliwości sprzętowe. Przedstawiony wyżej kod jest prosty a przykład nieskomplikowany, jednak doskonale pokazuje podstawy działania tej metody. Nie mniej jednak mam nadzieję, że artykuł okaże się dla wielu osób pomocny. Oprócz tego zostawiam jeszcze bibliotekę <VarSpeedServo> 😉 VarSpeedServo-master.zip Powodzenia we wszelkich przyszłych projektach i przygodach z elektroniką!
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.