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

Πρωτότυπο Smart Motorcycle HUD (περιήγηση σε στροφή και πολλά άλλα): 9 βήματα
Πρωτότυπο Smart Motorcycle HUD (περιήγηση σε στροφή και πολλά άλλα): 9 βήματα

Βίντεο: Πρωτότυπο Smart Motorcycle HUD (περιήγηση σε στροφή και πολλά άλλα): 9 βήματα

Βίντεο: Πρωτότυπο Smart Motorcycle HUD (περιήγηση σε στροφή και πολλά άλλα): 9 βήματα
Βίντεο: LiveMap: Motorbike helmet with GPS navigation. Bike HUD 2024, Ιούλιος
Anonim
Πρωτότυπο Smart Motorcycle HUD (περιήγηση σε στροφή και πολλά άλλα)
Πρωτότυπο Smart Motorcycle HUD (περιήγηση σε στροφή και πολλά άλλα)
Πρωτότυπο Smart Motorcycle HUD (περιήγηση σε στροφή και πολλά άλλα)
Πρωτότυπο Smart Motorcycle HUD (περιήγηση σε στροφή και πολλά άλλα)
Πρωτότυπο Smart Motorcycle HUD (περιήγηση σε στροφή και πολλά άλλα)
Πρωτότυπο Smart Motorcycle HUD (περιήγηση σε στροφή και πολλά άλλα)
Πρωτότυπο Smart Motorcycle HUD (περιήγηση σε στροφή και πολλά άλλα)
Πρωτότυπο Smart Motorcycle HUD (περιήγηση σε στροφή και πολλά άλλα)

Γεια !

Αυτό το Instructables είναι η ιστορία του πώς σχεδίασα και κατασκεύασα μια πλατφόρμα HUD (Heads-Up Display) σχεδιασμένη για τοποθέτηση σε κράνη μοτοσικλέτας. Γράφτηκε στο πλαίσιο του διαγωνισμού «χάρτες». Δυστυχώς, δεν μπόρεσα να ολοκληρώσω εντελώς αυτό το έργο εγκαίρως για την προθεσμία του διαγωνισμού, αλλά ήθελα ακόμα να μοιραστώ την πρόοδό μου σε αυτό, καθώς και να τεκμηριώσω όλη τη δοκιμή και το λάθος που έκανα κατά την πραγματοποίησή του.

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

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

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

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

Τι λειτουργεί από τώρα

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

- Επικοινωνία μεταξύ smartphone και πλακέτας που βασίζεται σε ESP32 (τηλέφωνο ξύπνιο)

- Ο σχεδιασμός οπτικών έχει ολοκληρωθεί (μπορεί να χρειαστούν μικρές προσαρμογές μακροπρόθεσμα)

- Εφαρμογή πλοήγησης Android χρησιμοποιώντας το SDK πλοήγησης Mapbox:

- Δυνατότητα υπολογισμού και εμφάνισης της θέσης του χρήστη σε χάρτη, καθώς και διαδρομής από αυτόν προς τον προορισμό

- Δυνατότητα σύνδεσης με συσκευή Bluetooth (η διεύθυνση MAC της συσκευής είναι κωδικοποιημένη από τώρα)

- Δυνατότητα πλοήγησης σε πραγματικό χρόνο, συμπεριλαμβανομένης της εξαγωγής και αποστολής των πληροφοριών του επερχόμενου ελιγμού μέσω σειριακού Bluetooth (υποστηρίζει μόνο στροφές προς το παρόν)

Αυτό που χρειάζεται δουλειά

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

- Συνολικός σχεδιασμός (προσάρτηση κράνους, μηχανισμός ρύθμισης γωνίας ανακλαστήρα,..)

- Εφαρμογή Android:

- Εφαρμογή ανίχνευσης και διόρθωσης εκτός διαδρομής

- Δυνατότητα εισαγωγής της διεύθυνσης προορισμού από τον χρήστη

- Σημεία πορείας;

- Εργονομία / Αισθητική

Προμήθειες:

Είδη πρώτης ανάγκης

- Ένας πίνακας ανάπτυξης βασισμένος σε esp32

- Οποιοδήποτε κάπως πρόσφατο smartphone Android (ενεργοποιημένο το Bluetooth)

- SSD1306 ή άλλη ενεργοποιημένη οθόνη OLED 96 "(η δική μου ήταν 128x64 εικονοστοιχεία, βλ. Μέρος" The brains: Microcontroller & Screen ")

- Ένας ανακλαστήρας (οποιοδήποτε κομμάτι ακρυλικού/γυαλιού/πλεξιγκλάς θα κάνει)

- Ένας φακός Fresnel (ο δικός μου είχε μήκος F. περίπου 13 εκατοστά, βλ. Μέρος "Επιλογή φακού")

Εργαλεία

- Συγκολλητικό σίδερο

- Breadboard

- Μερικά καλώδια άλματος

- Υπηρεσία τρισδιάστατου εκτυπωτή / τρισδιάστατης εκτύπωσης

Βήμα 1: Πώς λειτουργούν όλα: Εξηγημένες επιλογές σχεδίασης

Πώς λειτουργούν όλα: Επεξηγούνται οι επιλογές σχεδίασης
Πώς λειτουργούν όλα: Επεξηγούνται οι επιλογές σχεδίασης
Πώς λειτουργούν όλα: Επεξηγούνται οι επιλογές σχεδίασης
Πώς λειτουργούν όλα: Επεξηγούνται οι επιλογές σχεδίασης
Πώς λειτουργούν όλα: Επεξηγούνται οι επιλογές σχεδίασης
Πώς λειτουργούν όλα: Επεξηγούνται οι επιλογές σχεδίασης

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

Οπτική

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

Ωστόσο, αυτή η προσέγγιση έχει ένα τεράστιο ελάττωμα: η πραγματική οθόνη είναι συνήθως πιο κοντά στα μάτια του χρήστη από αυτό που πρέπει να εστιάσει ο χρήστης (π.χ. ο δρόμος μπροστά του). Αυτό σημαίνει ότι, για να διαβάσετε τι υπάρχει στην ανακλαστική επιφάνεια, τα μάτια του χρήστη θα πρέπει να προσαρμοστούν στην απόσταση της οθόνης από τα μάτια του (ας πούμε 20 εκατοστά) και στη συνέχεια θα πρέπει να προσαρμοστούν ξανά για να επικεντρωθούν στο δρόμο μπροστά (~ 2/5 μέτρα). Ο χρόνος που χρειάζεται όλη αυτή η λειτουργία είναι πολύτιμος χρόνος που πρέπει να αφιερωθεί κοιτάζοντας το δρόμο και η συχνή προσαρμογή μπορεί να είναι άβολη για τον χρήστη μετά από λίγα λεπτά.

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

Ο ρόλος του smartphone

Επειδή δεν ήταν ρεαλιστικό να δοκιμάσω και να εφαρμόσω μια ολόκληρη εφαρμογή πλοήγησης μόνο στο ESP32, αποφάσισα να φτιάξω μια εφαρμογή android που θα αναλάβει αυτό. Στη συνέχεια, η εφαρμογή θα πρέπει απλώς να πει στο ESP32 τι πρέπει να κάνει ο χρήστης για να φτάσει στον προορισμό του και το ESP32 μεταδίδει αυτές τις πληροφορίες μέσω του HUD (δείτε το σχήμα "Πώς λειτουργεί η μονάδα").

Βήμα 2: Μέρη - The Brains: Microcontroller & Screen

Μέρη - The Brains: Microcontroller & Screen
Μέρη - The Brains: Microcontroller & Screen
Μέρη - The Brains: Microcontroller & Screen
Μέρη - The Brains: Microcontroller & Screen

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

Για να διευκολύνω την επικοινωνία μεταξύ του τηλεφώνου του χρήστη και της μονάδας, επέλεξα να χρησιμοποιήσω έναν πίνακα που βασίζεται σε ESP32 για αυτό το έργο. Αυτή η επιλογή οφείλεται στη συγκεκριμένη μονάδα που διαθέτει ενσωματωμένες δυνατότητες Bluetooth, καθώς και μερικές άλλες ενδιαφέρουσες προδιαγραφές (εύκολο στη χρήση Non-Voileile Storage, διπύρηνος επεξεργαστής, αρκετή μνήμη RAM για την πραγματική οδήγηση της οθόνης OLED μέσω I2C,…). Είναι σχετικά απλό να σχεδιάζετε PCB που βασίζονται στο ESP32, πράγμα που έλαβα υπόψη. Έχω επίσης επαγγελματική εμπειρία στη χρήση και το σχεδιασμό κυκλωμάτων με το ESP32, το οποίο σίγουρα επηρέασε την επιλογή μου.

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

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

Βήμα 3: Μέρη - Οπτικά: Εύρεση συμβιβασμού

Μέρη - Οπτικά: Εύρεση συμβιβασμού
Μέρη - Οπτικά: Εύρεση συμβιβασμού
Μέρη - Οπτικά: Εύρεση συμβιβασμού
Μέρη - Οπτικά: Εύρεση συμβιβασμού
Μέρη - Οπτικά: Εύρεση συμβιβασμού
Μέρη - Οπτικά: Εύρεση συμβιβασμού

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

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

Βασικά, το κόλπο εδώ αφορούσε την εύρεση του σωστού συμβιβασμού μεταξύ:

- Έχοντας μια λογική απόσταση εικονικής εικόνας (δηλαδή, πόσο μακριά φαίνεται να είναι το HUD στο χρήστη ή πόσο μακριά θα πρέπει ο χρήστης να προσαρμόσει τα μάτια του για να δει τι υπάρχει στο HUD)

- Το κείμενο στην οθόνη να μην είναι πολύ μεγεθυμένο από τον φακό (ο οποίος είναι βασικά μεγεθυντικός φακός)

- Έχοντας μια λογική απόσταση μεταξύ της οθόνης OLED και του φακού, η οποία διαφορετικά θα οδηγούσε σε μια πολύ ογκώδη μονάδα

Εγώ προσωπικά παρήγγειλα μερικούς διαφορετικούς φακούς στο amazon και καθόρισα τα αντίστοιχα εστιακά τους μήκη, πριν επιλέξω έναν με μήκος F. F. περίπου 13 cm. Βρήκα αυτό το μήκος F.

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

Μπορείτε να βρείτε τα τρισδιάστατα αρχεία για τη θήκη φακών εδώ.

Βήμα 4: Μέρη - ένα δοχείο για να τα κρατάτε όλα

Μέρη - ένα δοχείο για να τα κρατάτε όλα
Μέρη - ένα δοχείο για να τα κρατάτε όλα
Μέρη - ένα δοχείο για να τα κρατάτε όλα
Μέρη - ένα δοχείο για να τα κρατάτε όλα

Καθώς γράφω αυτό το Instructables, το πραγματικό δοχείο που θα χωρέσει κάθε κομμάτι της οθόνης δεν είναι ακριβώς σχεδιασμένο. Ωστόσο, έχω μερικές ιδέες για το γενικό σχήμα του και για το πώς να προσεγγίσω ορισμένα προβλήματα (όπως το πώς να κρατάτε έναν ανακλαστήρα ακίνητο και να το κάνετε να αντέχει στους ανέμους 100+ km/h). Αυτό είναι ακόμη πολύ σε εξέλιξη.

Βήμα 5: Δημιουργία πρωτοκόλλου για την ενότητα μας

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

Κατά τη σύνταξη αυτού του Instructables, οι πληροφορίες που έπρεπε να μεταδοθούν από το τηλέφωνο για να πλοηγηθείτε με τη μονάδα ήταν:

- Τύπος επερχόμενου ελιγμού (απλή στροφή, κυκλική διασταύρωση, συγχώνευση σε άλλο δρόμο,…)

- Ακριβείς οδηγίες του επερχόμενου ελιγμού (ανάλογα με τον τύπο ελιγμού: δεξιά/αριστερά για στροφή · ποια έξοδο πρέπει να ακολουθήσει για κυκλικό κόμβο,…)

- Η απόσταση που απομένει πριν από τον επερχόμενο ελιγμό (σε μέτρα προς το παρόν)

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

: type.instructions, απόσταση?

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

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

Βήμα 6: Ο κωδικός: ESP32 Side

Κωδικός: ESP32 Side
Κωδικός: ESP32 Side
Κωδικός: ESP32 Side
Κωδικός: ESP32 Side

Ο κωδικός για το ESP32 είναι προς το παρόν αρκετά απλός. Χρησιμοποιεί τη βιβλιοθήκη U8g2lib, η οποία επιτρέπει τον εύκολο έλεγχο της οθόνης OLED (ενώ επιτρέπει τον κατοπτρισμό της εμφανιζόμενης εικόνας).

Βασικά, το μόνο που κάνει το ESP32 είναι να λαμβάνει σειριακά δεδομένα μέσω Bluetooth όταν τα στέλνει η εφαρμογή, να τα αναλύει και να εμφανίζει αυτά τα δεδομένα ή τις εικόνες βάσει αυτών των δεδομένων (δηλ. Εμφάνιση βέλους αντί της πρότασης "στρίψτε αριστερά/δεξιά"). Εδώ είναι ο κωδικός:

/*Το πρόγραμμα ελέγχου ενός HUD από μια εφαρμογή Android μέσω σειριακού bluetooth*/#περιλαμβάνει "BluetoothSerial.h" // Αρχείο κεφαλίδας για σειριακό Bluetooth, θα προστεθεί από προεπιλογή στο Arduino#include #include #ifdef U8X8_HAVE_HW_SPI#include#endif# ifdef U8X8_HAVE_HW_I2C #include #endif // OLED builder Library, πρέπει να αλλάξει ανάλογα στην οθόνη σαςU8G2_SSD1306_128X64_ALT0_F_HW_I2C u8g2 (U8G2_MIRROR,/* reset =*/U8X8_PIN_NON // Κατάσταση μηχάνημα εντοπισμένων τιμών πεδίου + μεταβλητή#καθορισμός ελιγμών Πεδίο 1#καθορισμός οδηγιών πεδίο 2#καθορισμός απόστασηςField 3#καθορισμός endOfFrame 4 δεν εντοπίστηκε_πεδίο = endOfFrame; BluetoothSerial serialBT; // Αντικείμενο για Bluetoothchar εισερχόμενη_χάρτης, ελιγμός char [10], οδηγίες char [10], απόσταση char [10]; char tempManeuver [10]; char tempInstructions [10]; char tempDistance [10]; int nbr_char_maneuver = 0; int nbr_char_instructions = 0; int nbr_char_distance = 0; boolean fullsentence = false; void setup () {Serial.begin (9600); // Έναρξη σειριακής οθόνης σε 9600 bauds u8g2.begin (); // Init OLED control serialBT.begin ("ESP32_BT"); // Όνομα καθυστέρησης σήματος Bluetooth (20). Serial.println ("Bluetooth Device is Ready to Pair");} void loop () {if (serialBT.available () &&! Fullsentence) // Χαρακτήρες που λαμβάνονται μέσω Bluetooth serial {incoming_char = serialBT.read (); Serial.print ("Λάβετε:"); Serial.println (εισερχόμενη_χάρτης); } διακόπτης (πεδίο εντοπισμού) {case maneuverField: Serial.println ("Ανιχνευμένο πεδίο: ελιγμός"); if (incoming_char == '.') // Εντοπίστηκε επόμενο πεδίο {dete_field = οδηγίεςField; } else {// Συμπληρώστε τον ελιγμό τύπου ελιγμού πίνακα πληροφοριών [nbr_char_maneuver] = εισερχόμενος_χάρτης; nbr_char_maneuver ++; } Διακοπή; οδηγίες περίπτωσηςField: Serial.println ("Εντοπίστηκε πεδίο: οδηγίες"); if (incoming_char == ',') // Εντοπίστηκε το επόμενο πεδίο {dete_field = distanceField; } else {// Συμπληρώστε τις οδηγίες του πίνακα πληροφοριών οδηγίες [nbr_char_instructions] = incoming_char; nbr_char_instructions ++; } Διακοπή; case caseField: Serial.println ("Εντοπισμένο πεδίο: απόσταση"); if (incoming_char == ';') // Εντοπίστηκε τέλος του πλαισίου {dete_field = endOfFrame; Serial.print ("ελιγμός:"); Serial.println (ελιγμός); Serial.print ("οδηγίες:"); Serial.println (οδηγίες); Serial.print ("απόσταση:"); Serial.println (απόσταση); πλήρης πρόταση = αλήθεια update_Display (); // Πλήρες καρέ που ελήφθη, αναλύστε το και εμφανίστε τα δεδομένα του δέκτη} αλλιώς {// Συμπληρώστε την απόσταση του πίνακα πληροφοριών απόστασης [nbr_char_distance] = εισερχόμενη_χρέωση; nbr_char_distance ++; } Διακοπή; περίπτωση endOfFrame: if (incoming_char == ':') detect_field = maneuverField; // Νέο σκελετό ανίχνευσης πλαισίου. προεπιλογή: // Μην κάνετε τίποτα break; } καθυστέρηση (20);} void update_Display () {// Αποθήκευση προσωρινής μνήμης σε κάθε πίνακα char για να αποφύγετε πιθανές συγκρούσεις memcpy (tempManeuver, ελιγμός, nbr_char_maneuver); memcpy (tempInstructions, οδηγίες, nbr_char_instructions); memcpy (tempDistance, απόσταση, nbr_char_distance); parseCache (); // Ανάλυση και επεξεργασία συστοιχιών char fullsentence = false; // Η πρόταση ολοκληρώθηκε, έτοιμη για την επόμενη} void parseCache () {u8g2.clearBuffer (); // εκκαθάριση της εσωτερικής μνήμης u8g2.setFont (u8g2_font_ncenB10_tr); // επιλέξτε μια κατάλληλη γραμματοσειρά // συστοιχίες char -> συμβολοσειρά υποχρεωτική για τη χρήση της συνάρτησης substring () String maneuverString = tempManeuver; String οδηγίεςString = tempInstructions; // Υλοποίηση πρωτοκόλλου εδώ. Υποστηρίζει μόνο στροφές προς το παρόν. if (maneuverString.substring (0, 4) == "turn") {// Έλεγχος για τύπο ελιγμού Serial.print ("TURN DETECTED"); if (οδηγίεςString.substring (0, 5) == "δεξιά") {// Ελέγξτε συγκεκριμένες οδηγίες και εμφανίστε ανάλογα u8g2.drawStr (5, 15, "-"); } else if (οδηγίεςString.substring (0, 4) == "αριστερά") {// Ελέγξτε συγκεκριμένες οδηγίες και εμφανίστε ανάλογα u8g2.drawStr (5, 15, "<---"); } else u8g2.drawStr (5, 15, "Err."); // Μη έγκυρο πεδίο οδηγιών}/ * Εφαρμόστε άλλους τύπους ελιγμών (κυκλικοί κόμβοι κ.λπ..) * αλλιώς εάν (tempManeuver == "rdbt") { * *] */ u8g2.drawStr (5, 30, tempDistance); // Εμφάνιση υπολειπόμενης απόστασης u8g2.sendBuffer (); // μεταφορά εσωτερικής μνήμης στην οθόνη // Επαναφορά όλων των συστοιχιών char πριν από την επόμενη ανάγνωση memset (ελιγμός, 0, 10). memset (οδηγίες, 0, 10); memset (απόσταση, 0, 10); memset (tempManeuver, 0, 10); memset (tempInstructions, 0, 10); memset (tempDistance, 0, 10); // Επαναφορά αριθμού στοιχείων σε πίνακες nbr_char_distance = 0; nbr_char_instructions = 0; nbr_char_maneuver = 0;}

Βήμα 7: Ο Κώδικας: Android Side

Ο Κώδικας: Android Side
Ο Κώδικας: Android Side
Ο Κωδικός: Android Side
Ο Κωδικός: Android Side
Ο Κωδικός: Android Side
Ο Κωδικός: Android Side

Για την εφαρμογή smartphone, αποφάσισα να χρησιμοποιήσω το SDK πλοήγησης του Mapbox, καθώς προσφέρει πολλές χρήσιμες δυνατότητες όταν πρόκειται για τη δημιουργία ενός χάρτη πλοήγησης από την αρχή. Επιτρέπει επίσης τη χρήση πολλών χρήσιμων ακροατών, οι οποίοι σίγουρα βοηθούν στο να λειτουργήσει αυτή η ενότητα. Χρησιμοποίησα επίσης την andry-bluetooth-σειριακή βιβλιοθήκη του harry1453 για το android, καθώς έκανε τη σειριακή επικοινωνία Bluetooth πολύ πιο εύκολη.

Εάν θέλετε να δημιουργήσετε αυτήν την εφαρμογή στο σπίτι, θα πρέπει να λάβετε ένα διακριτικό πρόσβασης στο Mapbox, το οποίο είναι δωρεάν έως και έναν συγκεκριμένο αριθμό αιτημάτων ανά μήνα. Θα πρέπει να βάλετε αυτό το διακριτικό στον κώδικα και να δημιουργήσετε την εφαρμογή από την πλευρά σας. Θα χρειαστεί επίσης να κωδικοποιήσετε τη διεύθυνση MAC Bluetooth της δικής σας ESP32.

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

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

Βήμα 8: Τι ακολουθεί;

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

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

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

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

Βήμα 9: Συμπέρασμα και ειδικές ευχαριστίες

Συμπέρασμα και ιδιαίτερες ευχαριστίες!
Συμπέρασμα και ιδιαίτερες ευχαριστίες!

Όπως αναφέρθηκε στην εισαγωγή, αν και αυτό το έργο απέχει πολύ από το να ολοκληρωθεί, ήθελα πολύ να το μοιραστώ με τον κόσμο, με την ελπίδα ότι θα μπορούσε να εμπνεύσει κάποιον άλλο. Iθελα επίσης να τεκμηριώσω την έρευνά μου σχετικά με αυτό το θέμα, καθώς δεν υπάρχει πραγματικά μεγάλο χόμπι ενδιαφέρον για AR και HUD, κάτι που νομίζω ότι είναι ντροπή.

Θέλω να δώσω ένα τεράστιο ευχαριστώ στους Awall99 και Danel Quintana, των οποίων το αντίστοιχο έργο επαυξημένης πραγματικότητας με ενέπνευσε πολύ στη δημιουργία αυτής της ενότητας.

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

Συνιστάται: