Агуулгын хүснэгт:

IRobot ашиглан бие даасан сагсан бөмбөгийн робот хэрхэн хийх вэ: 7 алхам (зурагтай)
IRobot ашиглан бие даасан сагсан бөмбөгийн робот хэрхэн хийх вэ: 7 алхам (зурагтай)

Видео: IRobot ашиглан бие даасан сагсан бөмбөгийн робот хэрхэн хийх вэ: 7 алхам (зурагтай)

Видео: IRobot ашиглан бие даасан сагсан бөмбөгийн робот хэрхэн хийх вэ: 7 алхам (зурагтай)
Видео: A Global Prediction for 2024 - Crystal Ball and Tarot - With time stamps 2024, Долдугаар сарын
Anonim
IRobot ашиглан бие даасан сагсан бөмбөг тоглох роботыг хэрхэн суурь болгох
IRobot ашиглан бие даасан сагсан бөмбөг тоглох роботыг хэрхэн суурь болгох

Энэ бол iRobot Create challenge -д миний оруулсан оролт юм. Миний хувьд энэ бүх процессын хамгийн хэцүү хэсэг бол робот юу хийхээ шийдэх явдал байв. Би Create -ийн гайхалтай онцлог шинж чанаруудыг харуулахыг хүсч байсан бөгөөд үүнээс гадна зарим робо чадварыг нэмж өгөхийг хүссэн юм. Миний бүх санаанууд нэг бол уйтгартай боловч хэрэгтэй, эсвэл дажгүй, практик биш гэсэн ангилалд багтсан юм шиг санагдсан. Эцэст нь дажгүй, практик биш ялалт байгуулж, сагсан бөмбөг тоглодог робот төрсөн. Жаахан бодсоны дараа энэ нь практик байж болохыг ойлгосон. Та улбар шар өнгийн цаас хэрэглэдэг гэж бодъё, мөн таны бүх хогийн сав ногоон дэвсгэртэй байна гэж бодъё …

Алхам 1: Aquire эд анги

Уралдааны хугацаа хязгаарлагдмал байсан тул миний ашигласан ихэнх хэсгүүд "тавиур дээрээс" гарсан байв. "Хувьцаа" роботын эд ангиудыг ашиглана уу: (x1) үүсгэх-iRobot-аас www.irobot.com (x2)-Ботболоос www.botball.orgSharp хүрээ хэмжигчээс (x1)-Ботболоос www.botball.org -оос LEGO-ийн төрөл бүрийн тоосго-LEGO www.lego.com -оос.com "Бүтээсэн" роботын эд ангиудыг ашигласан: 3/8 "зузаантай шахмал PVC хуудас - энэ бол гайхалтай зүйл, гэхдээ би хаанаас авснаа санахгүй байна, гэхдээ яг л энэ зүйл шиг байна https://www.lynxmotion.com/Category.aspx? CategoryID = 62 Бусад хэсгүүд: Улбар шар өнгийн "POOF" бөмбөг - WalMart -ийн сагсан бөмбөгийн бөмбөг хогийн савнаас - LowesGreen "арын самбараас" - нэмэлт PVC будсан тод ногоон

Алхам 2: Өвөрмөц хэсгийг бий болгох

Өвөрмөц хэсгийг бий болгох
Өвөрмөц хэсгийг бий болгох

Миний хийх ёстой цорын ганц хэсэг бол 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 -тэй ажиллахаар шийдсэн тул би роботыг Интерактив С эсвэл IC гэж нэрлэдэг. IC ашиглахад үнэгүй бөгөөд www.botball.org дээрээс татаж авах боломжтой. IC нь C ++ - тэй тун төстэй боловч хэд хэдэн номын санд бий. Оклахомагийн их сургуулийн Дэвид Миллер "Create" номын сан бичсэн бөгөөд үүнийг https://i-borg.engr.ou.edu/~dmiller/create/ хаягаар татаж авах боломжтой. Эдгээр нөөц, бүтээлийн гарын авлагын тусламжтайгаар би програмчлахад бэлэн байсан. Гэхдээ дараагийн том сорилт бол би үүнийг юу хийхийг хүсч байсан бэ? Би явж, улбар шар өнгийн бөмбөгийг аваад сагсанд оноодог робот хүсч байна. Миний зорилго энгийн сонсогдож байсан, магадгүй энгийн байж болох юм, гэхдээ би Бүтээж чадах зүйлдээ орох тусам үүнийг хийхийг хүсч байсан. Миний эцсийн жагсаалт иймэрхүү харагдаж байв: 1. Улбар шар өнгийн бөмбөгийг олоорой2. Улбар шар өнгийн бөмбөг авах3. Сагсыг олох4. Бөмбөгийг сагсанд хийж байгаарай1. Объектоос зайлсхийх 2. Юу ч унахгүй (ширээ шиг) 3. Батерейны цэнэгийг илрүүлж, гэрийн бааз руу залгах нь дуу чимээ багатай бөгөөд энэ бүхэн бүрэн бие даасан бөгөөд энэ нь бүгд урьдчилан програмчлагдсан гэсэн үг юм.

Алхам 5: Код

Энэ нь эмх замбараагүй байж болох ч энэ нь ажилладаг.#Use "createlib.ic" #use "xbccamlib.ic" #define cam 0 // camera servo port#define arm 3 // arm servo port#define et (analog (0)) // et port/*Үүсгэх кабелийг мөн залгах шаардлагатай. Цахилгаан залгуур, 3 залгууртай 8 -р порт, UX гэж тэмдэглэгдсэнийг UP -ийг камер руу чиглүүлж JP 28 (USB портын хажууд)*/ #c_down 5 -ийг тодорхойлох // камерын servo доош#тодорхойлох a_down 17 // гарын servo доош#барих барих 50 -ийг тодорхойлох // servo hold ball#баригдсан 27 -ийг тодорхойлох // ширээн дээр баригдахгүй байхын тулд arm servo байрлалыг тодорхойлох бөмбөг шидэх#track_c 25 тодорхойлох // камерын servo track close position#track_f 45 // камерын servo track хол байрлал#төвийг тодорхойлох 120 // камерын харааны төв#inrange -ийг тодорхойлох 30 // track_y координатыг бөмбөг хумс дотор байх үед#бөмбөгийг тодорхойлох 0 // улбар шар өнгийн суваг#ball_x тодорхойлох (track_x (бөмбөг, 0)) // x бөмбөгний координат мотор#хурдан тодорхойлох 175 // хурдан хөдөлгүүрийн хурд#тодорхой 0.2 // с тодорхойлох саад тотгороос ухрах#цаг тодорхойлох 0.5 //1.0 бол 90 градус баруун эргэх#амрах хугацааг тодорхойлох 0.05 // бөмбөрцгийг ажиглах үед унтах цаг#хурдыг тодорхойлох 175 мөргөлдсөн объектоос холдох#шулуун тодорхойлох 32767 // шулуун шугамаар жолоодох#арын хэсгийг тодорхойлох 2 // арын самбарын үндсэн өнгөний суваг#квадратыг тодорхойлох 1 // арын өргөлтийн өнгөний суваг#замыг тодорхойлох_d 250 // зорилгыг хянах камерын байрлал# track_find 70 // урт хянах камерын байрлалыг тодорхойлох#урвуу 2.25 // 180 -ийн унтах хугацааг тодорхойлох#back_f -150 // арын хурд of cam#define center_y 146 // camint pida -ийн үнэн y төв; // processint pidb -ээс зайлсхийх; // track processint pidc; // онооны processint have_ball = 0; // бид ямар функцээс зайлсхийж байгааг хэлдэг main () {long ch; enable_servos (); // servos init_camera () -г идэвхжүүлэх; // камерыг эхлүүлэх cconnect (); // бүрэн хяналттай үүсгэхийн тулд холбоно start_a (); // эхлэхээс зайлсхийх start_b () функцийг эхлүүлэх; {if (r_button () || gc_ldrop || gc_rdrop) {// хэрэв авсан эсвэл r мөрний товчлуурыг дарвал (pida); алах (pidb); алах (pidc); идэвхгүй болгох_сервос (); салгах (); завсарлах;} батерей_ цэнэг үүсгэх (); дэлгэцийн_ цэвэр (); printf ("төлбөр = %l / n", gc_battery_charge); if (gc_battery_charge <1200l || b_button ()) {kill (pida); алах (pidb); алах (pidc); шидэх (); have_ball = 0; үүсгэх_демо (1); while (b_button ()); while (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); дэлгэцийн_ цэвэр (); printf ("төлбөр = %l / n", gc_battery_charge); унтах (1.0);} cconnect (); нуруу (); унтах (2.0); эхлэх_а (); start_b ();}}} void зайлсхий () {while (1) {// үүрд давтах create_sensor_update (); // бүх мэдрэгчийн утгыг шинэчлэх // create_drive (speeda, шулуун); if (gc_lbump == 1) {// зүүн овойлт зайлсхийх_хэрэг ();} // өөрөөс зайлсхийхийн тулд баруун тийш эргэдэг бол gc_lfcliff == 1) {// зүүн урд талын цохио зайлсхийх_хэрхэн ();} өөр тохиолдолд);} өөр if (gc_rcliff == 1) {// баруун цохио зайлсхийх_зүүн ();}}} void track_ball () {kill (pidc); while (! have_ball) {// бөмбөг track_update () авах хүртэл давтана; far (); // камерыг бэлэн болгох (); // гарыг тохируулах үед (et <255) {// бөмбөгийг барихад хамгийн их утга гарах хүртэл track_update (); // камерын зургийг шинэчлэх бол (ball_x <= (center-5)) {// хэрэв бөмбөг үлдсэн бол track_update (); create_drive_direct (удаан, хурдан); // зүүн унтах (амрах);} if if (ball_x> = (center+5)) {// хэрэв бөмбөг зөв байвал track_update (); create_drive_direct (хурдан, удаан); // баруун тийш унтах (амрах);} өөр бол (ball_x (төв-5)) {// хэрэв бөмбөг төвлөрсөн бол track_update (); create_drive_straight (хурдан); // шууд унтах (амрах);}} барих (); // бөмбөгийг дуугаргах (); // чимээ гаргах (); Надад бөмбөг байна} start_c (); // сагсны нойрыг олоорой (1.0); // намайг унтвал би үхэх үедээ юу ч хийхгүй байх болно} void find_basket () {kill (pidb); // ball tracking process find (); // camera up up track_set_minarea (1000); // арын самбар нь том тул зөвхөн бөмбөг байхад track_update () байхад (have_ball) {// том том хэсгүүдийг хайна уу; while (track_x (backb, 0) = (center_x+20)) {// байхад төвлөрөөгүй track_update (); if (track_x (backb, 0)> = (center_x+20)) {// хэрэв арын самбар track_update () дээр үлдсэн бол; create_spin_CCW (100);} // хэрэв зүүн тийш эргэх бол (track_x (backb, 0) <= (center_x-20)) {// хэрэв backboard зөв 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 (удаан, хурдан); // зүүн унтах (амрах);} if if (track_x (backb, 0)> = (center_x+5)) {// хэрэв зорилт зөв track_update () байвал; create_drive_direct (хурдан, удаан); // баруун унтах (амрах);} өөр тохиолдолд (track_x (backb, 0) (center_x-5)) {// хэрэв зорилтот нь төвлөрсөн байвал track_update (); create_drive_straight (хурдан); // шууд унтах (амрах);}} зогсоох (); // create_drive_straight (хурдан); // жаахан ойртох // унтах (1.0); //Зогс(); унтах (1.0); create_spin_CW (speeda); // зөв унтах (буцаах); // 180 эргэлт хийхэд хангалттай удаан унтах (); доош (); // арын унтуулгыг хянахын тулд камерыг доошлуул (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 (); // зүүн унтах (амрах);} өөр бол (track_x (backb, 0)> = (center_x+5)) {// хэрэв зорилт зөв бол track_update (); back_left (); // баруун тийш унтах (амрах);} өөр тохиолдолд (track_x (backb, 0) (center_x-5)) {// хэрэв зорилтот нь track_update төвтэй бол (); буцах (); // шууд унтах (амрах);}} зогсоох (); дуут дохио (); шидэх (); // буудах нойр (1.0); have_ball = 0; // би бөмбөг шидсэн, түүнд байхгүй гэдгийг сануулах} start_b (); // бөмбөг мөрдөх нойр руу буцах (1.0); // энэ процесс үхэх хүртэл юу ч хийхгүй} void cconnect () {create_connect (); 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, straight);} void back () {create_drive (back_s, straight);} 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 ledge () {set_servo_position (гар, баригдсан);} void шидэлт () {int a; for (a = 50; a> = 30; a- = 1) {// set_servo_position (гар, a);} set_servo_position (гар, бууд);} void grab () {int a; for (a = 0; a <= hold; a+= 1) {// гараа жигд дээшлүүлэх set_servo_position (гар, 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 зайлсхий_зүүн () {алах (pidb); // бусад бүх зүйлийг зогсоох (pidc); ledge (); // хумсаа аваарай, ингэснээр ширээн дээр баригдахгүй байх болно back_away (); // буцааж эргүүлэх_l (); // саад бэрхшээлээс хол эргэх бэлэн (); // хэрэв (have_ball) {// хэрэв надад бөмбөг байгаа бол start_c ();} // хэрэв өөр бөмбөг байхгүй бол (! have_ball) {// хэрэв надад бөмбөг байхгүй бол start_b ();} // бөмбөг мөрдөж эхэлнэ үү {алах (pidb); алах (pidc); ирмэг (); буцах (); rotate_r (); бэлэн (); if (have_ball) {start_c ();} if 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, камер, LEGO тоосго, мэдрэгч) = 579 доллар PVC + будаг + эрэг = 20 орчим доллар Нийт зардал = 859 доллар Би Ботболлоос XBC гарааны иж бүрдэлтэй байсан тул зардал Миний хувьд энэ бүтээх зардал байсан юм. Миний бодлоор энэ нь үнэ цэнэтэй зүйл байсан бөгөөд хамгийн сайн тал нь хэрэв би энэ ботоос өөрийгөө салгаж чадвал миний ашиглаж байсан бүх хэсгийг дахин ашиглах боломжтой юм., ширээний тавцан дээр. Энэ видеон дээр робот 5 улбар шар бөмбөгийг нэг гоол оруулсан болохыг харуулжээ. Би зөвхөн үйл явцыг хурдасгахад тусалсан, энэ нь 5 -р бөмбөгийг өөрөө олж авах байсан.

Алхам 7: Дүгнэлт

Эцсийн үр дүн бол улбар шар өнгийн бөмбөгийг ганцаараа авах боломжтой робот юм.

Би энэ төсөл дээр ажиллах дуртай байсан. Би энэ робот дээр ажиллах тусам түүнд улам наалддаг болсон. Би одоо гэрийн тэжээвэр амьтан шиг ярьж байна. Энэ нь таны дараагийн төсөлд тусалсан гэж найдаж байна. Надад талархах ёстой олон хүмүүс байдаг, гэхдээ хэтэрхий олон хүмүүс байдаг. Чартресын Бернард шиг маш дэгжин хэлэхдээ: "Бид аварга том хүмүүсийн мөрөн дээрх одойтой адилхан бөгөөд ингэснээр бид тэднээс илүү их зүйлийг, илүү хол зайд байгаа зүйлийг харж чаддаг. ялгаа, гэхдээ биднийг асар өндөр хэмжээгээр өргөж, өсгөдөг учраас."

Зөвлөмж болгож буй: