Skocz do zawartości

Przeszukaj forum

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

  • Szukaj wg tagów

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

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino, 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 5 wyników

  1. Witam wszystkich. Mamy w szkole kilka zestawów Lego Mindstorms EV3, z którymi byliśmy już na kilku zawodach w kategoriach sumo i linefollower. Moją uwagę zwróciły jednak roboty starszej generacji Lego RCX, które w konkurencji linefollower biją nowsze wersje czyli np. EV3 na głowę. I tu moje pytanie, czy ktoś mógłby wyjaśnić z czego to wynika ten fenomen, że starsze generacje są lepsze od nowszych? Zacząłem się zastanawiać, czy nie kupić z jednego, czy dwóch zestawów RCX, ale wolałbym najpierw wiedzieć w czym tkwi sekret?
  2. Cześć! Skończyłem budowę mojego pierwszego robota. Jest to też mój pierwszy większy projekt, więc proszę o wyrozumiałość, komentarze, porady mile widziane. Z racji tego, że posiadam jeszcze dwa komplety lego, postanowiłem je wykorzystać do budowy pojazdu. Początkowo miały być silniki lego, ale stwierdziłem, że lepiej będzie zrobić to na zwykłych, uniwersalnych częściach. Konstrukcja miała być mała, zwinna, sterowana przez WIFI. Przednia oś, jak widać, sterowana za pomocą micro serwa. Nie było większych oporów, serwo bez problemów sobie radziło ze sterowaniem. Zacząłem szukać jakiegoś ciekawego i małego silnika DC. Postanowiłem wybrać silnik z podwójnym wałem. Kolejnym zadaniem było przebudowanie konstrukcji tak, żeby silnik się zmieścił i nie wadził w poruszaniu się robota. Z racji tego, że wolałem zaoszczędzić kilkanaście złotych na przejściówkę lego-wał, rozwierciłem otwory w częściach które miałem. Zacząłem myśleć jak wyglądałoby połączenie iPhone - ESP, ale w międzyczasie na uczelni dziekan zapowiedział nam dodatkowy projekt na zajęciach z mikrokontrolerów ( pierwsze takie zajęcia na drugim roku studiów ) - dowolny robot na platformie Arduino lub STM. Chłopaki na Facebookowej grupie Arduino uświadomili mi, że nie ma sensu robić projektu na ESP, bo musiałbym się łączyć tylko przez sieć i lepszym wyborem byłby bluetooth. Tak też się stało, zakupiłem moduł HM-10, który współpracuje z używanym przeze mnie iOS. Do tego całość przeniosłem na klona płytki Arduino. Jako aplikacji sterującej użyłem ArduinoBlue, wraz z biblioteką. Inne aplikacje nie chciały działać. W dodatku albo na iOS nie ma żadnych popularnych aplikacji do sterowania przez BLE albo nie udało mi się znaleźć. Możecie polecić ciekawe aplikacje na iOS, na pewno sprawdzę! Można zauważyć, że na breadbordzie zainstalowałem jakąś płytkę. Jest to sterownik silników DC, polecany, łatwy w użyciu. Dobra, silnik jest, działa, serwo jest, łączność przez BLE również. Wypadało by odpiąć wszystko od zasilania z gniazdka i zastosować akumulatory, baterie. Z początku była to dla mnie czarna magia, większe napięcie, jakieś ampery, przetwornice. Czytałem różne artykuły, oglądałem poradniki, pytałem na Facebookowej grupie. Ostatecznie, zgodnie z zasadami: Arduino + sekcja logiczna zasilana z powerbanka + wyprowadzenie zasilania bezpośrednio do serwa, silnik DC zasilany przez dwa ogniwa litowo-jonowe połączone szeregowo z BMS, napięcie zmniejszane przez przetwornicę Żeby szybko podpinać ogniwa do robota albo ładować, przylutowałem wtyki/gniazda DC 5.5mm. BTW. Bardzo długo męczyłem się z lutowaniem ogniw na 30-watowej lutownicy kolbowej. Metodą prób i błędów wszystko się złączyło. Przed podłączeniem każdego elementu lutowanego, sprawdzałem miernikiem czy nie ma zwarcia! Dodatkowo pokusiłem się o popularny czujnik odległości oraz mała prowizorka - dwie diody z opornikami schowane w obudowie po serwie (spaliło się), informujące o przeszkodzie w danej odległości. Wersja finalna, kilkukrotnie większa i cięższa niż pierwotna wersja. Wzmocniony układ kierowniczy. Jeździ, skręca, hamuje, cofa. Trzymany pod kocem Wszelkie komentarze mile widziane! A tutaj krótki filmik (musiałem zdemontować czujnik odległości, ponieważ powodował zakłócenia całego układu: Tak wygląda sterowanie za pomocą joysticka:
  3. To co tutaj widzicie, winien byłem pokazać Wam już od dawna, jednak z powodu braku możliwości do swobodnego stworzenia nagrania pokazującego funkcje robota (oraz konta na forum), przeleżał on jakiś czas kurząc się w moim warsztacie, aż do teraz... prawie miesiąc po tym jak go ukończyłem. Tak więc, lejdis end dżentelmen, prezentuję wam to oto robotyczne ramię wykonane z Lego: Przechodząc do konkretów zabrzmię może trochę dziecinnie mówiąc, że owe ramię zostało w pełni skonstruowane z oryginalnych części Lego (włącznie z elektryką i pneumatyką), a jedynymi nieoryginalnymi elementami są linki służące do zginania palców i garść gumek recepturek wykorzystanych do ich wyprostowywania oraz wiązania przewodów. Tak czy inaczej, tą konstrukcję możemy w całości zaliczyć do budowli z klocków, czy tego chcecie, czy nie. Oczywiście, oprócz "zwykłych" i często powielanych w oficjalnych zestawach części, mamy tu sort elementów obwodu elektrycznego i całkiem rozbudowany układ pneumatyczny. A te dwa właściwie wzajemnie się uzupełniają, tzn. mamy: - 2 czujniki podczerwieni, umożliwiające zdalne sterowanie; - 6 silników, z których jeden napędza kompresor; - 7 siłowników pneumatycznych; - 4 siłowniki śrubowe; - 6 zaworów doprowdzających powietrze do każdego siłownika; - pompę kompresora napędzaną jednym wyżej wymienionych silników; - wyłącznik ciśnieniowy, który odłącza kompresor, gdy w układzie zapanuje zbyt duże ciśnienie Skoro zapoznaliśmy się już z bill of material, pora przyznać się co skłoniło mnie do budowy. Otóż, pomysł narodził mi się w głowie jakieś 5 i pół roku temu jak natknąłem się na ten Jak na tamten czas obejrzana koncepcja wydawała mi się bardzo ciekawa, genialna wręcz w pomyśle i zastosowanych rozwiązaniach. Dodatkowo należy zwrócić uwagę na fakt, że autor wstawił dostępną dla wszystkich instrukcję budowy w opisie filmu, co może się przydać jeśli komuś z was przyszedł by pomysł, aby podjąć się budowy modelu o własnych siłach, ale nie będę dłużej kusił. Ja sam po latach miałem przyjemność zrekonstruować owe ramię, w dosyć dokładny sposób, natomiast szczerze zawiodłem się na działaniu. Duże obciążenia i sztywność niektórych części powodowały przerwy w działaniu, a czasem nawet blokowały zakres ruchów (szczególnie dłoni i nadgarstka). Ponadto, niektóre łączenia wymagały wzmocnienia, bo zdarzało się nie raz, że dana część się odczepiła, a oczywiście można było temu zapobiec. Pytacie skąd taka ocena? Te spostrzeżenia wyrobiłem sobie, ponieważ w ostatnim czasie otrzymałem zaproszenie na jeden festiwal popularnonaukowy, a szukając inspiracji z czym mógłbym tam pojechać pomysł od razu wpadł mi do głowy. Co prawda istniały różnice pomiędzy tym co było na filmie, a tym co osobiście zbudowałem i taką rzeczą były np. przewody, bo (ze względu na koszty) użyłem sztywniejszych poliuretanowych zamiast silikonowych jak w oryginale, a piszę to tym właściwie tylko dlatego, że niby taka mała zmiana a nastręczyła sporych problemów. Bo założenie ich na legowe siłowniki, zawory i rozdzielniki wymagało niemałej siły, dlatego też szybko po pierwszych próbach zacząłem stosować patent z rozpychaniem ich gwozdziem, a do tego oczywiście bez smaru się nie obyło. Po godzinach spędzonych na ich łączeniu odciski na palcach były okropne... Tak więc, mając to wszystko na uwadze, wyznaczyłem sobie za cel zbudowanie tego lepiej, mocniej i bardziej kompaktowo (bo co prawda o tym nie wspomniałem, ale pierwotne ramię było dość duże z nieproporcjonalnie wręcz wielką dłonią). Pomysł miałem cały czas gdzieś z tyłu głowy, zbudowałem jeden moduł służący do obrotu pozniejszego przedramienia gdzieś na początku tego roku, a reszta prac ruszyła właściwie po tym jak dowiedziałem się o trzeciej już edycji konkursu organizowanego przez PB: El-Robo-Mech. Tym sposobem dalsze prace potoczyły się gładko i zwięzle. Całokształt ramienia miałem właściwie gotowy czwartego dnia budowy o ile dobrze pamiętam, a całość zajęła trochę dłużej niż tydzień, no może dwa Najwięcej roboty, co już chyba przywykło do większych modeli było z przewodami. Tym razem, na szczęście już silikonowymi, dlatego łatwiej było je zakładać i nie były takie sztywne. Za to było ich tyle, że w konstrukcji ramienia jak i przedtem musiałem przewidzieć specjalne szyby dla nich, w przeciwnym wypadku wystawałyby za model niszcząc jego estetykę. Jednak to nie przewody miały być innowacyjnością w tej koncepcji. Tak naprawdę, główną różnicą, która zaważyła na prostocie działania, wielkości dłoni, a co za tym idzie i całego ramienia była budowa palców poruszanych dwoma siłownikami poprzez system linek, zakładanych na podobieństwo ścięgien w ludzkiej dłoni. Ten zabieg pozwolił znacznie odchudzić dłoń, nadając jej tym samym bardziej realistyczny wygląd.Co do działania, będę trochę leniwy w opisie, co nie znaczy, że opiszę je powierzchownie. Po prostu, poniżej macie w większości skopiowany tekst z mojej prezentacji (choć może nie powinienem tego pisać, bo teraz nie będzie chciało się wam czytać :3), która chyba nie jest taka zła skoro zakwalifikowała się jak na razie do pierwszego etapu konkursu No i oczywiście film: Opis ogólny Robot posiada dwie funkcje elektryczne i sześć pneumatycznych. Funkcje w pełni elektryczne obejmują dwie możliwości ruchu przedramienia: zginanie wokół stawu łokciowego oraz obrót nadgarstka o 90 stopni wokół osi wzdłużnej przedramienia. Obie są sterowane pilotem na podczerwień dzięki czujnikom umieszczonym na cięższym końcu ramienia. Wśród funkcji pneumatycznych mamy natomiast te typowe dla motoryki małej człowieka. Są nimi: ruch nadgarstka wokół osi poprzecznej przedramienia oraz funkcje odpowiedzialne za chwyt i ułożenie palców. Ruchy te są wykonywane dzięki siłownikom pneumatycznym, z których każdy podłączony jest do oddzielnego zaworu. Te z kolei – wszystkie napędzane są jednym kompresorem poprzez wyłącznik ciśnieniowy. Układ elektryczny W skład całego modelu wchodzą łącznie: 2 pojemniki na baterie, 2 czujniki podczerwieni sterowane pilotem, 5 silników o momencie 3,6 N*cm i jeden mocniejszy o momencie 14,5 N*cm (uwzględniając w tym ich redukcję wewnętrzną). Słabsze silniki wykorzystane są do napędzania funkcji elektrycznych: cztery z nich, parami sprzężone na sztywno odpowiadają za zginanie ramienia wokół łokcia, a ostatni z nich, piąty został użyty do jego obrotu. Szósty, największy silnik natomiast został wykorzystany do napędzania kompresora. Cały obwód jest zasilany napięciem 9V. Układ pneumatyczny W skład tego układu wchodzą: kompresor z pojedynczym tłokiem o średnicy d=16 mm i takim samym skoku (s), wyłącznik ciśnieniowy, 6 zaworów, 2 siłowniki o d=16, s=48, 4 siłowniki o d=16, s=28 oraz 2 miniaturowe siłowniki o d=8, s=16. Wygląda to w ten sposób, że spora część jak i „serce” całego układu w postaci kompresora znajduje się poza ramieniem, a wszystkie komponenty są z nim połączone poprzez silikonowe przewody o średnicy wewnętrznej 2 mm. Układ oparty jest o jednokierunkowy przepływ powietrza, tzn. powietrze jest zawsze wpompowywane w każdy siłownik niezależnie od tego czy się wysuwa czy wsuwa. Całość działa pod względnie niewielkim ciśnieniem. Funkcja 1: Obrót przedramienia wokół jego własnej osi Ten ruch jest możliwy dzięki konstrukcji, w której ruchoma część przedramienia jest osadzona na obrotnicy o średnicy 56 mm napędzanej pojedynczym silnikiem poprzez parę zębatek walcowych i przekładnię ślimakową. To ułożenie daje nam ostatecznie 338,8 N*cm momentu siły z jaką ręka wraz z dłonią oraz chwytanym przedmiotem będzie się obracać. Jest to całkiem sporo nawet jeśli uwzględnimy straty sprawności wynikające z tarcia i chociażby sztywność przewodów, które lekko hamują rękę w nadgarstku, gdzie są skumulowane. Funkcja 2: Podnoszenie i opuszczenie przedramienia Druga i ostatnia zarazem funkcja sterowana w pełni elektrycznie to najprościej mówiąc ruch góra-dół przedramienia wraz z dłonią w oparciu o staw łokciowy. Ruch ten zawdzięczamy czterem silnikom o łącznym momencie 14,5 N*cm, z których każdy przyłączony jest do jednego siłownika śrubowego o wysięgu 40 mm. Właśnie przez te siłowniki, silniki są parami sprzężone ze sobą na sztywno, a w praktyce wygląda to tak, że po prostu sumuje się ich siła. Staw łokciowy w celu zminimalizowania tarcia oraz zwiększenia precyzji ruchu oparty jest na dwóch ulokowanych symetrycznie obrotnicach o d=56 mm. Funkcja 3: Zmiana nachylenia dłoni w nadgarstku Czynność ta odbywa się za pośrednictwem dwóch siłowników pneumatycznych o łącznej sile nacisku 59,6 N. Ze względu na sam ciężar dłoni, można zauważyć, że szybciej wykonuje ona ruch w przód, ale nie odgrywa to większej roli w sposobie poruszania się modelu. Dzięki tej funkcji motoryka dłoni wydaje się być jeszcze bardziej naturalna. Funkcje 4 i 5: Zginanie palców dłoni Zginanie poszczególnych palców odbywa się za pomocą dwóch kolejnych siłowników pneumatycznych podłączonych do różnych zaworów, a co za tym idzie – sterowanych osobno. Innymi słowy: po przesunięciu jednej dźwigni zaworu zegną się lub wyprostują dwa palce: wskazujący i środkowy albo serdeczny i mały. Mamy więc do dyspozycji dwie dźwignie, a więc i dwie funkcje, które zdecydowałem się w tym miejscu opisać jako jedną, bo przecież chodzi nam najczęściej o jedno i to samo: aby robot uchwycił i przemieścił jakiś przedmiot. Patrząc pod tym względem jest to spore ułatwienie, ponieważ wykonując domyślnie prostą czynność nie musimy zawracać sobie głowy ułożeniem poszczególnych palców i ich segmentów. Robot zrobi to za nas dobierając odpowiednią siłę nacisku w każdym segmencie dzięki sprytnemu ulokowaniu recepturek i linek napinających. Funkcje 6 i 7: Ruch kciuka Na ostateczne położenie przeciwstawnego palca w tym modelu wpływają dwa siłowniki, takie same jakie wykorzystałem do zmian nachylenia dłoni, czyli o d=16 i s=28. Pierwszy z nich widoczny jest na zewnętrznej stronie dłoni i odpowiada za ruch kciuka do przodu i w tył. Dzieje się to za pomocą przeniesienia siły wysięgu przez pojedyncze cięgno o łączeniach kulowych i długości między środkami łączeń l=40mm (ciemnoszare na zdj.) do części właściwej kciuka zamocowanej na osi pod kątem 53 stopni względem linii zgięcia dłoni. Drugi siłownik jest umieszczony w ten sposób, że jego dolna nasada znajduje się praktycznie przy samym zakończeniu kciuka. Jest odpowiedzialny za ruch palca do środka bądź na zewnątrz dłoni. Oba z nich są sterowane osobno. Funkcja 8: Rozpostarcie palców Ten ruch rozumiemy przez swobodne odchylanie palców, tak aby każdy znajdował się bliżej lub dalej od sąsiada na płaszczyźnie wyprostowanej dłoni. Zależnie od tego czy chcemy uchwycić duży czy też mały przedmiot, możemy zmienić szerokość „luk” pomiędzy palcami poprzez rozpostarcie ich. Za tę niewinną funkcję odpowiada najmniejszy z zastosowanych w modelu siłowników pneumatycznych o d=8 i s=16 umieszczony po zewnętrznej stronie dłoni. Przy pełnym rozpostarciu nieco spada nam napięcie linek odpowiadających za zginanie małego i serdecznego palca, ale nie zmienia to faktu, że ta czynność dalej jest w pełni możliwa. Słowami zakończenia, z tego miejsca muszę wam szczerze pogratulować, że doszliście do tego miejsca, bo sam pisząc to nie wiedziałem do końca, że tak dużo mi to zajmie. W sprawach dalszego rozwoju mogę powiedzieć tyle, że planuję dalej rozwijać projekt, a pierwsze pomysły na to już padły. Przede wszystkim zacznę od przejścia z trybu ręcznego sterowania zaworami do zaworów sterowanych serwomechanizmami, np. przez laptop i płytkę Arduino, gdzie po wpisaniu odpowiednich komend będziemy mogli otwierać i zamykać poszczególne dopływy powietrza. W czym to ma niby pomóc? Otóż, nieraz sterując ramieniem ręcznie musimy przełączać więcej niż jedną dźwignię w celu wykonania prostej czynności. W domniemanym przypadku np. po wpisaniu komendy „catch” system sam odpowiednio dobierze, które porty zostaną otwarte, a z czasem może ich się zrobić nawet sporo... Co więcej, gdy będziemy mieli już płytkę Arduino w układzie, będę mógł poszerzyć model o zaprojektowany własnoręcznie cyfrowy miernik ciśnienia, który będzie przydatny do monitorowania jak zmienia się ciśnienie w obwodzie oraz system pomiaru ciężaru i wielkości chwytanych obiektów. W planach mam także rozbudowanie ramienia o odporny na działanie dużych sił staw barkowy, który znacznie poszerzyłby zakres ruchu robota. Kontakt: psor2.0@gmail.com
  4. To teraz moja kolej żebym się pochwalił swoim "dziełem". Konkretnie jest to algorytm linefollowera i drugiego robota podążającego za nim. Roboty zbudowane są z dwóch zestawów klocków Lego Mindstorms NXT ze standardowym firmwarem język programowania: NXC http://bricxcc.sourceforge.net/nbc/ obsługa modułu Bluetooth - zmodyfikowana wersja (podana na stronie nie działa ze względu na zmianę składni polecenia TextOut) - http://daniele.benedettelli.com/BT_NXC.htm inspiracja linefollowera - http://www.mindstorms.pl/cr_m_blackline.html Taki algorytm pozwala zbadać różne typy komunikacji. Część algorytmu odpowiedzialna za podążanie za linią jest analogiczna z komunikacją domniemaną. Można sobie wyobrazić, że istnieje jeszcze jeden robot znaczący swoją trasę za pomocą linii. Odpowiada to przypadkowi, gdy robot sprawdza na przykład czy jedzie po terenie ze skoszoną trawą lub gdy odczytuje chemiczne ślady pozostawione przez inne roboty (odpowiednik feromonów, por. w Anies Hannawati Purnamadjaja, R. Andrew Russell: „Robotic Pheromones: Using Temperature Modulation in Tin Oxide Gas Sensor to Differentiate Swarm’s Behaviours”. Intelligent Robotics Research Centre, Monash University, Clayton, Australia (2006)). Część algorytmu pozwalająca drugiemu robotowi podążać za pierwszym to ilustracja komunikacji na podstawie stanu. W tym przypadku odczytywanym stanem jest tylko obecność pierwszego robota w zasięgu czujników robota podążającego. Trzeci użyty w algorytmie rodzaj komunikacji to odbywająca się przez bezprzewodowy moduł Bluetooth komunikacja formalna. Przekazywany jest konkretny komunikat o braku zakłóceń w komunikacji na podstawie stanu. Nie jest ona konieczna, ale zastąpienie jej innym typem mogłoby okazać się bardziej pracochłonne i nieefektywne. linefol-jor-v5-mst.nxc // line-follower + robot sledzacy // projekt - Jordan 3.VI.2008r // dla jednego czujnika z obsługą bluetootha (master) #include "BTlib.nxc" #define BT_CONN 1 // linia do ktorej jest podlaczony slave #define MAILBOX 0 // tył tam gdzie czujnik // silnik na porcie A - lewy // silnik na porcie C - prawy string in; bool kierunek; int ciemne = 480, predkosc = -40; unsigned long czas, timer; byte skok=400, cz1 = IN_1; /* cz1 - port do ktorego jest podpiety jest czujnik optyczny */ sub masterBTCheck(int conn){ /****************************/ string cStr; /* sprawdzenie czy */ cStr = NumToStr(conn); /* mozliwa jest komunikacja */ cStr = StrCat("na linii ",cStr); /* przez Bluetooth */ if (!BTCommCheck(conn)){ /****************************/ TextOut(0,LCD_LINE2,"Polacz z robotem",true); TextOut(0,LCD_LINE3,"podazajacym"); TextOut(0,LCD_LINE4,cStr,false); TextOut(0,LCD_LINE5,"w menu NXT",false); until(ButtonPressed(BTNCENTER, false)); Stop(true); } } /*********************** * PROGRAM GLOWNY * ***********************/ task main() { // INICJALIZACJA // masterBTCheck(BT_CONN); // czy jest komunikacja Bluetooth SetSensor(cz1, SENSOR_LIGHT); SetSensorType(cz1,SENSOR_TYPE_LIGHT_ACTIVE); string tekst,out; int czas; // NORMALNA PRACA LIDERA // byte cz2=IN_4; // czujnik swiatla dzialajacy jako lampka kontrolna - nieobowiazkowa while(true) { ClearScreen(); SetSensorType(cz2,SENSOR_TYPE_LIGHT_ACTIVE); // BTSendMessage(BT_CONN,MAILBOX,out); //wyslanie wiadomosci /****** normalna jazda do przodu ******/ tekst = StrToNum(Sensor(cz1)); TextOut(10, LCD_LINE3,"cz1="+tekst,false); /* A-lewy, C-prawy */ in = BTReceiveMessage(BT_CONN, MAILBOX, TRUE); until (in=="ok") { Off(OUT_AC); in = BTReceiveMessage(BT_CONN, MAILBOX, TRUE); } OnFwd(OUT_AC,predkosc); Wait(50); /****** szukanie linni *****/ czas=0; SetSensorType(cz2,SENSOR_TYPE_LIGHT_INACTIVE); while (Sensor(cz1) > ciemne) { if ((kierunek==false) && (Sensor(cz1) > ciemne)) { SetSensorType(cz2,SENSOR_TYPE_LIGHT_ACTIVE); Wait(1); /***************************/ SetSensorType(cz2,SENSOR_TYPE_LIGHT_INACTIVE); /* obraca robota w prawo */ OnRev(OUT_A,predkosc); /* i szuka linii */ OnFwd(OUT_C,predkosc); /***************************/ timer=0; until ( (Sensor(cz1) < ciemne) || (timer >= czas) ) {timer++; /* czyli czekaj */ }; if (Sensor(cz1) > ciemne) { kierunek = true; }; czas=czas+skok; } if ((kierunek==true) && (Sensor(cz1) > ciemne)) { SetSensorType(cz2,SENSOR_TYPE_LIGHT_ACTIVE); Wait(1); /***************************/ SetSensorType(cz2,SENSOR_TYPE_LIGHT_INACTIVE); /* obraca robota w lewo */ OnRev(OUT_C,predkosc); /* i szuka linii */ OnFwd(OUT_A,predkosc); /***************************/ timer=0; until ( (Sensor(cz1) < ciemne) || (timer >= czas) ) {timer++; /* czyli czekaj */ }; if (Sensor(cz1) > ciemne) { kierunek = false; }; czas=czas+skok; } } // skoniec while (Sensor(cz1) > ciemne) /******* linia znaleziona, jedzie dalej ***/ } // koniec glownej petli while(true) } linefol-jor-v5-slv.nxc // line-follower + robot sledzacy // projekt - Jordan 3.VI.2008r // dla jednego czujnika z obsługą bluetootha (slave) #include "BTlib.nxc" #define BT_CONN 0 // linia do ktorej jest podlaczony slave #define MAILBOX 0 // tył tam gdzie czujnik // silnik na porcie A - lewy // silnik na porcie C - prawy bool kierunek; int odl_sledzenia=40; // max odleglosc na ktora moze oddalic sie master unsigned long czas, timer; byte skok=10, cz1 = IN_1; /* cz1 - port do ktorego jest podpiety jest */ /* ultradzwiekowy czujnik odleglosci */ int predkosc() { // dynamiczne przystosowanie predkosci do odleglosci int odl = SensorUS(cz1); if (odl > odl_sledzenia) return (-45); // <- predkosc przy rozgladaniu sie else { if (odl < 8) return (0); // <- dla odleglosci < 6 zatrzymaj robota else return (odl * (-3)/2); // <- normalna predkosc sledzenia } } sub slaveBTCheck(int conn){ string cStr; cStr = NumToStr(conn); cStr = StrCat("na linni ",cStr); if (!BTCommCheck(conn)){ TextOut(0,LCD_LINE2,"Polacz z robotem",true); TextOut(0,LCD_LINE3,"prowadzacym"); TextOut(0,LCD_LINE4,cStr,false); TextOut(0,LCD_LINE5,"w menu NXT",false); until(ButtonPressed(BTNCENTER, false)); // czeka na nacisniecie srodkowego przycisku Stop(true); // konczy dzialanie programu } } /*********************** * PROGRAM GLOWNY * ***********************/ task main() { // INICJALIZACJA // slaveBTCheck(0); // czy jest komunikacja Bluetooth SetSensorLowspeed(cz1); string tekst,out; int czuj; byte cz2=IN_4; // czujnik swiatla dzialajacy jako lampka kontrolna - nieobowiazkowa // NORMALNA PRACA PODOAZAJACEGO // while(true) { ClearScreen(); SetSensorType(cz2,SENSOR_TYPE_LIGHT_ACTIVE); if (SensorUS(cz1) < odl_sledzenia) BTSendMessage(BT_CONN,MAILBOX,"ok"); //wyslanie wiadomosci // PODAZANIE ZAROBOTEM /* ---------------------- */ tekst = StrToNum(SensorUS(cz1)); TextOut(10, LCD_LINE3,"cz1="+tekst,false); /* A-lewy, C-prawy */ OnFwd(OUT_AC,predkosc()); /****** szukanie linni *****/ czas=0; while (SensorUS(cz1) > odl_sledzenia) { BTSendMessage(BT_CONN,MAILBOX,"nie_ok"); if ((kierunek==false) && (SensorUS(cz1) > odl_sledzenia)) { SetSensorType(cz2,SENSOR_TYPE_LIGHT_ACTIVE); /* mrygniecie dioda */ Wait(1); SetSensorType(cz2,SENSOR_TYPE_LIGHT_INACTIVE); /***************************/ OnRev(OUT_C,predkosc()); /* obraca robota w prawo */ OnFwd(OUT_A,predkosc()); /* i szuka mastera */ timer=0; /***************************/ until ( (SensorUS(cz1) < odl_sledzenia) || (timer >= czas) ) {timer++; }; if (SensorUS(cz1) > odl_sledzenia) { kierunek = true; }; czas=czas+skok; } if ((kierunek==true) && (SensorUS(cz1) > odl_sledzenia)) { SetSensorType(cz2,SENSOR_TYPE_LIGHT_ACTIVE); /* mrygniecie dioda */ Wait(1); SetSensorType(cz2,SENSOR_TYPE_LIGHT_INACTIVE); /***************************/ OnRev(OUT_A,predkosc()); /* obraca robota w lewo */ OnFwd(OUT_C,predkosc()); /* i szuka mastera */ timer=0; /***************************/ until ( (SensorUS(cz1) < odl_sledzenia) || (timer >= czas) ) {timer++; }; if (SensorUS(cz1) > odl_sledzenia) { kierunek = false; }; czas=czas+skok; } } // skoniec while (SensorUS(cz1) > odl_sledzenia) /******* linia znaleziona, jedzie dalej ***/ } // koniec petli while(true) } Dorzucam też wstępne algorytmy. W programie nie jest uwzględnione znalezienie końca trasy. Algorytm lidera: Algorytm robota śledzącego: Nie działa to jeszcze tak jak trzeba, przydałoby się poprawić niektóre stałe, żeby zachowywał się bardziej płynnie. Efekt jest następujący: http://pl.youtube.com/watch?v=8kV26Pf8Uf8 Kod razem z poprawioną wersja modułu BTLib zamieszczam w załączniku Lego.zip
  5. Jeszcze jedna konstrukcja z klocków Lego, dość nowatorska i oryginalna. Robot jeździ na 4 kołach - wszystkie są skrętne, a dwa tylne - także napędowe, z dyferencjałem (układem różnicowym) między nimi. Robot nie jest zbyt elegancki (konstrukcja szalonego konstruktora ), gdyż głównym celem jego zbudowania było sprawdzenie nowej koncepcji. Aby go zbudować musiałem poświęcić poprzednią wersję słowika dyferencjał: przeniesienie napędu na koła skrętne:
×
×
  • Utwórz nowe...