جدول المحتويات:

FinduCar: مفتاح سيارة ذكي يوجه الناس إلى مكان وقوف السيارة: 11 خطوة (بالصور)
FinduCar: مفتاح سيارة ذكي يوجه الناس إلى مكان وقوف السيارة: 11 خطوة (بالصور)

فيديو: FinduCar: مفتاح سيارة ذكي يوجه الناس إلى مكان وقوف السيارة: 11 خطوة (بالصور)

فيديو: FinduCar: مفتاح سيارة ذكي يوجه الناس إلى مكان وقوف السيارة: 11 خطوة (بالصور)
فيديو: Трактористы (комедия, реж. Иван Пырьев, 1939 г.) 2024, شهر نوفمبر
Anonim
FinduCar: مفتاح سيارة ذكي يوجه الناس إلى مكان وقوف السيارة
FinduCar: مفتاح سيارة ذكي يوجه الناس إلى مكان وقوف السيارة

من أجل حل المشكلات المذكورة أعلاه ، يقترح هذا المشروع تطوير مفتاح سيارة ذكي يمكن أن يوجه الأشخاص إلى المكان الذي أوقفوا فيه السيارة. وخطتي هي دمج GPS في مفتاح السيارة. ليست هناك حاجة لاستخدام تطبيق الهاتف الذكي لتتبع السيارة ، كل الإرشادات ستظهر فقط على مفتاح السيارة.

الخطوة 1: رسم ورقي

رسم ورقي
رسم ورقي

عندما يضغط الأشخاص على الزر لقفل السيارة ، يمكن تسجيل معلومات الموقع في وحدة التحكم الدقيقة تلقائيًا. بعد ذلك ، عندما يبدأ الأشخاص في التنقل إلى السيارة ، يضيء مؤشر LED المختلف للتوجيه إلى موضع السيارة ويظهر التردد الوامض المسافة إلى السيارة. يمكنهم بسهولة متابعة مؤشر LED الوامض والعثور على السيارة بسرعة.

الخطوة 2: قائمة الأجهزة

قائمة الأجهزة
قائمة الأجهزة

هذه هي المكونات المستخدمة في هذا المشروع. بعضها من مجموعات الجسيمات (اللوح ، الزر ، الرؤوس) ، والبعض الآخر يتم شراؤه من موقع Adafruit الرسمي (Adafruit Feather M0 ، Adafruit Ultimate GPS module ، Lpoly Battery و Coin Cell Battery) و Amazon (NeoPixel Ring - 12 RGB LED).

الخطوة 3: تصميم الدوائر

تصميم الدوائر
تصميم الدوائر

Neopixel_LED متصل برقم التعريف الشخصي 6 الخاص بـ Feather M0

يتم توصيل Button_Unlock بـ PIN 12 الخاص بـ Feather M0

يتم توصيل Button_Lock بالرقم PIN 13 الخاص بـ Feather M0

الخطوة 4: توصيل الأجهزة

اتصال الأجهزة
اتصال الأجهزة
اتصال الأجهزة
اتصال الأجهزة
اتصال الأجهزة
اتصال الأجهزة

قم بتلحيم الرؤوس باستخدام Adafruit M0 Feather ، Adafruit Ultimate GPS Featherwing. رص اللوحين معًا. يتم توصيل GPS FeatherWing بلوحة Feather M0 الخاصة بك دون أي أسلاك أخرى.

الخطوة الخامسة: تصميم البرمجيات

تصميم البرمجيات
تصميم البرمجيات

مكونات الاختبار

اقرأ فيكس

الإعداد باطل() {

Serial.println ("اختبار صدى GPS") ؛ Serial.begin (9600) ؛ Serial1.begin (9600) ؛ // البث بالباود الافتراضي NMEA GPS}

حلقة فارغة() {

إذا (Serial.available ()) {char c = Serial.read () ؛ Serial1.write (ج) ؛ } if (Serial1.available ()) {char c = Serial1.read ()؛ Serial.write (ج) ؛ }}

وميض حلقة LED

انظر أمثلة Adafruit NeoPixel.

وظائف حساب GPS

احسب السمت

// احسب السمت

سمت مزدوج (lat_a مزدوج ، lon_a مزدوج ، lat_b مزدوج ، lon_b مزدوج) {

مزدوج د = 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) ؛ د = الجذر التربيعي (1-د * د) ؛ d = cos (lat_b) * sin (lon_b-lon_a) / د ؛ د = أسين (د) * 180 / بي ؛ عودة د ؛ }

احسب الوقت على ساعة LED ، وهو أيضًا اتجاه السيارة

// احسب الوقت على ساعة LED

int led_time (زاوية مزدوجة) {

علم int = 0 ؛ إذا (الزاوية = 15) {angle_time = angle_time + 1 ؛ } if (flag == 1) {angle_time = 12 - 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 ؛ مزدوج ب = (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))) ؛ ق = ق * 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 ()؛ delay (wait)؛}}

احصل على تردد LED على أساس المسافة

// احصل على تردد LED

تردد int (مسافة مزدوجة) {

int f = مسافة (int) * 20 ؛ العودة و ؛ }

وميض مؤشر LED محدد يشير إلى اتجاه السيارة

// العرض على LED

strip.clear () ؛

عرض الشريط()؛ التأخير (التردد (السيارة_المسافة_المسافة)) ؛ // تأخير (500) ؛ strip.setPixelColor (angle_time ، strip. Color (0 ، 0 ، 255)) ؛ عرض الشريط()؛ التأخير (التردد (السيارة_المسافة_المسافة)) ؛ // تأخير (500) ؛

// تعطيل الصمام

إذا (button_flag == 1 && car_person_distance <5.0) {button_flag = 0 ؛ led_flag = 1 ؛ strip.clear () ؛ عرض الشريط()؛ }

الأساسية

# تضمين Adafruit_GPS.h # تتضمن 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 خطأ

Adafruit_GPS GPS (& GPSSerial) ؛ شريط Adafruit_NeoPixel = Adafruit_NeoPixel (Neopixel_LED_NUM و Neopixel_LED_PIN و NEO_GRB + NEO_KHZ800) ؛ زر button_lock (Button_Lock_PIN) ؛ زر button_unlock (Button_Unlock_PIN) ؛ int button_flag = 0 ؛ int led_flag = 1 ؛ uint32_t timer = مللي () ؛ car_lat مزدوج ، car_lon ؛ سيارة - شخص - مسافة مزدوجة ؛ حركة مزدوجة مزدوج car_azimuth. مزدوج car_person_angle ؛ زاوية_وقت كثافة العمليات ؛

الإعداد باطل() {

Serial.begin (115200) ؛ // Serial1.begin (9600) ؛ GPS.begin (9600) ؛ // الافتراضي NMEA GPS بالباود strip.begin () ؛ // uncomment هذا الخط لتشغيل RMC (الحد الأدنى الموصى به) و GGA (إصلاح البيانات) بما في ذلك الارتفاع GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA) ؛ // تعيين معدل التحديث GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ) ؛ // معدل تحديث 1 هرتز // طلب تحديثات على حالة الهوائي ، قم بالتعليق للحفاظ على الهدوء // GPS.sendCommand (PGCMD_ANTENNA) ؛ تأخير (1000) ؛}

حلقة باطلة () {// if (Serial.available ()) {

// char c = Serial.read () ؛ // Serial1.write (c) ؛ //} // if (Serial1.available ()) {char c = GPS.read () ؛ إذا (GPSECHO) إذا (ج) Serial.print (c) ؛ // إذا تم استلام جملة ، فيمكننا التحقق من المجموع الاختباري ، وتحليله … اصطياد الجمل الأخرى! // لذا كن حذرًا جدًا عند استخدام OUTPUT_ALLDATA وحاول طباعة البيانات Serial.println (GPS.lastNMEA ()) ؛ // يقوم هذا أيضًا بتعيين علامة NMEAreceived () الجديدة إلى false إذا (! GPS.parse (GPS.lastNMEA ())) // وهذا أيضًا يعين علامة NMEAreceived () الجديدة إلى إرجاع خاطئ ؛ // يمكننا أن نفشل في تحليل جملة وفي هذه الحالة يجب علينا فقط انتظار آخر} // إذا كان الميلي () أو المؤقت يلتف حوله ، فسنقوم بإعادة تعيينه إذا (timer> millis ()) timer = millis ()؛ if (millis () - timer> 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 ("Location:") ؛ 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 ("Angle:") ؛ 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 = مسافة (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 = السمت (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 ؛ angle_time = led_time (car_person_angle) ؛ // العرض على شريط LED واضح () ؛ عرض الشريط()؛ // التأخير (التردد (السيارة_المسافة_المسافة)) ؛ تأخير (500) ؛ strip.setPixelColor (angle_time ، strip. Color (0 ، 0 ، 255)) ؛ عرض الشريط()؛ // التأخير (التردد (السيارة_المسافة_المسافة)) ؛ تأخير (500) ؛ // تعطيل LED إذا (button_flag == 1 && car_person_distance <5.0) {button_flag = 0 ؛ led_flag = 1 ؛ strip.clear () ؛ عرض الشريط()؛ }}} //}}}

الخطوة 6: التصحيح على اللوح

التصحيح على اللوح
التصحيح على اللوح
التصحيح على اللوح
التصحيح على اللوح
التصحيح على اللوح
التصحيح على اللوح

الخطوة 7: تجميع الأجهزة

تجميع الأجهزة
تجميع الأجهزة
تجميع الأجهزة
تجميع الأجهزة
تجميع الأجهزة
تجميع الأجهزة

الخطوة 8: تصميم مسكن الإلكترونيات في Adobe Illustrator

تصميم مسكن الإلكترونيات في Adobe Illustrator
تصميم مسكن الإلكترونيات في Adobe Illustrator

الخطوة 9: نموذج من الورق المقوى

نموذج من الورق المقوى
نموذج من الورق المقوى
نموذج من الورق المقوى
نموذج من الورق المقوى

تُستخدم هذه الخطوة لتأكيد حجم الهيكل وكل قطعة من النموذج ، والتأكد من أن حجم الصندوق وموضع الزر وموضع LED يناسب المكونات الإلكترونية المجمعة.

الخطوة 10: نموذج خشب البتولا الرقائقي

نموذج البتولا الخشب الرقائقي
نموذج البتولا الخشب الرقائقي
نموذج البتولا الخشب الرقائقي
نموذج البتولا الخشب الرقائقي

كان هذا هو النموذج الأولي. تمت إضافة فتحة مربعة للتوصيل بالشاحن إلى إحدى القطع أخيرًا.

موصى به: