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 - roboty
    • Projekty - DIY
    • Projekty - DIY (początkujący)
    • Projekty - 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
    • Kosz

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


Znaleziono 26 wyników

  1. 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
  2. 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
  3. 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
  4. 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,?
  5. 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 :).
  6. 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ę
  7. 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źć ?
  8. 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ą!
  9. Cześć razem z kolegą pracujemy nad robotem na konkurs RoboRave w łęgowie. Robot będzie startował w kategori firefighting. Będzie miał za zadanie zgaszenie 4 losowo rozmieszczonych świeczek na wysokości od 10cm do 45cm. Jest opart na arduino a za szkielet posłużą nitowane płytki. Dodatkowe elementy takie jak zaokrąglenia rogów podstawy pochodzą z drukarki 3d. Gdy robot będzie gotowy wstawię dokładniejszy opis.
  10. Witam! Mam problem z tym projektem ponieważ mam podpięte wszystkie kabelki prawidłowo program i biblioteki również a działa tylko sensor (wykrywa ruch) i servomotor ("kręci tylko głową")a nie wysyła żadnego sygnału do silników. Proszę o pomoc! (Film na którym się wzorowałem https://www.youtube.com/watch?v=4CFO0MiSlM8 ) <---SCHEMAT #include <Servo.h> //Servo motor library. This is standard library #include <NewPing.h> //Ultrasonic sensor function library. You must install this library //our L298N control pins const int LeftMotorForward = 5; const int LeftMotorBackward = 4; const int RightMotorForward = 3; const int RightMotorBackward = 2; //sensor pins #define trig_pin A1 //analog input 1 #define echo_pin A2 //analog input 2 #define maximum_distance 200 boolean goesForward = false; int distance = 100; NewPing sonar(trig_pin, echo_pin, maximum_distance); //sensor function Servo servo_motor; //our servo name void setup(){ pinMode(RightMotorForward, OUTPUT); pinMode(LeftMotorForward, OUTPUT); pinMode(LeftMotorBackward, OUTPUT); pinMode(RightMotorBackward, OUTPUT); servo_motor.attach(11); //our servo pin servo_motor.write(90); delay(2000); distance = readPing(); delay(100); distance = readPing(); delay(100); distance = readPing(); delay(100); distance = readPing(); delay(100); } void loop(){ int distanceRight = 0; int distanceLeft = 0; delay(50); if (distance <= 20){ moveStop(); delay(300); moveBackward(); delay(400); moveStop(); delay(300); distanceRight = lookRight(); delay(300); distanceLeft = lookLeft(); delay(300); if (distance >= distanceLeft){ turnRight(); moveStop(); } else{ turnLeft(); moveStop(); } } else{ moveForward(); } distance = readPing(); } int lookRight(){ servo_motor.write(10); delay(500); int distance = readPing(); delay(100); servo_motor.write(90); return distance; } int lookLeft(){ servo_motor.write(170); delay(500); int distance = readPing(); delay(100); servo_motor.write(90); return distance; delay(100); } int readPing(){ delay(70); int cm = sonar.ping_cm(); if (cm==0){ cm=250; } return cm; } void moveStop(){ digitalWrite(RightMotorForward, LOW); digitalWrite(LeftMotorForward, LOW); digitalWrite(RightMotorBackward, LOW); digitalWrite(LeftMotorBackward, LOW); } void moveForward(){ if(!goesForward){ goesForward=true; digitalWrite(LeftMotorForward, HIGH); digitalWrite(RightMotorForward, HIGH); digitalWrite(LeftMotorBackward, LOW); digitalWrite(RightMotorBackward, LOW); } } void moveBackward(){ goesForward=false; digitalWrite(LeftMotorBackward, HIGH); digitalWrite(RightMotorBackward, HIGH); digitalWrite(LeftMotorForward, LOW); digitalWrite(RightMotorForward, LOW); } void turnRight(){ digitalWrite(LeftMotorForward, HIGH); digitalWrite(RightMotorBackward, HIGH); digitalWrite(LeftMotorBackward, LOW); digitalWrite(RightMotorForward, LOW); delay(500); digitalWrite(LeftMotorForward, HIGH); digitalWrite(RightMotorForward, HIGH); digitalWrite(LeftMotorBackward, LOW); digitalWrite(RightMotorBackward, LOW); } void turnLeft(){ digitalWrite(LeftMotorBackward, HIGH); digitalWrite(RightMotorForward, HIGH); digitalWrite(LeftMotorForward, LOW); digitalWrite(RightMotorBackward, LOW); delay(500); digitalWrite(LeftMotorForward, HIGH); digitalWrite(RightMotorForward, HIGH); digitalWrite(LeftMotorBackward, LOW); digitalWrite(RightMotorBackward, LOW); } Filmik jak działa.rar
  11. Drodzy Technicy! Typowe ramię robota tylko pozornie naśladuje nasze ludzkie. Mobilność naszych kończyn jest daleko większa gdyż mamy bardziej ruchliwe stawy. A co by było gdyby i robot miał możliwość realizowania wielu stopni swobody w ramach tylko jednego przegubu?... ... To pytanie zadałem sobie po raz pierwszy dawno, dawno temu, u schyłku poprzedniego tysiąclecia, kiedy to komórki były w cebuli i na ziemniaki. W owych straszliwych, bezfejsowych czasach, pacholęciem będąc, usłyszałem o bajecznej chirurgii laparoskopowej. Dziurka od klucza te sprawy... Zafascynował mnie ten temat w stopniu większym niźli przysługiwał memu smarkaczowatemu stanowi. Pooglądałem sobie narzędzia jakie są używane i byłem niezmiernie zbulwersowany, że wśród nich brak jest takich, które by działały wystarczająco dobrze... Było dla mnie oczywistym, że przegub, który występuje w tego typu instrumentach, winien pracować podobnie jak nadgarstek, gałka oczna czy staw ramienny lub biodrowy. W takim brzuchu czy innym sercu jest klaustrofobicznie ciasno, więc należy mieć możliwość działania swobodnie w każdym kierunku bez przeszkód. Istniejące konstrukcje dają wolność w wymiarze albo w lewo albo w prawo i dopiero przy następnym przegubie mamy ponownie jedynie słuszną dowolność albo w lewo albo w prawo… No ale tam, w tych trzewiach, przecie nie ma miejsca na taką gburowatość w ruchach! O jakże potężną moc ma dziecięcy gniew!... Zanurkowałem w bezkresnym bałaganie mojego pokoju i cudem odnalazłem w miarę całą i nadal względnie kulistą piłeczkę pingpongową i zacząłem kombinować… O dziwo udało mi się znaleźć rozwiązanie. Działało! Ale niestety nie działało dość dobrze… Konstrukcja żerowała na wytrzymałości bardzo finezyjnych, delikatnych i trudnych w wykonaniu elementach. Wiedziałem już wtedy, że jeżeli coś ma być do medycyny to ma być solidne, niezawodne i nade wszystko tanie!… Początkowy gniew, po którym nastał złudny sukces, ostatecznie przeobraził się z wieloletnią, dojmującą rozpacz bezowocnych poszukiwań… Aż tu nagle, razu pewnego, jadłem na kolację jajecznicę. Lubuję się w takiej technologii spożycia rzeczonej jajecznicy, gdy niezmiennie pozostaje ona na patelni a ta z kolei spoczywa uroczyście na gazecie aby zadość uczynić stołowemu, kuchennemu bhp… Pozwalam sobie o tym wspomnieć tylko dlatego, że wystąpił w tamtym momencie ów decydujący czynnik katalizujący me pragnienia – gazeta! A dokładniej skrawek jej, marginesem zwany, wciąż niedoceniany, który aż się prosi aby przelać nań jakąś ważną myśl. Z takiego zaproszenia skwapliwie skorzystałem bo właśnie wtedy napadła mnie bardzo ważna myśl, jakże utęskniona… Otóż rozwiązanie patowego problemu, który dręczył mnie całe dziecieństwo, że o okresie gołowąsowości nie wspomnę, okazało się bezczelnie proste – stos rurek, rozmieszczonych współosiowo kubek w kubek, uzębionych na końcu, przenosi ruch w oś stawu, na którym nanizana jest adekwatna ilość kół zębatych, a te z kolei, przenoszą napęd dalej... Każda rurka, wraz z przypisanym sobie kołem odpowiada za inną funkcję, której sobie życzymy… Wszelkie ruchliwości mogą być realizowane osobno lub jednocześnie - jednakowoż sterowanie ich jest niezależne, z możliwościami (zaletami i wadami) i precyzją układów zębatych… czyli klasyka mechaniki w nieco odświeżonej, cudacznej formie... Po etapie gazetowym nastąpiła już czysta formalność – zasiadłem do warsztatu, pozbierałem kilka rurek, kilka zębatek wypreparowałem z maszyn, które liczyły czasy słusznie minione… Nad ranem dysponowałem ruchliwą ilustracją mojego pomysłu. Oddam pod łaskawy osąd drogich Forumowiczów, czy to drugie podejście, które nastąpiło po wielu latach rozkmin podprogowych, może osuszyć wcześniejsze łzy… Proszę o słowa możliwie merytoryczne i krytyczne. Oczywistym jest, że rozwiązanie to namieszać może w robotyce jako takiej. Pierwotnie skupiłem się na medycynie bo tam jest najtrudniej i tam też najprędzej nowe rozwiązania powinny trafiać. Nota bene stąd wynikają rozmiary prototypu, który naprędce zmajstrowałem.. Docelowo produkcja tych urządzeń miała być realizowana za pomocą lasera femtosekundowego (popularne dziś stenty, przedmioty o podobnych rozmiarach i klasie dokładności są tak wykonywane). Ja wtedy miałem tylko rękę uzbrojoną w pilnik – stąd żałosna dokładność... Wyzwań, którym trzeba by sprostać jest wiele – opracowanie odpowiedniego modułu zęba (audi ma na koncie niezłą propozycję, co najważniejsze przećwiczoną), wybór materiału (metal, ceramika?), w końcu wybór systemu łożyskowania… Owszem, sporo zabawy! Jednakże śmiem twierdzić, że rozwiązanie jakie pozwoliłem sobie zaproponować pod wieloma względami jest nader atrakcyjne – daje nieznane dotychczas, nowe możliwości. Ochoczo przyjmę wszelkie uargumentowane za i przeciw. Szczególnie będę wdzięczny za wskazanie gdzie takie rozwiązanie w przemyśle już występuje. Przyznam się, że na tamten czas, przeprowadziłem gruntowne poszukiwania przynajmniej śladów podobnych koncepcji, gdyż byłem przekonany, że tak prosty mechanizm musi już gdzieś występować. Dopiero później odnalazłem lakoniczny schemat rysunkowy zamieszczony bodaj na stronie pewnej japońskiej uczelni. Niestety, nie było żadnych zdjęć czy filmu dokumentujących prace badawcze nad tego typu konstrukcją. Życzę owocnych rozmyślań i z góry dziękuję za rozpoczęcie dyskusji! Szczegóły zębatki:
  12. Cześć mam problem z zaprogramowaniem analogowego czujnika płomieni Waveshare. Jest to czujnik z botlandu za 10.99zł. Buduje robota na konkurs RoboRave w kategorii fire fighting. Jeżeli znacie jakiś poradnik to o podanie linku czy nazwy. Z góry dziękuje.
  13. Rozwiązuje proste zadanie kinematyki i prosiłbym, aby ktoś mógł sprawdzić moje rozwiązanie. Treść i rozwiązanie w załącznikach
  14. Witam, zabieram się za budowę robota podwodnego wykorzystując Arduino, robot niewielki, 3 silniki DC i mam kilka pytań co do kwestii komunikacji i sterowania: 1. Czy za pomocą arduino UNO oraz modułu sterowania silnikami 4-kanałowym uda mi się sterować silnikami DC ? I jak zasilić taki shield wraz z UNO czy wystarczy zasilanie z odpowiedniego akumulatora Li-lon ? 2. Jak rozwiązać kwestie sterowania robotem? Rozwiązanie bezprzewodowe wydaje mi się bezsensowne pod wodą przez zakłócenia fal ( może się mylę). Natomiast nie wiem do końca jak rozwiązać sterowanie przewodowe, czy za pomocą pada np. od PS2 i skrętki? 3. Czy jest kamera arduino która spełni swoje zadanie i jak przesłać dane do PC lub urządzenia? Czytałem, że wystarczy kamerka internetowa na USB przerobiona na RJ45 i podpięta do PC, ale do końca nie jestem pewny czy na długim kablu takie rozwiązanie się sprawdzi. Czy LAN będzie najlepszym rozwiązaniem czy też może inny pomysł? Jeśli ethernet to jaki moduł wystarczy ? Dzięki za wszystkie rady :)
  15. Witajcie. Mam do zaprezentowania mój nowy projekt. Zdalnie sterowany robot kroczący z odbiornikiem podczerwieni. Jednostką centralną jest mikrokontroler ATmega8A-PU. Robot porusza się dzięki trzem serwomechanizmom TowerPro SG90. Inspiracją do sposobu chodzenia był robot kroczący Pololu. Robot posiada 6 niebieskich diod. Ich katody są połączone z odpowiednimi pinami mikrokontrolera, dzięki czemu steruję nimi w zależności od wykonywanego ruchu robota. Anody są połączone przez rezystor z nogami robota, te natomiast są połączone z potencjałem dodatnim zasilania. Jako pilota używam telefonu z androidem wraz z aplikacją RCoid. Korzystam ze standardu RC5. Kierunkami poruszania się robota są przód, tył, obracanie w lewo i prawo. Do zatrzymania robota służy dowolna inna komenda. Sterowanie serwomechanizmów odbywa się dzięki programowo stworzonemu PWM na 8 bitowym timerze mikrokontrolera. Tak wygląda kod przerwania od przepełnienia timera: ISR(TIMER0_OVF_vect) { static uint16_t cnt; if(cnt>=r) PORTC &= ~(1<<PC3); else PORTC |= (1<<PC3); if(cnt>=m) PORTC &= ~(1<<PC4); else PORTC |= (1<<PC4); if(cnt>=l) PORTC &= ~(1<<PC5); else PORTC |= (1<<PC5); cnt++; if(cnt>625) cnt = 0; } Zmienne r m i l odpowiadają za położenie poszczególnych nóg zmieniane w pętli głównej programu. Ich zakres mieści się od 17-76 (0.5ms-2.5ms) (0°-180°). Oczywiście zakres pracy jest mniejszy. Dla przykładu dobranymi wartościami dla nogi środkowej są 42 przy oparciu na lewej części, 44 pozycja środkowa, 46 oparcie na prawej części nogi. Zmienna licznika cnt jest porównywana z wartością 625, dzięki czemu uzyskuję częstotliwość 50Hz (8000000Hz/1/256/625=50Hz [20ms] [prescaler=1]). Jeżeli chodzi o kwestie zasilania to zdecydowałem się na użycie czterech zwykłych baterii AAA dających na wyjściu ~6V co zmusiło mnie do użycia przetwornicy Pololu S7V7F5 do zasilania mikrokontrolera. Diody i serwomechanizmy są zasilane bezpośrednio z baterii. Nogi zostały wygięte ze stalowego drutu o średnicy 1.5mm. Do orczyków zostały przymocowane za pomocą stalowego drutu o średnicy 0.3mm. Koniec każdej nogi zalałem gorącym klejem tak, aby zapobiec ślizganiu się robota na gładkiej powierzchni. Lista elementów: mikrokontroler ATmega8A-PU 3x serwomechanizmy TowerPro SG90 przetwornica Pololu S7V7F5 odbiornik podczerwieni TSOP31236 6x diody niebieskie rezonator kwarcowy 8MHz trytki i rurki termokurczliwe druty stalowe o średnicy 1.5mm, oraz 0.3mm płytka stykowa 170 otworów 4x baterie AAA z koszykiem parę rezystorów, kondensatorów i przewodów Zapraszam do śmiałego pisania swoich pytań, opinii i uwag Pozdrawiam, Karol
  16. Witam wszystkich! Dzisiaj przedstawię mój kolejny projekt robota z "recyklingu", ponieważ znalazłem spisany na straty, kompletnie zniszczony samochód RC w skali 1:16. Z tej zabawki udało mi się odzyskać przedni, tylny układ napędowy i kilka mniejszych części mechanicznych. Proto ma napęd 4x4 i skrętną przednią oś. Z tego wszystkiego wyszedł całkiem szybki i zwinny robot, więc chce się nim pochwalić. Mechanika Proto: Plastikowa płytka trzymająca cały samochód w kupie była dość mocno pęknięta, a usztywnienia nie znalazłem. Postanowiłem więc samodzielnie zaprojektować i wydrukować w 3D wszystkie potrzebne części za pomocą mojej Anet A6. Dodatkowo płyta, którą wydrukowałem, okazała się trochę za długa i musiałem zaprojektować przedłużenie wała napędowego, aby zachować napęd na cztery koła. Silnik który pasował do konstrukcji to silnik typu 500 zasiany napięciem 12V, a serwo to zwykłe serwo typu standard. Uznałem, że najlepsza metoda montażu pcb z elektroniką i pakietu zasilającego to rzepy, żeby dało się szybko wymieniać te elementy. Elektronika i zasilanie: Płytkę PCB zaprojektowałem i wytrawiłem samemu, znajduje się na niej już używane przeze mnie czyli połączenie czyli H-bridge VNS2sp30, Arduino NANO i moduł bluetooth XM-15B. Ten zestaw wydaje się najwydajniejszy nawet jeśli weźmie się pod uwagę to że używam tylko jednego z dwóch sterowników na czerwonej płytce. Dodatkowo na PCB znalazł się buzzer (klakson i alarm), przycisk i dodatkowe wyprowadzenia (nie wyprowadzałem wszystkich pinów, ale teraz wiem że to lepiej było wyprowadzać wszystkie dostępne, poprawię to kiedyś). Płyta główna jest osadzona na kolejnym wydrukowanym stelażu z rzepem. Zasilanie robota to trzy ogniwa 18650 o pojemności 1000mAh każde. Projekt koszyka na ogniwa ukradłem z Thingiverse. Baterie dają napięcie ~12V i wystarczają w zupełności do prawidłowego funkcjonowania robota. Dodatkowo z tyłu zamontowany jest woltomierz do monitorowania napięcia. Aplikacja do sterowania przed Bluetooth to keuwl, moim zdaniem to jedna z najlepszych aplikacji tego typu. Na koniec pokarze jeszcze kilka fotek całego projektu i film na YouTube: Mam nadzieję że robot Proto spodoba się wszystkim użytkownikom. Pozdrawiam, Technowsky
  17. Cześć, praca inżynierska zbliża się wielkimi krokami, więc chciałbym zacząć jak najwcześniej. Temat: robot mobilny BB-8. Chciałbym zacząć od części mechanicznej i tu chciałbym zadać Wam pytanie: czy tego typu kula styropianowa https://allegro.pl/oferta/55-cm-to-moze-byc-gigantyczna-kula-styropianowa-5859406525 (wzmocniona włóknem szklanym)nada się na główną część ciała? Do wstępnych testów trwałość nie będzie aż tak istotna, bardziej zależy mi na łatwym otwieraniu i zamykaniu.
  18. Mam plan zbudowania prostego robota na raspberry pi 3 który będzie reagował na dźwięk i jechał w jego stronę , samego rpi już mam (stąd wybór) i pozostaje kwestia wyboru silniczków i tu mam problem, ponieważ nie wiem jak obliczyć masę jaką udźwigną dane silniczki więc bym był wdzięczny jak by ktoś mi przedstawił taki wzór
  19. "Devastator" O zbudowaniu robota myślałem już dawno. Devastator ma też swojego poprzednika, lecz o wykonaniu conajmniej tragicznym. Po podjęciu decyzji o budowie robota zaczęłem rozglądać się za częściami a jednocześnie zajęłem się wakacyjną pracą, żeby jakoś dorobić się na te części. Zbudowanie tego robota kosztowało mnie jak do tej pory trochę ponad 1000 zł dodając jeszcze do tego masę czasu, kawy i nieprzespanych nocek przy budowie. Głównym problemem był dla mnie program. Programistą nie jestem jakimś dobrym a jeszcze dodatkowo projekt ten jest pierwszym z użyciem raspberry pi. Największym problemem był program. Sczególnie dał mi się we znaki, gdy chciałem zaprogramować serva. Jak na złość żaden program znaleziony w internecie nie chciał działać. Więc musiałem przestudiować zasadę działania serv, i na podstawie wyciągnietych wniosków metodą prób i błędów udało mi się dojść do rozwiązania tego problemu. Tak więc mając mniejsze i większe problemy udało mi się dobrnąć do zbudowania robota. Zamysł projektu jest taki, żeby zbudować takiego robota, który dostanie się w takie miejsca niebezpieczne lub miejsca gdzie człowiek się nie dostanie. Czyli np. budynki grożące zawaleniem, szczeliny, oraz wiele innych. Zamiast podawać teoretyczne zastosowania wolę wspomnieć o sytuacjach gdy Devastator znalazł zastosowanie. Przede wszystkim użyłem go do sprawdzenia stanu podwozia auta. następne zastosowanie znalazł gdy zatkały się przepusty na pod wjazdem na moje podwórko. Dzięki temu robotowi szybko odnalazłem owe zatkane przepusty, dzięki czemu oszczędziłem sobię wiele pracy. Sprzydał się również podczas szukania nieszczelności w instalacji hydraulicznej. Zaczynając od początku: Mózgiem robota jest Raspberry PI 3 b+(link na dole). Malinę wybrałem tylko dlatego, że potrzebowałem odskoczni od arduino. Następnie użyłem sterownik silników(link na dole) do sterowania gąsienicami. Do budowy użyłem również baterii li-ion 18650 , powerbanka , kilku serv, modułu kamery z nadajnikiem radiowym oraz własnej płytki pcb. Do budowy użyłem podwozia gąsienicowego "Devastator"(stąd nazwa robota, link na dole), ramienia wydrukowanego na drukarce 3D oraz wieżyczki z kamerką również drukowaną na drukarce. obecnie pracuję nad dopinanym z przodu spychem/elektromagnesem. Program napisany w Pythonie (z małą pomocą wujka google). Sterowany poprzez klawiaturę bluetooth, natomiast obraz przezyłany radiowo przez moduł bezpośrednio do telefonu. Devastator posiada zasilanie modułowe. Znaczy to, że osobno jest zasilana logika, silniki, serva, oraz kamerka. Devastator przeżył już swój debiut na konkursie Geniusz IT(Dotarł do finału). Jak wiadaomo z każdym projektem jest jakieś ograniczenie budżetowe. W moim przypadku ciągle szukam dodatkowych funduszy na ulepszenie tego projektu, np. muszę wymienić serva na o wiele wytrzymalsze bo na ten moment ramię działa jedynie w wersji pokazowej. Muszę również przerzucić się na komunikację radiową, a wiadomo nic za darmo. NIe będę już więcej przynudzał. wrzucam wam więc kilka zdjęć (sorki że obrócone, pogimnastykujecie się trochę ) : A tu kilka przydatnych linków: raspberry: https://botland.com.pl/pl/moduly-i-zestawy-raspberry-pi-3-b-plus/11142-raspberry-pi-3-model-b-wifi-dual-band-bluetooth-1gb-ram-14ghz-7131796402594.html?search_query=raspberry+pi+3+b+&amp;results=937 podwozie: https://botland.com.pl/pl/podwozia-robotow/6610-dfrobot-devastator-gasienicowe-podwozie-robota-metalowe-silniki.html?search_query=devastator&amp;results=2 sterownik silników: https://botland.com.pl/pl/podwozia-robotow/6610-dfrobot-devastator-gasienicowe-podwozie-robota-metalowe-silniki.html?search_query=devastator&amp;results=2
  20. Witam, zrobiłem robota według poradnika i niestety tylko jeden silnik działa. Załączam zdjęcia.
  21. Witam bardzo serdecznie jestem tu pierwszy raz więc proszę o wyrozumiałość . Chciałbym złożyć drobny układ, który to by mi ładował powerbank dzięki energii słonecznej, mam panel 6v 1w 200mA oraz stabilizator ka78L05.Gdy na panelu mam napięcie 5.6V to na stabilizatorze uzyskuje 4.2, dodatkowo gdy podłączamy przetwornice step-up 1.2A 5v to na wyjściu otrzymuje ledwo 3V nie znam dokładnie przyczyny tak słabego napięcia na wyjściu, dlatego też czy jeżeli bym dołożył jeszcze jeden panel o tych samych specyfikacjach to czy bym osiągnął zadowalający efekt? Tzn. mógłbym podłączyć powerbank i by śmigalo wszystko.
  22. Już w najbliższą sobotę, w Warszawie odbędą się jedne z największych zawodów robotów. Wstęp dla widzów darmowy! Wszystkie wcześniejsze edycje tego wydarzenia były przepełnione atrakcjami dla konstruktorów oraz odwiedzających. Zobacz na własne oczy zmagania robotów lub weź udział w warsztatach. [blog]https://forbot.pl/blog/robomaticon-wybierz-sie-na-zawody-robotow-w-warszawie-id34559[/blog]
  23. Witam, przedstawiam mój pierwszy projekt DIY opisany na Forbocie. Robota nazwałem Maxi-Brzydal, ponieważ podwozie i nadwozie na którym wykonałem robota jest wizualnie zniszczone i nie wygląda ciekawie. Robot może być sterowany za pomocą Bluetooth i posiada funkcję omijania przeszkód, którą można włączyć i wyłączyć z poziomu aplikacji. Robot posiada sterowanie "jak czołg", regulację prędkości, sterowanie chwytakiem (trzema serwami), włącznik lamp i włącznik trybu omijania przeszkód. Panel sterowania zrobiłem w aplikacji Bluetooth Electronic od keuwl. Sama aplikacja nie potrzebuję żadnych dodatkowych bibliotek i wszystko odbywa się za pomocą komend monitora szeregowego, czyli Serial.read itd. MECHANIKA i ZASILANIE: Robot został zbudowany za starym podwoziu od jakiegoś pojazdu RC(Podwozie znalazłem w piwnicy bez baterii silników i z uszkodzoną elektroniką). Podwozie jest bardzo fajne, ponieważ posiada pompowane, gumowe opony, które świetnie sprawują się na powierzchniach wszystkich typów. Całość napędzają dwa silniki 12V, które są w stanie uciągnąć około 2-kilogramową konstrukcję. W przedniej części znajduję się chwytak sterowany za pomocą 3 serw TowerPro MG-995 wykonany z aluminium. Co do zasilania zwykłe "laptopówki" nie dawały wystarczająco mocy więc wybór padł na akumulator żelowy 12V 1.3Ah pozwalający wykorzystać potencjał silników w 100%. Taki akumulator kosztował mnie jakieś 20zł. ELEKTRONIKA: Mózgiem całego robota jest klon bardzo popularnego Arduino NANO z procesorem Atmega328 na pokładzie, który w zupełności wystarcza do tego typu robota. Kod zabiera jakieś 45% pamięci. Do komunikacji z telefonem lub komputerem wykorzystałem moduł BT o nazwie XM-15 . Moduł ten ma większy zasięg od popularnych HC-05 i HC-06, a jest tak samo łatwy w obsłudze. do sterowania silnikami posłużyłem się dwoma sterownikami VNH2SP30 osadzonymi na shildzie do Arduino UNO. Użyłem tych sterowników ponieważ silniki potrzebują aż 5A, a ten sterownik może dać 30A. Płytkę PCB wytrawiłem sam w domu rysując odpowiednie ścieżki i wyszła całkiem dobrze. Na płytce oprócz arduino, sterownika silników i modułu BT znajduję się kilka dodatkowych złączy zasilania, wyjścia do podłączenia serw oraz dość duży kondensator (chodzi o to, że przy maksymalnej mocy silników przy ruszaniu bez niego potrafiło zrestartować arduino i rozłączyć moduł BT, teraz jest Soft Start, ale kondensator został). Na czerwonym nadwoziu zamontowane są trzy czujniki ultradźwiękowe HC-SR04 do wykrywania przeszkód, dwie lampy LED 12V i mały woltomierz do sprawdzania naładowania akumulatora. Jest to mój pierwszy wpis na forum więc proszę o wyrozumiałość dla młodego, dopiero uczącego się, pasjonata robotyki i programowania. Liczę na konstruktywną krytykę od tych bardziej doświadczonych i wskazówki co mogę zrobić lepiej. Na wszystkie pytania postaram się odpowiedzieć. Pozdrawiam wszystkich czytelników, Technowsky!
  24. Cześć wszystkim, chciałbym przedstawić wam mój pierwszy projekt DIY - wyścigówka Robo Race. Projekt ten powstał w celu rozwinięcia pasji, jaką było stworzenie własnego autonomicznego pojazdu oraz w celu wzięcia udziału w wyścigach Roborace będących częścią międzynarodowych zawodów Sumo Challenge. Zawody te polegają na wyścigu mobilnych robotów czterokołowych. Zadaniem robota jest przejechanie określonej liczby okrążeń (od startu do mety) toru z liniami jak w kategorii Line Follower ograniczonego bandami, wraz z resztą robotów ścigających się. Pierwszy z robotów, który przejedzie określoną liczbę okrążeń, wygrywa etap konkurencji. Z powodu wymagań opisanych powyżej postanowiłem stworzyć pojazd reagujący na sygnały z czujników wykrywających przeszkody (w postaci ścianek tworzących tor ruchu robota, oraz innych robotów biorących udział w wyścigu). Na podstawie zdobytych informacji pojazd wymija przeszkody dopasowując odpowiednio skręcenie kół oraz prędkość obrotu silnika. Jako, że w swojej karierze wykorzystywałem głównie arduino do sterowania robotem postanowiłem wykorzystać moduł firmy DFRobot, który zgodny jest z Arduino Uno. Dodatkowo wykorzystałem możliwość komunikacji dzięki modułowi BLE w celu skomunikowania mikrokontrolera z telefonem, dzięki któremu mogłem dostrajać robota. Do budowy projektu wykorzystałem następujące elementy: Płyta mocująca: wykonana z pleksi, stanowi bazę do pozostałych części. Płyty wydrukowane na drukarce 3D: Zaprojektowane w programie DesignSpark Mechanical 2.0, zapewniają utrzymanie części sterujących robota. Układ napędowy: przenosi moment z osi silnika na tylną oś pojazdu, która wyposażona jest w mechanizm różnicowy ułatwiający skręcanie. Układ skręcający: skrętne 2 przednie koła sterowane poprzez Serwo Hitec HS-322HD. Mikrokontroler: Romeo BLE pozwalający bezpośrednio sterować robotem oraz komunikować się z urządzeniami dzięki modułowi BLE CC2540. Sterownik silnika PWM: sterownik, potrafiący sterować silnikiem napędzającym pojazd. Silnik: Redox bardzo wydajna jednostka napędzająca pojazd. Zasilanie: 2 akumulatory, większy Pakiet Li-Pol Redox 4400mAh 30C 4S 14,8V do zasilania silnika, oraz mniejszy Pakiet Li-Pol Redox 2200mAh 30C 2S 7.4V do zasilania serwomechanizmu, mikrokontrolera oraz czujników. Układ sensoryczny: 3 analogowe czujniki podczerwieni. Układ, sterowany przez mikrokontroler Romeo BLE odczytuje pomiary przez analogowe czujniki, następnie na ich podstawie wytwarza sygnał sterujący serwomechanizmem pojazdu, oraz sygnał sterujący silnikiem napędowy, który podany na sterownik PWM przetwarzany jest na sygnały kluczujące zasilaniem silnika napędowego. Dzięki modułowi BLE możliwa stała się bezprzewodowa komunikacja z mikrokontrolerem, co pozwoliło na dynamiczne dostrajanie regulatora PD sterującego serwomechanizmem robota. Wykorzystałem do tego program pracujący z poziomu przeglądarki App Inventor 2. Program ten pozwolił mi na stworzenie mobilnej aplikacji, pozwalającej na przesyłanie do robota i odczytywanie aktywnych parametrów regulatora PD robota. Parametry regulatora odczytywane są przez mikrokontroler pojazdu i zapisywane do odpowiednich zmiennych dzięki zastosowaniu poniższego kodu: void loop() { regulator(kp, kd); if(Serial.available()>0){ val = Serial.readStringUntil('\n'); if(val.startsWith(kp)){ val.remove(0, 2); kp=val.toInt(); }else if(val.startsWith(kd)){ val.remove(0, 2); kd=val.toInt(); }else{ val=""; } } } Pojazd odczytuje wartości położenia od przeszkód z czujników w przerwaniach czasowych z częstotliwością 500Hz. Pozwala to na stały odczyt odległości, dzięki czemu możliwe jest sterowanie w czasie rzeczywistym. void setup() { Serial.begin(115200); //Set Serial Baud noInterrupts(); // zatrzymaj wykonywanie jakichkolwiek przerwań // ustawianie timera 2 // TCCR2A i TCCR2B to rejestry kontrolne timera 2 // służą one do wyboru trybu pracy danego timera // i wartości podzielnika TCCR2A = 0;// zerowanie rejestru kontrolnego A TCCR2B = 0;// zerowanie rejestru kontrolnego B TCNT2 = 0;// zerowanie licznika // ustawiamy rejestr porównawczy na 500 Hz OCR2A = 255;// = (16000000) / (500*256) - 1 [ustawianie liczby impulsów do zliczenia TCCR2A |= (1 << WGM22); // ustawianie timer2 w tryb obsługi przerwań (CTC) TCCR2B |= (1 << CS22) | (1 <<CS20); // ustawianie dzielnika na 256 // ustawianie maski rejestru przerwań zegarowych timera 2 TIMSK2 |= (1 << OCIE2A); // wzkazanie że przerwanie ma być wywołane dla rejestru OCR2A interrupts(); //zezwalenie na wykonywanie przerwań } ISR(TIMER2_COMPA_vect) // wywołanie funkcji po zliczeniu impulsów timera { odczyt(); } void odczyt(){ wartosclewego = analogRead(SENSORLEWY); wartoscprawego = analogRead(SENSORPRAWY); wartoscsrodek = analogRead(SENSORSRODEK); } Dzięki wartością pozycji odczytanych z czujników oraz parametrom regulatora sygnał sterujący robotem wytwarzany jest przez poniższy kod void regulator(const int kp, const int kd){ err_prev = err; err = wartoscprawego - wartosclewego; serwo = kp * (err + kd*fpr*(err - err_prev)); //kp - wzmocnienie; fpr - częstotliwość próbkowania; kd - wzmocnienie części różniczkującej if(serwo > 85) serwo = 85; if(serwo < 5) serwo = 5; } Poniżej przedstawiam moje dzieło Wyścigówka w akcji:
  25. 1) Wstęp Postępujący w ostatnich dziesięcioleciach rozwój przemysłu spowodował potrzebę podnoszenie efektywności produkcji przy jednoczesnym obniżaniu kosztów. Naturalnym następstwem jest pojawianie się różnego typu maszyn, urządzeń i instalacji zastępujących pracownika tam, gdzie wykonywana praca jest w pełni powtarzalna pozwalając na wprowadzenie automatyzacji. Jednym z jej owoców są manipulatory – roboty, które działaniem przypominają ludzką kończynę górną. Ich efektorem (końcówką roboczą) może być na przykład chwytak (przenoszenie przedmiotów), wrzeciono frezujące bądź inne elektronarzędzie (obróbka) czy głowica spawalnicza (spawanie). Celem projektu było zbudowanie mini-systemu segregującego krążki na białe i czarne z manipulatorem opartym na projekcie EEZYbotARM https://www.thingiverse.com/thing:1015238 w roli głównej. Kolor krążków miałby być rozpoznawany za pomocą czujnika odbiciowego CNY70 (dioda IR + fototranzystor). Podczas pojedynczego cyklu, wyzwalanego za pomocą przycisku START, robot segregowałby 8 elementów, przekładając je do odpowiednio białego i czarnego pojemnika. Oprócz wspomnianego przycisku, na interfejs użytkownika składałyby się linijka ośmiu diód LED RGB oraz brzęczyk. 2) Parametry modelu Wymiary [cm]: 40x25x20 Kontroler: Arduino Uno R3 + Arduino Sensor Shield V5.0 Zasilanie: Zasilacz DC 5V 4A Czas cyklu: <1min; maximum 8 krążków Czujnik odbiciowy: CNY70 Ruch krążków: Wymuszony grawitacyjnie, szyna ustawiona pod kątem 30° Dodatkowe funkcje: Brzęczyk, przycisk START, 8 diód sygnalizujących RGB 3) Teoria Serwomechanizm modelarski to urządzenie, które sterowane sygnałem prostokątnym PWM pozwala na obrót wału w zakresie 180°. W manipulatorze wykorzystano cztery serwa, trzy główne SG-92R oraz jedno sterujące chwytakiem SG-90. Rozpoznawanie koloru krążka odbywa się poprzez czujnik odbiciowy – powierzchnia biała odbija wiele światła, oświetlając tym samym fototranzystor, co nie ma miejsca przy powierzchni czarnej. Po naciśnięciu przycisku START czujnik rozpoznaje kolor, zwraca informację do sterownika, a ten steruje serwami tak, aby krążki przekładane były do odpowiednich pojemników. Kolejność, w jakiej krążki były ułożone na szynie jest zapisywana na linijce LED. Podstawę stanowi frezowana płyta z mlecznej plexy o grubości 5mm. Pozostałe części wykonano z wykorzystaniem druku 3D, wspomagając się programem Google SketchUp. Rysunek techniczny 2D podstawy, niezbędny do jej późniejszej obróbki na ploterze frezującym CNC, opracowano w programie SolidEdge ST8. Wsad Arduino liczy 170 linijek kodu. Wykorzystano bibliotekę VarSpeedServo.h, która pozwala na zadanie kąta obrotu wału serwa oraz prędkości, z jaką ma ono nastąpić. 4) Film 5) Schemat blokowy i ideowy elektroniki 6) Główny fragment programu for(int x=0; x<8; x++) { //Powtórzenie 8-krotne linijka.setPixelColor(x, linijka.Color(255, 255, 0)); //Sygnalizacja kolorem żółtym, który krążek jest właśnie rozpoznawany linijka.show(); if (analogRead(A0)>=500) //Ocena, czy krążek jest biały (pomiar napięcia na fototranzystorze czujnika CNY70) { BASE.slowmove(50,50); //Ruchy serwomechanizmów RB.slowmove(120,50); RS.slowmove(90,50); GRIP.slowmove(pozycja1,100); delay(1000); GRIP.slowmove(0,100); delay(1000); BASE.slowmove(50,20); RB.slowmove(70,20); RS.slowmove(140,20); delay(1000); BASE.slowmove(10,50); RB.slowmove(110,20); delay(1000); GRIP.slowmove(pozycja2,100); delay(1000); linijka.setPixelColor(x, linijka.Color(255, 255, 255)); //Sygnalizacja kolorem białym, właśnie przełożony krążek był biały linijka.show(); } else if (analogRead(A0)<500) //Analogicznie dla krążków czarnych {...} Podsumowanie Wszystkie początkowo zakładane wymagania i cele zostały osiągnięte. Co ważne, na podstawie kilkudziesięciu prób można stwierdzić, że instalacja cechuje się wysoką niezawodnością – skuteczność w rozpoznawaniu detali wynosi 100%, nie dochodzi również do zacięć czy w samym działaniu mechaniki i elektroniki. Model budowałem hobbystycznie, natomiast później prezentowałem go na różnych pokazach itd. oraz konkursie innowacji technicznych, gdzie reprezentowałem szkołę. Pozdrawiam Zapraszam do pozytywnej krytyki PS. Kilka zdjęć (dwa ostatnie zdjęcia pokazują spód modelu, który stoi na pomarańczowych "nóżkach")
×
×
  • Utwórz nowe...