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

FinduCar: Ένα έξυπνο κλειδί αυτοκινήτου που καθοδηγεί τους ανθρώπους στο σημείο στάθμευσης του αυτοκινήτου: 11 βήματα (με εικόνες)
FinduCar: Ένα έξυπνο κλειδί αυτοκινήτου που καθοδηγεί τους ανθρώπους στο σημείο στάθμευσης του αυτοκινήτου: 11 βήματα (με εικόνες)

Βίντεο: FinduCar: Ένα έξυπνο κλειδί αυτοκινήτου που καθοδηγεί τους ανθρώπους στο σημείο στάθμευσης του αυτοκινήτου: 11 βήματα (με εικόνες)

Βίντεο: FinduCar: Ένα έξυπνο κλειδί αυτοκινήτου που καθοδηγεί τους ανθρώπους στο σημείο στάθμευσης του αυτοκινήτου: 11 βήματα (με εικόνες)
Βίντεο: тгк - кталевр 🩷 #пов #рек #жиза #жизнь #любовь #отношения #парень #love #жизненныеистории 2024, Νοέμβριος
Anonim
FinduCar: Ένα έξυπνο κλειδί αυτοκινήτου που καθοδηγεί τους ανθρώπους εκεί που είναι σταθμευμένο το αυτοκίνητο
FinduCar: Ένα έξυπνο κλειδί αυτοκινήτου που καθοδηγεί τους ανθρώπους εκεί που είναι σταθμευμένο το αυτοκίνητο

Προκειμένου να επιλυθούν τα παραπάνω προβλήματα, αυτό το έργο προτείνει την ανάπτυξη ενός έξυπνου κλειδιού αυτοκινήτου που θα μπορούσε να κατευθύνει τους ανθρώπους εκεί που στάθμευσαν το αυτοκίνητο. Και το σχέδιό μου είναι να ενσωματώσω ένα 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

Debug στο Breadboard
Debug στο Breadboard
Debug στο Breadboard
Debug στο Breadboard
Debug στο Breadboard
Debug στο Breadboard

Βήμα 7: Συναρμολόγηση υλικού

Συναρμολόγηση υλικού
Συναρμολόγηση υλικού
Συναρμολόγηση υλικού
Συναρμολόγηση υλικού
Συναρμολόγηση υλικού
Συναρμολόγηση υλικού

Βήμα 8: Σχεδιασμός ηλεκτρονικών κατοικιών στο Adobe Illustrator

Σχεδιασμός ηλεκτρονικών ειδών κατοικίας στο Adobe Illustrator
Σχεδιασμός ηλεκτρονικών ειδών κατοικίας στο Adobe Illustrator

Βήμα 9: Πρωτότυπο από χαρτόνι

Πρωτότυπο από χαρτόνι
Πρωτότυπο από χαρτόνι
Πρωτότυπο από χαρτόνι
Πρωτότυπο από χαρτόνι

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

Βήμα 10: Πρωτότυπο κόντρα πλακέ σημύδας

Πρωτότυπο κόντρα πλακέ σημύδας
Πρωτότυπο κόντρα πλακέ σημύδας
Πρωτότυπο κόντρα πλακέ σημύδας
Πρωτότυπο κόντρα πλακέ σημύδας

Αυτό ήταν το αρχικό πρωτότυπο. Μια τετράγωνη τρύπα για σύνδεση σε φορτιστή προστέθηκε τελικά σε ένα από τα κομμάτια.

Συνιστάται: