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

Πώς να φτιάξετε ένα Robo-Bellhop: 3 βήματα
Πώς να φτιάξετε ένα Robo-Bellhop: 3 βήματα

Βίντεο: Πώς να φτιάξετε ένα Robo-Bellhop: 3 βήματα

Βίντεο: Πώς να φτιάξετε ένα Robo-Bellhop: 3 βήματα
Βίντεο: Karl Friston: The "Meta" Free Energy Principle [ΜΕΡΟΣ 1!] 2024, Νοέμβριος
Anonim

Ακολουθήστε περισσότερα από τον συγγραφέα:

Πώς να συμμετάσχετε στο μίνι διαγωνισμό iRobot Create Scholarship
Πώς να συμμετάσχετε στο μίνι διαγωνισμό iRobot Create Scholarship
Πώς να συμμετάσχετε στο μίνι διαγωνισμό iRobot Create Scholarship
Πώς να συμμετάσχετε στο μίνι διαγωνισμό iRobot Create Scholarship
Πώς να φτιάξετε LOLCats, Meme cats, Cat macros ή εικόνες γάτας με αστείες λεζάντες
Πώς να φτιάξετε LOLCats, Meme cats, Cat macros ή εικόνες γάτας με αστείες λεζάντες
Πώς να φτιάξετε LOLCats, Meme cats, Cat macros ή εικόνες γάτας με αστείες λεζάντες
Πώς να φτιάξετε LOLCats, Meme cats, Cat macros ή εικόνες γάτας με αστείες λεζάντες

Σχετικά: Μου αρέσει να διαχωρίζω τα πράγματα και να καταλαβαίνω πώς λειτουργούν. Γενικά χάνω το ενδιαφέρον μετά από αυτό. Περισσότερα για τον Jeffreyf »

Αυτό το Instructable δείχνει πώς να χρησιμοποιήσετε το iRobot Create για να δημιουργήσετε ένα κινούμενο καμπαναριό. Αυτό καταργήθηκε εξ ολοκλήρου με άδεια από τις οδηγίες του carolDancer και το έβαλα ως δείγμα συμμετοχής για τον διαγωνισμό μας. Το Robo-BellHop μπορεί να είναι ο προσωπικός σας βοηθός για να μεταφέρει τις τσάντες, τα είδη παντοπωλείου, τα πλυντήρια κ.λπ., οπότε δεν έχετε προς το. Η βασική δημιουργία έχει έναν κάδο προσαρτημένο στο επάνω μέρος και χρησιμοποιεί δύο ενσωματωμένους ανιχνευτές IR για να ακολουθήσει τον πομπό IR του κατόχου του. Με πολύ βασικό κωδικό λογισμικού C, ο χρήστης μπορεί να εξασφαλίσει βαριά είδη παντοπωλείου, ένα μεγάλο φορτίο ρούχων ή τη διανυκτέρευση της τσάντας σας στο Robo -BellHop και να σας ακολουθήσει το ρομπότ στο δρόμο, μέσω του εμπορικού κέντρου, στο διάδρομο ή στο αεροδρόμιο - - οπουδήποτε χρειάζεται να πάει ο χρήστης. Βασική λειτουργία 1) Πατήστε το κουμπί Επαναφορά για να ενεργοποιήσετε τη μονάδα εντολών και ελέγξτε την εμπλοκή των αισθητήρων1α) το LED αναπαραγωγής πρέπει να ανάψει όταν βλέπει τον πομπό IR να σας ακολουθεί Το ρομπότ βρίσκεται σε πολύ κοντινή απόσταση2) Πατήστε το μαύρο κουμπί για να εκτελέσετε τη ρουτίνα Robo-BellHop3) Συνδέστε τον πομπό IR στον αστράγαλο και βεβαιωθείτε ότι είναι ενεργοποιημένος. Στη συνέχεια, φορτώστε το καλάθι και πηγαίνετε! εύρος (με πολύ μεγάλη ή πολύ απότομη γωνία), το ρομπότ θα διανύσει μια μικρή απόσταση με αργή ταχύτητα σε περίπτωση που το σήμα επανέλθει ξανά4γ) Εάν το σήμα IR δεν ανιχνευθεί, το ρομπότ θα στρίψει αριστερά και δεξιά 4d) Εάν εντοπιστεί το σήμα IR, αλλά το ρομπότ χτυπήσει ένα εμπόδιο, το ρομπότ θα προσπαθήσει να οδηγήσει γύρω από το εμπόδιο4e) Εάν το ρομπότ πλησιάσει πολύ στο σήμα IR, το ρομπότ θα σταματήσει για να αποφύγει το χτύπημα αστράγαλοι ιδιοκτήτη Hardware1 iRobot εικονική μονάδα τοίχου - ανιχνευτής IR 301 $ από RadioShack - 31 $ DB -9 αρσενικός σύνδεσμος από Radio Shack - 44 $ 6-32 $ βίδες από Home Depot - 2,502 $ 3V μπαταρίες, χρησιμοποίησα καλάθι πλυντηρίου D1 από το Target - 51 $ επιπλέον τροχό για πίσω μέρος της δημιουργίας ρομπότ Ηλεκτρική ταινία, σύρμα και συγκόλληση

Βήμα 1: Κάλυψη του αισθητήρα IR

Συνδέστε την ηλεκτρική ταινία για να καλύψετε όλες εκτός από μια μικρή σχισμή του αισθητήρα IR στο μπροστινό μέρος του ρομπότ Δημιουργία. Αποσυναρμολογήστε την εικονική μονάδα τοίχου και αφαιρέστε την πλακέτα μικρού κυκλώματος στο μπροστινό μέρος της μονάδας. Αυτό είναι λίγο δύσκολο γιατί υπάρχουν πολλές κρυφές βίδες και πλαστικές βάσεις. Ο πομπός IR βρίσκεται στην πλακέτα κυκλώματος. Καλύψτε τον πομπό IR με ένα κομμάτι χαρτί για να αποφύγετε τις ανακλάσεις IR. Συνδέστε την πλακέτα σε ένα λουρί ή ελαστική ταινία που μπορεί να τυλιχτεί γύρω από τον αστράγαλο σας. Συνδέστε τις μπαταρίες στην πλακέτα, ώστε να έχετε τις μπαταρίες σε ένα άνετο μέρος (το έφτιαξα για να βάλω τις μπαταρίες στην τσέπη μου).

Συνδέστε τον 2ο ανιχνευτή υπέρυθρων ακροδεκτών στον σύνδεσμο DB-9 και τοποθετήστε τον στην καρφίτσα ePort Cargo Bay 3 (σήμα) και τον πείρο 5 (γείωση). Συνδέστε τον 2ο ανιχνευτή υπέρυθρων στην κορυφή του υπάρχοντος αισθητήρα υπέρυθρης ακτινοβολίας στο Δημιουργία και καλύψτε τον με δύο στρώσεις υφασμάτινου χαρτιού έως ότου ο δεύτερος ανιχνευτής υπέρυθρων ακτινοβολίας δεν βλέπει τον πομπό σε απόσταση που θέλετε να σταματήσει το ρομπότ Δημιουργία από το να σε χτυπήσει. Μπορείτε να το δοκιμάσετε αφού πατήσετε το κουμπί Επαναφορά και παρακολουθήσετε το LED Advance για να συνεχίσει όταν βρίσκεστε στην απόσταση στάσης.

Βήμα 2: Συνδέστε το καλάθι

Συνδέστε το καλάθι χρησιμοποιώντας τις βίδες 6-32. Μόλις τοποθέτησα το καλάθι στην κορυφή του ρομπότ Δημιουργία. Σύρετε επίσης στον πίσω τροχό, ώστε να τοποθετήσετε βάρος στο πίσω μέρος του ρομπότ Δημιουργία.

Σημειώσεις: - Το ρομπότ μπορεί να μεταφέρει αρκετό φορτίο, τουλάχιστον 30 κιλά. - Το μικρό μέγεθος φάνηκε να είναι το πιο δύσκολο μέρος για να το μεταφέρετε σε οποιαδήποτε αποσκευή - το IR είναι πολύ ιδιοσυγκρασιακό. Perhapsσως η χρήση απεικόνισης είναι καλύτερη, αλλά είναι πολύ πιο ακριβή

Βήμα 3: Κατεβάστε τον πηγαίο κώδικα

Κατεβάστε τον πηγαίο κώδικα
Κατεβάστε τον πηγαίο κώδικα

Ο πηγαίος κώδικας ακολουθεί και επισυνάπτεται σε ένα αρχείο κειμένου:

/********************************************* ******************** follow.c ** -------- ** τρέχει στο Create Command Module ** καλύπτει όλα τα μικρά ανοίγματα στο μπροστινό μέρος του αισθητήρα υπέρυθρης ακτινοβολίας ** Η δημιουργία θα ακολουθήσει έναν εικονικό τοίχο (ή οποιοδήποτε IR που στέλνει το ** σήμα πεδίου δύναμης) και ελπίζουμε να αποφύγει εμπόδια στη διαδικασία ****************** ********************************************** **/#include interrupt.h> #include io.h>#include#include "oi.h" #define TRUE 1#define FALSE 0#define FullSpeed 0x7FFF#define SlowSpeed 0x0100#define SearchSpeed 0x0100#define ExtraAngle 10#define SearchLeftAngle 125#define SearchRightAngle (SearchLeftAngle - 1000) #define CoastDistance 150#define TraceDistance 250#define TraceAngle 30#define BackDistance 25#define IRDetected (~ PINB & 0x01) // state#define Έτοιμο 0#καθορίστε 1#καθορίστε WasFollowing 2 #define SearchingLeft 3#define SearchingRight 4#define TracingLeft 5#define TracingRight 6#define BackingTraceLeft 7#define BackingTraceRight 8 // Global variablesv olatile uint16_t timer_cnt = 0; volatile uint8_t timer_on = 0; volatile uint8_t sensors_flag = 0; volatile uint8_t sensors_index = 0; volatile uint8_t sensors_in [Sen6Size]; volatile uint8_t αισθητήρες [απόσταση6 volatile uint8_t inRange = 0; // Functionsvoid byteTx (uint8_t value); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (unsigned int time_ms); void αρχική (void) void αρχική (void) void αρχικοποίηση (void) void void baud (uint8_t baud_code); void drive (int16_t velocity, int16_t radius); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// state variableuint8_t state = Ready; int found = 0; int wait_counter = 0; // Set up Create and moduleinitialize (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // set i/o for second IR sensorDDRB & = X 0x01; // ορίστε την καρφίτσα ePort 3 του φορτίου ως είσοδοPORTB | = 0x01; // set cargo ePort pin3 pullup enabled // program loop while (TRUE) {// Stop just as a preutionutiondrive (0, RadStraight); // set LEDsbyteTx (CmdLeds); byteTx ((((sensors [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (αισθητήρες [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // ψάχνοντας για κουμπί χρήστη, ελέγξτε oftendelayAndUpdateSensors (10); (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // ενεργό loop while (! (UserButtonPressed) && (! Αισθητήρες [SenCliffL]) && (! Αισθητήρες [SenCliffFL]) && (! Αισθητήρες [SenCliffFR]) && (! αισθητήρες [SenCliffR])) {byteTx (CmdLeds); byteTx (((αισθητήρες [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (αισθητήρες [SenCharge1]); byteTx (255) IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; διακόπτης (κατάσταση) {περίπτωση Έτοιμο: if (αισθητήρες [SenVWall]) {// έλεγχος για εγγύτητα σε Leaderif (inRange) {μονάδα δίσκου (0, RadStraight);} άλλο {// drive straightdrive (SlowSpeed, RadStraight); state = Following;}} else {// search for the beamangle = 0; distance = 0; wait_counter = 0; found = FALSE; drive (SearchSpeed, RadCCW); state = SearchingLeft;} break; case following: if (αισθητήρες [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); κατάσταση = BackingTraceLeft;} άλλο εάν (αισθητήρες [SenBumpDrop] & BumpLeft) {απόσταση = 0; γωνία = 0; κίνηση (-SlowSpeed, RadStraight); κατάσταση = BackingTraceRight;} αλλιώς εάν (αισθητήρες [SenVWall]) {// ελέγξτε για γειτνίαση με leaderif (inRange) {μονάδα δίσκου (0, RadStraight); κατάσταση = Έτοιμο;} else {// drive straightdrive (FullSpeed, RadStraight); state = Following;}} else {// μόλις έχασε το σήμα, συνέχισε αργά ένα cycledistance = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} break; case WasFollowing: if (αισθητήρες [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); κατάσταση = BackingTraceLeft;} else if (αισθητήρες [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (αισθητήρες [SenVWall]) {// ελέγξτε την εγγύτητα στο leaderif (inRange) {μονάδα δίσκου (0, RadStraight); κατάσταση = R eady;} else {// drive straightdrive (FullSpeed, RadStraight); state = Following;}} else if (distance> = CoastDistance) {drive (0, RadStraight); state = Ready;} else {drive (SlowSpeed, RadStraight);} break; case SearchingLeft: if (found) {if (angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); state = Following;} else {drive (SearchSpeed, RadCCW);}} else if (αισθητήρες [SenVWall]) {found = TRUE; angle = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {drive (SearchSpeed, RadCCW);}} else if (angle> = SearchLeftAngle) {drive (SearchSpeed, RadCW); wait_counter = 0; state = SearchingRight;} else {drive (SearchSpeed, RadCCW);} break; case SearchingRight: if (found) {if (-angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); κατάσταση = Παρακολούθηση;} else {drive (SearchSpeed, RadCW);}} else if (αισθητήρες [SenVWall]) {found = TRUE; angle = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {drive (SearchSpeed, RadCCW);}} else if (wait_counter> 0) {wait_counter -= 20; drive (0, RadStraight);} else if (angle = Search RightAngle) {drive (0, RadStraight); wait_counter = 5000; angle = 0;} else {drive (SearchSpeed, RadCW);} break; case TracingLeft: if (αισθητήρες [SenBumpDrop] & BumpRight) {απόσταση = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} αλλιώς εάν (αισθητήρες [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} else if (αισθητήρες [SenVWall]) {// έλεγχος για γειτνίαση με Leaderif (inRange) {μονάδα δίσκου (0, RadStraight); κατάσταση = Έτοιμο;} else {// drive straightdrive (SlowSpeed, RadStraight); κατάσταση = Ακολουθώντας;}} αλλού εάν (! (απόσταση> = TraceDistance)) { drive (SlowSpeed, RadStraight);} αλλιώς αν (! (-angle> = TraceAngle)) {drive (SearchSpeed, RadCW);} else {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = Ready; } break; case TracingRight: if (αισθητήρες [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} else if (αισθητήρες [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (- SlowSpeed, RadStraight); state = BackingTraceRight;} αλλιώς εάν (αισθητήρες [SenVWall]) {// ελέγξτε την εγγύτητα στο leaderif (inRang ε) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Following;}} else if (! (distance> = TraceDistance)) {drive (SlowSpeed, RadStraight);} else if (! (angle> = TraceAngle)) {drive (SearchSpeed, RadCCW);} else {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = Ready;} break; case BackingTraceLeft: if (αισθητήρες [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} else if (angle> = TraceAngle) {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = TracingLeft; } else if (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (αισθητήρες [SenVWall] && inRange) {μονάδα δίσκου (0, RadStraight); κατάσταση = Έτοιμο;} αλλιώς αν (-ango> = TraceAngle) {απόσταση = 0; γωνία = 0; μονάδα δίσκου (SlowSpeed, RadStraight); κατάσταση = TracingRight;} αλλιώς εάν (-distance> = BackDistance) {drive (SearchSpeed, RadCW);} else {drive (-SlowSpeed, RadStraight);} break; προεπιλογή: // stopdrive (0, RadStraight); κατάσταση = Re ady; break;} delayAndCheckIR (10); delayAndUpdateSensors (10);} // εντοπίστηκε γκρεμός ή κουμπί χρήστη, επιτρέπουν τη σταθεροποίηση της κατάστασης (π.χ., απελευθέρωση κουμπιού) μονάδας δίσκου (0, RadStraight); delayAndUpdateSensors (2000);}}} // Διακοπή σειριακής λήψης για αποθήκευση τιμών αισθητήρων σε χρονικές καθυστερήσεις στο msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Μεταδώστε ένα byte πάνω από το σειριακό portvoid byteTx (τιμή uint8_t) {ενώ (! (UCSR0A & _BV) (UDRE0) UDR0 = τιμή;} // Καθυστέρηση για τον καθορισμένο χρόνο σε ms χωρίς ενημέρωση των τιμών του αισθητήρα αποφυγή καθυστέρησηςMs (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // Καθυστέρηση για τον καθορισμένο χρόνο σε ms και έλεγχος Ανιχνευτής IR αποφεύγει την καθυστέρησηAndCheckIR (uint16_t time_ms) {uint8_t timer_val = 0; inRange = 0; timer_on = 1; timer_cnt = time_ms; while (timer_on) {if (! (Timer_val == timer_cnt)) {inRange + = IRDetected; timer_val = timer_cnt;}} inRange = (inRange> = (time_ms >> 1));} // Καθυστέρηση για τον καθορισμένο χρόνο σε ms και ενημέρωση τιμών αισθητήρωνvoid delayAndUpdateSensors (uint16_t time_ms) {uint8_t temp; timer_on = 1; timer_cnt = time_ms; while (timer_on) {if (! sensors_flag) {for (temp = 0; temp Sen6Size; temp ++) αισθητήρες [temp] = αισθητήρες_σε [temp]; // Ενημέρωση συνόλων λειτουργίας απόστασης και γωνίας += (int) ((αισθητήρες [SenDist1] 8) | αισθητήρες [SenDist0]); γωνία += (int) ((αισθητήρες [SenAng1] 8) | αισθητήρες [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}} // Initialize the Mind Control & aposs ATmega168 microcontrollervoid initialize (void) {cli (); // Ορίστε ακίδες εισόδου/εξόδουDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Ρυθμίστε το χρονόμετρο 1 για να δημιουργείτε μια διακοπή κάθε 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Ρύθμιση της σειριακής θύρας με διακοπή rxUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0 U) ! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Καθυστέρηση σε αυτήν την κατάστασηRobotPwrToggleHigh; // Χαμηλή σε υψηλή μετάβαση στην εναλλαγή powerdelayMs (100). // Καθυστέρηση σε αυτήν την κατάστασηRobotPwrToggleLow;} delayMs (3500); // Καθυστέρηση εκκίνησης}} // Εναλλαγή του ρυθμού baud τόσο στη δημιουργία όσο και στο modulevoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Περιμένετε έως ότου ολοκληρωθεί η μετάδοση (! (UCSR0A & _BV (TXC0))); cli (); // Αλλάξτε τον καταχωρητή ταχύτητας baud; αλλιώς εάν (baud_code == Baud38400) UBRR0 = Ubrr38400; αλλιώς εάν (baud_code == Baud28800) UBRR0 = Ubrr28800; αλλιώς εάν (baud_code == Baud19200) UBRR0 = Ubrr19200; αλλιώς αν (baud_code = Uudr1400 = Ubr0400 = if (baud_code == Baud9600) UBRR0 = Ubrr9600; αλλιώς αν (baud_code == Baud4800) UBRR0 = Ubrr4800; αλλιώς εάν (baud_code == Baud2400) UBRR0 = Ubrr2400; αλλιώς αν (baud_code == Baud1200; else) baud_code == Baud600) UBRR0 = Ubrr600; αλλιώς αν (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Αποστολή Δημιουργία εντολών μονάδας δίσκου όσον αφορά την ταχύτητα και την ακτινοβολία (int16_t ταχύτητα, int16_t ακτίνα) {byteTx (CmdDrive); byteTx ((uint 8_t) ((ταχύτητα >> 8) & 0x00FF)); byteTx ((uint8_t) (ταχύτητα & 0x00FF)); byteTx ((uint8_t) ((ακτίνα >> 8) & 0x00FF)); byteTx ((uint8_t) (ακτίνα & 0x00FF));}

Συνιστάται: