Mục lục:

Cách tạo Robot chơi bóng rổ tự động bằng IRobot Tạo làm cơ sở: 7 bước (có hình ảnh)
Cách tạo Robot chơi bóng rổ tự động bằng IRobot Tạo làm cơ sở: 7 bước (có hình ảnh)

Video: Cách tạo Robot chơi bóng rổ tự động bằng IRobot Tạo làm cơ sở: 7 bước (có hình ảnh)

Video: Cách tạo Robot chơi bóng rổ tự động bằng IRobot Tạo làm cơ sở: 7 bước (có hình ảnh)
Video: Cách gấp quạt 2024, Tháng bảy
Anonim
Cách chế tạo rô bốt chơi bóng rổ tự động bằng cách sử dụng IRobot tạo làm đế
Cách chế tạo rô bốt chơi bóng rổ tự động bằng cách sử dụng IRobot tạo làm đế

Đây là bài viết của tôi cho thử thách Tạo iRobot. Phần khó nhất của toàn bộ quá trình này đối với tôi là quyết định xem robot sẽ làm gì. Tôi muốn chứng minh các tính năng thú vị của Create, đồng thời thêm vào một số nét tinh tế của rô bốt. Tất cả các ý tưởng của tôi dường như thuộc loại nhàm chán nhưng hữu ích, hoặc tuyệt vời và không thực tế. Cuối cùng, sự tuyệt vời và không thực tế đã chiến thắng và robot chơi bóng rổ đã ra đời. Sau một số suy nghĩ, tôi nhận ra rằng điều đó có thể thực tế. Giả sử rằng bạn sử dụng giấy màu cam và tất cả các thùng rác của bạn đều có bảng màu xanh lá cây…

Bước 1: Mua lại các bộ phận

Vì thời gian diễn ra cuộc thi nên hầu hết những phần tôi sử dụng đều "hết hạn sử dụng". Các bộ phận Robot "có sẵn" được sử dụng: Tạo (x1) - từ iRobot www.irobot.comXBC V.3.0 (x1) - từ Botball www.botball.org Cáp tạo-Roomba (x1) - từ Botball www.botball.orgServo (x2) - từ Botball www.botball.org Máy đo khoảng cách (x1) - từ Botball www.botball.org Các viên gạch LEGO được phân loại - từ LEGO www.lego.com6-32 vít máy (x4) - từ McMaster www.mcmaster.com "Tạo" Bộ phận Robot được sử dụng: Tấm nhựa PVC đùn dày 3/8 "- thứ này thật tuyệt, nhưng tôi không thể nhớ mình lấy nó từ đâu, nhưng nó giống như thứ này https://www.lynxmotion.com / Category.aspx? CategoryID = 62Các bộ phận khác: Quả bóng "POOF" màu cam - từ thùng rác WalMartBasketball nhìn khung thành - từ "bảng sau" LowesGreen - thêm PVC sơn màu xanh lá cây tươi sáng

Bước 2: Tạo phần duy nhất

Tạo phần độc đáo
Tạo phần độc đáo

Phần duy nhất mà tôi phải chế tạo là một tấm bắt vít vào Tạo và cung cấp khoảng cách LEGO. Khoảng cách của các lỗ gạch LEGO cách nhau 8mm, nhưng tôi đã tạo khoảng cách gấp đôi để tiết kiệm thời gian. PVC đùn rất dễ làm việc. Nó có thể được cắt bằng một con dao tiện ích, nhưng cứng và mạnh mẽ. Tôi thường gắp robot bằng tấm này và tôi chưa gặp sự cố nào.

Bước 1: Cắt tờ giấy thành 3,5 "x 9,5", bạn có thể cắt bằng dao tiện ích. Bước 2: Khoan lỗ cho các vít tạo. Các vít tạo tạo ra một hộp có kích thước 2 và 5/8 "bằng 8 và 5/8". Bước 3: Khoan các lỗ cách nhau các viên gạch LEGO. Sử dụng một mũi khoan 3/16 "và tôi đặt các lỗ cách nhau 16mm. Mẹo: Tôi đặt tờ giấy trong chương trình CAD, in nó ra với kích thước đầy đủ và dán nó vào tờ giấy. Sau đó, tôi sử dụng nó làm hướng dẫn để cắt và khoan.

Bước 3: Lắp ráp Robot

Lắp ráp Robot
Lắp ráp Robot
Lắp ráp Robot
Lắp ráp Robot
Lắp ráp Robot
Lắp ráp Robot

Tôi thích xây dựng mọi thứ đơn giản nhất có thể, theo cách đó khi chúng nhảy ra khỏi bàn, bạn không phải xây dựng lại nhiều!

1. Vặn tấm mới kiểu dáng vào đầu của Create 2. Tạo cánh tay để nắm lấy quả bóng 3. Tạo cánh tay để giữ máy ảnh 4. Làm giá đỡ cho máy đo khoảng cách 5. Gắn XBC và kết nối tất cả các dây cáp

Bước 4: Lập trình Robot

Tôi quyết định sử dụng XBC làm bộ điều khiển của mình chủ yếu vì tính năng theo dõi màu sắc được tích hợp sẵn của nó. Bởi vì tôi quyết định coi XBC là bộ não của hoạt động, tôi đã lập trình robot của mình trong Interactive C, hay tôi gọi nó là IC. IC được sử dụng miễn phí và có thể tải xuống tại www.botball.org. IC rất giống với C ++, nhưng có một số thư viện được tích hợp sẵn. Hóa ra, David Miller từ Đại học Oklahoma đã viết một thư viện cho Create có thể được tải xuống từ trang của anh ấy tại https://i-borg.engr.ou.edu/~dmiller/create/. Với những tài nguyên đó và sách hướng dẫn tạo, tôi đã sẵn sàng lập trình. Nhưng thách thức lớn tiếp theo là tôi muốn nó làm gì? Tôi muốn một con rô bốt có thể đi nhặt những quả bóng màu cam và ghi chúng vào rổ. Mục tiêu của tôi nghe có vẻ đơn giản, và có lẽ có thể đơn giản, nhưng tôi càng tập trung vào những gì Create có thể làm, tôi càng muốn nó làm được nhiều hơn. Danh sách cuối cùng của tôi trông như thế này: 1. Tìm quả bóng màu cam2. Nhặt quả bóng màu cam3. Xác định vị trí giỏ4. Đặt bóng vào rổ Tránh các đối tượng2. Không rơi ra bất cứ thứ gì (như bàn) 3. Việc phát hiện sạc pin và kết nối với đế máy chủ khi lowOh và tất cả điều này là hoàn toàn tự động, có nghĩa là tất cả đều được lập trình trước.

Bước 5: Mã

Nó có thể lộn xộn, nhưng nó hoạt động. # Sử dụng "createelib.ic" #use "xbccamlib.ic" #define cam 0 // cổng servo máy ảnh # xác định cánh tay 3 // cổng servo cánh tay # xác định et (tương tự (0)) // et port / * Cáp tạo cũng cần được cắm. Giắc nguồn, phích cắm 3 chấu vào cổng 8 và phích cắm có nhãn UX thành JP 28 (bên cạnh cổng USB) với chữ U về phía máy ảnh * / #define c_down 5 // hạ servo camera # xác định a_down 17 // hạ servo xuống # xác định giữ 50 // giữ servo # xác định bị bắt 27 // vị trí của servo để tránh bị kẹt trên bàn # xác định chụp 150 // servo ném bóng # xác định rãnh_c 25 // vị trí gần theo dõi servo camera # xác định rãnh_f 45 // vị trí xa theo dõi servo camera # xác định tâm 120 // tâm của tầm nhìn camera # xác định trong phạm vi 30 // theo dõi_y toạ độ khi bóng ở trong vuốt # xác định bóng 0 // kênh của bóng màu cam # xác định bóng_x (track_x (ball, 0)) // tọa độ x của bóng # xác định ball_y (track_y (ball, 0)) // tọa độ y của bóng # xác định chậm 100 // tốc độ chậm động cơ # xác định nhanh 175 // tốc độ của động cơ nhanh # xác định rõ ràng 0,2 // s leep để lùi khỏi chướng ngại vật # xác định thời gian 0,5 //1.0 là rẽ phải 90 độ # xác định nghỉ 0,05 // thời gian để ngủ trong khi theo dõi đốm màu # xác định speeda 175 // tốc độ tránh rẽ # xác định lùi_s -200 // tốc độ tới lùi ra khỏi đối tượng bị va chạm # xác định đường thẳng 32767 // lái xe theo đường thẳng # xác định mặt sau 2 // kênh của màu chính của mặt sau # xác định hình vuông 1 // kênh của màu nổi bật của mặt sau # xác định track_d 250 // vị trí camera để theo dõi mục tiêu # xác định track_find 70 // vị trí camera để theo dõi lâu # xác định ngược 2,25 // thời gian ngủ cho 180 # xác định lùi_f -150 // quay lại tốc độ nhanh # xác định lùi_sl -125 // quay lại tốc độ chậm # xác định tâm_x 178 // đúng x trung tâm of cam # define center_y 146 // true y center of camint pida; // tránh processint pidb; // theo dõi processint pidc; // score processint have_ball = 0; // cho biết chúng ta đang dùng hàm nào main () {long ch; enable_servos (); // kích hoạt servos init_camera (); // khởi động máy ảnh cconnect (); // kết nối để tạo với toàn quyền điều khiển start_a (); // bắt đầu tránh hàm start_b (); // khởi động hàm ball_tracking trong khi (1) {if (r_button () || gc_ldrop || gc_rdrop) {// nếu nhặt được hoặc r nút vai giết (pida); giết (pidb); giết (pidc); vô hiệu hóa_servos (); ngắt kết nối (); break;} create_battery_charge (); display_clear (); printf ("phí =% l / n", gc_battery_charge); if (gc_battery_charge <1200l || b_button ()) {kill (pida); giết (pidb); giết (pidc); ném(); có_bóng = 0; create_demo (1); while (b_button ()); while (gc_battery_charge <2800l &&! b_button ()) {create_battery_charge (); display_clear (); printf ("phí =% l / n", gc_battery_charge); ngủ (1.0);} cconnect (); mặt sau(); ngủ (2.0); bắt đầu một(); start_b ();}}} void tránh () {while (1) {// lặp lại mãi mãi create_sensor_update (); // cập nhật tất cả các giá trị cảm biến // create_drive (speeda, thẳng); if (gc_lbump == 1) {// quẹo trái tránh xa else if (gc_rbump == 1) {// quẹo phải tránh xa else if (gc_lfcliff == 1) {// vách đá phía trước bên trái tránh_right ();} else if (gc_rfcliff == 1) {// vách đá phía trước bên phải tránh_left ();} else if (gc_lcliff == 1) {// vách đá bên trái tránh_right ();} else if (gc_rcliff == 1) {// vách đá bên phải tránh_left ();}}} void track_ball () {kill (pidc); while (! have_ball) {// lặp lại cho đến khi nhận được ball track_update (); far (); // đặt camera sẵn sàng (); // đặt cánh tay trong khi (et <255) {// cho đến khi giá trị lớn nhất xảy ra khi bắt bóng track_update (); // cập nhật hình ảnh camera if (ball_x <= (center-5)) {// nếu bóng trái track_update (); create_drive_direct (chậm, nhanh); // quay trái sleep (nghỉ);} else if (ball_x> = (center + 5)) {// if ball right track_update (); create_drive_direct (nhanh, chậm); // quay sang phải sleep (nghỉ);} else if (ball_x (center-5)) {// if ball is center track_update (); create_drive_straight (fast); // đi thẳng vào chế độ ngủ (nghỉ ngơi);}} grab (); // gắp quả bóng bíp (); // dừng tiếng ồn (); // dừng lái xe have_ball = 1; // lưu ý rằng Tôi có bóng} start_c (); // tìm bóng rổ (1.0); // ngủ để tôi không làm gì khi bị giết} void find_basket () {kill (pidb); // tiêu diệt quá trình theo dõi bóng find (); // đặt camera lên track_set_minarea (1000); // bảng sau lớn nên chỉ tìm các đốm màu lớn while (have_ball) {// trong khi tôi có ball track_update (); while (track_x (backb, 0) = (center_x + 20)) {// trong khi không căn giữa track_update (); if (track_x (backb, 0)> = (center_x + 20)) {// nếu backboard là trái track_update (); create_spin_CCW (100);} // quay sang trái else if (track_x (backb, 0) <= (center_x-20)) {// nếu backboard đúng track_update (); create_spin_CW (300-center_x);} // rẽ phải chậm lại khi tâm đến gần} stop (); while (track_size (backb, 0) <= (6000)) {// trong khi mục tiêu có kích thước nhỏ hơn 6000 pixel track_update (); if (track_x (backb, 0) <= (center_x-5)) {// nếu mục tiêu là trái track_update (); create_drive_direct (chậm, nhanh); // chuyển sang trái sleep (nghỉ);} else if (track_x (backb, 0)> = (center_x + 5)) {// nếu mục tiêu là phải track_update (); create_drive_direct (nhanh, chậm); // chuyển sang phải sleep (nghỉ);} else if (track_x (backb, 0) (center_x-5)) {// nếu mục tiêu được căn giữa track_update (); create_drive_straight (nhanh); // đi thẳng vào chế độ ngủ (nghỉ ngơi);}} stop (); // create_drive_straight (nhanh); // đến gần hơn một chút //sleep(1.0); //ngừng lại(); ngủ (1.0); create_spin_CW (speeda); // quay sang phải (đảo ngược); // ngủ đủ lâu để dừng 180 lượt (); down (); // đặt camera xuống để theo dõi chế độ ngủ của bảng sau (1.0); track_set_minarea (200); // sử dụng kích thước nhỏ hơn y tọa độ track_update (); if (track_x (backb, 0) <= (center_x-5)) {// nếu mục tiêu là trái track_update (); back_right (); // chuyển sang trái sleep (rest);} else if (track_x (backb, 0)> = (center_x + 5)) {// nếu mục tiêu là phải track_update (); back_left (); // chuyển sang phải sleep (rest);} else if (track_x (backb, 0) (center_x-5)) {// nếu mục tiêu được căn giữa track_update (); back (); // ngủ thẳng giấc (nghỉ ngơi);}} stop (); tiếng kêu bíp(); ném (); // bắn sleep (1.0); have_ball = 0; // nhắc nhở tôi đã ném bóng và không có nó} start_b (); // quay lại chế độ ngủ theo dõi bóng (1.0); // đừng làm bất cứ điều gì cho đến khi quá trình này kết thúc} void cconnect () {create_connect (); create_full (); // để kiểm soát toàn bộ cảm biến gờ create_power_led (0, 255);} // ngắt kết nối đèn led nguồn xanh () {stop (); // dừng di chuyển create_disconnect ();} void back_away () {back (); ngủ (trong sáng); stop ();} void xoay_l () {create_spin_CCW (speeda); giờ ngủ); stop ();} void xoay_r () {create_spin_CW (speeda); giờ ngủ); stop ();} void stop () {create_drive (0, thẳng);} void back () {create_drive (back_s, thẳng);} 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 (arm, catch);} void ném () {int a; for (a = 50; a> = 30; a- = 1) {// chuẩn bị sẵn sàng set_servo_position (arm, a);} set_servo_position (arm, shoot);} void grab () {int a; for (a = 0; a <= hold; a + = 1) {// nâng cánh tay lên một cách trơn tru 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 (tránh ());} void start_b () {pidb = start_process (track_ball ());} void start_c () {pidc = start_process (find_basket ());} void kill (int pid) {CREATE_BUSY; // đợi quá trình tạo hiện tại kết thúc và ưu tiên kill_process (pid); CREATE_FREE; // tôi xong rồi stop ();} void tránh_left () {kill (pidb); // dừng mọi thứ khác kill (pidc); ledge (); // nhấc móng vuốt để nó không bị kẹt trên bàn back_away (); // quay lại xoay_l (); // xoay khỏi chướng ngại vật đã sẵn sàng (); // đặt vuốt xuống nếu (có_ball) {// nếu tôi có bóng start_c ();} // bắt đầu theo dõi bàn thắng else if (! have_ball) {// nếu tôi không có bóng start_b ();} // bắt đầu theo dõi bóng} void Tránh_right () {giết (pidb); giết (pidc); gờ (); back_away (); xoay_r (); Sẵn sàng(); 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);}

Bước 6: Có xứng đáng không?

Chi phí là: Tạo + pin + doc = 260 đô la Bộ khởi động XBC (xbc, cam, gạch LEGO, cảm biến) = 579 đô laPVC + sơn + vít = khoảng 20 đô la Tổng chi phí = 859 đô la Tôi đã có bộ khởi động XBC từ Botball, vì vậy chi phí Đối với tôi đó là chi phí của Tạo. Tôi nghĩ rằng nó xứng đáng và phần tốt nhất là tất cả các phần tôi đã sử dụng đều có thể tái sử dụng, nếu tôi có thể tự tách ra khỏi bot này. Video này cho thấy thói quen tránh phụ, trên mặt bàn. Video này cho thấy robot ghi được 5 quả bóng màu cam trong một khung thành. Tôi chỉ hỗ trợ để đẩy nhanh quá trình, cuối cùng nó sẽ tự tìm thấy bóng số 5.

Bước 7: Kết luận

Kết quả cuối cùng là robot có thể tự mình nhặt và ghi những quả bóng màu cam vào khung thành.

Tôi thích làm việc trong dự án này. Càng làm việc với con robot này, tôi càng gắn bó với nó. Bây giờ tôi nói chuyện với nó như thể nó là một con vật cưng. Tôi hy vọng rằng điều này đã giúp bạn trong dự án tiếp theo của bạn. Có rất nhiều người mà tôi cần phải cảm ơn, nhưng có quá nhiều. Giống như Bernard ở Chartres đã tuyên bố một cách thanh lịch: "chúng ta giống như những chú lùn trên vai những người khổng lồ, để chúng ta có thể nhìn thấy nhiều thứ hơn chúng, và mọi thứ ở khoảng cách xa hơn, không phải nhờ bất kỳ độ sắc nét nào trên thị giác của chúng ta, hoặc bất kỳ vật chất nào. sự khác biệt, nhưng bởi vì chúng ta được nâng lên cao và lớn lên bởi kích thước khổng lồ của chúng."

Đề xuất: