Skocz do zawartości
Leoneq

Robot pubga v1.0- czyli otto diy po mojemu

Pomocna odpowiedź

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.

IMG20190705131056.thumb.jpg.2f3b738af97c7e3b971cd119d832b618.jpgIMG20190705131011.thumb.jpg.5f87b677a59bd75335eb60b015a99e30.jpg

(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):

pilocik.thumb.png.079614612b13374af3a48cec481a0497.pngottoboard.thumb.png.d95602623b68c81b754a77fd55506685.png

Płytka w procesie projektowania, a bardziej patrzenia czy wszystko jest ok

IMG20190530204822.thumb.jpg.8ea0b0be16795fb1b252e25efc14f0d0.jpg IMG20190530204826.thumb.jpg.34d9ff44e59cf55cf545a2efb13dca5b.jpg IMG20190530224917.thumb.jpg.d26375c9b419845d0698e181490544f4.jpg

IMG20190530224926.jpg IMG20190530224933.jpg IMG20190531160450.jpg

Tutaj podczas wgrywania programu, stabilizator ze starego monitora okazał się być zużyty

IMG20190531161035.thumb.jpg.1bd60e1b8aed2d788ce370d8babec4da.jpg

Gotowa płytka:

IMG20190705131709.thumb.jpg.1cbdd36a5e344e0b7ce5bed4fa279f37.jpgIMG20190705131719.thumb.jpg.f2cc22d5d39fb263ac93aa4ac1b72d87.jpg

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.

IMG20190705131115.thumb.jpg.80c9a775b6081d0e4c0325a0a09535d2.jpg

Ź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)

IMG20190531190516.thumb.jpg.8dc579dc7bbb3c80f24eb0ccac3a2593.jpg IMG20190705131203.thumb.jpg.73ef927ad094f5adfe07a775d5406a53.jpg

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.

IMG20190602220348.thumb.jpg.ea8494abd7b15ef009b62b363c934321.jpgIMG20190602220358.thumb.jpg.1898b40a5d270fd742d2210d9d48af0b.jpg IMG20190705131011.thumb.jpg.5f87b677a59bd75335eb60b015a99e30.jpg IMG20190705131056.thumb.jpg.2f3b738af97c7e3b971cd119d832b618.jpg

Miłych wakacji, Leoneq ;3

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

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 🙂

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...