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

Garden Helper Roomba Bot: 8 Βήματα
Garden Helper Roomba Bot: 8 Βήματα

Βίντεο: Garden Helper Roomba Bot: 8 Βήματα

Βίντεο: Garden Helper Roomba Bot: 8 Βήματα
Βίντεο: You’re welcome 😚 #Roomba #maintenance 2024, Ιούλιος
Anonim
Garden Helper Roomba Bot
Garden Helper Roomba Bot

Kiara Myers, Ahmad Alghadeer και Madison Tippet

Σκοπός:

Αυτό θα σας διδάξει πώς να προγραμματίσετε ένα Roomba Bot, χρησιμοποιώντας το MATLAB, για να πλοηγηθείτε σε έναν κήπο, ανιχνεύοντας φρούτα/λαχανικά κυκλικού σχήματος που είναι αρκετά ώριμα για να συλλεχθούν με βάση το μέγεθός τους. Αυτό το ρομπότ σας στέλνει επίσης ένα μήνυμα ηλεκτρονικού ταχυδρομείου, προειδοποιώντας πόσα φρούτα είναι έτοιμα για συλλογή και το μονοπάτι στο οποίο ταξίδεψε.

Χαρακτηριστικά:

  • Χρησιμοποιεί αισθητήρες φωτός για τον εντοπισμό τοίχων και την ελαφρά στροφή για να αποφύγει το χτύπημα τους
  • Χρησιμοποιεί αισθητήρες χτυπήματος για να σπάσει το πρόγραμμα όταν χτυπήσει το βράχο στο τέλος του κήπου
  • Χρησιμοποιεί επεξεργασία εικόνας για να ανιχνεύσει έναν κύκλο στον κήπο και στη συνέχεια να καθορίσει την ακτίνα του
  • Χρησιμοποιεί αισθητήρες γκρεμού για να ανιχνεύσει μια έγχρωμη ταινία που υποδεικνύει την παρουσία ενός φρούτου

Βήμα 1: Υλικά και αναλώσιμα:

  • Ένα φορητό υπολογιστή
  • MATLAB 2017
  • Ηλεκτρική σκούπα Roomba
  • Raspberry Pi
  • Ξύλα
  • Λευκό χαρτί
  • Μαύρο Χαρτί
  • Έγχρωμη ταινία/λεπτή λωρίδα χρωματιστού χαρτιού
  • Μεγάλος Ροκ

Βήμα 2:

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

Συναρμολογώντας το δικό σας
Συναρμολογώντας το δικό σας
  1. Πάρτε το μαύρο χαρτί σας και κόψτε κύκλους διαφόρων μεγεθών
  2. Κολλήστε αυτούς τους μαύρους κύκλους σε ένα μεγάλο λευκό χαρτί

    Αυτή η αντίθεση θα είναι απαραίτητη κατά την ανίχνευση ενός φρούτου

  3. Χρησιμοποιήστε τα ξύλινα μπλοκ σας για να φτιάξετε ένα μονοπάτι κήπου που μοιάζει με λαβύρινθο για να πλοηγηθεί το ρομπότ σας

    Επιλέξαμε ένα μονοπάτι σε σχήμα U όπως φαίνεται παραπάνω

  4. Στο τέλος του κήπου σας προσθέστε έναν βράχο ή μια πόρτα ή ένα άλλο αντικείμενο για να γνωρίζει το ρομπότ σας ότι έχει γίνει
  5. Κολλήστε το λευκό σας χαρτί με τον κύκλο στους τοίχους του κήπου

    Χρησιμοποιήσαμε κουβάδες για να το κολλήσουμε γιατί οι τοίχοι μας ήταν πολύ κοντοί για την κάμερα

  6. Βάλτε έγχρωμη ταινία/λεπτή λωρίδα χρωματιστού χαρτιού στο έδαφος μπροστά από τα φρούτα

Βήμα 4: Γράφοντας τον Κώδικα

Περιήγηση στον Κήπο

Χρήση αισθητήρων χτυπήματος: Για την εκτέλεση του προγράμματος, τοποθετούμε την κωδικοποίηση σε μια δήλωση while που περιηγείται σε διάφορες προτάσεις if μέχρι να σπάσει ο κώδικας. Εάν χτυπηθεί οποιοσδήποτε από τους προφυλακτήρες, θα έχει ως αποτέλεσμα την τιμή τους να ισούται με αληθινή (η οποία στο Boolean είναι τιμή 1). Μια δήλωση if χρησιμοποιείται για να σπάσει τον κώδικα όταν μία από τις τιμές τους ισούται με 1.

Χρήση αισθητήρων Cliff: Μέσα στη δήλωση while, χρησιμοποιούμε μια εντολή if για να πούμε στο Roomba όταν έχει φτάσει στη θέση ενός εργοστασίου. Το Roomba ανιχνεύει την έγχρωμη ταινία στο πάτωμα εξετάζοντας το κατώφλι του κόκκινου που σηκώνουν οι αισθητήρες του γκρεμού. Εάν ο αριστερός ή ο δεξιός αισθητήρας γκρεμού εντοπίσει ένα χρώμα με μεγαλύτερο κατώφλι από αυτό του εδάφους, τότε θα σταματήσει το ρομπότ για 2 δευτερόλεπτα (χρησιμοποιώντας την εντολή παύσης). Σε αυτά τα 2 δευτερόλεπτα, το Roomba θα πάρει και θα εμφανίσει μια εικόνα του φρούτου. Χρησιμοποιώντας τα κυκλώματα imfindcircs που είναι ενσωματωμένα, ορίστε ένα εύρος για τις ακτίνες των κύκλων σας και το Roomba σας θα βρει τα λεγόμενα φρούτα σας.

Χρήση επεξεργασίας εικόνας: Εντός της εντολής if, ενσωματώνουμε μια άλλη δήλωση if που λέει: εάν η ακτίνα που ανιχνεύεται, η radii3, είναι μεγαλύτερη ή ίση με την ελάχιστη απαίτησή μας για ένα ώριμο φρούτο, r1 (εσείς το αποφασίζετε αυτό), στη συνέχεια μετρήστε και εμφανίστε το Roomba πόσα φρούτα είναι έτοιμα και γυρίστε για να συνεχίσετε στον κήπο. Αν όχι, η σειρά για να συνεχίσετε μέσα από τον κήπο. Σημείωση: ίσως χρειαστεί να ρυθμίσετε τη γωνία που στρίβετε επειδή κάθε Roomba είναι διαφορετική

Χρήση προφυλακτήρων φωτός: Σε μια άλλη δήλωση if, οι προφυλακτήρες φωτός αναλύονται για να είναι σίγουροι ότι κανένας από αυτούς δεν γίνεται μεγαλύτερος από το καθορισμένο κατώφλι μας. Εάν είτε ο αριστερός, ο δεξιός, ο αριστερός κέντρος, το δεξιό κέντρο, το αριστερό εμπρός, ή ο μπροστινός μπροστινός προφυλακτήρας φωτός υπερβεί το κατώφλι, τότε το Roomba θα στρίψει ελαφρώς στην κατάλληλη γωνία για να αποφύγει το χτύπημα σε έναν τοίχο. Ως εκ τούτου, περιήγηση στον λαβύρινθο.

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

Βήμα 5: Αντιγράψτε τον κώδικα

% Σκοπός: Με βάση τα μεγέθη τους, το roomba θα περάσει από έναν κήπο και θα ξεχωρίσει τα λαχανικά/φρούτα που είναι έτοιμα για παραλαβή. % Είσοδοι: Αισθητήρες Lightbump, Αισθητήρες Cliff, Αισθητήρες Bump, εικόνα από την κάμερα % Έξοδοι: Κάθε φορά που οι αισθητήρες φωτός είναι μεγαλύτεροι από το κατώφλι, το roomba θα γυρίζει και θα τραβάει μια εικόνα, θα ηχεί μπιπ εάν η ακτίνα % λαχανικών/φρούτων είναι μεταξύ συγκεκριμένου εύρους. Ο κώδικας σπάει όταν το roomba χτυπήσει σε % ένα αντικείμενο, στέλνει στον αστροναύτη ένα email για το πόσα φρούτα είναι έτοιμα να παραληφθούν % και μια χαρτογράφηση της κίνησης του roomba. % Χρήση: Εάν και ενώ δηλώσεις, σχεδιάζετε εντολές, κωδικό email από το MATLAB

k = 0

σύσπαση

timerVal = τικ

ενώ ισχύει

v = 0,2; % velocity r.setDriveVelocity (v, v);% roomba go forward L = r.getLightBumpers; LC = L.leftCenter; Rr = L. δεξιά; Lf = L.left; RC = L.rightCenter; LF = L.leftFront; RF = L.rightFront; Q = 75; % κατώτατο όριο. RTH = 30; %Υψηλό κόκκινο κατώφλι RTL = 10; %Χαμηλό κόκκινο κατώφλι B = r.getBumpers S = r.getCliffSensors; r1 = 24; r3 = 10; PL1 = 1800; εάν S.leftFront> PL1 || S.rightFront> PL1 % ανιχνεύει εάν το χρώμα στο έδαφος είναι πάνω από το όριο r.stop pause (2) elapsedTime = toc (timerVal-2) tic timerVal = tic % pause for 2 seconds img = r.getImage; %take image imshow (img)%display image [cent3, radii3] = imfindcircles (img, [30 50], 'ObjectPolarity', 'dark', 'Sensitivity', 0.9)? h = κύκλοι (κέντρα3, ακτίνες3). %αναζητήστε κύκλους ακτίνων w/σε καθορισμένο εύρος στην εικόνα εάν radii3> = r1 T = 1 k = k+1 dist1 = 0,2.*elapsedTime %Εάν η ακτίνα που ανιχνεύεται είναι μεγαλύτερη ή ίση με την ελάχιστη %απαίτηση ενός ώριμου φρούτου, τότε το Roomba μετράει αυτό το φρούτο

αν T == 1 r.setLEDDigits (num2str (k)) r.beep r.beep r.beep r.turnAngle (78) %Αν εντοπίστηκε ένα φρούτο, τότε εμφανίστε τον αριθμό στο Roomba, %κάνετε θόρυβο και γυρίστε elseif T == 2 r.turnAngle (78) %Αν ανιχνευτούν 2 φρούτα, τότε στρίψτε για να συνεχίσετε μέσω του %κήπου else r.turnAngle (78) %Εάν δεν ανιχνευθούν φρούτα, τότε στρίψτε για να συνεχίσετε μέσω του %τέλους του κήπου εάν LC> Q r.stop r.turnAngle (-7) elseif RC> Q r.stop r.turnAngle (7) elseif LF> Q r.stop r.turnAngle (-7) elseif RF> Q r.stop r turnAngle (7) elseif Lf> Q r.stop r.turnAngle (-7) elseif Rr> Q r.stop r.turnAngle (7) end %Αν κάποια από τις τιμές των προφυλακτήρων φωτός υπερβεί το κατώφλι, τότε %το Roomba θα στραφεί ελαφρώς προς την κατάλληλη κατεύθυνση για να αποφευχθεί το %να χτυπήσει σε έναν τοίχο

αν B.right == 1 || Β. Αριστερά == 1 || B.front == 1 dist3 = 0.2.*ElapsedTime r.stop r.beep ('F#*2, F#*2, c, F#*2, F#*2') r.turnAngle (360) %Εάν κάποιο από τα χτυπιούνται τα bumbers, τότε το roomba παίζει ήχο, γυρίζει γύρω, %και σπάει τον κωδικό

διάλειμμα τέλος

τέλος διασποράς (0.533, 0, '^') κρατήστε το scatter (0.533, dist1, '<') κρατήστε το scatter (-dist2, dist1, 'v') κρατήστε το scatter (-dist2, 0, 'd') saveas (gcf, 'Movement.png')

kmsg = num2str (k) mail = '[email protected]' password = 'Srsora123#' host = 'smtp.gmail.com' port = '465'

setpref ('Internet', 'E_mail', mail)? setpref ("Internet", "SMTP_Server", host) props = java.lang. System.getProperties; props.setProperty ('mail.smtp.user', mail)? props.setProperty ('mail.smtp.host', host); props.setProperty ('mail.smtp.port', port)? props.setProperty ('mail.smtp.starttls.enable', 'true'); props.setProperty ('mail.smtp.debug', 'true'); props.setProperty ('mail.smtp.auth', 'true'); props.setProperty ('mail.smtp.socketFactory.port', port)? props.setProperty ('mail.smtp.socketFactory.class', 'javax.net.ssl. SSLSocketFactory'); props.setProperty ("mail.smtp.socketFactory.fallback", "false"); sendmail (mail, 'Γεια αστροναύτη! Υπάρχουν τόσα πολλά φρούτα στον κήπο', kmsg, {'Movement.png'})

Συνιστάται: