Πίνακας περιεχομένων:
- Βήμα 1: Σκίτσο χαρτιού
- Βήμα 2: Λίστα υλικού
- Βήμα 3: Σχεδιασμός κυκλωμάτων
- Βήμα 4: Σύνδεση υλικού
- Βήμα 5: Σχεδιασμός λογισμικού
- Βήμα 6: Εντοπισμός σφαλμάτων στο Breadboard
- Βήμα 7: Συναρμολόγηση υλικού
- Βήμα 8: Σχεδιασμός ηλεκτρονικών κατοικιών στο Adobe Illustrator
- Βήμα 9: Πρωτότυπο από χαρτόνι
- Βήμα 10: Πρωτότυπο κόντρα πλακέ σημύδας
2025 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2025-01-13 06:57
Προκειμένου να επιλυθούν τα παραπάνω προβλήματα, αυτό το έργο προτείνει την ανάπτυξη ενός έξυπνου κλειδιού αυτοκινήτου που θα μπορούσε να κατευθύνει τους ανθρώπους εκεί που στάθμευσαν το αυτοκίνητο. Και το σχέδιό μου είναι να ενσωματώσω ένα GPS στο κλειδί του αυτοκινήτου. Δεν χρειάζεται να χρησιμοποιήσετε την εφαρμογή smartphone για να παρακολουθείτε το αυτοκίνητο, όλες οι οδηγίες θα εμφανίζονται μόνο στο κλειδί του αυτοκινήτου.
Βήμα 1: Σκίτσο χαρτιού
Όταν οι άνθρωποι πατούν το κουμπί για να κλειδώσουν το αυτοκίνητο, οι πληροφορίες τοποθεσίας θα μπορούσαν να καταγραφούν αυτόματα στον μικροελεγκτή. Στη συνέχεια, όταν οι άνθρωποι αρχίζουν να πλοηγούνται στο αυτοκίνητο, ανάβει το διαφορετικό LED για να κατευθυνθεί στη θέση του αυτοκινήτου και η συχνότητα που αναβοσβήνει δείχνει την απόσταση από το αυτοκίνητο. Μπορούν εύκολα να ακολουθήσουν το LED που αναβοσβήνει και να βρουν γρήγορα το αυτοκίνητο.
Βήμα 2: Λίστα υλικού
Αυτά είναι τα στοιχεία που χρησιμοποιούνται σε αυτό το έργο. Ορισμένα είναι από τα σετ σωματιδίων (breadboard, κουμπί, κεφαλίδες), άλλα αγοράζονται από την επίσημη ιστοσελίδα της Adafruit (Adafruit Feather M0, Adafruit Ultimate GPS module, Lpoly Battery and Coin Cell Battery) και Amazon (NeoPixel Ring - 12 RGB LED).
Βήμα 3: Σχεδιασμός κυκλωμάτων
Το Neopixel_LED είναι συνδεδεμένο στο PIN 6 του Feather M0
Το Button_Unlock είναι συνδεδεμένο με το PIN 12 του Feather M0
Το Button_Lock είναι συνδεδεμένο με το PIN 13 του Feather M0
Βήμα 4: Σύνδεση υλικού
Συγκολλήστε τις κεφαλίδες με φτερό Adafruit M0, Adafruit Ultimate GPS Featherwing. Τοποθετήστε τους δύο πίνακες μαζί. Το GPS FeatherWing συνδέεται απευθείας στην πλακέτα Feather M0 χωρίς άλλα καλώδια.
Βήμα 5: Σχεδιασμός λογισμικού
Εξαρτήματα δοκιμής
Διαβάστε ένα FIX
void setup () {
Serial.println ("GPS echo test"); Serial.begin (9600); Serial1.begin (9600); // προεπιλεγμένο NMEA GPS baud}
void loop () {
if (Serial.available ()) {char c = Serial.read (); Serial1.write (c); } if (Serial1.available ()) {char c = Serial1.read (); Serial.write (c); }}
Δαχτυλίδι αναβοσβήνει LED
Δείτε Adafruit NeoPixel Παραδείγματα.
Λειτουργίες υπολογισμού GPS
Υπολογίστε το Αζιμούθιο
// Υπολογίστε το Αζιμούθιο
διπλό αζιμούθιο (διπλό lat_a, διπλό lon_a, διπλό lat_b, διπλό lon_b) {
διπλό d = 0; lat_a = lat_a*PI/180; lon_a = lon_a*PI/180; lat_b = lat_b*PI/180; lon_b = lon_b*PI/180; d = sin (lat_a)*sin (lat_b)+cos (lat_a)*cos (lat_b)*cos (lon_b-lon_a); d = sqrt (1-d*d); d = cos (lat_b)*sin (lon_b-lon_a)/d; d = asin (d)*180/PI; επιστροφή δ? }
Υπολογίστε το χρόνο στο ρολόι LED, το οποίο είναι επίσης η κατεύθυνση του οχήματος
// Υπολογίστε την ώρα στο ρολόι LED
int led_time (διπλή γωνία) {
int σημαία = 0; εάν (γωνία = 15) {angle_time = angle_time + 1; } if (flag == 1) {angle_time = 12 - angle_time; } επιστροφή angle_time; }
Υπολογίστε την απόσταση μεταξύ του ατόμου και του οχήματός του
// Υπολογίστε την Απόσταση
διπλή απόσταση (διπλό lat_a, διπλό lon_a, διπλό lat_b, διπλό lon_b) {
διπλό EARTH_RADIUS = 6378137.0; διπλό radLat1 = (lat_a * PI / 180.0); διπλό radLat2 = (lat_b * PI / 180.0); διπλό a = radLat1 - radLat2; διπλό b = (lon_a - lon_b) * PI / 180.0; διπλό s = 2 * asin (sqrt (pow (sin (a / 2), 2) + cos (radLat1) * cos (radLat2) * pow (sin (b / 2), 2))); s = s * EARTH_RADIUS / 10000000; επιστροφή s? }
Λειτουργίες οθόνης LED
Ανάψτε τις λυχνίες LED σε έναν κύκλο που δείχνουν ότι αρχίζει να περιηγείται
// Ο φωτισμός του δακτυλίου LED μία προς μία δείχνει ότι ξεκινά η πλοήγηση
void colorWipe (uint32_t c, uint8_t αναμονή) {
για (uint16_t i = 0; i strip.setPixelColor (i, c); strip.show (); καθυστέρηση (αναμονή);}}
Λάβετε τη συχνότητα LED με βάση την απόσταση
// Λήψη συχνότητας LED
int συχνότητα (διπλή απόσταση) {
int f = (int) απόσταση * 20; επιστροφή f? }
Αναβοσβήνει το συγκεκριμένο LED που δείχνει την κατεύθυνση του αυτοκινήτου
// Οθόνη σε LED
strip.clear ();
strip.show (); καθυστέρηση (συχνότητα (car_person_distance))? // καθυστέρηση (500). strip.setPixelColor (angle_time, strip. Color (0, 0, 255)); strip.show (); καθυστέρηση (συχνότητα (car_person_distance))? // καθυστέρηση (500).
// Απενεργοποίηση LED
αν (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_flag = 1; strip.clear (); strip.show (); }
Κύριος
#include Adafruit_GPS.h #include Adafruit_NeoPixel.h #include HardwareSerial.h #include Button.h #include math.h
#define Neopixel_LED_PIN 6
#define Neopixel_LED_NUM 12 #define Button_Lock_PIN 13 #define Button_Unlock_PIN 12 #define GPSSerial Serial1
#define GPSECHO false
Adafruit_GPS GPS (& GPSSerial); Adafruit_NeoPixel strip = Adafruit_NeoPixel (Neopixel_LED_NUM, Neopixel_LED_PIN, NEO_GRB + NEO_KHZ800); Κουμπί κλειδώματος (Button_Lock_PIN) Button button_unlock (Button_Unlock_PIN); int button_flag = 0; int led_flag = 1; uint32_t χρονόμετρο = millis (); διπλό car_lat, car_lon; διπλό αυτοκίνητο_προσωπική_ απόσταση? διπλή κίνηση_κατεύθυνση? διπλό αυτοκίνητο_αζιμούθιο? διπλο αυτοκινητο int angle_time;
void setup () {
Serial.begin (115200); // Serial1.begin (9600); GPS.begin (9600); // προεπιλεγμένο NMEA GPS baud strip.begin (); // αποσυνδέστε αυτήν τη γραμμή για να ενεργοποιήσετε το RMC (συνιστώμενο ελάχιστο) και το GGA (επιδιόρθωση δεδομένων), συμπεριλαμβανομένου του υψομέτρου GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA). // Ορίστε το ρυθμό ενημέρωσης GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ). // Ρυθμός ενημέρωσης 1 Hz // Ζητήστε ενημερώσεις για την κατάσταση της κεραίας, σχολιάστε για να ησυχάσετε // GPS.sendCommand (PGCMD_ANTENNA); καθυστέρηση (1000);}
void loop () {// if (Serial.available ()) {
// char c = Serial.read (); // Serial1.write (c); //} // if (Serial1.available ()) {char c = GPS.read (); εάν (GPSECHO) εάν (γ) Serial.print (γ)? // εάν ληφθεί μια πρόταση, μπορούμε να ελέγξουμε το άθροισμα ελέγχου, να το αναλύσουμε… αν (GPS.newNMEAreceived ()) {// ένα δύσκολο πράγμα εδώ είναι αν εκτυπώσουμε την πρόταση NMEA ή τα δεδομένα // καταλήγουμε να μην ακούμε και αλιεύοντας άλλες προτάσεις! // γι 'αυτό να είστε πολύ προσεκτικοί εάν χρησιμοποιείτε το OUTPUT_ALLDATA και προσπαθείτε να εκτυπώσετε δεδομένα Serial.println (GPS.lastNMEA ()). // αυτό ορίζει επίσης τη σημαία newNMEAreceived () σε false εάν (! GPS.parse (GPS.lastNMEA ())) // αυτό θέτει επίσης τη σημαία newNMEAreceived () σε ψευδή επιστροφή. // μπορούμε να αποτύχουμε να αναλύσουμε μια πρόταση, οπότε πρέπει απλά να περιμένουμε μια άλλη} // αν millis () ή χρονόμετρο τελειώσει, θα την επαναφέρουμε μόνο εάν (χρονόμετρο> millis ()) χρονοδιακόπτης = millis (); if (millis () - timer> 2000) {timer = millis (); // επαναφέρετε το χρονοδιακόπτη Serial.print ("\ nΧρόνος:"); Serial.print (GPS.hour, DEC); Serial.print (':'); Serial.print (GPS.minute, DEC); Serial.print (':'); Serial.print (GPS. δευτερόλεπτα, DEC); Serial.print ('.'); Serial.println (GPS.milliseconds); Serial.print ("Ημερομηνία:"); Serial.print (GPS.day, DEC); Serial.print ('/'); Serial.print (GPS.month, DEC); Serial.print ("/20"); Serial.println (GPS.year, DEC); Serial.print ("Επιδιόρθωση:"); Serial.print ((int) GPS.fix); Serial.print ("ποιότητα:"); Serial.println ((int) GPS.fixquality); if (GPS.fix) {Serial.print ("Τοποθεσία:"); Serial.print (GPS.latitude, 4); Serial.print (GPS.lat); Serial.print (","); Serial.print (GPS.longitude, 4); Serial.println (GPS.lon); Serial.print ("Τοποθεσία (σε μοίρες, λειτουργεί με τους Χάρτες Google):"); Serial.print (GPS.latitudeDerees, 4); Serial.print (","); Serial.println (GPS.longitudeDerees, 4); Serial.print ("Ταχύτητα (κόμβοι):"); Serial.println (GPS.speed); Serial.print ("Γωνία:"); Serial.println (GPS.angle); Serial.print ("Υψόμετρο:"); Serial.println (GPS.altitude); Serial.print ("Δορυφόροι:"); Serial.println ((int) GPS.satellites); // Αποθηκεύστε το GPS του οχήματος εάν (button_lock.read ()) {car_lat = GPS.latitudeDegrees; car_lon = GPS.longitudeDegrees; // για εντοπισμό σφαλμάτων Serial.print ("carLatitude:"); Serial.println (car_lat); Serial.print ("carLongitude:"); Serial.println (car_lon); } // Ξεκινήστε να βρίσκετε το αυτοκίνητο εάν (button_flag == 0) {button_flag = button_unlock.read (); } if (button_flag == 1 && led_flag == 1) {colorWipe (strip. Color (0, 255, 0), 500); led_flag = 0; } if (button_flag == 1) {car_person_distance = distance (GPS.latitudeDegrees, GPS.longitudeDerees, car_lat, car_lon); // Υπολογίστε την απόσταση // car_person_distance = απόσταση (100.0005, 100.0005, 100.0, 100.0); // για εντοπισμό σφαλμάτων Serial.println (car_person_distance); move_direction = GPS.angle; // Καταγράψτε την κατεύθυνση κίνησης (γωνία) // move_direction = 100.0; // Καταγράψτε το αζιμούθιο (γωνία) car_azimuth = αζιμούθιο (GPS.latitudeDerees, GPS.longitudeDegrees, car_lat, car_lon); // car_azimuth = αζιμούθιο (100.0005, 100.0005, 100.0, 100.0); // Υπολογίστε το χρόνο στο ρολόι LED car_person_angle = car_azimuth - move_direction; angle_time = led_time (car_person_angle)? // Οθόνη σε λωρίδα LED.clear (); strip.show (); // καθυστέρηση (συχνότητα (car_person_distance)); καθυστέρηση (500)? strip.setPixelColor (angle_time, strip. Color (0, 0, 255)); strip.show (); // καθυστέρηση (συχνότητα (car_person_distance)); καθυστέρηση (500)? // Απενεργοποίηση LED εάν (button_flag == 1 && car_person_distance <5.0) {button_flag = 0; led_flag = 1; strip.clear (); strip.show (); }}} //}}}
Βήμα 6: Εντοπισμός σφαλμάτων στο Breadboard
Βήμα 7: Συναρμολόγηση υλικού
Βήμα 8: Σχεδιασμός ηλεκτρονικών κατοικιών στο Adobe Illustrator
Βήμα 9: Πρωτότυπο από χαρτόνι
Αυτό το βήμα χρησιμοποιείται για την επιβεβαίωση του μεγέθους του περιβλήματος και κάθε τεμαχίου του μοντέλου, διασφαλίζοντας ότι το μέγεθος του κουτιού, η θέση του κουμπιού και η θέση LED ταιριάζουν στα συναρμολογημένα ηλεκτρονικά εξαρτήματα.
Βήμα 10: Πρωτότυπο κόντρα πλακέ σημύδας
Αυτό ήταν το αρχικό πρωτότυπο. Μια τετράγωνη τρύπα για σύνδεση σε φορτιστή προστέθηκε τελικά σε ένα από τα κομμάτια.