Popularny post Leoneq Napisano Lipiec 5, 2019 Popularny post Udostępnij Napisano Lipiec 5, 2019 witam (do admina) na wstępie chciałem zaznaczyć, że jedyne co mam z gotowego projektu z neta to modele do wydrukowania (po co tworzyć coś na nowo jak już jest) jeżeli projekt nie zalicza się do akcji rabatowej, mogę usunąć linki i opublikować "po prostu". Był taki pomysł, żeby zbudować robota. Linefollower? jak już to na poważnie, a mi sie nie chce. Jakiś manipulator? nie mam napędów. Autko? to też chcę na poważnie zrobić, coś więcej niż lego. Wybór padł na robota, który miał po prostu zająć czymś kolegów i nauczycieli w szkole - czyli takie cudo na pokazy. Miało to być małe, do plecaka, znalazłem projekt otto diy. Spodobał mi się, więc wydrukowałem, złożyłem na płytce stykowej i ledwie zamknąłem obudowę przez kable 20cm - ale robot działał, wydawał zabawne odgłosy i tańczył. Zadanie swoje spełnił, mogłem go teraz zostawić i się skupić na zvsie (którego opublikuję po dokończeniu obudowy). Ale co to za skończony projekt na płytce stykowej? Nie mogłem tego tak zostawić, to dla mnie wręcz porażka. (Aby zapobiec spamowi, drukowałem na Aflawise U30 - dysza 0.4, chłodzenie petsfang, 60mm/s warstwa 0.3mm. PLA od printme, 200*C/60*C. Ta żółta czapka się źle wydrukowała, to troszkę uzupełniłem ubytki lutownicą i filamentem, co jak widać średnio wyszło.) Myślałem, czego mi w nim brakuje. Oczywiście sztuczki robota robione w kółko szybko się znudziły, to musiałem wymyślić jakieś sterowanie. Mam dużo odbiorników IR, to sprzężyłem taki jeden z robotem, spisałem kody z pilota do ledów i zrobiłem mapowanie przycisków. Następnie wziąłem się za lutowanie płytki pod niego. Kilka godzin lutowania, plątanina kabli z drugiej strony, ale działa. (mistrz painta w akcji): Płytka w procesie projektowania, a bardziej patrzenia czy wszystko jest ok Tutaj podczas wgrywania programu, stabilizator ze starego monitora okazał się być zużyty Gotowa płytka: Na płytce za zasilanie odpowiada stabilizator 7805 (oczywiście z radiatorem i kapką pasty termoprzewodzącej), z kondensatorem 100uF. W środku stara dobra atmega 328, z kwarcem 16Mhz i brzęczykiem z diodą led. Najwięcej jest wyprowadzeń, bo cała listwa 4x3 dla serw, złącze od HC-SR04, VS1838B, interfejsu UART a nawet złącze programatora. Cała płytka ma 60x30mm. Źródło napięcia to 2 akusy lipo na 7.4V (tylko takie miałem) o pojemności 1800mAh. Wyjęte z tableta - tam dużo fajnych rzeczy można znaleźć... Początkowo miałem dać 2 akusy 18650, ale one były za duże pod moją płytkę. Jedno 18650 ze step upem to samo. Więc zostały liposy, które niestety nie są zbyt ciężkie i robot ma dość nisko środek ciężkości (powinien być "na środku", pierwotnie tam miały siedzieć 4 paluszki aa) Zostało napisać kod. Skorzystałem z gotowych bibliotek pod otto, gdzie miałem gotowe sterowanie serwami i czujnikiem. Był za to ogromny kłopot z bibliotekami, bo te gryzły się z timerami których używała biblioteka od otto. Na chińskim githubie znalazłem jakimś cudem bibliotekę od IR która nie używa timerów, biblioteka od dźwięków była łatwiejsza do znalezienia ale musiałem wykonywać modyfikacje w niej, tak czy siak. Sam kod nie jest skomplikowany, po funkcjach startujących peryferia co chwilę sprawdzamy czy odebraliśmy jakiś kod z pilota - jeżeli tak, wykonujemy funkcję z nim związaną. W przeciwnym wypadku wykonujemy kod danego trybu, a jest ich 3: (wiem, na zdjęciu jest ich więcej ale uznałem że są niepotrzebne dla mnie): tryb swobodny, czyli nie robimy nic, tryb omijania przeszkód, tutaj za dużo tłumaczyć nie trzeba, tryb śledzenia: po wykryciu dłoni, robot idzie w jej kierunku. A oto cały kodzik, może kiedyś go dam na githuba bo szkoda by się u mnie marnował: //---------------------------------------------------------------- //-- Otto IR mod //-- Does many things, controlled by an IR remote. //-- (insert github here) //-- CC BY SA (http://ottodiy.com) //-- 02 June 2019 by Leoneq ;3 //----------------------------------------------------------------- // INCLUDES --------------------------- #include <Servo.h> //servo library #include <Oscillator.h> //important library #include <US.h> //ultrasonic library #include <Otto.h> //otto library #include <motoIRremote.h> //timer-free ir library #include <TimerFreeTone.h> //timer-free tone library // PINS ------------------------------- #define PIN_LEFT_HIP 2 #define PIN_RIGHT_HIP 3 #define PIN_LEFT_ANKLE 5 #define PIN_RIGHT_ANKLE 4 #define PIN_IR 6 #define PIN_LED 13 // TRIMS ------------------------------ #define TRIM_LEFT_HIP -9 #define TRIM_RIGHT_HIP -9 #define TRIM_LEFT_ANKLE 0 #define TRIM_RIGHT_ANKLE -20 // OBJECTS ---------------------------- Otto Otto; //This is Otto! IRrecv ir(PIN_IR); decode_results IR_RES; // VARIABLES -------------------------- int WALK_TIME = 1000; int WALK_DIR = 1; int WALK_HEIGHT = 20; int speed = 3; int US_DIST = 0; bool obstacleDetected = false; String IR_CODE = ""; String IR_SYMBOL = ""; #define UP "f700ff" #define DOWN "f7807f" #define OFF "f740bf" #define ON "f7c03f" #define ONE "f720df" #define TWO "f7a05f" #define THREE "f7609f" #define FOUR "f710ef" #define FIVE "f7906f" #define SIX "f750af" #define SEVEN "f730cf" #define EIGHT "f7b04f" #define NINE "f7708f" #define TEN "f708f7" #define ELEVEN "f78877" #define TWELVE "f748b7" #define THIRTEEN "f728d7" #define FOURTEEN "f7a857" #define FIFTEEN "f76897" #define W "f7e01f" #define FLASH "f7d02f" #define STROBE "f7f00f" #define FADE "f7c837" #define SMOOTH "f7e817" /* * There are 5 modes attached to: * W - avoid obstacles (1) * FADE - follow hand! (2) * SMOOTH - free mode. Do anything what you want! (3) */ byte OTTO_MODE = 5; void setup() { Serial.begin(115200); //enable serial for debugging ir.enableIRIn(); //enable ir sensor Otto.init(PIN_LEFT_HIP,PIN_RIGHT_HIP,PIN_LEFT_ANKLE,PIN_RIGHT_ANKLE,true); //init otto! Otto.setTrims(TRIM_LEFT_HIP,TRIM_RIGHT_HIP, TRIM_LEFT_ANKLE, TRIM_RIGHT_ANKLE); //set trims //why not in one line? here, in code it looks better. Serial.println("Otto IR Mod by Leoneq :3"); Serial.println("Summer 2019"); Serial.println("-----------------------------------"); Serial.println("Ready."); Otto.sing(S_connection); //let us know, that otto woke up! Otto.home(); //set initial position delay(100); Otto.sing(S_happy); //when you are happy, otto should be too ;) //end of setup function } void checkIR() { if (ir.decode(&IR_RES)) //if we get something { IR_CODE = String(IR_RES.value, HEX); //we save received data into string Serial.print("Received data: 0x"); Serial.println(IR_CODE); //lets write it on serial checkIRcode(); //we must know what button is pressed delay(250); //little delay ir.resume(); } } void loop() { checkIR(); //check for new ir signals switch(OTTO_MODE) { case 1: //avoid obstacles avoid(); break; case 2: //follow hand mode follow(); break; case 3: //free mode free(); break; } } void free() { //nothing! } void follow() { obstacleDetected = obstacleDetector(); if(obstacleDetected) { Otto.walk(1,1000,FORWARD); } else { Otto.home(); } } void dance() { //soon } void sing() { //soon } void avoid() { obstacleDetected = obstacleDetector(); if(obstacleDetected) { Otto.sing(S_surprise); Otto.walk(5,1000,BACKWARD); delay(1000); Otto.sing(S_happy); Otto.turn(3,1000,RIGHT); delay(2000); } else { Otto.walk(1,1000,FORWARD); } //end of avoid() function } bool obstacleDetector() { int distance = Otto.getDistance(); Serial.print("Distance: "); Serial.println(distance); if(distance<15) { return true; } else { return false; } } void up() { IR_SYMBOL = "UP"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); speed--; Serial.print("Changing speed! The new speed is: "); Serial.print(speed); } void down() { IR_SYMBOL = "DOWN"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); speed++; Serial.print("Changing speed! The new speed is: "); Serial.print(speed); } void off() { IR_SYMBOL = "OFF"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.print("See you later!"); Otto.home(); Otto.playGesture(OttoSleeping); Otto.sing(S_sleeping); } void on() { IR_SYMBOL = "ON"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("Turning on..."); Otto.sing(S_happy); Otto.playGesture(OttoHappy); Otto.home(); } void _one() { IR_SYMBOL = "1"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("Moonwalking!"); Otto.sing(S_superHappy); Otto.moonwalker(3,speed*300,30,1); Otto.home(); } void _two() { IR_SYMBOL = "2"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("jump!"); Otto.jump(3, speed*300); } void _three() { IR_SYMBOL = "3"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("Am I taller?"); Otto.updown(1, speed*300, 22); } void _four() { IR_SYMBOL = "4"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("I'm happy, because you are with me!"); Otto.sing(S_happy); Otto.playGesture(OttoLove); } void _five() { IR_SYMBOL = "5"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("I'm so sad, help me :("); Otto.sing(S_confused); Otto.playGesture(OttoSad); Otto.sing(S_sad); } void _six() { IR_SYMBOL = "6"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("mmmphm!"); Otto.sing(S_fart1); Otto.playGesture(OttoFart); Otto.sing(S_fart3); Otto.playGesture(OttoWave); } void _eight() { IR_SYMBOL = "8"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("Going forward!"); Otto.walk(3, speed*300, 1); Otto.home(); } void _fourteen() { IR_SYMBOL = "14"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("Going backwards!"); Otto.walk(3, speed*300, -1); Otto.home(); } void _ten() { IR_SYMBOL = "10"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("Rotating left, please wait..."); Otto.turn(3, speed*300, 1); Otto.home(); } void _twelve() { IR_SYMBOL = "12"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("Rotating right, please wait..."); Otto.turn(3, speed*300, -1); Otto.home(); } void _eleven() { IR_SYMBOL = "11"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("I am standing up!"); Otto.home(); } void _w() { IR_SYMBOL = "W"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("Obstacle avoid mode: ACTIVATED"); OTTO_MODE = 1; } void _flash() { IR_SYMBOL = "FLASH"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("Follow mode: ACTIVATED"); OTTO_MODE = 2; } void _strobe() { IR_SYMBOL = "STROBE"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("Free mode: ACTIVATED"); OTTO_MODE = 3; } void _seven() { IR_SYMBOL = "7"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("Standing one foot!"); Otto.bend(1, 2000, 1); } void _nine() { IR_SYMBOL = "7"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); Serial.println("Standing one foot!"); Otto.bend(1, 2000, -1); } void checkIRcode() { if(IR_CODE == UP) up(); else if(IR_CODE == DOWN) down(); else if(IR_CODE == OFF) off(); else if(IR_CODE == ON) on(); else if(IR_CODE == ONE) _one(); else if(IR_CODE == TWO) _two(); else if(IR_CODE == THREE) _three(); else if(IR_CODE == FOUR) _four(); else if(IR_CODE == FIVE) _five(); else if(IR_CODE == SIX) _six(); else if(IR_CODE == SEVEN) _seven(); else if(IR_CODE == EIGHT) _eight(); else if(IR_CODE == NINE) _nine(); else if(IR_CODE == TEN) _ten(); else if(IR_CODE == ELEVEN) _eleven(); else if(IR_CODE == TWELVE) _twelve(); else if(IR_CODE == THIRTEEN) IR_SYMBOL = "13"; else if(IR_CODE == FOURTEEN) _fourteen(); else if(IR_CODE == FIFTEEN) IR_SYMBOL = "15"; else if(IR_CODE == W) _w(); else if(IR_CODE == FLASH) _flash(); else if(IR_CODE == STROBE) _strobe(); //else if(IR_CODE == FADE) _fade(); //else if(IR_CODE == SMOOTH) _fade(); //we cant do switch case with string else IR_SYMBOL = "UNKNOWN"; Serial.print("The symbol is: "); //lets write symbol on serial Serial.println(IR_SYMBOL); } Efekty prac są podane na zdjęciach. Film dorzuce później, jak na yt wrzucę. Robot został nazwany pubga, na pamięć mojego kolegi z 8. klasy, który co chwile mówił do nauczycieli "a pogramy w pubga? pubga, w pubga!" przez chyba cały czerwiec XD W przyszłości chyba nie będę miał na niego za dużo czasu, bo technikum itd. Może na jakiś długi weekend, zamontuję do niego esp, jakieś dodatkowe czujniki albo miotacz ognia. Kto wie. Miłych wakacji, Leoneq ;3 6 Link do komentarza Share on other sites More sharing options...
Popularny post Treker (Damian Szymański) Lipiec 7, 2019 Popularny post Udostępnij Lipiec 7, 2019 Właśnie zaakceptowałem Twój opis, możesz go teraz zgłosić do akcji rabatowej umieszczając link w temacie zbiorczym. Dziękuję za przedstawienie ciekawego projektu, zachęcam do prezentowania kolejnych DIY oraz aktywności na naszym forum 🙂 3 Link do komentarza Share on other sites More sharing options...
bjrk Styczeń 2, 2023 Udostępnij Styczeń 2, 2023 @Leoneq To gdzie ten filmik? 😉 2 Link do komentarza Share on other sites More sharing options...
Popularny post Leoneq Styczeń 2, 2023 Autor tematu Popularny post Udostępnij Styczeń 2, 2023 4 Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
bjrk Styczeń 2, 2023 Udostępnij Styczeń 2, 2023 @Leoneq Dziękuję. 2 Link do komentarza Share on other sites More sharing options...
farmaceuta Styczeń 3, 2023 Udostępnij Styczeń 3, 2023 Fajne fajne😉👍 1 Link do komentarza Share on other sites More sharing options...
_LM_ Styczeń 4, 2023 Udostępnij Styczeń 4, 2023 Podoba mi się ta zabawka 🙂 👍 1 Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »