Mündəricat:

Bir IRobot istifadə edərək muxtar bir basketbol oynayan robot necə yaradılır: 7 addım (şəkillərlə)
Bir IRobot istifadə edərək muxtar bir basketbol oynayan robot necə yaradılır: 7 addım (şəkillərlə)

Video: Bir IRobot istifadə edərək muxtar bir basketbol oynayan robot necə yaradılır: 7 addım (şəkillərlə)

Video: Bir IRobot istifadə edərək muxtar bir basketbol oynayan robot necə yaradılır: 7 addım (şəkillərlə)
Video: İmam Əlinin (ə) həyatına qısa bir baxış @guldiyarzulfuqar1592 2024, Iyul
Anonim
Bir IRobotdan istifadə edərək muxtar bir basketbol oynayan robot necə yaradılır
Bir IRobotdan istifadə edərək muxtar bir basketbol oynayan robot necə yaradılır

Bu, iRobot Create probleminə girişimdir. Mənim üçün bütün bu prosesin ən çətin hissəsi robotun nə edəcəyinə qərar vermək idi. Yaratmanın sərin xüsusiyyətlərini nümayiş etdirmək istəyirdim, eyni zamanda bir robo qabiliyyəti də əlavə etdim. Bütün fikirlərim ya darıxdırıcı, lakin faydalı, ya da sərin və praktik olmayan kateqoriyaya düşdü. Sonda sərin və praktik olmayan qalib gəldi və basketbol oynayan robot dünyaya gəldi. Bir az düşündükdən sonra bunun praktik ola biləcəyini başa düşdüm. Narıncı kağızdan istifadə etdiyinizi və bütün zibil qutularınızın yaşıl lövhələri olduğunu düşünün …

Addım 1: Aquire hissələri

Müsabiqənin vaxtı məhdud olduğu üçün istifadə etdiyim hissələrin çoxu "rəfdə" idi. İstifadə olunan "Stok" Robot Parçaları: Yarat (x1)-iRobotdan www.irobot.comXBC V.3.0 (x1)-Botboldan www.botball.orgCreate-Roomba kabeli (x1)-Botboldan www.botball.orgServo (x2)-Botball-dan www.botball.orgSharp məsafəölçən (x1)-Botboldan www.botball.org -dan Çeşidli LEGO kərpicləri-LEGO www.lego.com saytından 6-32 maşın vintləri (x4)-McMaster www.mcmaster-dən.com "Yaradılan" Robot Parçaları: 3/8 "qalın ekstrüde edilmiş PVC təbəqə - bu əşyalar zəhmlidir, amma hardan aldığımı xatırlamıram, amma bu da eynidir https://www.lynxmotion.com/Category.aspx? CategoryID = 62Digər hissələr: Narıncı "POOF" topu - WalMartBasketbol qolundan zibil qutusuna baxır - LowesGreen "arxa taxtadan" - əlavə PVC boyalı parlaq yaşıl

Addım 2: Unikal hissə yaradın

Unikal hissə yaradın
Unikal hissə yaradın

Hazırlamaq məcburiyyətində qaldığım yeganə hissə, LEGO aralığını yaratmağa bərkidilmiş bir boşqab idi. LEGO kərpic çuxurlarının aralarındakı məsafə 8 mm -dir, amma vaxta qənaət etmək üçün ikiqat aralıq etdim. Ekstrüde edilmiş PVC, işləmək üçün bir mehdir. Bir bıçaqla kəsilə bilər, ancaq möhkəm və möhkəmdir. Robotu tez -tez bu boşqabdan götürürəm və hələ heç bir problemim yoxdur.

Addım 1: Vərəqi 3,5 "x 9,5" ölçüsündə kəsin, bunu bir bıçaqla kəsə bilərsiniz. Addım 2: Yaratma vintləri üçün deliklər qazın. Yaratma vintləri 2 və 5/8 "8 və 5/8" ölçülərində bir qutu düzəldir. Addım 3: LEGO kərpic aralığında deliklər qazın. 3/16 "qazma ucu istifadə edin və delikləri bir -birindən 16 mm aralıda yerləşdirdim. İpucu: Vərəqi CAD proqramına qoydum, tam ölçüdə çap etdim və vərəqə yapışdırdım. Sonra bunu kəsmə və qazma.

Addım 3: Robotun yığılması

Robotun yığılması
Robotun yığılması
Robotun yığılması
Robotun yığılması
Robotun yığılması
Robotun yığılması

Mümkün qədər sadə şeylər qurmaqdan zövq alıram, belə ki, onlar masadan tullananda çox yenidən qurmaq lazım deyil!

1. Yeni hazırlanan lövhəni Yaradın üstünə vidalayın 2. Topu tutmaq üçün bir qol qurun 3. Kameranı tutmaq üçün bir qol qurun 4. Məsafə tapan üçün bir montaj qurun 5. XBC -ni quraşdırın və bütün kabelləri bağlayın.

Addım 4: Robotun proqramlaşdırılması

Əsasən rəng izləmə xüsusiyyətinə görə XBC -ni nəzarətçi olaraq istifadə etmək qərarına gəldim. Əməliyyatın beyni olaraq XBC ilə robotumu İnteraktiv C -də və ya IC adlandırdığım kimi proqramlaşdırmağa qərar verdim. IC istifadə etmək pulsuzdur və www.botball.org saytında yüklənə bilər. IC C ++ ilə çox oxşardır, lakin bir neçə kitabxanada qurulmuşdur. Göründüyü kimi, Oklahoma Universitetindən David Miller, https://i-borg.engr.ou.edu/~dmiller/create/ ünvanından yükləyə biləcəyiniz Yaratmaq üçün bir kitabxana yazdı. Yaratmaq üçün bu qaynaqlar və təlimatlarla proqramlaşdırmağa hazır idim. Amma növbəti böyük problem nə etmək istədim? Gedib narıncı topları götürüb səbətə vura biləcək bir robot istədim. Məqsədim sadə səsləndi və yəqin ki, sadə ola bilərdi, amma Yaratmanın edə biləcəyi işlərə nə qədər çox daxil olsam, bir o qədər çox etmək istəyirdim. Son siyahım belə oldu: 1. Narıncı topu tap 2. Narıncı topu götür 3. Səbəti tapın4. Topu səbətə qoyun1. Obyektlərdən qaçınmaq 2. Heç bir şeydən düşməmək (masa kimi) 3. Batareyanın doldurulmasını aşkar etmək və aşağı olduqda ev bazası ilə birləşdirmək və bunların hamısı tamamilə avtonomdur, yəni hamısı əvvəlcədən proqramlaşdırılmışdır.

Addım 5: Kod

Səliqəsiz ola bilər, amma işləyir.#İstifadə "createlib.ic" #use "xbccamlib.ic" #define cam 0 // kamera servo portu#qolu təyin etmək 3 // arm servo port#define et (analog (0)) // et port/*Yaratma kabelinin də bağlanması lazımdır. Güc yuvası, 3 portlu 8 -ci porta və UX -i JP 28 -ə (USB portunun yanında) U -u kameraya doğru yönəldilmiş*/ #c_down 5 təyin edin // kamera servo aşağı#a_down 17 müəyyən edin // qol servo aşağı#tutma 50 təyin edin // servo tutma topu#tutulan 27 müəyyən edin // masaya düşməmək üçün qol servo mövqeyi#vuruş 150 təyin edin top atmaq#track_c 25 təyin edin // kamera servo izi yaxın mövqe#track_f 45 təyin edin#kamera servo track uzaq mövqe#mərkəz müəyyən edin 120 // kamera görmə mərkəzi#inrange 30 təyin edin // top pençədə olduqda track_y koordinat. 0 // narıncı top kanalı#top_x təyin edin (track_x (top, 0)) // x topun koordinatı#top_y təyin edin (track_y (top, 0)) // y topun koordinatı#yavaş 100 təyin edin // yavaş sürət motor#sürətli müəyyən 175 // sürətli motor sürəti#dəqiq 0.2 0.2 s maneələrdən geri çəkilmək#vaxtı təyin etmək 0.5 //1.0 90 dərəcə sağa dönmək#istirahət təyin etmək 0.05 // ləkələri izləyərkən yatmaq vaxtı#sürəti müəyyən etmək 175 // dönmə sürəti#geri_s -200 // sürət vurulmuş obyektdən uzaqlaşın#düz 32767 təyin edin // düz bir xəttlə sürün#arxanı təyin edin 2 // arxa planın əsas rəngi#kvadratı müəyyən edin // arxa planın vurğu rəngli kanalı#track_d 250 // hədəfi izləmək üçün kamera mövqeyi# track_find 70 təyin edin // uzun izləmə üçün kamera mövqeyi#tərs 2.25 təyin edin // 180 üçün yuxu vaxtı#geri təyin_f -150 // geri sürətli sürət#geri müəyyən_sl -125 // geri yavaş sürət#mərkəz_x 178 müəyyən edin // əsl x mərkəzi of cam#define center_y 146 // həqiqi y camint pidasının mərkəzi; // prosesin pidbindən qaçın; // track processint pidc; // hesabın işlənməsi have_ball = 0; // hansı funksiyadan çəkindiyimizi bildirir main () {long ch; enable_servos (); // servo init_cameranı aktivləşdirmək (); // kamera cconnect başlatmaq; // tam nəzarətlə yaratmaq üçün qoşulmaq start_a (); // start funksiyasından qaçmaq start_b (); // ball_tracking funksiyasını başlatmaq (1) {if (r_button () || gc_ldrop || gc_rdrop) {// alsanız və ya r çiyin düyməsini öldürsəniz (pida); öldürmək (pidb); öldürmək (pidc); disable_servos (); ayırın (); fasilə;} create_battery_charge (); display_clear (); printf ("şarj = %l / n", gc_battery_charge); if (gc_battery_charge <1200l || b_button ()) {kill (pida); öldürmək (pidb); öldürmək (pidc); atmaq(); have_ball = 0; yaratmaq_demo (1); while (b_button ()); while (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("şarj = %l / n", gc_battery_charge); yuxu (1.0);} cconnect (); arxa (); yuxu (2.0); start_a (); start_b ();}}} void qoch () {while (1) {// sonsuza qədər create_sensor_update (); // bütün sensor dəyərlərini yeniləyin // create_drive (speeda, düz); if (gc_lbump == 1) {// sol bump qarşısını almaq_right ();} // başqa haldan qaçmaq üçün sağa dönərsə (gc_rbump == 1) {// sağ bump qarşısını almaq_left ();} // başqa halda qarşısını almaq üçün sola dönərsə (gc_lfcliff == 1) {// sol ön uçurumdan qaçın_right ();} başqa halda (gc_rfcliff == 1) {// sağ ön uçurumdan qaçın_sola ();} başqa əgər (gc_lcliff == 1) {// sol uçurumdan qaçın_sağlıq);} başqa halda (gc_rcliff == 1) {// sağ uçurumdan qaçın_sola ();}}} void track_ball () {kill (pidc); while (! have_ball) {// top track_update () alınana qədər təkrarlayın; far (); // kameranı hazır vəziyyətə gətirir (); // qolu təyin edərkən (et <255) {// top tutulduqda maksimum dəyər baş verənə qədər track_update (); // əgər kamera şəklini yeniləyin (ball_x <= (center-5)) {// top sol olarsa track_update (); create_drive_direct (yavaş, sürətli); // sol yuxuya dön (istirahət);} başqa halda (ball_x> = (center+5)) {// top doğru olarsa track_update (); create_drive_direct (sürətli, yavaş); // sağa dön (yuxu);} başqa halda (ball_x (mərkəz-5)) {// top mərkəzdədirsə track_update (); create_drive_straight (sürətli); // düz yuxuya get (istirahət et);}} tut (); // top bip səsi (); // səs -küy saxla (); // sürməyi dayandır have_ball = 1; // qeyd et Topum var} start_c (); // səbət yuxusunu tap (1.0); // yuxu elə ki, öldürüləndə heç nə etmərəm} void find_basket () {kill (pidb); // top izləmə prosesi find (); // kamera qoyun track_set_minarea (1000); // arxa lövhə böyükdür, buna görə də (have_ball) {// topu track_update () olarkən yalnız böyük ləkələr axtarın; while (track_x (backb, 0) = (center_x+20)) {// mərkəzləşdirilməmiş track_update (); if (track_x (backb, 0)> = (center_x+20)) {// əgər backboard track_update () qalırsa; create_spin_CCW (100);} // əgər sola dönsək (track_x (backb, 0) <= (center_x-20)) {// əgər backboard doğru track_update () olarsa; create_spin_CW (300-center_x);} // mərkəz yaxınlaşdıqca yavaşlayaraq sağa dön} stop (); while (track_size (backb, 0) <= (6000)) {// hədəf 6000 pikseldən kiçik olduqda track_update (); if (track_x (backb, 0) <= (center_x-5)) {// hədəf track_update () qalırsa; create_drive_direct (yavaş, sürətli); // sol yuxuya dön (istirahət);} başqa halda (track_x (backb, 0)> = (center_x+5)) {// hədəf doğru olarsa track_update (); create_drive_direct (sürətli, yavaş); // sağa dön (istirahət);} başqa halda (track_x (backb, 0) (center_x-5)) {// əgər hədəf mərkəzdədirsə track_update (); create_drive_straight (sürətli); // düz yuxuya get (istirahət);}} dayan (); // create_drive_straight (sürətli); // bir az yaxınlaş // // yuxu (1.0); // dayandır (); yuxu (1.0); create_spin_CW (speeda); // sağ yuxu fırlat (tərsinə); // 180 dönmə dayanacağı üçün kifayət qədər uzun yat (); aşağı (); // arxa plan yuxusunu izləmək üçün kameranı aşağı salın (1.0); track_set_minarea (200); // daha kiçik bir ölçü istifadə edin, çünki ona işarə edirik və yaxınlaşacağıq (track_y (backb, 0)> = (center_y-140)) {// hədəf daha az olduqda y koordinat track_update (); if (track_x (backb, 0) <= (center_x-5)) {// hədəf track_update () qalırsa; back_right (); // sol yuxuya dön (istirahət);} başqa halda (track_x (backb, 0)> = (center_x+5)) {// hədəf doğru olarsa track_update (); back_left (); // sağa dön (yuxu);} başqa halda (track_x (backb, 0) (center_x-5)) {// hədəf mərkəzdədirsə track_update (); geri (); // düz yuxuya get (istirahət);}} dayan (); bip (); atmaq (); // vur yuxusu (1.0); have_ball = 0; // topu atdığım və xatırlamadığım} start_b (); // topu izləmə yuxusuna qayıt (1.0); // bu proses ölməyincə heç nə etmə} void cconnect () {create_connect (); create_full (); // çıxıntı sensorlarının tam nəzarəti üçün create_power_led (0, 255);} // yaşıl enerji ledvoid ayırma () {stop (); // hərəkəti dayandırmağı create_disconnect ();} void back_away () {geri (); yuxu (aydın); stop ();} void rotate_l () {create_spin_CCW (speeda); yuxu vaxtı); stop ();} void rotate_r () {create_spin_CW (speeda); yuxu vaxtı); stop ();} void stop () {create_drive (0, straight);} void back () {create_drive (back_s, straight);} void ready () {set_servo_position (qol, a_down);} boşluğu yoxlamaq () {set_servo_position (cam, track_c);} void far () {set_servo_position (cam, track_f);} boş boşluq () {set_servo_position (qol, tutuldu);} boş atma () {int a; for (a = 50; a> = 30; a- = 1) {// hazır_servo_pozisiyası (qol, a);} set_servo_pozisiyası (qol, vur);} void grab () {int a; for (a = 0; a <= basıb saxlayın; a+= 1) {// qolu hamar bir şəkildə qaldırın set_servo_position (qol, a);}} boşaldın () {set_servo_position (cam, track_d);} boşluq tap () {set_servo_position (cam, track_find);} void start_a () {pida = start_process (qarşısını almaq ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // cari yaratmaq prosesinin bitməsini gözləyin və kill_process (pid) prioritetini götürün; CREATE_FREE; // tamamladım stop ();} void avoid_left () {kill (pidb); // hər şeyi dayandır öldür (pidc); ledge (); // pençəni götürün ki, masaya yapışmasın. back_away (); // geriyə döndür_l (); // maneədən uzaqlaşmağa hazır (); // əgər (var_bol) {// topum varsa start_c ();} // başqa hədəfi izləməyə başla (əgər var! {öldür (pidb); öldürmək (pidc); çıxıntı (); geriyə (); rotate_r (); hazı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);}

Addım 6: Buna dəyərmi?

Xərclər bunlar idi: + batareya + doc = 260 dollarlıq XBC başlanğıc dəsti (xbc, cam, LEGO kərpicləri, sensorlar) = 579 dollarPVC + boya + vintlər = təxminən 20 dollar Cəmi xərc = 859 dollar Mən artıq Botboldan XBC başlanğıc dəstinə sahib idim. Mənə yaratmağın qiyməti idi. Düşünürəm ki, buna dəyərdi və ən yaxşı tərəfi, bu botdan ayrılmaq üçün özümü gətirə bilsəm istifadə etdiyim bütün hissələrin təkrar istifadə oluna bilməsidir., masanın üstündə. Bu videoda robotun bir qola 5 narıncı top vurduğu görünür. Yalnız prosesi sürətləndirməyə kömək etdim, nəticədə öz başına 5 -ci topu tapardı.

Addım 7: Nəticə

Son nəticə, narıncı topları tək başına ala bilən və vura bilən bir robotdur.

Bu layihə üzərində işləməyi çox bəyəndim. Bu robot üzərində nə qədər çox çalışsam, ona bir o qədər bağlı oldum. İndi onunla ev heyvanı kimi danışıram. Ümid edirəm ki, bu, növbəti layihənizdə sizə kömək etdi. Təşəkkür etməli olduğum bir çox insan var, amma çoxdur. Bernard Chartres kimi çox zərif bir şəkildə ifadə etdiyi kimi: "biz nəhənglərin çiyinlərində olan cırtdanlar kimiyik ki, onlardan daha çoxunu və daha uzaq məsafədə olan şeyləri görə bilək, görmə qabiliyyətimizə görə və ya fiziki cəhətdən fərqlənmə, amma bizi nəhəng ölçüləri ilə yüksəklərə qaldırdığımız və qaldırdığımız üçün."

Tövsiyə: