Съдържание:

Как да си направим автономен робот за баскетбол, използващ IRobot Създаване като основа: 7 стъпки (със снимки)
Как да си направим автономен робот за баскетбол, използващ IRobot Създаване като основа: 7 стъпки (със снимки)

Видео: Как да си направим автономен робот за баскетбол, използващ IRobot Създаване като основа: 7 стъпки (със снимки)

Видео: Как да си направим автономен робот за баскетбол, използващ IRobot Създаване като основа: 7 стъпки (със снимки)
Видео: Как да си направим мини баскет болно кошче 2024, Юли
Anonim
Как да си направим автономен баскетболен робот с помощта на IRobot Създаване като база
Как да си направим автономен баскетболен робот с помощта на IRobot Създаване като база

Това е моят запис за предизвикателството iRobot Create. Най -трудната част от целия този процес за мен беше да реша какво ще прави роботът. Исках да демонстрирам страхотните функции на Create, като същевременно добавя и някакъв робо усет. Всичките ми идеи сякаш или попаднаха в категорията скучни, но полезни, или готини и непрактични. В крайна сметка хладно и непрактично спечели и се роди роботът за баскетбол. След като се замислих, разбрах, че това може да бъде практично. Да предположим, че използвате оранжева хартия и че всичките ви кофи за боклук имат зелени табла …

Стъпка 1: Купете части

Поради ограничението във времето на състезанието, повечето от използваните от мен части бяха „от рафта“. Използвани части от „запас“: Създайте (x1)-от iRobot www.irobot.com XBC V.3.0 (x1)-от Botball www.botball.org Създайте-Roomba кабел (x1)-от Botball www.botball.orgServo (x2)-от Botball www.botball.org Sharp далекомер (x1)-от Botball www.botball.org Асортирани LEGO тухли-от LEGO www.lego.com 6-32 машинни винтове (x4)-от McMaster www.mcmaster.com "Създадени" използвани части за роботи: 3/8 "дебел екструдиран PVC лист - тези неща са страхотни, но не мога да си спомня откъде съм го взел, но е точно като тези неща https://www.lynxmotion.com/Category.aspx? CategoryID = 62 Други части: Оранжева топка "POOF" - от WalMartБаскетболна кош за боклук - от LowesGreen "табло" - допълнително боядисано в PVC ярко зелено

Стъпка 2: Създайте уникалната част

Създайте уникалната част
Създайте уникалната част

Единствената част, която трябваше да изработя, беше плоча, която беше закрепена към Create и предлагаше LEGO разстояние. Разстоянието между дупките от тухли LEGO е 8 мм един от друг, но направих двойно разстояние, за да спестя време. Екструдираният PVC е лесен за работа. Може да се реже с помощен нож, но е твърд и здрав. Често хващам робота от тази чиния и все още не съм имал проблем.

Стъпка 1: Нарежете листа на 3,5 "x 9,5", можете да го изрежете с помощта на нож. Стъпка 2: Пробийте отворите за винтовете за създаване. Винтовете за създаване правят кутия с размери 2 и 5/8 "на 8 и 5/8". Стъпка 3: Пробийте дупките, разположени върху тухлите на LEGO. Използвайте свредло 3/16 "и разположих отворите на 16 мм един от друг. Съвет: Поставих листа в CAD програма, разпечатах го в пълен размер и го залепих върху листа. След това използвах това като ръководство за рязане и пробиване.

Стъпка 3: Сглобяване на робота

Сглобяване на робота
Сглобяване на робота
Сглобяване на робота
Сглобяване на робота
Сглобяване на робота
Сглобяване на робота

Харесва ми да изграждам нещата възможно най -просто, така че когато скачат от масата, не е нужно да възстановявате толкова много!

1. Завийте новоизработената плоча към горната част на Create 2. Изградете рамо, за да хванете топката 3. Постройте рамо, за да държите камерата 4. Изградете стойка за далекомер 5. Монтирайте XBC и свържете всички кабели

Стъпка 4: Програмиране на робота

Реших да използвам XBC като мой контролер главно поради вграденото му проследяване на цветовете. Тъй като реших да използвам XBC като мозък на операцията, програмирах робота си в Interactive C или както аз го наричам IC. IC е безплатна за използване и може да бъде изтеглена на www.botball.org. IC е много подобен на C ++, но има няколко вградени библиотеки. Оказва се, че Дейвид Милър от университета в Оклахома е написал библиотека за създаването, която може да бъде изтеглена от неговата страница на https://i-borg.engr.ou.edu/~dmiller/create/. С тези ресурси и ръководствата за създаването бях готов да програмирам. Но следващото голямо предизвикателство беше какво искам да направи? Исках робот, който да може да вземе оранжеви топки и да ги вкара в кош. Целта ми звучеше просто и вероятно би могла да бъде проста, но колкото повече навлизах в това, което Create можеше да направи, толкова повече исках да го направи. Последният ми списък изглеждаше така: 1. Намерете оранжева топка 2. Вземете оранжева топка 3. Намерете кошница4. Поставете топката в кошницата Докато 1. Избягване на обекти2. Не падайте от нищо (като маса) 3. Откриване на зареждането на батерията и докинг с домашната база, когато lowOh, и всичко това е напълно автономно, което означава, че всичко е предварително програмирано.

Стъпка 5: Код

Може да е объркано, но работи.#Use "createlib.ic" #use "xbccamlib.ic" #define cam 0 // servo port на камерата#define arm 3 // arm servo port#define et (analog (0)) // et port/*Кабелът за създаване също трябва да бъде включен. Жакът за захранване, 3 -кратният щепсел към порт 8 и този с надпис UX в JP 28 (до USB порта) с U към камерата*/ #define c_down 5 // серво на камерата надолу#define a_down 17 // серво на ръката надолу#define задържане 50 // servo задържане на топка#дефиниране на хванато 27 // позицията на серво на ръката, за да не се хване на масата#define shoot 150 // серво хвърляне на топката#дефиниране track_c 25 // затваряне на сервозаписите на камерата#определяне на track_f 45 // отдалечена позиция на сервозаписите на камерата#определяне на център 120 // център на зрението на камерата#дефиниране на диапазон 30 // координата на track_y, когато топката е в нокът#дефиниране на топка 0 // канал на оранжева топка#определете ball_x (track_x (ball, 0)) // x координата на топката#define ball_y (track_y (ball, 0)) // y координата на топката#определете бавна 100 // скорост на бавна мотор#дефиниране бързо 175 // скорост на бърз двигател#дефиниране ясно 0,2 // s скок, за да се отдръпнете от препятствия#дефинирайте време 0.5 //1.0 е завой на 90 градуса надясно#дефинирайте почивка 0.05 // време за сън, докато проследявате петна#дефинирайте скоростa 175 // скорост на избягване на завой#дефинирайте back_s -200 // скорост до отдръпнете се от ударен обект#определете прав 32767 // карайте по права линия#дефинирайте backb 2 // канал на основния цвят на таблото#дефинирайте квадрат 1 // канал на акцентен цвят на таблото#дефинирайте track_d 250 // позицията на камерата за проследяване на цел# определи track_find 70 // позиция на камерата за дълго проследяване#определи обратно 2.25 // време на заспиване за 180#определи back_f -150 // назад скорост#определи back_sl -125 // назад бавна скорост#определи center_x 178 // вярно x център на cam#дефинирайте center_y 146 // true y център на camint pida; // избягвайте processint pidb; // проследявате processint pidc; // оценявате processint have_ball = 0; // казва коя функция сме извикани main () {long ch; enable_servos (); // активиране на сервомоторите init_camera (); // стартиране на камерата cconnect (); // свързване за създаване с пълен контрол start_a (); // стартиране на функцията за избягване start_b (); // стартиране на функция ball_tracking while (1) {if (r_button () || gc_ldrop || gc_rdrop) {// ако е вдигнат или r бутон за рамо убие (pida); убивам (pidb); kill (pidc); disable_servos (); прекъсване на връзката (); break;} create_battery_charge (); display_clear (); printf ("заряд = %l / n", gc_battery_charge); if (gc_battery_charge <1200l || b_button ()) {kill (pida); убивам (pidb); kill (pidc); хвърлям (); have_ball = 0; create_demo (1); while (b_button ()); while (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("заряд = %l / n", gc_battery_charge); sleep (1.0);} cconnect (); обратно(); сън (2.0); start_a (); start_b ();}}} void избегнете () {while (1) {// повтаряйте завинаги create_sensor_update (); // актуализирайте всички стойности на сензора // create_drive (speeda, прав); if (gc_lbump == 1) {// лява неравноста избегайте_right ();} // завива надясно, за да избегнете else if (gc_rbump == 1) {// дясна неравна избегайте_left ();} // завива наляво, за да избегнете else if ((gc_lfcliff == 1) {// лява предна скала избягвайте_right ();} иначе ако (gc_rfcliff == 1) {// дясна предна скала избягвайте_left ();} иначе ако (gc_lcliff == 1) {// лява скала избегнете_дясно ();} else if (gc_rcliff == 1) {// дясна скала избегнете_left ();}}} void track_ball () {kill (pidc); while (! have_ball) {// повтаряйте, докато получите ball track_update (); far (); // настройва камерата ready (); // задава рамото while (et <255) {// докато не се получи максимална стойност, когато топката е уловена track_update (); // актуализира снимката на камерата, ако (ball_x <= (center-5)) {// ако топката е оставена track_update (); create_drive_direct (бавно, бързо); // завийте наляво (почивка);} else if (ball_x> = (center+5)) {// ако топката е права track_update (); create_drive_direct (бързо, бавно); // завийте надясно (sleep);} else if (ball_x (center-5)) {// ако топката е центрирана track_update (); create_drive_straight (бързо); // преминете направо в режим на сън (почивка);}} grab (); // вземете топка beep (); // направете шум stop (); // спрете шофирането have_ball = 1; // отбележете, че Имам топка} start_c (); // намирам кошницата sleep (1.0); // спя така, че да не правя нищо, когато ме убият} void find_basket () {kill (pidb); // процес на проследяване на топка find (); // поставете камерата track_set_minarea (1000); // таблото е голямо, така че търсете само големи петна while (have_ball) {// докато имам топката track_update (); while (track_x (backb, 0) = (center_x+20)) {// докато не е центрирано track_update (); if (track_x (backb, 0)> = (center_x+20)) {// ако таблото е оставено track_update (); create_spin_CCW (100);} // завийте наляво иначе if (track_x (backb, 0) <= (center_x-20)) {// ако таблото е дясно track_update (); create_spin_CW (300-center_x);} // завийте надясно, забавяйки с приближаването на центъра} stop (); while (track_size (backb, 0) <= (6000)) {// докато целта е с размер по -малък от 6000 пиксела track_update (); if (track_x (backb, 0) <= (center_x-5)) {// ако целта е оставена track_update (); create_drive_direct (бавно, бързо); // завийте наляво (почивка);} иначе ако (track_x (backb, 0)> = (center_x+5)) {// ако целта е права track_update (); create_drive_direct (бързо, бавно); // завийте надясно (почивка);} иначе ако (track_x (backb, 0) (center_x-5)) {// ако целта е центрирана track_update (); create_drive_straight (бързо); // отидете направо на сън (почивка);}} stop (); // create_drive_straight (бързо); // приближавам се малко по -близо //sleep(1.0); //Спри се(); сън (1.0); create_spin_CW (speeda); // завъртане вдясно (обратно); // заспиване достатъчно дълго за 180 оборота stop (); down (); // поставете камерата надолу, за да проследявате спирането на таблото (1.0); track_set_minarea (200); // използваме по-малък минимален размер, тъй като сме насочени към него и ще се приближим, докато (track_y (backb, 0)> = (center_y-140)) {// докато целта е по-малка от y координира track_update (); if (track_x (backb, 0) <= (center_x-5)) {// ако целта е оставена track_update (); back_right (); // завийте наляво sleep (rest);} else if (track_x (backb, 0)> = (center_x+5)) {// ако целта е права track_update (); back_left (); // завийте надясно (почивка);} иначе ако (track_x (backb, 0) (center_x-5)) {// ако целта е центрирана track_update (); back (); // отидете направо на сън (почивка);}} stop (); звуков сигнал (); throw (); // стреля сън (1.0); have_ball = 0; // напомняне, че хвърлих топката и я нямам (); create_full (); // за пълен контрол на сензорите за первази create_power_led (0, 255);} // зелено захранване ledvoid disconnect () {stop (); // спиране на движението create_disconnect ();} void back_away () {back (); сън (ясен); stop ();} void rotate_l () {create_spin_CCW (speeda); време за сън); stop ();} void rotate_r () {create_spin_CW (speeda); време за сън); stop ();} void stop () {create_drive (0, прав);} void back () {create_drive (back_s, прав);} void ready () {set_servo_position (arm, a_down);} void check () {set_servo_position (cam, track_c);} void far () {set_servo_position (cam, track_f);} void перваз () {set_servo_position (ръка, хванат);} void throw () {int a; for (a = 50; a> = 30; a- = 1) {// пригответе set_servo_position (arm, a);} set_servo_position (arm, shoot);} void grab () {int a; for (a = 0; a <= hold; a+= 1) {// повдигнете ръката плавно set_servo_position (arm, a);}} void down () {set_servo_position (cam, track_d);} void find () {set_servo_position (cam, track_find);} void start_a () {pida = start_process (избягвайте ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // изчакайте текущия процес на създаване да приключи и вземете приоритет kill_process (pid); CREATE_FREE; // приключих stop ();} void избегайте_left () {kill (pidb); // спрете всичко останало kill (pidc); перваза (); // вземете нокът, за да не се хване на масата back_away (); // отдръпнете се rotate_l (); // завъртете се далеч от препятствието ready (); // поставете нокътя обратно надолу, ако (have_ball) {// ако имам топката start_c ();} // стартирам проследяването на целите else if (! have_ball) {// ако нямам топката start_b ();} // стартирам проследяването на топката} void избегайте_right () {kill (pidb); kill (pidc); перваза (); Дръпни се(); rotate_r (); готов(); if (have_ball) {start_c ();} else if (! have_ball) {start_b ();}} void back_left () {create_drive_direct (back_f, back_sl);} void back_right () {create_drive_direct (back_sl, back_f);}

Стъпка 6: Струваше ли си?

Разходите бяха: Създайте + батерия + doc = $ 260 XBC стартов комплект (xbc, cam, LEGO тухли, сензори) = $ 579PVC + боя + винтове = около 20 $ Обща цена = 859 $ Вече имах стартов комплект XBC от Botball, така че цената за мен беше цената на Create. Смятам, че си заслужаваше, а най -хубавото е, че всички използвани от мен части са за многократна употреба, ако успея да се разделя с този бот. Това видео показва избягването на подпрограма, върху плот за маса. Това видео показва как роботът вкарва 5 оранжеви топки в гол. Помогнах само за ускоряване на процеса, в крайна сметка щеше да намери топка 5 сама.

Стъпка 7: Заключение

Крайният резултат е робот, който може сам да вземе и вкара оранжеви топки в гол.

Хареса ми да работя по този проект. Колкото повече работех върху този робот, толкова по -привързан бях към него. Сега говоря с него, сякаш е домашен любимец. Надявам се, че това ви е помогнало при следващия ви проект. Има много хора, на които трябва да благодаря, но има твърде много. Както Бернард от Шартър така елегантно заяви: „ние сме като джуджета на раменете на гиганти, така че можем да видим повече от тях, и нещата на по -голямо разстояние, а не поради някаква острота от наша страна или някаква физическа разлика, но защото сме изнесени високо и издигнати от гигантския им размер."

Препоръчано: