- Απαιτούμενα υλικά:
- Έννοια του ρομπότ αποφυγής εμποδίων:
- Διάγραμμα κυκλώματος και επεξήγηση:
- Προγραμματισμός του μικροελεγκτή PIC:
- Obstacle Avoider Robot σε δράση:
Το Obstacle Avoider Robot είναι ένα άλλο διάσημο ρομπότ που μπαχαρικά ενσωματωμένα έργα. Για εκείνους που είναι νέο ρομπότ αποτροπής του Obstacle, είναι ένα απλό ρομπότ με τροχούς που θα μπορούσε να πλοηγηθεί στο δρόμο του χωρίς να χτυπήσει κανένα εμπόδιο. Υπάρχουν πολλοί τρόποι για να δημιουργήσουμε ένα ρομπότ αποτροπής εμποδίων στο έργο που πρόκειται να χρησιμοποιήσουμε έναν αισθητήρα υπερήχων (μπροστά) και δύο αισθητήρες υπερύθρων (αριστερά / δεξιά) έτσι ώστε το ρομπότ μας να έχει τα μάτια και στις τρεις κατευθύνσεις. Με αυτόν τον τρόπο μπορείτε να το κάνετε πιο έξυπνο και γρηγορότερο ανιχνεύοντας αντικείμενα και στις τρεις πλευρές και ελιγμούς ανάλογα. Εδώ μηνύουμε το PIC Microcontroller PIC16F877A για αυτό το εμπόδιο που αποφεύγει το ρομπότ.
Η λειτουργία ενός ρομπότ αποφυγής εμποδίων μπορεί να παρατηρηθεί από ένα προϊόν σε πραγματικό χρόνο που ονομάζεται ρομπότ οικιακού καθαρισμού. Αν και η τεχνολογία και οι αισθητήρες που χρησιμοποιούνται σε αυτά είναι πολύ περίπλοκα, η ιδέα παραμένει η ίδια. Ας δούμε πόσο μπορούμε να επιτύχουμε χρησιμοποιώντας τους κανονικούς αισθητήρες και τους μικροελεγκτές PIC.
Ελέγξτε επίσης τα άλλα ρομπότ αποφυγής εμποδίων:
- Εμπόδιο με βάση το Raspberry Pi Αποφυγή ρομπότ
- DIY Smart Vacuum Clean Robot χρησιμοποιώντας το Arduino
Απαιτούμενα υλικά:
- PIC16F877Α
- Αισθητήρας υπερύθρων (2Nos)
- Αισθητήρας υπερήχων (1Nos)
- DC Gear Motor (2Nos)
- Οδηγός κινητήρα L293D
- Chaises (Μπορείτε επίσης να δημιουργήσετε τα δικά σας χρησιμοποιώντας χαρτόνια)
- Τράπεζα ισχύος (Οποιαδήποτε διαθέσιμη πηγή ενέργειας)
Έννοια του ρομπότ αποφυγής εμποδίων:
Η έννοια του ρομπότ αποφυγής εμποδίων είναι πολύ απλή. Χρησιμοποιούμε αισθητήρες για να ανιχνεύσουμε την παρουσία αντικειμένων γύρω από το ρομπότ και χρησιμοποιούμε αυτά τα δεδομένα για να μην συγκρούσουμε το ρομπότ πάνω από αυτά τα αντικείμενα. Για να ανιχνεύσουμε ένα αντικείμενο μπορούμε να χρησιμοποιήσουμε οποιονδήποτε αισθητήρα χρήσης όπως τον αισθητήρα υπερύθρων και τον αισθητήρα υπερήχων.
Στο ρομπότ μας χρησιμοποιήσαμε τον αισθητήρα ΗΠΑ ως τον μπροστινό αισθητήρα και δύο αισθητήρες υπερύθρων για αριστερά και δεξιά αντίστοιχα. Το ρομπότ θα κινηθεί προς τα εμπρός όταν δεν υπάρχει κανένα αντικείμενο πριν από αυτό. Έτσι, το ρομπότ θα προχωρήσει έως ότου ο αισθητήρας υπερήχων (ΗΠΑ) εντοπίσει οποιοδήποτε αντικείμενο.
Όταν ένα αντικείμενο εντοπίζεται από τον αισθητήρα των ΗΠΑ, είναι καιρός να αλλάξετε την κατεύθυνση του ρομπότ. Μπορούμε είτε να στρίψουμε αριστερά είτε δεξιά, για να αποφασίσουμε την κατεύθυνση στροφής που χρησιμοποιούμε τη βοήθεια του αισθητήρα υπερύθρων για να ελέγξουμε εάν υπάρχει κάποιο αντικείμενο κοντά στην αριστερή ή τη δεξιά πλευρά του ρομπότ.
Αν εντοπιστεί κάποιο αντικείμενο στην μπροστινή και τη δεξιά πλευρά του ρομπότ, τότε το ρομπότ θα επιστρέψει και θα στρίψει αριστερά. Κάνουμε το ρομπότ να τρέχει προς τα πίσω για μια συγκεκριμένη απόσταση, ώστε να μην συγκρούεται με το αντικείμενο ενώ κάνει τη στροφή.
Εάν εντοπιστεί κάποιο αντικείμενο στην μπροστινή και την αριστερή πλευρά του ρομπότ, τότε το ρομπότ θα επιστρέψει και θα στρίψει δεξιά.
Εάν το ρομπότ φτάσει σε μια γωνία του δωματίου, θα αισθανθεί το αντικείμενο που υπάρχει και στους τέσσερις. Σε αυτήν την περίπτωση πρέπει να οδηγήσουμε το ρομπότ προς τα πίσω έως ότου κάποια από τις πλευρές γίνει ελεύθερη.
Μια άλλη πιθανή περίπτωση είναι ότι θα υπάρχει ένα αντικείμενο μπροστά, αλλά μπορεί να μην υπάρχει κανένα αντικείμενο ούτε στην αριστερή πλευρά ούτε στη δεξιά πλευρά, στην περίπτωση αυτή πρέπει να γυρίσουμε τυχαία οποιαδήποτε κατεύθυνση.
Ελπίζω ότι αυτό θα έδινε μια γενική ιδέα για το πώς λειτουργεί ένα Avoider Obstacle, τώρα ας προχωρήσουμε με το Διάγραμμα κυκλώματος για να φτιάξουμε αυτό το bot και να το απολαύσουμε σε δράση.
Διάγραμμα κυκλώματος και επεξήγηση:
Το πλήρες διάγραμμα κυκλώματος αυτού του ρομπότ αποφυγής εμποδίων που βασίζεται σε PIC φαίνεται στην παραπάνω εικόνα. Όπως μπορείτε να δείτε, χρησιμοποιήσαμε δύο αισθητήρες υπερύθρων για την ανίχνευση αντικειμένων αριστερά και δεξιά του ρομπότ αντίστοιχα και έναν αισθητήρα υπερήχων για τη μέτρηση της απόστασης του αντικειμένου που υπάρχει μπροστά από το ρομπότ. Χρησιμοποιήσαμε επίσης μια μονάδα οδήγησης κινητήρα L293D για να οδηγήσουμε τους δύο κινητήρες που υπάρχουν σε αυτό το έργο. Αυτοί είναι απλοί συνηθισμένοι κινητήρες DC για τροχούς και ως εκ τούτου μπορούν να παραχθούν πολύ εύκολα. Ο παρακάτω πίνακας θα σας βοηθήσει στις συνδέσεις.
ΝΟ |
Συνδέθηκε από |
Συνδεδεμένος με |
1 |
Αισθητήρας IR Αριστερός πείρος |
RD2 (ακίδα 21) |
2 |
Αισθητήρας υπερύθρων ακροδέκτης |
RD3 (ακίδα 22) |
4 |
Κινητήρας 1 κανάλι Α καρφίτσα |
RC4 (ακίδα 23) |
5 |
Ακροδέκτης κινητήρα 1 καναλιού Β |
RC5 (ακίδα 25) |
6 |
Κινητήρας 2 κανάλι Α καρφίτσα |
RC6 (ακίδα 26) |
7 |
Κινητήρας 2 ακίδων Β |
RC7 (ακίδα 27) |
8 |
Καρφίτσα σκανδάλης ΗΠΑ |
RB1 (ακίδα 34) |
9 |
Καρφίτσα ηχούς ΗΠΑ |
RB2 (ακίδα 35) |
Μια μονάδα οδήγησης κινητήρα όπως το L293D είναι υποχρεωτική, επειδή το απαιτούμενο ρεύμα για τη λειτουργία του κινητήρα DC δεν μπορεί να προέρχεται από τον πείρο I / O του μικροελεγκτή PIC. Οι αισθητήρες και το δομοστοιχείο τροφοδοτούνται από την τροφοδοσία + 5V που ρυθμίζεται από το 7805. Η μονάδα οδηγού κινητήρα μπορεί να τροφοδοτηθεί ακόμη και με χρήση + 12V, αλλά για αυτό το έργο έχω μόλις κολλήσει στο διαθέσιμο + 5V.
Το πλήρες ρομπότ τροφοδοτείται από Power Bank στην περίπτωσή μου. Μπορείτε επίσης να χρησιμοποιήσετε οποιαδήποτε συνηθισμένη τράπεζα τροφοδοσίας και να περάσετε την ενότητα ρυθμιστή ή να χρησιμοποιήσετε το παραπάνω κύκλωμα και να χρησιμοποιήσετε οποιαδήποτε μπαταρία 9V ή 12V για το ρομπότ, όπως φαίνεται στο παραπάνω διάγραμμα κυκλώματος. Μόλις ολοκληρωθούν οι συνδέσεις σας, θα φαίνεται κάπως έτσι παρακάτω
Προγραμματισμός του μικροελεγκτή PIC:
Ο προγραμματισμός του PIC για να δουλέψετε για ένα εμπόδιο στο Obstacle είναι πολύ εύκολος. Πρέπει απλώς να διαβάσουμε την αξία αυτών των τριών αισθητήρων και να οδηγήσουμε τους κινητήρες ανάλογα. Σε αυτό το έργο χρησιμοποιούμε αισθητήρα υπερήχων. Έχουμε ήδη μάθει πώς να συνδέουμε υπερήχους με μικροελεγκτή PIC, αν είστε νέοι εδώ, παρακαλώ επιστρέψτε σε αυτό το σεμινάριο για να καταλάβετε πώς λειτουργεί ένας αισθητήρας των ΗΠΑ με ένα PIC, αφού θα παραλείψω τις λεπτομέρειες σχετικά με αυτό εδώ για να αποφευχθεί η επανάληψη.
Το πλήρες πρόγραμμα ή αυτό το ρομπότ δίνεται στο τέλος αυτής της σελίδας, εξήγησα περαιτέρω τα σημαντικά κομμάτια του προγράμματος παρακάτω.
Όπως γνωρίζουμε, όλα τα προγράμματα ξεκινούν με τις δηλώσεις pin εισόδου και εξόδου. Εδώ οι τέσσερις ακίδες της μονάδας οδηγού κινητήρα και των ακίδων σκανδάλης είναι οι ακίδες εξόδου, ενώ θα εισαχθούν οι ακίδες Echo και δύο ακροδέκτες IR. Πρέπει να προετοιμάσουμε τη μονάδα Timer 1 για να τη χρησιμοποιήσουμε με τον αισθητήρα υπερήχων.
TRISD = 0x00; // Το PORTD δηλώθηκε ως έξοδος για διασύνδεση LCD TRISB1 = 0; // Ο πείρος σκανδάλης του αισθητήρα ΗΠΑ αποστέλλεται ως πείρος εξόδου TRISB2 = 1; // Ο πείρος ηχούς του αισθητήρα ΗΠΑ έχει οριστεί ως πείρος εισόδου TRISB3 = 0; // Το RB3 είναι πείρος εξόδου για LED TRISD2 = 1; TRISD3 = 1; // Και οι δύο ακίδες αισθητήρα IR δηλώνονται ως είσοδος TRISC4 = 0; TRISC5 = 0; // Κινητήρας 1 ακίδες που δηλώνονται ως έξοδο TRISC6 = 0 TRISC7 = 0; // Κινητήρας 2 ακίδες που δηλώνονται ως έξοδος T1CON = 0x20;
Σε αυτό το πρόγραμμα θα έπρεπε να ελέγξουμε την απόσταση μεταξύ του αισθητήρα και του αντικειμένου αρκετά συχνά, οπότε έχουμε δημιουργήσει μια συνάρτηση που ονομάζεται calcul_distance () μέσα στην οποία θα μετρήσουμε την απόσταση με τη μέθοδο που συζητήθηκε στο σεμινάριο διασύνδεσης αισθητήρων των ΗΠΑ. Ο κωδικός φαίνεται παρακάτω
void calcul_distance () // συνάρτηση για τον υπολογισμό της απόστασης US {TMR1H = 0; TMR1L = 0; // διαγράψτε τα bit του χρονοδιακόπτη Trigger = 1; __delay_us (10); Σκανδάλη = 0; ενώ (Echo == 0); TMR1ON = 1; ενώ (Echo == 1); TMR1ON = 0; time_taken = (TMR1L - (TMR1H << 8)); απόσταση = (0,0272 * χρόνος_ένα) / 2; }
Το επόμενο βήμα θα ήταν η σύγκριση των τιμών του αισθητήρα υπερήχων και του αισθητήρα υπερύθρων και η μετακίνηση του ρομπότ ανάλογα. Εδώ Σε αυτό το πρόγραμμα έχω χρησιμοποιήσει μια τιμή cm ως την κρίσιμη απόσταση κάτω από την οποία το Ρομπότ πρέπει να αρχίσει να κάνει αλλαγές στην κατεύθυνση. Μπορείτε να χρησιμοποιήσετε τις προτιμώμενες τιμές σας. Εάν δεν υπάρχει αντικείμενο, το ρομπότ κινείται προς τα εμπρός
εάν (απόσταση> 5) {RC4 = 0; RC5 = 1; // Κινητήρας 1 προς τα εμπρός RC6 = 1; RC7 = 0; // Κινητήρας 2 προς τα εμπρός}
Εάν εντοπιστεί ένα αντικείμενο, τότε η απόσταση θα είναι κάτω από cm. Σε αυτήν την περίπτωση λαμβάνουμε υπόψη τις τιμές του αισθητήρα υπερήχων αριστερού και δεξιού. Με βάση αυτήν την τιμή αποφασίζουμε είτε να στρίψουμε αριστερά είτε να στρίψουμε δεξιά. Χρησιμοποιείται καθυστέρηση του ms έτσι ώστε η αλλαγή να είναι η κατεύθυνση να είναι ορατή.
if (RD2 == 0 && RD3 == 1 && απόσταση <= 5) // Ο αριστερός αισθητήρας είναι αποκλεισμένος {back_off (); RC4 = 1; RC5 = 1; // Κινητήρας 1 στοπ RC6 = 1 RC7 = 0; // Κινητήρας 2 προς τα εμπρός __delay_ms (500); } υπολογισμός_ απόσταση (); if (RD2 == 1 && RD3 == 0 && απόσταση <= 5) // Ο δεξιός αισθητήρας είναι αποκλεισμένος {back_off (); RC4 = 0; RC5 = 1; // Κινητήρας 1 προς τα εμπρός RC6 = 1; RC7 = 1; // Στάση 2 κινητήρα __delay_ms (500); }
Μερικές φορές ο αισθητήρας υπερήχων θα ανιχνεύσει ένα αντικείμενο, αλλά δεν θα εντοπίζεται κανένα αντικείμενο από τους αισθητήρες υπερύθρων. Σε αυτήν την περίπτωση το ρομπότ στρίβει αριστερά από προεπιλογή. Μπορείτε επίσης να το στρίψετε δεξιά ή σε τυχαία κατεύθυνση με βάση τις προτιμήσεις σας. Εάν υπάρχουν αντικείμενα και στις δύο πλευρές, τότε το κάνουμε να πάει πίσω. Ο κωδικός για να κάνετε το ίδιο φαίνεται παρακάτω.
calcul_distance (); if (RD2 == 0 && RD3 == 0 && απόσταση <= 5) // Και οι δύο αισθητήρες είναι ανοιχτοί {back_off (); RC4 = 0; RC5 = 1; // Κινητήρας 1 προς τα εμπρός RC6 = 1; RC7 = 1; // Στάση 2 κινητήρα __delay_ms (500); } υπολογισμός_ απόσταση (); if (RD2 == 1 && RD3 == 1 && απόσταση <= 5) // Και οι δύο αισθητήρες είναι αποκλεισμένοι {back_off (); RC4 = 1; RC5 = 0; // Μοτέρ 1 αντίστροφη RC6 = 1; RC7 = 1; // Στάση κινητήρα 2 __delay_ms (1000); }
Obstacle Avoider Robot σε δράση:
Η εργασία του έργου είναι πολύ ενδιαφέρουσα και διασκεδαστική. Μόλις τελειώσετε με το κύκλωμα και τον κωδικό σας, απλώς ενεργοποιήστε το Bot σας και αφήστε το στο έδαφος. Θα πρέπει να μπορεί να εντοπίζει εμπόδια και να τα αποφεύγει έξυπνα. Αλλά, εδώ έρχεται το διασκεδαστικό μέρος. Μπορείτε να τροποποιήσετε τον κώδικα και να τον κάνετε να κάνετε περισσότερα πράγματα όπως να τον αποφύγετε ένα σκαλοπάτι, να τον κάνετε πιο έξυπνο αποθηκεύοντας πολύτιμες στροφές και τι όχι;
Αυτό το ρομπότ θα σας βοηθήσει να κατανοήσετε τα βασικά του προγραμματισμού και να μάθετε πώς ένα πραγματικό υλικό θα ανταποκρίνεται στον κώδικά σας. Είναι πάντα διασκεδαστικό να προγραμματίζετε αυτό το ρομπότ και να παρακολουθείτε πώς συμπεριφέρεται για τον κώδικα στον πραγματικό κόσμο.
Εδώ έχουμε χρησιμοποιήσει τον ίδιο πίνακα PIC perf που έχουμε φτιάξει για να αναβοσβήνει LED χρησιμοποιώντας μικροελεγκτή PIC και χρησιμοποιήσαμε αυτόν τον πίνακα σε άλλα έργα της σειράς PIC Tutorial.
Το ρομπότ σας θα πρέπει να μοιάζει με αυτό που φαίνεται στην παραπάνω εικόνα. Η πλήρης εργασία αυτού του έργου φαίνεται στο παρακάτω βίντεο.
Ελπίζω να καταλάβατε το έργο και να απολαύσατε την κατασκευή του. Εάν έχετε αμφιβολίες ή έχετε κολλήσει, μπορείτε να χρησιμοποιήσετε την ενότητα σχολίων για να δημοσιεύσετε τις ερωτήσεις σας και θα προσπαθήσω ό, τι καλύτερο μπορώ να απαντήσω σε αυτές.