สารบัญ:

FinduCar: กุญแจรถอัจฉริยะที่นำทางผู้คนไปยังสถานที่จอดรถ: 11 ขั้นตอน (พร้อมรูปภาพ)
FinduCar: กุญแจรถอัจฉริยะที่นำทางผู้คนไปยังสถานที่จอดรถ: 11 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: FinduCar: กุญแจรถอัจฉริยะที่นำทางผู้คนไปยังสถานที่จอดรถ: 11 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: FinduCar: กุญแจรถอัจฉริยะที่นำทางผู้คนไปยังสถานที่จอดรถ: 11 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: Сериал - "Сваты" (1-й сезон 1-я серия) фильм комедия для всей семьи 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 เชื่อมต่อกับ PIN 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 โดยไม่ต้องใช้สายอีกต่อไป

ขั้นตอนที่ 5: การออกแบบซอฟต์แวร์

การออกแบบซอฟต์แวร์
การออกแบบซอฟต์แวร์

ส่วนประกอบทดสอบ

อ่านการแก้ไข

การตั้งค่าเป็นโมฆะ () {

Serial.println("GPS echo test"); Serial.begin(9600); Serial1.begin(9600); // ค่าเริ่มต้น NMEA GPS baud }

วงเป็นโมฆะ () {

ถ้า (Serial.available ()) { ถ่าน c = Serial.read (); Serial1.write(c); } if (Serial1.available()) { ถ่าน c = Serial1.read(); Serial.write(c); } }

ไฟ LED กะพริบตา

ดูตัวอย่าง Adafruit NeoPixel

ฟังก์ชันคำนวณ GPS

คำนวณ Azimuth

// คำนวณ Azimuth

ราบคู่ (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 = บาป(lat_a)*บาป(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; กลับ d; }

คำนวณเวลาบนนาฬิกา 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; double radLat1 = (lat_a * PI / 180.0); double radLat2 = (lat_b * PI / 180.0); ดับเบิล a = radLat1 - radLat2; ดับเบิล b = (lon_a - lon_b) * PI / 180.0; double 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 ส่องสว่างทีละดวงแสดงว่าการนำทางเริ่มต้นขึ้น

เป็นโมฆะ colorWipe (uint32_t c, uint8_t รอ) {

for(uint16_t i=0; i strip.setPixelColor(i, c); strip.show(); delay(wait); } }

รับความถี่ LED ตามระยะทาง

// รับความถี่ LED

ความถี่ int (ระยะทางสองเท่า) {

int f = (int)ระยะทาง * 20; กลับ f; }

กะพริบไฟ LED ที่ระบุทิศทางของรถ

//แสดงผลบน LED

แถบ. clear();

แถบ.show(); ล่าช้า(ความถี่(car_person_distance)); // ล่าช้า (500); strip.setPixelColor(angle_time, strip. Color(0, 0, 255)); แถบ.show(); ล่าช้า(ความถี่(car_person_distance)); // ล่าช้า (500);

//ปิดการใช้งาน LED

ถ้า (button_flag == 1 && car_person_distance < 5.0) { button_flag = 0; led_flag = 1; แถบ. clear(); แถบ.show(); }

หลัก

#รวม 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 ตัวจับเวลา = มิลลิวินาที (); รถคู่ car_lat, car_lon; car_person_distance คู่; สองครั้ง move_direction; car_azimuth คู่; รถคู่_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 Hz // ขออัปเดตเกี่ยวกับสถานะเสาอากาศ แสดงความคิดเห็นเพื่อเก็บเสียง // GPS.sendCommand(PGCMD_ANTENNA); ล่าช้า (1000);}

วงเป็นโมฆะ () {// ถ้า (Serial.available ()) {

// ถ่าน c = Serial.read(); // Serial1.write (c); // } // if (Serial1.available ()) { ถ่าน c = GPS.read (); ถ้า (GPSECHO) ถ้า (c) Serial.print (c); // หากได้รับประโยค เราสามารถตรวจสอบเช็คซัม แยกวิเคราะห์… if (GPS.newNMEAreceived()) { // สิ่งที่ยุ่งยากที่นี่คือถ้าเราพิมพ์ประโยค NMEA หรือ data // ท้ายที่สุดแล้วเราไม่ได้ฟังและ จับประโยคอื่น ๆ ! // ดังนั้นจงระวังให้มากหากใช้ OUTPUT_ALLDATA และลองพิมพ์ข้อมูล Serial.println(GPS.lastNMEA()); // สิ่งนี้ยังตั้งค่าแฟล็ก newNMEAreceived() เป็นเท็จ ถ้า (!GPS.parse(GPS.lastNMEA())) // สิ่งนี้ยังตั้งค่าแฟล็ก newNMEAreceived() เป็นการคืนค่าเท็จ // เราไม่สามารถแยกวิเคราะห์ประโยคได้ ซึ่งในกรณีนี้เราควรรออีก } // ถ้า millis() หรือ timer วนรอบ เราจะรีเซ็ตมันถ้า (timer > millis()) timer = millis(); ถ้า (มิลลิวินาที () - ตัวจับเวลา > 2000) { ตัวจับเวลา = มิลลิวินาที (); // รีเซ็ตตัวจับเวลา Serial.print("\nTime: "); Serial.print (GPS.hour, ธ.ค.); Serial.print(':'); Serial.print (GPS.minute, ธ.ค.); Serial.print(':'); Serial.print(GPS.วินาที,ธันวาคม); Serial.print('.'); Serial.println(GPS.มิลลิวินาที); Serial.print("วันที่: "); Serial.print (GPS.day, ธ.ค.); Serial.print('/'); Serial.print(GPS.เดือน ธ.ค.); Serial.print("/20"); Serial.println(GPS.ปี ธ.ค.); Serial.print("แก้ไข: "); Serial.print((int)GPS.fix); Serial.print(" คุณภาพ: "); Serial.println((int)GPS.fixquality); ถ้า (GPS.fix) { Serial.print ("ตำแหน่ง: "); Serial.print(GPS.ละติจูด, 4); Serial.print (GPS.lat); Serial.print(", "); Serial.print(GPS.ลองจิจูด, 4); Serial.println (GPS.lon); Serial.print("ตำแหน่ง (หน่วยเป็นองศา ใช้งานได้กับ Google Maps): "); Serial.print(GPS.latitudeDegrees, 4); Serial.print(", "); Serial.println(GPS.ลองจิจูดดีกรี 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.ดาวเทียม); // บันทึก GPS ของรถหาก (button_lock.read ()) { car_lat = GPS.latitudeDegrees; car_lon = GPS.longitudeDegrees; //สำหรับการดีบัก Serial.print ("carLatitude: "); Serial.println(car_lat); Serial.print("รถลองจิจูด: "); 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 = ระยะทาง (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; // บันทึก Azimuth(มุม) 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; angle_time = led_time (car_person_angle); //แสดงบนแถบ LED.clear(); แถบ.show(); // ล่าช้า (ความถี่ (car_person_distance)); ล่าช้า (500); strip.setPixelColor(angle_time, strip. Color(0, 0, 255)); แถบ.show(); // ล่าช้า (ความถี่ (car_person_distance)); ล่าช้า (500); //ปิดการใช้งาน LED ถ้า (button_flag == 1 && car_person_distance <5.0){ button_flag = 0; led_flag = 1; แถบ. clear(); แถบ.show(); } } } // } } }

ขั้นตอนที่ 6: ดีบักบน Breadboard

ดีบักบน Breadboard
ดีบักบน Breadboard
ดีบักบน Breadboard
ดีบักบน Breadboard
ดีบักบน Breadboard
ดีบักบน Breadboard

ขั้นตอนที่ 7: การประกอบฮาร์ดแวร์

การประกอบฮาร์ดแวร์
การประกอบฮาร์ดแวร์
การประกอบฮาร์ดแวร์
การประกอบฮาร์ดแวร์
การประกอบฮาร์ดแวร์
การประกอบฮาร์ดแวร์

ขั้นตอนที่ 8: การออกแบบที่อยู่อาศัยอุปกรณ์อิเล็กทรอนิกส์ใน Adobe Illustrator

การออกแบบที่อยู่อาศัยอุปกรณ์อิเล็กทรอนิกส์ใน Adobe Illustrator
การออกแบบที่อยู่อาศัยอุปกรณ์อิเล็กทรอนิกส์ใน Adobe Illustrator

ขั้นตอนที่ 9: ต้นแบบกระดาษแข็ง

ต้นแบบกระดาษแข็ง
ต้นแบบกระดาษแข็ง
ต้นแบบกระดาษแข็ง
ต้นแบบกระดาษแข็ง

ขั้นตอนนี้ใช้เพื่อยืนยันขนาดของตัวเรือนและชิ้นส่วนของรุ่นทุกชิ้น ตรวจสอบให้แน่ใจว่าขนาดกล่อง ตำแหน่งปุ่ม และตำแหน่ง LED พอดีกับชิ้นส่วนอิเล็กทรอนิกส์ที่ประกอบเข้าด้วยกัน

ขั้นตอนที่ 10: ต้นแบบไม้อัดเบิร์ช

ต้นแบบไม้อัดเบิร์ช
ต้นแบบไม้อัดเบิร์ช
ต้นแบบไม้อัดเบิร์ช
ต้นแบบไม้อัดเบิร์ช

นี่คือต้นแบบเริ่มต้น ในที่สุดรูสี่เหลี่ยมสำหรับเสียบที่ชาร์จก็ถูกเพิ่มเข้าไปในชิ้นส่วนหนึ่ง

ขั้นตอนที่ 11: ต้นแบบการประกอบขั้นสุดท้าย

แนะนำ: