תוכן עניינים:

FinduCar: מפתח לרכב חכם המוביל אנשים לאן המכונית חונה: 11 שלבים (עם תמונות)
FinduCar: מפתח לרכב חכם המוביל אנשים לאן המכונית חונה: 11 שלבים (עם תמונות)

וִידֵאוֹ: FinduCar: מפתח לרכב חכם המוביל אנשים לאן המכונית חונה: 11 שלבים (עם תמונות)

וִידֵאוֹ: FinduCar: מפתח לרכב חכם המוביל אנשים לאן המכונית חונה: 11 שלבים (עם תמונות)
וִידֵאוֹ: Голубая стрела (1958) фильм 2024, דֵצֶמבֶּר
Anonim
FinduCar: מפתח לרכב חכם המוביל אנשים לאן המכונית חונה
FinduCar: מפתח לרכב חכם המוביל אנשים לאן המכונית חונה

על מנת לפתור את הבעיות לעיל, פרויקט זה מציע לפתח מפתח לרכב חכם שיכול לכוון אנשים למקום בו החנו את המכונית. והתוכנית שלי היא שילוב GPS במפתח הרכב. אין צורך להשתמש באפליקציית הסמארטפון כדי לעקוב אחר המכונית, כל ההנחיות יופיעו רק על מפתח הרכב.

שלב 1: רישום נייר

סקיצה של נייר
סקיצה של נייר

כאשר אנשים לוחצים על הכפתור כדי לנעול את המכונית, ניתן לרשום את פרטי המיקום באופן אוטומטי בבקר המיקרו. לאחר מכן, כאשר אנשים מתחילים לנווט אל המכונית, נורית ה- LED השניה מוארת כדי לכוון למיקום המכונית והתדר המהבהב מראה את המרחק למכונית. הם יכולים לעקוב בקלות אחר הנורית המהבהבת ולמצוא במהירות את המכונית.

שלב 2: רשימת חומרה

רשימת חומרה
רשימת חומרה

אלה המרכיבים המשמשים בפרויקט זה. חלקם מגיעים מתוך ערכות החלקיקים (קרש לחם, כפתור, כותרות), אחרים נרכשים מהאתר הרשמי של Adafruit (Adafruit Feather M0, מודול GPS של Adafruit Ultimate, סוללת Lpoly וסוללות מטבעות) ואמזון (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

הגדרת בטל () {

Serial.println ("בדיקת הד GPS"); Serial.begin (9600); Serial1.begin (9600); // ברירת מחדל ל- NMEA GPS baud}

לולאת חלל () {

if (Serial.available ()) {char c = Serial.read (); Serial1.write (ג); } אם (Serial1.available ()) {char c = Serial1.read (); Serial.write (ג); }}

טבעת LED מהבהבת

עיין בדוגמאות NeoPixel של Adafruit.

פונקציות חישוב 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

int led_time (זווית כפולה) {

int flag = 0; אם (זווית = 15) {זווית_זמן = זווית_זמן + 1; } אם (דגל == 1) {זווית_זמן = 12 - זווית_זמן; } זמן החזרה זווית; }

חשב את המרחק בין האדם לרכבו

// חשב את המרחק

מרחק כפול (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; החזרות; }

פונקציות תצוגת LED

הדליקו נוריות LED במעגל המראות שהוא מתחיל לנווט

// תאורת טבעת LED אחת אחת מראה שהניווט מתחיל

void colorWipe (uint32_t c, uint8_t wait) {

עבור (uint16_t i = 0; i strip.setPixelColor (i, c); strip.show (); עיכוב (המתן);}}

קבל את תדר ה- LED על בסיס המרחק

// קבל תדר LED

תדר int (מרחק כפול) {

int f = (int) מרחק * 20; החזר f; }

מהבהב את הנורית המסויימת המצביעה על כיוון המכונית

// תצוגה על LED

strip.clear ();

strip.show (); עיכוב (תדירות (car_person_distance)); // עיכוב (500); strip.setPixelColor (זווית_זמן, 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

#הגדר Neopixel_LED_PIN 6

#define Neopixel_LED_NUM 12 #Define Button_Lock_PIN 13 #Define Button_Unlock_PIN 12 #define GPS Serial serial1

#define GPSECHO שקר

Adafruit_GPS GPS (& GPSSerial); Adafruit_NeoPixel strip = Adafruit_NeoPixel (Neopixel_LED_NUM, Neopixel_LED_PIN, NEO_GRB + NEO_KHZ800); נעילת כפתור כפתור (Button_Lock_PIN); כפתור כפתור_הנעילה (Button_Unlock_PIN); int button_flag = 0; int led_flag = 1; טיימר uint32_t = מיליס (); car_lat כפול, car_lon; מרחק כפול_אדם_אדם; move_direction כפול; car_azimuth כפול; car_person_angle כפול; int angle_time;

הגדרת בטל () {

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 הרץ // בקש עדכונים על מצב האנטנה, הערה כדי לשמור על שקט // GPS.sendCommand (PGCMD_ANTENNA); עיכוב (1000);}

לולאת void () {// if (Serial.available ()) {

// char c = Serial.read (); // Serial1.write (ג); //} // if (Serial1.available ()) {char c = GPS.read (); if (GPSECHO) if (c) Serial.print (c); // אם מתקבל משפט, נוכל לבדוק את סכום הבידוק, לנתח אותו … אם (GPS.newNMEAreceived ()) {// דבר מסובך כאן הוא אם נדפיס את המשפט NMEA, או נתונים // בסופו של דבר לא נקשיב לתפוס משפטים אחרים! // לכן היזהר מאוד אם אתה משתמש ב- OUTPUT_ALLDATA ונסה להדפיס נתונים Serial.println (GPS.lastNMEA ()); // זה גם מגדיר את הדגל newNMEAreceived () ל- false אם (! GPS.parse (GPS.lastNMEA ())) // זה גם מגדיר את הדגל newNMEAreceived () להחזרה שווא; // אנחנו לא מצליחים לנתח משפט ובמקרה זה עלינו לחכות לעוד}} אם אם מיליס () או טיימר עוטף, פשוט נאפס אותו אם (טיימר> מילי ()) טיימר = מילי (); if (millis () - טיימר> 2000) {timer = millis (); // אפס את הטיימר Serial.print ("\ nTime:"); Serial.print (GPS.hour, DEC); Serial.print (':'); Serial.print (GPS.minute, DEC); Serial.print (':'); Serial.print (GPS.seconds, 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.latitudeDegrees, 4); Serial.print (","); Serial.println (GPS.longitudeDegrees, 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; } אם (button_flag == 1) {car_person_distance = distance (GPS.latitudeDegrees, GPS.longitudeDegrees, 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 = azimuth (GPS.latitudeDegrees, GPS.longitudeDegrees, car_lat, car_lon); // car_azimuth = אזימוט (100.0005, 100.0005, 100.0, 100.0); // חשב את הזמן על שעון LED car_person_angle = car_azimuth - move_direction; time_time = led_time (car_person_angle); // תצוגה ב- strip strip.clear (); strip.show (); // עיכוב (תדירות (car_person_distance)); עיכוב (500); strip.setPixelColor (זווית_זמן, 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: איתור באגים בלוח הלוח

איתור באגים בלוח הלחם
איתור באגים בלוח הלחם
איתור באגים בלוח הלחם
איתור באגים בלוח הלחם
איתור באגים בלוח הלחם
איתור באגים בלוח הלחם

שלב 7: הרכבת חומרה

הרכבת חומרה
הרכבת חומרה
הרכבת חומרה
הרכבת חומרה
הרכבת חומרה
הרכבת חומרה

שלב 8: עיצוב דיור אלקטרוניקה ב- Adobe Illustrator

עיצוב דיור אלקטרוניקה ב- Adobe Illustrator
עיצוב דיור אלקטרוניקה ב- Adobe Illustrator

שלב 9: אב טיפוס מקרטון

אב טיפוס מקרטון
אב טיפוס מקרטון
אב טיפוס מקרטון
אב טיפוס מקרטון

שלב זה משמש לאישור גודל המארז וכל פיסת הדגם, וודא כי גודל התיבה ומיקום הכפתור ומיקום ה- LED מתאימים לרכיבים האלקטרוניים המורכבים.

שלב 10: אב טיפוס של דיקט ליבנה

אב טיפוס של דיקט ליבנה
אב טיפוס של דיקט ליבנה
אב טיפוס של דיקט ליבנה
אב טיפוס של דיקט ליבנה

זה היה אב הטיפוס הראשוני. לבסוף נוסף לאחד החלקים חור מרובע לחיבור למטען.

מוּמלָץ: