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

The Butter Robot: The Arduino Robot With Existential Crisis: 6 βήματα (με εικόνες)
The Butter Robot: The Arduino Robot With Existential Crisis: 6 βήματα (με εικόνες)

Βίντεο: The Butter Robot: The Arduino Robot With Existential Crisis: 6 βήματα (με εικόνες)

Βίντεο: The Butter Robot: The Arduino Robot With Existential Crisis: 6 βήματα (με εικόνες)
Βίντεο: Butbot - The arduino butter robot 2024, Ιούλιος
Anonim
Image
Image

Αυτό το έργο βασίζεται στη σειρά κινουμένων σχεδίων "Rick and Morty". Σε ένα από τα επεισόδια, ο Ρικ φτιάχνει ένα ρομπότ του οποίου ο μοναδικός σκοπός είναι να φέρει βούτυρο. Ως φοιτητές από το Bruface (Σχολή Μηχανικών των Βρυξελλών) έχουμε μια εργασία για το έργο μηχατρονικής, η οποία είναι η κατασκευή ενός ρομπότ με βάση ένα προτεινόμενο θέμα. Η εργασία για αυτό το έργο είναι: Φτιάξτε ένα ρομπότ που σερβίρει μόνο βούτυρο. Μπορεί να έχει μια υπαρξιακή κρίση. Φυσικά το ρομπότ στο επεισόδιο του Rick and Morty είναι ένα αρκετά περίπλοκο ρομπότ και πρέπει να γίνουν κάποιες απλοποιήσεις:

Δεδομένου ότι ο μοναδικός σκοπός του είναι να φέρει βούτυρο, υπάρχουν πιο απλές εναλλακτικές λύσεις. Αντί να κάνει το ρομπότ να φαίνεται και να πιάνει το βούτυρο, πριν το φέρει στο σωστό άτομο, το ρομπότ μπορεί να μεταφέρει το βούτυρο όλη την ώρα. Η κύρια ιδέα είναι λοιπόν να φτιάξετε ένα κάρο που μεταφέρει το βούτυρο εκεί που πρέπει.

Εκτός από τη μεταφορά του βουτύρου, το ρομπότ πρέπει να γνωρίζει πού πρέπει να φέρει το βούτυρο. Στο επεισόδιο, ο Rick χρησιμοποιεί τη φωνή του για να καλέσει και να δώσει εντολή στο ρομπότ. Αυτό απαιτεί ένα ακριβό σύστημα αναγνώρισης φωνής και θα ήταν πολύπλοκο. Αντ 'αυτού, όλοι στο τραπέζι παίρνουν ένα κουμπί: μόλις ενεργοποιηθεί αυτό το κουμπί, το ρομπότ μπορεί να εντοπίσει αυτό το κουμπί και να κινηθεί προς αυτό.

Για να επαναλάβουμε, το ρομπότ πρέπει να πληροί τις ακόλουθες απαιτήσεις:

  • Πρέπει να είναι ασφαλές: πρέπει να αποφεύγει τα εμπόδια και να αποτρέπει την πτώση του τραπεζιού.
  • Το ρομπότ πρέπει να είναι μικρό: ο χώρος στο τραπέζι είναι περιορισμένος και κανείς δεν θα ήθελε ένα ρομπότ που σερβίρει βούτυρο αλλά έχει το μισό μέγεθος του ίδιου του τραπεζιού.
  • Η λειτουργία του ρομπότ δεν μπορεί να εξαρτάται από το μέγεθος ή το σχήμα του τραπεζιού, με αυτόν τον τρόπο μπορεί να χρησιμοποιηθεί σε διαφορετικούς πίνακες.
  • Πρέπει να φέρει το βούτυρο στο σωστό άτομο στο τραπέζι.

Βήμα 1: Κύρια έννοια

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

Για να εκπληρώσει το καθήκον του, το ρομπότ πρέπει να κινηθεί μέχρι να φτάσει στον προορισμό. Λαμβάνοντας υπόψη την εφαρμογή του ρομπότ, είναι απλό ότι η χρήση τροχών αντί για "περπατητική" κίνηση είναι καλύτερο να το κάνετε να κινείται. Δεδομένου ότι ένα τραπέζι είναι μια επίπεδη επιφάνεια και το ρομπότ δεν θα φτάσει σε πολύ υψηλές ταχύτητες, δύο τροχοί που ενεργοποιούνται και μία μπάλα είναι η απλούστερη και πιο εύκολη λύση. Οι ενεργοποιημένοι τροχοί πρέπει να τροφοδοτούνται από δύο κινητήρες. Οι κινητήρες πρέπει να έχουν μεγάλη ροπή αλλά δεν χρειάζεται να φτάσουν σε υψηλή ταχύτητα, γι 'αυτό θα χρησιμοποιηθούν συνεχείς σερβοκινητήρες. Ένα άλλο πλεονέκτημα των σερβοκινητήρων είναι η απλότητα χρήσης με ένα Arduino.

Η ανίχνευση των εμποδίων μπορεί να γίνει χρησιμοποιώντας έναν υπερηχητικό αισθητήρα που μετρά την απόσταση, προσαρτημένο σε σερβοκινητήρα για να επιλέξετε την κατεύθυνση της μέτρησης. Τα άκρα μπορούν να ανιχνευθούν χρησιμοποιώντας αισθητήρες LDR. Η χρήση αισθητήρων LDR θα απαιτήσει την κατασκευή μιας συσκευής που θα περιέχει και led led και αισθητήρα LDR. Ένας αισθητήρας LDR μετρά το ανακλώμενο φως και μπορεί να θεωρηθεί ως ένα είδος αισθητήρα απόστασης. Η ίδια αρχή ισχύει και για το υπέρυθρο φως. Υπάρχουν μερικοί αισθητήρες εγγύτητας υπέρυθρων που έχουν ψηφιακή έξοδο: κλείσιμο ή όχι. Αυτό ακριβώς χρειάζεται το ρομπότ για να εντοπίσει τις άκρες. Συνδυάζοντας 2 αισθητήρες ακμής τοποθετημένους όπως δύο κεραίες εντόμων και έναν ενεργοποιημένο αισθητήρα υπερήχων, το ρομπότ θα πρέπει να μπορεί να αποφεύγει εμπόδια και άκρα.

Η ανίχνευση κουμπιού μπορεί επίσης να επιτευχθεί χρησιμοποιώντας αισθητήρες IR και led. Το πλεονέκτημα του IR είναι ότι είναι αόρατο, γεγονός που καθιστά τη χρήση του ενοχλητική για τους ανθρώπους στο τραπέζι. Θα μπορούσαν επίσης να χρησιμοποιηθούν λέιζερ, αλλά τότε το φως θα ήταν ορατό και επίσης επικίνδυνο όταν κάποιος στρέφει το λέιζερ στο μάτι άλλου ατόμου. Επίσης, ο χρήστης θα χρειαστεί να στοχεύσει τους αισθητήρες στο ρομπότ μόνο με μια λεπτή δέσμη λέιζερ, κάτι που θα ήταν αρκετά ενοχλητικό. Εξοπλίζοντας το ρομπότ με δύο αισθητήρες IR και κατασκευάζοντας το κουμπί με led IR, το ρομπότ γνωρίζει ποια κατεύθυνση πρέπει να ακολουθήσει ακολουθώντας την ένταση του φωτός IR. Όταν δεν υπάρχει κουμπί, το ρομπότ μπορεί να γυρίσει μέχρι το ένα από τα led να τραβήξει το σήμα από ένα από τα κουμπιά.

Το βούτυρο τοποθετείται σε ένα διαμέρισμα στην κορυφή του ρομπότ. Αυτό το διαμέρισμα μπορεί να αποτελείται από ένα κουτί και ένα ενεργοποιημένο καπάκι για να ανοίξει το κουτί. Για να ανοίξουμε το καπάκι και να κινήσουμε τον αισθητήρα υπερήχων για να σαρώσουμε και να ανιχνεύσουμε τα εμπόδια χρειαζόμαστε δύο κινητήρες και για το σκοπό αυτό, οι μη συνεχείς σερβοκινητήρες είναι πιο προσαρμοσμένοι επειδή οι κινητήρες πρέπει να πηγαίνουν σε μια συγκεκριμένη θέση και να διατηρούν αυτή τη θέση.

Ένα επιπλέον χαρακτηριστικό του έργου ήταν η αλληλεπίδραση με το εξωτερικό περιβάλλον με φωνή ρομπότ. Ο βομβητής είναι απλός και προσαρμοσμένος για αυτόν τον σκοπό, αλλά δεν μπορεί να χρησιμοποιηθεί ανά πάσα στιγμή, επειδή η κλήρωση είναι υψηλή.

Οι κύριες δυσκολίες του έργου βασίζονται στην κωδικοποίηση, καθώς το μηχανικό μέρος είναι αρκετά απλό. Πολλές περιπτώσεις πρέπει να ληφθούν υπόψη για να αποφευχθεί το κολλημένο ρομπότ ή να κάνει κάτι ανεπιθύμητο. Τα κύρια προβλήματα που πρέπει να λύσουμε είναι να χάσουμε το σήμα IR λόγω ενός εμποδίου και να σταματήσουμε όταν φτάσει στο κουμπί!

Βήμα 2: Υλικά

Μηχανικά μέρη

  • Τρισδιάστατος εκτυπωτής και μηχανή κοπής λέιζερ

    • Το PLA θα χρησιμοποιηθεί για τρισδιάστατη εκτύπωση, αλλά μπορείτε επίσης να χρησιμοποιήσετε ABS
    • Μια πλάκα από κόντρα πλακέ σημύδας 3 mm θα χρησιμοποιηθεί για κοπή με λέιζερ καθώς δίνει τη δυνατότητα να κάνετε τροποποιήσεις αργότερα εύκολα, μπορεί να χρησιμοποιηθεί και πλεξιγκλάς, αλλά είναι πιο δύσκολο να το τροποποιήσετε μόλις κοπεί με λέιζερ χωρίς να το καταστρέψετε
  • Βίδες, παξιμάδια, ροδέλες

    Τα περισσότερα από τα εξαρτήματα συγκρατούνται χρησιμοποιώντας μπουλόνια, ροδέλες και παξιμάδια M3, αλλά μερικά από αυτά απαιτούν σετ μπουλονιών M2 ή M4. Το μήκος των μπουλονιών κυμαίνεται από 8-12 mm

  • Αποστάτες PCB, 25 mm και 15 mm
  • 2 σερβοκινητήρες με συμβατούς τροχούς
  • Κάποιο χοντρό μεταλλικό σύρμα διαμέτρου 1-2 mm

Ηλεκτρονικά μέρη

  • Μικροελεγκτής

    1 πίνακας arduino UNO

  • Σερβοκινητήρες

    • 2 μεγάλοι σερβοκινητήρες: Feetech συνεχούς 6Kg 360 μοίρες
    • 2 μικρο σερβοκινητήρες: Feetech FS90
  • Αισθητήρες

    • 1 Αισθητήρας υπερήχων
    • 2 αισθητήρες εγγύτητας IR
    • 2 φωτοδιόδους IR
  • Μπαταρίες

    • 1 υποδοχή μπαταρίας 9V + μπαταρία
    • 1 υποδοχή μπαταρίας 4AA + μπαταρίες
    • 1 κουτί μπαταρίας 9V + μπαταρία
  • Πρόσθετα συστατικά

    • Μερικά καλώδια, σύρματα και πλάκες συγκόλλησης
    • Κάποιες αντιστάσεις
    • 1 LED IR
    • 3 διακόπτες
    • 1 βομβητής
    • 1 κουμπί
    • 1 υποδοχή μπαταρίας Arduino σε 9V

Βήμα 3: Δοκιμή των Ηλεκτρονικών

Δοκιμή Ηλεκτρονικών
Δοκιμή Ηλεκτρονικών
Δοκιμή Ηλεκτρονικών
Δοκιμή Ηλεκτρονικών

Δημιουργία του κουμπιού:

Το κουμπί είναι απλώς κατασκευασμένο από έναν διακόπτη, μια υπέρυθρη λυχνία LED και μια αντίσταση 220 Ohm σε σειρά, που τροφοδοτείται από μια μπαταρία 9V. Τοποθετείται σε μπαταρία 9V για συμπαγή και καθαρό σχεδιασμό.

Δημιουργία μονάδων δέκτη υπερύθρων:

Αυτές οι μονάδες κατασκευάζονται με πλάκες συγκόλλησης μέσω οπών, οι οποίες αργότερα θα προσαρτηθούν με βίδες στο ρομπότ. Τα κυκλώματα για αυτές τις ενότητες απεικονίζονται στα γενικά σχήματα. Η αρχή είναι η μέτρηση της έντασης του υπέρυθρου φωτός. Για τη βελτίωση των μετρήσεων, μπορούν να χρησιμοποιηθούν συσκευές συγκέντρωσης (κατασκευασμένες με σωλήνες συρρίκνωσης) για να εστιάσουν σε μια συγκεκριμένη κατεύθυνση ενδιαφέροντος.

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

  • Συνεχείς σερβοκινητήρες.
  • Αισθητήρας υπερήχων.
  • Μη συνεχείς σερβοκινητήρες.
  • Βομβητής;
  • Ανίχνευση κατεύθυνσης κουμπιού IR.
  • Ανίχνευση άκρων από αισθητήρες εγγύτητας.

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

Βήμα 4: Σχεδιασμός τρισδιάστατων εκτυπωμένων και κομμένων κομματιών με λέιζερ

Τρισδιάστατη εκτύπωση και σχέδιο κοπής με λέιζερ
Τρισδιάστατη εκτύπωση και σχέδιο κοπής με λέιζερ
Τρισδιάστατη εκτύπωση και σχέδιο κοπής με λέιζερ
Τρισδιάστατη εκτύπωση και σχέδιο κοπής με λέιζερ
Τρισδιάστατη εκτύπωση και σχέδιο κοπής με λέιζερ
Τρισδιάστατη εκτύπωση και σχέδιο κοπής με λέιζερ

Τεμάχια Laser Cut

Το συγκρότημα αποτελείται από τρεις κύριες οριζόντιες πλάκες που συγκρατούνται μεταξύ τους με αποστάτες PCB για να αποκτήσουν ένα ανοιχτό σχέδιο που παρέχει εύκολη πρόσβαση στα ηλεκτρονικά αν χρειαστεί.

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

Μικρότερα κομμάτια κόβονται στις διαστάσεις του μεγάλου σερβο για να τα στερεώσουν στο συγκρότημα.

Τρισδιάστατα τυπωμένα κομμάτια

Εκτός από την κοπή με λέιζερ, ορισμένα κομμάτια θα πρέπει να εκτυπωθούν 3D:

  • Η υποστήριξη για τον υπερηχητικό αισθητήρα, ο οποίος τον συνδέει με έναν βραχίονα μικρο σερβοκινητήρα
  • Η υποστήριξη για τον τροχό τροχού και τους δύο αισθητήρες ακρών IR. Ο ιδιαίτερος σχεδιασμός του είδους των άκρων του τεμαχίου σε σχήμα κουτιού για τους αισθητήρες IR λειτουργεί ως οθόνη για να αποφευχθούν παρεμβολές μεταξύ του κουμπιού που εκπέμπει σήμα IR και των αισθητήρων IR που πρέπει να εστιάσουν σε αυτό που συμβαίνει μόνο στο έδαφος
  • Το στήριγμα για τον μικρο σερβοκινητήρα που ανοίγει το καπάκι
  • Και τέλος το ίδιο το καπάκι, κατασκευασμένο από δύο κομμάτια για να έχει μεγαλύτερη γωνία λειτουργίας αποφεύγοντας τη σύγκρουση με τον μικρο σερβοκινητήρα που ανοίγει το καπάκι:

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

Μόλις όλα τα κομμάτια έχουν σχεδιαστεί και τα αρχεία εξάγονται στη σωστή μορφή για τις μηχανές που χρησιμοποιούνται, τα κομμάτια μπορούν πραγματικά να κατασκευαστούν. Λάβετε υπόψη ότι η τρισδιάστατη εκτύπωση απαιτεί πολύ χρόνο, ειδικά με τις διαστάσεις του επάνω τμήματος του καπακιού. Μπορεί να χρειαστείτε μία ή δύο ημέρες για να εκτυπώσετε όλα τα κομμάτια. Ωστόσο, η κοπή με λέιζερ είναι θέμα λεπτών.

Όλα τα αρχεία SOLIDWORKS μπορούν να βρεθούν στο φάκελο με φερμουάρ.

Βήμα 5: Συναρμολόγηση και καλωδίωση

Image
Image
Συναρμολόγηση και καλωδίωση
Συναρμολόγηση και καλωδίωση
Συναρμολόγηση και καλωδίωση
Συναρμολόγηση και καλωδίωση
Συναρμολόγηση και καλωδίωση
Συναρμολόγηση και καλωδίωση

Το συγκρότημα θα είναι ένα μείγμα καλωδίωσης και βιδώματος των εξαρτημάτων μεταξύ τους, ξεκινώντας από κάτω προς τα πάνω.

Κάτω πιάτο

Η κάτω πλάκα είναι συναρμολογημένη με τη μπαταρία 4AA, τους σερβοκινητήρες, το τυπωμένο μέρος (που συνδέει το κάδο κάτω από την πλάκα), τους δύο αισθητήρες άκρων και 6 αποστάτες αρσενικών-θηλυκών.

Μεσαίο πιάτο

Στη συνέχεια, η μεσαία πλάκα μπορεί να τοποθετηθεί, συμπιέζοντας τους σερβοκινητήρες μεταξύ των δύο πλακών. Αυτή η πλάκα μπορεί στη συνέχεια να στερεωθεί βάζοντας ένα άλλο σετ αποστάσεων πάνω της. Ορισμένα καλώδια μπορούν να περάσουν από την κεντρική τρύπα.

Η μονάδα υπερήχων μπορεί να συνδεθεί σε ένα μη συνεχές σερβο, το οποίο είναι στερεωμένο στη μεσαία πλάκα με το Arduino, το πακέτο μπαταριών 9V (τροφοδοτεί το arduino) και τις δύο μονάδες δέκτη υπερύθρων στο μπροστινό μέρος του ρομπότ. Αυτές οι μονάδες κατασκευάζονται με πλάκες συγκόλλησης μέσω οπών και συνδέονται με βίδες στην πλάκα. Τα κυκλώματα για αυτές τις ενότητες απεικονίζονται στα γενικά σχήματα.

Πάνω πιάτο

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

Όταν επιτευχθούν όλα αυτά, η επάνω πλάκα μπορεί να στερεωθεί με αποστάτες. Τα τελευταία εξαρτήματα που είναι οι δύο διακόπτες, το κουμπί, το σερβο, το βομβητή και το σύστημα καπακιού μπορούν τελικά να στερεωθούν στην επάνω πλάκα για να τελειώσουν τη συναρμολόγηση.

Το τελευταίο πράγμα που πρέπει να δοκιμάσετε και να διορθώσετε είναι η γωνία του σερβο για να ανοίξει σωστά το καπάκι.

Το κατώφλι των αισθητήρων ακμής πρέπει να προσαρμοστεί με το παρεχόμενο ποτενσιόμετρο (χρησιμοποιώντας ένα επίπεδο κατσαβίδι) για διαφορετικές επιφάνειες τραπεζιού. Ένα λευκό τραπέζι πρέπει να έχει χαμηλότερο όριο από ένα καφέ τραπέζι για παράδειγμα. Επίσης το ύψος των αισθητήρων θα επηρεάσει το απαιτούμενο όριο.

Στο τέλος αυτού του βήματος, η συναρμολόγηση τελειώνει και το τελευταίο μέρος που απομένει είναι οι κωδικοί που λείπουν.

Βήμα 6: Κωδικοποίηση: Τοποθέτηση όλων μαζί

Όλος ο απαραίτητος κώδικας για να λειτουργήσει το ρομπότ βρίσκεται στο συμπιεσμένο αρχείο που μπορείτε να κατεβάσετε. Ο πιο σημαντικός είναι ο "κύριος" κώδικας που περιλαμβάνει τη ρύθμιση και τον λειτουργικό βρόχο του ρομπότ. Οι περισσότερες από τις άλλες λειτουργίες είναι γραμμένες σε υπο-αρχεία (επίσης στο φάκελο με φερμουάρ). Αυτά τα δευτερεύοντα αρχεία πρέπει να αποθηκευτούν στον ίδιο φάκελο (που ονομάζεται "κύριο") με το κύριο σενάριο πριν το ανεβάσετε στο Arduino

Αρχικά ορίζεται η γενική ταχύτητα του ρομπότ μαζί με τη μεταβλητή "υπενθύμιση". Αυτή η "υπενθύμιση" είναι μια τιμή που θυμάται προς ποια κατεύθυνση στρεφόταν το ρομπότ. Εάν "υπενθυμίσω = 1", το ρομπότ έκανε/στρίβει αριστερά, αν "υπενθυμίσει = 2", το ρομπότ ήταν/στρίβει δεξιά.

int ταχύτητα = 9; // Γενική ταχύτητα του ρομπότ

int υπενθύμιση = 1; // Αρχική διεύθυνση

Στη ρύθμιση του ρομπότ, προετοιμάζονται τα διαφορετικά υπο-αρχεία του προγράμματος. Σε αυτά τα υπο-αρχεία, γράφονται οι βασικές λειτουργίες για τον έλεγχο των κινητήρων, των αισθητήρων,… Με την προετοιμασία τους στη ρύθμιση, οι λειτουργίες που περιγράφονται σε καθένα από αυτά τα αρχεία μπορούν να χρησιμοποιηθούν στον κύριο βρόχο. Ενεργοποιώντας τη λειτουργία r2D2 (), το ρομπότ θα κάνει θόρυβο όπως το ρομπότ R2D2 από το franchise ταινιών Star Wars όταν ξεκινάει. Εδώ η λειτουργία r2D2 () είναι απενεργοποιημένη για να εμποδίσει το βομβητή να τραβήξει πολύ ρεύμα.

// Ρύθμιση @ επαναφορά // ----------------

void setup () {initialize_IR_sensors (); initialize_obstacles_and_edges (); initialize_movement (); initialize_lid (); initialize_buzzer (); // r2D2 (); int υπενθύμιση = 1; // αρχική κατεύθυνση Εκκίνηση (υπενθύμιση). }

Η λειτουργία εκκίνησης (υπενθύμιση) καλείται πρώτα στη ρύθμιση. Αυτή η λειτουργία κάνει το ρομπότ να γυρίσει και να αναζητήσει το σήμα IR ενός από τα κουμπιά. Μόλις βρει το κουμπί, το πρόγραμμα θα βγει από τη λειτουργία Starter αλλάζοντας τη μεταβλητή 'cond' σε false. Κατά τη διάρκεια της περιστροφής του ρομπότ πρέπει να γνωρίζει το περιβάλλον του: πρέπει να ανιχνεύει άκρα και εμπόδια. Αυτό ελέγχεται κάθε φορά πριν συνεχίσει να γυρίζει. Μόλις το ρομπότ ανιχνεύσει ένα εμπόδιο ή μια άκρη, το πρωτόκολλο για την αποφυγή αυτών των εμποδίων ή άκρων θα εκτελεστεί. Αυτά τα πρωτόκολλα θα εξηγηθούν αργότερα σε αυτό το βήμα. Η λειτουργία Starter έχει μία μεταβλητή, η οποία είναι η μεταβλητή υπενθύμισης που συζητήθηκε προηγουμένως. Δίνοντας την τιμή υπενθύμισης στη λειτουργία Starter, το ρομπότ γνωρίζει σε ποια κατεύθυνση πρέπει να στραφεί για να αναζητήσει το κουμπί.

// Βρόχος εκκίνησης: Γυρίστε και αναζητήστε το κουμπί // ---------------------------------------- ----------------

void Εκκίνηση (int υπενθύμιση) {if (isedgeleft () || isedgeright ()) {// Εντοπισμός των άκρων των άκρωνΕντοπίστηκε (υπενθύμιση); } else {bool cond = true; ενώ (cond == true) {if (buttonleft () == false && buttonright () == false && isButtonDetected () == true) {cond = false; } else {if (remember == 1) {// Στρεφόμασταν αριστερά εάν (isobstacleleft ()) {stoppeed (); αποφεύγετε το εμπόδιο (υπενθυμίζω) } else if (isedgeleft () || isedgeright ()) {// Εντοπισμός των άκρων των άκρωνΕντοπίστηκε (υπενθύμιση); } else {turnleft (ταχύτητα); }} else if (υπενθύμιση == 2) {if (isobstacleright ()) {stoppeed (); αποφεύγετε το εμπόδιο (υπενθυμίζω) } else if (isedgeleft () || isedgeright ()) {// Εντοπισμός των άκρων των άκρωνΕντοπίστηκε (υπενθύμιση); } else {στροφή δεξιά (ταχύτητα); }}}}}}

Εάν το ρομπότ βρει το κουμπί, τότε βγαίνει ο πρώτος βρόχος Starter και ξεκινά ο κύριος, λειτουργικός βρόχος του ρομπότ. Αυτός ο κύριος βρόχος είναι αρκετά πολύπλοκος αφού κάθε φορά, το ρομπότ πρέπει να εντοπίζει αν υπάρχει εμπόδιο ή άκρη μπροστά του ή όχι. Η κύρια ιδέα είναι ότι το ρομπότ ακολουθεί το κουμπί βρίσκοντάς το και χάνοντάς το κάθε φορά. Χρησιμοποιώντας δύο αισθητήρες IR, μπορούμε να διακρίνουμε τρεις καταστάσεις:

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

Ο τρόπος με τον οποίο λειτουργεί η ρουτίνα κομματιού έχει ως εξής: όταν εντοπιστεί το κουμπί, το ρομπότ κινείται προς το κουμπί στρέφοντας προς την ίδια κατεύθυνση που γύριζε (χρησιμοποιώντας τη μεταβλητή υπενθύμισης) και ταυτόχρονα προχωρούσε λίγο μπροστά. Εάν το ρομπότ στρίψει πολύ, το κουμπί θα χαθεί ξανά και σε αυτό το σημείο το ρομπότ θυμάται ότι πρέπει να γυρίσει προς την άλλη κατεύθυνση. Αυτό γίνεται επίσης ενώ προχωράτε λίγο. Με αυτόν τον τρόπο το ρομπότ στρέφεται συνεχώς αριστερά και στρίβει δεξιά, αλλά εν τω μεταξύ εξακολουθεί να προχωρά προς το κουμπί. Κάθε φορά που το ρομπότ βρίσκει το κουμπί, συνεχίζει να γυρίζει μέχρι να το χάσει, οπότε αρχίζει να κινείται προς την άλλη κατεύθυνση. Παρατηρήστε τη διαφορά στις λειτουργίες που χρησιμοποιούνται στον βρόχο Starter και τον κύριο βρόχο: ο βρόχος Starter χρησιμοποιεί "turnleft ()" ή "turnright ()", ενώ ο κύριος βρόχος χρησιμοποιεί "moveleft ()" και "moveright ()". Οι κινήσεις αριστερά/δεξιά δεν κάνουν μόνο το ρομπότ να γυρίσει αλλά και να το κάνει να προχωρήσει ταυτόχρονα.

/ * Λειτουργικός βρόχος ---------------------------- Εδώ, υπάρχει μόνο η ρουτίνα του κομματιού */

int χαμένο = 0; // Αν χαθεί = 0 το κουμπί βρίσκεται, αν χαθεί = 1 το κουμπί χάνεται void loop () {if (isedgeleft () || isedgeright ()) {

εάν (! isobstacle ()) {

moveforward (ταχύτητα)? καθυστέρηση (5)? } else {αποφεύγετε το εμπόδιο (υπενθύμιση); } else {if (Υπενθύμιση == 1 && χάθηκε == 1) {// Στρίψαμε αριστερά stoppeed (); if (! isobstacleright ()) {μετακίνηση (ταχύτητα); // Γυρίστε για να βρείτε το κουμπί} αλλιώς {αποφεύγετε το εμπόδιο (υπενθύμιση); } υπενθύμιση = 2; } else if (υπενθύμιση == 2 && lost == 1) {stoppeed (); εάν (! isobstacleleft ()) {moveleft (ταχύτητα); // Στρίψαμε δεξιά} else {else_obstacle (υπενθύμιση); } υπενθύμιση = 1; } else if (lost == 0) {if (remember == 1) {// Στρεφόμασταν αριστερά εάν (! isobstacleleft ()) {moveleft (speed); // Στρίβουμε δεξιά} else {stoppeed (); αποφεύγετε το εμπόδιο (υπενθυμίζω) } //} else if (υπενθύμιση == 2) {if (! isobstacleright ()) {moveright (speed); // Γυρίστε για να βρείτε το κουμπί} else {stoppeed (); αποφεύγετε το εμπόδιο (υπενθυμίζω) }}} καθυστέρηση (10); χαμένο = 0; }} //}}

Τώρα, δίνεται μια μικρή εξήγηση για τις δύο πιο πολύπλοκες ρουτίνες:

Αποφύγετε τις άκρες

Το πρωτόκολλο για την αποφυγή άκρων ορίζεται σε μια συνάρτηση που ονομάζεται "edgeDetection ()", η οποία είναι γραμμένη στο υπο-αρχείο "κίνηση". Αυτό το πρωτόκολλο βασίζεται στο γεγονός ότι το ρομπότ θα πρέπει να συναντήσει μια άκρη μόνο όταν έχει φτάσει στον προορισμό του: το κουμπί. Μόλις το ρομπότ εντοπίσει μια άκρη, το πρώτο πράγμα που κάνει είναι να μετακινηθεί λίγο πίσω για να βρεθεί σε ασφαλή απομάκρυνση από την άκρη. Μόλις γίνει αυτό, το ρομπότ περιμένει 2 δευτερόλεπτα. Εάν κάποιος πατήσει το κουμπί στο μπροστινό μέρος του ρομπότ σε αυτά τα δύο δευτερόλεπτα, το ρομπότ γνωρίζει ότι έχει φτάσει στο άτομο που θέλει το βούτυρο και ανοίγει τη θήκη βουτύρου και παρουσιάζει το βούτυρο. Σε αυτό το σημείο, κάποιος μπορεί να πάρει βούτυρο από το ρομπότ. Μετά από λίγα δευτερόλεπτα το ρομπότ θα κουραστεί να περιμένει και θα κλείσει το καπάκι του βουτύρου. Μόλις κλείσει το καπάκι, το ρομπότ θα εκτελέσει τον βρόχο Starter για να αναζητήσει άλλο κουμπί. Εάν συμβεί ότι το ρομπότ συναντήσει μια άκρη πριν φτάσει στον προορισμό του και το κουμπί στο μπροστινό μέρος του ρομπότ δεν πατηθεί, το ρομπότ δεν θα ανοίξει το καπάκι βουτύρου και θα εκτελέσει αμέσως τον βρόχο Starter.

Αποφύγετε τα εμπόδια

Η συνάρτηση αποφυγή_μποδίου () βρίσκεται επίσης στο υπο-αρχείο "κίνηση". Το δύσκολο κομμάτι της αποφυγής εμποδίων είναι το γεγονός ότι το ρομπότ έχει ένα αρκετά μεγάλο τυφλό σημείο. Ο αισθητήρας υπερήχων τοποθετείται στο μπροστινό μέρος του ρομπότ, πράγμα που σημαίνει ότι μπορεί να ανιχνεύσει εμπόδια, αλλά δεν γνωρίζει πότε του προσπερνά. Για να λυθεί αυτό, χρησιμοποιείται η ακόλουθη αρχή: Μόλις το ρομπότ συναντήσει ένα εμπόδιο, χρησιμοποιεί τη μεταβλητή reming για να στρίψει προς την άλλη κατεύθυνση. Με αυτό τον τρόπο το ρομπότ αποφεύγει να χτυπήσει το εμπόδιο. Το ρομπότ συνεχίζει να γυρίζει μέχρι ο αισθητήρας υπερήχων να μην ανιχνεύσει πια το εμπόδιο. Κατά τη διάρκεια της περιστροφής του ρομπότ, ένας μετρητής αυξάνεται έως ότου το εμπόδιο δεν ανιχνευθεί πια. Αυτός ο μετρητής δίνει στη συνέχεια μια προσέγγιση του μήκους του εμποδίου. Προχωρώντας προς τα εμπρός και ταυτόχρονα μειώνοντας τον μετρητή, το εμπόδιο μπορεί να αποφευχθεί. Μόλις ο μετρητής φτάσει στο 0, η λειτουργία Starter μπορεί να χρησιμοποιηθεί ξανά για τη μετακίνηση του κουμπιού. Φυσικά το ρομπότ κάνει τη λειτουργία Starter στρέφοντας προς την κατεύθυνση που θυμόταν ότι πήγαινε πριν συναντήσει το εμπόδιο (και πάλι χρησιμοποιώντας τη μεταβλητή υπενθύμισης).

Τώρα που έχετε κατανοήσει πλήρως τον κώδικα, μπορείτε να αρχίσετε να τον χρησιμοποιείτε!

Φροντίστε να προσαρμόσετε τα κατώφλια στο περιβάλλον σας (η αντανάκλαση IR είναι υψηλότερη σε λευκά τραπέζια για παράδειγμα) και να προσαρμόσετε τις διαφορετικές παραμέτρους στις ανάγκες σας. Επίσης, θα πρέπει να δοθεί μεγάλη προσοχή στην τροφοδοσία των διαφορετικών μονάδων. Είναι βασικής σημασίας οι σερβοκινητήρες να μην τροφοδοτούνται από τη θύρα Arduino 5V, καθώς παίρνουν πολύ ρεύμα (αυτό θα μπορούσε να βλάψει τον μικροελεγκτή). Εάν χρησιμοποιείται η ίδια πηγή ισχύος για τους αισθητήρες με αυτόν που τροφοδοτεί τα σερβο, μπορεί να προκύψουν ορισμένα προβλήματα μέτρησης.

Συνιστάται: