Πίνακας περιεχομένων:

Πώς να φτιάξετε ένα αυτόνομο ρομπότ μπάσκετ χρησιμοποιώντας ένα IRobot Δημιουργήστε ως βάση: 7 βήματα (με εικόνες)
Πώς να φτιάξετε ένα αυτόνομο ρομπότ μπάσκετ χρησιμοποιώντας ένα IRobot Δημιουργήστε ως βάση: 7 βήματα (με εικόνες)

Βίντεο: Πώς να φτιάξετε ένα αυτόνομο ρομπότ μπάσκετ χρησιμοποιώντας ένα IRobot Δημιουργήστε ως βάση: 7 βήματα (με εικόνες)

Βίντεο: Πώς να φτιάξετε ένα αυτόνομο ρομπότ μπάσκετ χρησιμοποιώντας ένα IRobot Δημιουργήστε ως βάση: 7 βήματα (με εικόνες)
Βίντεο: The Third Industrial Revolution: A Radical New Sharing Economy 2024, Νοέμβριος
Anonim
Πώς να φτιάξετε ένα αυτόνομο μπάσκετ Παίζοντας ρομπότ χρησιμοποιώντας ένα IRobot Δημιουργήστε ως βάση
Πώς να φτιάξετε ένα αυτόνομο μπάσκετ Παίζοντας ρομπότ χρησιμοποιώντας ένα IRobot Δημιουργήστε ως βάση

Αυτή είναι η καταχώρισή μου για την πρόκληση iRobot Create. Το πιο δύσκολο μέρος ολόκληρης αυτής της διαδικασίας για μένα ήταν να αποφασίσω τι επρόκειτο να κάνει το ρομπότ. Wantedθελα να επιδείξω τα υπέροχα χαρακτηριστικά του Δημιουργία, προσθέτοντας παράλληλα και κάποια ρομπόρα. Όλες οι ιδέες μου φάνηκαν είτε να ανήκουν στην κατηγορία των βαρετών αλλά χρήσιμων, είτε δροσερών και μη πρακτικών. Στο τέλος κέρδισε ένα δροσερό και μη πρακτικό και γεννήθηκε το ρομπότ που έπαιζε μπάσκετ. Μετά από λίγη σκέψη συνειδητοποίησα ότι θα μπορούσε να είναι πρακτικό. Ας υποθέσουμε ότι χρησιμοποιείτε πορτοκαλί χαρτί και ότι όλοι οι κάδοι απορριμμάτων σας έχουν πράσινους πίνακες…

Βήμα 1: Ανταλλακτικά Aquire

Λόγω του χρονικού ορίου του διαγωνισμού, τα περισσότερα μέρη που χρησιμοποίησα ήταν "εκτός ράφι". Χρησιμοποιούνται μέρη ρομπότ "Stock": Δημιουργία (x1)-από iRobot www.irobot.comXBC V.3.0 (x1)-από Botball www.botball.orgCreate-Roomba καλώδιο (x1)-από Botball www.botball.orgServo (x2)-από Botball www.botball.orgSharp rangefinder (x1)-από Botball www.botball.org Ποικιλία από τούβλα LEGO-από LEGO www.lego.com 6-32 βίδες μηχανής (x4)-από McMaster www.mcmaster.com "Δημιουργήθηκε" Μέρη ρομπότ που χρησιμοποιήθηκαν: 3/8 "παχύ εξωθημένο φύλλο PVC - αυτά τα πράγματα είναι φοβερά, αλλά δεν μπορώ να θυμηθώ από πού το πήρα, αλλά είναι ακριβώς όπως αυτό το υλικό

Βήμα 2: Δημιουργήστε το Μοναδικό Μέρος

Δημιουργήστε το μοναδικό μέρος
Δημιουργήστε το μοναδικό μέρος

Το μόνο που έπρεπε να κατασκευάσω ήταν μια πλάκα που βιδώθηκε στο Δημιουργία και προσέφερε απόσταση LEGO. Το διάστημα των οπών από τούβλα LEGO απέχει 8mm, αλλά έκανα ένα διπλό διάστημα για να εξοικονομήσω χρόνο. Το εξωθημένο PVC είναι ένα αεράκι για εργασία. Μπορεί να κοπεί με ένα μαχαίρι χρησιμότητας, αλλά είναι άκαμπτο και ισχυρό. Συχνά παίρνω το ρομπότ από αυτό το πιάτο και δεν είχα πρόβλημα ακόμα.

Βήμα 1: Κόψτε το φύλλο σε 3,5 "x 9,5", μπορείτε να το κόψετε με ένα μαχαίρι χρησιμότητας. Βήμα 2: Τρυπήστε τις οπές για τις βίδες δημιουργίας. Οι βίδες δημιουργίας δημιουργούν ένα κουτί 2 και 5/8 "επί 8 και 5/8". Βήμα 3: Τρυπήστε τις τρύπες LEGO με απόσταση από τούβλα. Χρησιμοποιήστε ένα τρυπάνι 3/16 "και χώρισα τις τρύπες μεταξύ τους 16 mm. Συμβουλή: Τοποθέτησα το φύλλο σε ένα πρόγραμμα CAD, το εκτύπωσα σε πλήρες μέγεθος και το κόλλησα στο φύλλο. Στη συνέχεια το χρησιμοποίησα ως οδηγό για κοπή και γεώτρηση.

Βήμα 3: Συναρμολόγηση του ρομπότ

Συναρμολόγηση του ρομπότ
Συναρμολόγηση του ρομπότ
Συναρμολόγηση του ρομπότ
Συναρμολόγηση του ρομπότ
Συναρμολόγηση του ρομπότ
Συναρμολόγηση του ρομπότ

Μου αρέσει να χτίζω πράγματα όσο το δυνατόν πιο απλά, με αυτόν τον τρόπο όταν πηδούν από το τραπέζι δεν χρειάζεται να ξαναχτίσεις τόσο πολύ!

1. Βιδώστε το πιάτο που δημιουργήθηκε πρόσφατα στην κορυφή του Δημιουργία 2. Φτιάξτε ένα χέρι για να πιάσετε τη μπάλα 3. Φτιάξτε ένα χέρι για να κρατήσετε την κάμερα 4. Φτιάξτε μια βάση για το εύρος εύρους 5. Τοποθετήστε το XBC και συνδέστε όλα τα καλώδια

Βήμα 4: Προγραμματισμός του ρομπότ

Αποφάσισα να χρησιμοποιήσω το XBC ως χειριστήριο κυρίως λόγω της ενσωματωμένης παρακολούθησης χρωμάτων. Επειδή αποφάσισα να με το XBC ως τον εγκέφαλο της λειτουργίας προγραμματίσα το ρομπότ μου στο Interactive C, ή όπως το αποκαλώ IC. Το IC είναι δωρεάν για χρήση και μπορείτε να το κατεβάσετε στη διεύθυνση www.botball.org. Το IC είναι πολύ παρόμοιο με το C ++, αλλά έχει αρκετές ενσωματωμένες βιβλιοθήκες. Όπως αποδεικνύεται, ο David Miller από το Πανεπιστήμιο της Οκλαχόμα έχει γράψει μια βιβλιοθήκη για το Δημιουργία που μπορείτε να κατεβάσετε από τη σελίδα του στη διεύθυνση https://i-borg.engr.ou.edu/~dmiller/create/. Με αυτούς τους πόρους και τα εγχειρίδια για τη δημιουργία ήμουν έτοιμος να προγραμματίσω. Αλλά η επόμενη μεγάλη πρόκληση ήταν τι ήθελα να κάνει; Wantedθελα ένα ρομπότ που θα μπορούσε να πάει να πάρει πορτοκαλί μπάλες και να τις σκοράρει σε ένα καλάθι. Ο στόχος μου ακουγόταν απλός και πιθανώς θα μπορούσε να ήταν απλός, αλλά όσο περισσότερο έμπαινα σε αυτό που μπορούσε να κάνει το Δημιουργία, τόσο περισσότερο ήθελα να κάνει. Η τελική μου λίστα έμοιαζε με αυτό: 1. Βρείτε πορτοκαλί μπάλα 2. Πάρτε πορτοκαλί μπάλα 3. Εντοπίστε καλάθι 4. Βάλτε μπάλα στο καλάθι Ενώ 1. Αποφυγή αντικειμένων2. Να μην πέσει από τίποτα (σαν τραπέζι) 3. Ανίχνευση της φόρτισης της μπαταρίας και σύνδεση με τη βάση του σπιτιού όταν είναι χαμηλή, και όλα αυτά είναι εντελώς αυτόνομα, πράγμα που σημαίνει ότι είναι όλα προ -προγραμματισμένα.

Βήμα 5: Κωδικός

Μπορεί να είναι ακατάστατο, αλλά λειτουργεί.#Use "createlib.ic" #use "xbccamlib.ic" #define cam 0 // port servo camera#define arm 3 // arm servo port arm // et port/*Πρέπει επίσης να συνδεθεί το καλώδιο δημιουργίας. Η πρίζα τροφοδοσίας, το βύσμα 3 ακροδεκτών στη θύρα 8 και αυτό με την ένδειξη UX σε JP 28 (δίπλα στη θύρα USB) με το U προς την κάμερα*/ #define c_down 5 // camera servo down#define a_down 17 // arm servo down#define hold 50 // servo hold ball#define catch 27 // arm servo position για να μην πιάσουμε στο τραπέζι#define shoot 150 // servo ρίξτε μπάλα#καθορίστε track_c 25 // κάμερα servo track κλείσιμο θέσης#καθορίστε track_f 45 // camera servo track far position#define center 120 // center of camera vision#define inrange 30 // track_y συντονίστε όταν η μπάλα είναι στο νύχι#ορίστε μπάλα 0 // κανάλι πορτοκαλί μπάλας#καθορισμός μπάλας_χ (κομμάτι_χ (μπάλα, 0)) // x συντεταγμένη μπάλας#καθορισμός μπάλας_υ (διαδρομή_υ (μπάλα, 0)) // y συντεταγμένη μπάλας#καθορισμός αργής 100 // ταχύτητα αργής μοτέρ#καθορίστε γρήγορα 175 // ταχύτητα γρήγορου κινητήρα#καθορίστε διαυγή 0,2 // s πήδημα προς τα πίσω από εμπόδια#καθορισμός χρόνου 0.5 //1.0 είναι 90 μοίρες δεξιά στροφή#καθορισμός ανάπαυσης 0.05 // χρόνος για ύπνο κατά την παρακολούθηση των κηλίδων#καθορισμός ταχύτητας 175 πίσω από το χτυπημένο αντικείμενο#καθορίστε ευθεία 32767 // οδηγήστε σε ευθεία γραμμή#καθορίστε την πλάτη 2 // κανάλι του κύριου χρώματος του ταμπλό#καθορίστε το τετράγωνο 1 // κανάλι του χρώματος έμφασης του ταμπλό#καθορίστε track_d 250 // θέση κάμερας για τον εντοπισμό στόχου# καθορισμός track_find 70 // θέση κάμερας για παρακολούθηση μακράς διάρκειας#καθορισμός αντίστροφης 2.25 // χρόνος ύπνου για 180#καθορισμός back_f -150 // γρήγορη ταχύτητα πίσω#καθορισμός back_sl -125 // πίσω αργή ταχύτητα#καθορισμός center_x 178 // true x center του cam#define center_y 146 // true y κέντρο του camint pida; // αποφύγετε το processint pidb; // track processint pidb; // score processint have_ball = 0; // λέει ποια συνάρτηση είμαστε άκυροι main () {long ch; enable_servos (); // ενεργοποίηση servos init_camera (); // έναρξη σύνδεσης κάμερας (); // σύνδεση για δημιουργία με πλήρη έλεγχο start_a (); // έναρξη αποφυγής της λειτουργίας start_b (); // έναρξη λειτουργίας ball_tracking ενώ (1) {if (r_button () || gc_ldrop || gc_rdrop) {// αν σηκωθεί ή σκουπίσει το κουμπί ώμου (pida); σκοτώνω (pidb)? σκοτώσει (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)? σκοτώσει (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 ();}}} άκυρο αποφεύγετε () {ενώ (1) {// επαναλάβετε για πάντα create_sensor_update (); // ενημερώστε όλες τις τιμές αισθητήρων // create_drive (speeda, straight); εάν (gc_lbump == 1) {// αριστερό χτύπημα αποφεύγετε_δεξιά ();} // στρίβει δεξιά για να αποφύγετε αλλιώς εάν (gc_rbump == 1) {// δεξιό χτύπημα αποφευχθεί_αριστερά ();} // στρίβει αριστερά για να αποφύγετε διαφορετικά αν (gc_lfcliff == 1) {// αριστερός μπροστινός γκρεμός αποφεύγετε_δεξιά ();} αλλιώς εάν (gc_rfcliff == 1) {// δεξί μπροστινό γκρεμό αποφεύγετε_αριστερά ();} αλλιώς εάν (gc_lcliff == 1) {// αριστερός γκρεμός αποφεύγετε_δεξιά ();} else if (gc_rcliff == 1) {// δεξιός γκρεμός αποφεύγετε_αριστερά ();}}}} void track_ball () {kill (pidc); while (! have_ball) {// επαναλάβετε μέχρι να λάβετε την μπάλα track_update (); μακριά (); // ρυθμίζει την κάμερα έτοιμη (); // ορίζει το χέρι ενώ (et <255) {// έως ότου συμβεί η μέγιστη τιμή όταν η μπάλα πιάσει track_update (); // ενημερώστε την εικόνα της κάμερας εάν (ball_x <= (κέντρο-5)) {// αν η μπάλα παραμείνει track_update (); create_drive_direct (αργό, γρήγορο); // στρίψτε αριστερά στον ύπνο (ξεκούραση);} αλλιώς εάν (ball_x> = (κέντρο+5)) {// εάν η μπάλα είναι σωστή track_update (); create_drive_direct (γρήγορα, αργά); // στρίψτε δεξιά στον ύπνο (ξεκούραση);} αλλιώς εάν (ball_x (κέντρο-5)) {// εάν η μπάλα είναι κεντραρισμένη track_update (); create_drive_straight (γρήγορα); // πηγαίνετε για ύπνο (ξεκούραση);}} πιάστε (); // πιάστε μπιπ μπάλας (); // κάντε θόρυβο σταματήστε (); // σταματήστε να οδηγείτε have_ball = 1; // σημειώστε ότι Έχω μπάλα} start_c (); // βρίσκω τον ύπνο του καλαθιού (1.0); // κοιμάμαι έτσι ώστε να μην κάνω τίποτα όταν σκοτωθώ} void find_basket () {kill (pidb); // kill διαδικασία παρακολούθησης μπάλας εύρεση (); // βάλτε την κάμερα στο track_set_minarea (1000); // το ταμπλό είναι μεγάλο, οπότε αναζητήστε μόνο μεγάλες σταγόνες ενώ (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);} // στρίψτε αριστερά αλλού εάν (track_x (backb, 0) <= (center_x-20)) {// εάν ο πίνακας είναι σωστός track_update (); create_spin_CW (300-center_x);} // στρίψτε δεξιά επιβραδύνοντας όσο πλησιάζει το κέντρο} στάση (); while (track_size (backb, 0) <= (6000)) {// ενώ ο στόχος είναι μικρότερος από 6000 pixel σε μέγεθος 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 (γρήγορα); // κοιμηθείτε κατευθείαν (ξεκούραση);}} διακοπή (); // create_drive_straight (γρήγορα); // πλησιάστε λίγο //sleep(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 (); // back to sleep tracking sleep (1.0); // μην κάνεις τίποτα μέχρι να πεθάνει αυτή η διαδικασία} void cconnect () {create_connect ()? create_full (); // για πλήρη έλεγχο των αισθητήρων περβάζι create_power_led (0, 255);} // green power 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 rage () {set_servo_position (βραχίονας, πιασμένος);} void ρίψη () {int a; για (a = 50; a> = 30; a- = 1) {// ετοιμαστείτε set_servo_position (βραχίονας, α);} set_servo_position (βραχίονας, βολή);} void grab () {int a; για (a = 0; a <= κράτημα; a+= 1) {// σηκώστε ομαλά τον βραχίονα set_servo_position (βραχίονας, a);}} void down () {set_servo_position (cam, track_d);} void find () {set_servo_position (κάμερα, 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); ΔΗΜΙΟΥΡΓΙΑ_ΔΩΡΕΑΝ; // τελείωσα τη διακοπή ();} άκυρο αποφεύγω_αριστερά () {σκοτώσω (pidb); // σταματήσω όλα τα άλλα σκοτώστε (pidc), προεξοχή (); // μαζεύω το νύχι για να μην πιαστεί στο τραπέζι back_away (); // back away rotate_l (); // περιστρέφεται μακριά από το εμπόδιο έτοιμο (); // βάζει το νύχι πίσω αν (have_ball) {// αν έχω την μπάλα start_c ();} // ξεκινήστε την παρακολούθηση στόχων αλλιώς εάν (! have_ball) {// εάν δεν έχω τη μπάλα start_b ();} // ξεκινήστε την παρακολούθηση της μπάλας} void shmang_ δικαίωμα () {kill (pidb); σκοτώσει (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 = $ 260XBC κιτ εκκίνησης (xbc, cam, τούβλα LEGO, αισθητήρες) = $ 579PVC + χρώμα + βίδες = περίπου $ 20 Συνολικό κόστος = $ 859 Είχα ήδη το κιτ εκκίνησης XBC από το Botball, άρα το κόστος για μένα ήταν το κόστος της Δημιουργίας. Νομίζω ότι άξιζε τον κόπο και το καλύτερο είναι ότι όλα τα μέρη που χρησιμοποίησα είναι επαναχρησιμοποιήσιμα, αν μπορούσα να αποκτήσω τον εαυτό μου για να μοιραστώ αυτό το bot. Αυτό το βίντεο δείχνει την αποφυγή της υπο -ρουτίνας, σε ένα τραπέζι. Αυτό το βίντεο δείχνει το ρομπότ να σκοράρει 5 πορτοκαλί μπάλες σε ένα γκολ. Βοήθησα μόνο για να επιταχύνουμε τη διαδικασία, θα είχε βρει τη μπάλα 5 τελικά μόνο του.

Βήμα 7: Συμπέρασμα

Το τελικό αποτέλεσμα είναι ένα ρομπότ που μπορεί να μαζέψει και να σκοράρει πορτοκαλί μπάλες σε ένα γκολ μόνο του.

Μου άρεσε να δουλεύω σε αυτό το έργο. Όσο περισσότερο δούλευα σε αυτό το ρομπότ τόσο περισσότερο προσκολλήθηκα σε αυτό. Τώρα του μιλάω σαν να είναι κατοικίδιο. Ελπίζω ότι αυτό σας βοήθησε στο επόμενο έργο σας. Υπάρχουν πολλοί άνθρωποι που πρέπει να ευχαριστήσω, αλλά είναι πάρα πολλοί. Όπως ο Μπέρναρντ του Σαρτρ είπε τόσο κομψά: «είμαστε σαν νάνοι στους ώμους των γιγάντων, έτσι ώστε να βλέπουμε περισσότερα από αυτά, και τα πράγματα σε μεγαλύτερη απόσταση, όχι λόγω οποιασδήποτε οξύτητας στην όρασή μας, ή οποιασδήποτε φυσικής διάκριση, αλλά επειδή μας φέρνει ψηλά και μεγαλώνουμε από το γιγαντιαίο τους μέγεθος ».

Συνιστάται: