สารบัญ:

ค้นหาเส้นทางของคุณด้วย GPS: 9 ขั้นตอน
ค้นหาเส้นทางของคุณด้วย GPS: 9 ขั้นตอน

วีดีโอ: ค้นหาเส้นทางของคุณด้วย GPS: 9 ขั้นตอน

วีดีโอ: ค้นหาเส้นทางของคุณด้วย GPS: 9 ขั้นตอน
วีดีโอ: ดูตำแหน่งพิกัด GPS ปัจจุบันบนมือถือง่าย ๆ Google Map 2024, กรกฎาคม
Anonim
ค้นหาเส้นทางของคุณด้วย GPS
ค้นหาเส้นทางของคุณด้วย GPS

แบบฝึกหัดทำความเข้าใจและนำข้อมูล GPS ไปใช้อย่างรวดเร็ว

  • เวลาที่ต้องการ: 2 ชั่วโมง
  • ราคา: $75–$150

สำหรับผู้ผลิต การรวมข้อมูลเชิงพื้นที่คุณภาพสูงเข้ากับโครงการอิเล็กทรอนิกส์นั้นค่อนข้างถูก และในช่วงไม่กี่ปีที่ผ่านมา โมดูลตัวรับ GPS (Global Positioning System) มีความหลากหลายมากขึ้น มีประสิทธิภาพ และง่ายต่อการรวมเข้ากับบอร์ดพัฒนา เช่น Arduino, PIC, Teensy และ Raspberry Pi หากคุณกำลังคิดที่จะสร้างโดยใช้ GPS แสดงว่าคุณได้เลือกช่วงเวลาที่ดีในการเริ่มต้นแล้ว

ขั้นตอนที่ 1: มันทำงานอย่างไร

โมดูล GPS เป็นเครื่องรับวิทยุขนาดเล็กที่ประมวลผลสัญญาณที่ออกอากาศในความถี่ที่ทราบโดยฝูงบินดาวเทียม ดาวเทียมเหล่านี้หมุนรอบโลกโดยโคจรเป็นวงกลมโดยประมาณ ส่งข้อมูลตำแหน่งและข้อมูลนาฬิกาที่แม่นยำอย่างยิ่งไปยังพื้นดินด้านล่าง หากเครื่องรับสายดินสามารถ "มองเห็น" ดาวเทียมเหล่านี้ได้เพียงพอ ก็สามารถใช้ดาวเทียมเหล่านี้ในการคำนวณตำแหน่งและระดับความสูงของดาวเทียมได้

เมื่อข้อความ GPS มาถึง ผู้รับจะตรวจสอบการประทับเวลาออกอากาศก่อนเพื่อดูว่ามีการส่งเมื่อใด เนื่องจากความเร็วของคลื่นวิทยุในอวกาศเป็นค่าคงที่ที่ทราบ (c) เครื่องรับจึงสามารถเปรียบเทียบการออกอากาศและรับเวลาเพื่อกำหนดระยะทางที่สัญญาณเดินทางได้ เมื่อมันกำหนดระยะห่างจากดาวเทียมที่รู้จักสี่ดวงขึ้นไปแล้ว การคำนวณตำแหน่งของมันเองเป็นปัญหาที่ค่อนข้างง่ายของการหาสามเหลี่ยมสามมิติ แต่การจะทำได้อย่างรวดเร็วและแม่นยำนั้น เครื่องรับจะต้องสามารถกระทืบตัวเลขอย่างฉับไวจากการสตรีมข้อมูลได้ถึง 20 รายการในคราวเดียว เนื่องจากระบบ GPS มีเป้าหมายที่เผยแพร่ว่าสามารถใช้งานได้ทุกที่บนโลก ระบบจึงต้องแน่ใจว่าดาวเทียมอย่างน้อยสี่ดวง - เด่นกว่า - มองเห็นได้ตลอดเวลาจากทุกจุดบนโลก ขณะนี้มีดาวเทียม GPS จำนวน 32 ดวงที่แสดงการเต้นรำอย่างพิถีพิถันในเมฆที่มีความสูง 20,000 กิโลเมตร

ขั้นตอนที่ 2: แฟนข้อเท็จจริง

GPS ไม่สามารถทำงานได้หากไม่มีทฤษฎีสัมพัทธภาพของไอน์สไตน์ เนื่องจากต้องทำการชดเชย 38 ไมโครวินาทีที่นาฬิกาอะตอมโคจรได้รับในแต่ละวันจากการขยายเวลาในสนามโน้มถ่วงของโลก

ขั้นตอนที่ 3: เริ่มต้นใช้งาน

เริ่มต้น
เริ่มต้น

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

สำหรับผู้เริ่มต้น โมดูล Ultimate GPS Breakout ของ Adafruit เป็นตัวเลือกที่ดี มีผลิตภัณฑ์ที่เป็นคู่แข่งกันมากมายในตลาด แต่ Ultimate เป็นผลิตภัณฑ์ที่มีประสิทธิภาพในราคาที่สมเหตุสมผล โดยมีรูทะลุขนาดใหญ่ที่บัดกรีหรือเชื่อมต่อกับเขียงหั่นขนมได้ง่าย

ขั้นแรกให้เชื่อมต่อกราวด์และพลังงาน ในแง่ของ Arduino นี่หมายถึงการเชื่อมต่อพิน GND ของไมโครคอนโทรลเลอร์ตัวใดตัวหนึ่งกับ GND ของโมดูล และพิน +5V กับ VIN ของโมดูล ในการจัดการการถ่ายโอนข้อมูล คุณต้องเชื่อมต่อพิน TX และ RX ของโมดูลกับ Arduino ด้วย ฉันจะเลือก Arduino พิน 2 (TX) และ 3 (RX) โดยพลการเพื่อจุดประสงค์นี้ แม้ว่าพิน 0 และ 1 ได้รับการออกแบบมาโดยเฉพาะสำหรับใช้เป็น "พอร์ตอนุกรมของฮาร์ดแวร์" หรือ UART ทำไม? เพราะฉันไม่ต้องการเสีย UART เพียงตัวเดียวที่โปรเซสเซอร์ AVR ระดับล่างมี UART ของ Arduino ต่อสายเข้ากับขั้วต่อ USB แบบออนบอร์ด และฉันชอบที่จะให้มันเชื่อมต่อกับคอมพิวเตอร์ของฉันเพื่อการดีบัก

ขั้นตอนที่ 4: นิ้วเท้าใน Datastream

นิ้วเท้าใน Datastream
นิ้วเท้าใน Datastream

ทันทีที่คุณใช้ไฟ โมดูล GPS จะเริ่มส่งข้อมูลข้อความบนสาย TX อาจยังไม่เห็นดาวเทียมดวงเดียว แต่มี "การแก้ไข" น้อยมาก แต่ data faucet จะทำงานทันที และน่าสนใจที่จะดูว่ามีอะไรออกมาบ้าง แบบร่างอย่างง่ายแรกของเรา (ด้านล่าง) ไม่ได้ทำอะไรนอกจากแสดงข้อมูลที่ยังไม่ได้ประมวลผลนี้

#รวม #define RXPin 2

#define TXPin 3#define GPSBaud 4800

#define ConsoleBaud 115200

// การเชื่อมต่อแบบอนุกรมกับอุปกรณ์ GPSSoftwareSerial ss(RXPin, TXPin);

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

Serial.begin(ConsoleBaud);

ss.begin(GPSBaud);

Serial.println ("ตัวอย่าง GPS 1");

Serial.println("แสดงข้อมูลดิบ NMEA ที่ส่งโดยโมดูล GPS");

Serial.println ("โดย Mikal Hart"); Serial.println();

}

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

{ if (ss.available() > 0) // เมื่อตัวละครแต่ละตัวมาถึง…

Serial.write(ss.read()); // … เขียนลงในคอนโซล

}

หมายเหตุ: ภาพร่างกำหนดขารับ (RXPin) เป็น 2 แม้ว่าเราจะกล่าวไว้ก่อนหน้านี้ว่าพินส่งสัญญาณ (TX) จะเชื่อมต่อกับพิน 2 นี่เป็นสาเหตุของความสับสน RXPin คือขารับ (RX) จากมุมมองของ Arduino โดยปกติจะต้องเชื่อมต่อกับขาส่งสัญญาณ (TX) ของโมดูลและในทางกลับกัน

อัปโหลดภาพร่างนี้และเปิด Serial Monitor ที่ 115, 200 บอด หากทุกอย่างทำงานได้ดี คุณควรเห็นสตริงข้อความที่คั่นด้วยจุลภาคที่หนาแน่นและไม่มีที่สิ้นสุด แต่ละภาพจะมีลักษณะเหมือนภาพที่สองที่จุดเริ่มต้นของย่อหน้า

สตริงที่โดดเด่นเหล่านี้เรียกว่าประโยค NMEA ซึ่งเรียกกันว่ารูปแบบนี้เนื่องจากรูปแบบนี้คิดค้นโดย National Maritime Electronics Association NMEA กำหนดจำนวนประโยคเหล่านี้สำหรับข้อมูลการนำทางตั้งแต่ข้อมูลที่จำเป็น (ตำแหน่งและเวลา) ไปจนถึงความลึกลับ (อัตราส่วนสัญญาณต่อสัญญาณรบกวนจากดาวเทียม ความแปรปรวนของแม่เหล็ก ฯลฯ) ผู้ผลิตไม่สอดคล้องกับประเภทของประโยคที่ผู้รับใช้ แต่ GPRMC เป็นสิ่งจำเป็น เมื่อโมดูลของคุณได้รับการแก้ไข คุณควรเห็นประโยค GPRMC เหล่านี้เป็นจำนวนมาก

ขั้นตอนที่ 5: ค้นหาตัวเอง

ไม่ใช่เรื่องแปลกที่จะแปลงเอาต์พุตโมดูลดิบเป็นข้อมูลที่โปรแกรมของคุณสามารถใช้ได้จริง โชคดีที่มีห้องสมุดดีๆ ให้คุณทำสิ่งนี้อยู่แล้ว ห้องสมุด Adafruit GPS ยอดนิยมของ Limor Fried เป็นตัวเลือกที่สะดวกสบายหากคุณใช้ Ultimate breakout มันถูกเขียนขึ้นเพื่อเปิดใช้งานคุณสมบัติเฉพาะของ Ultimate (เช่นการบันทึกข้อมูลภายใน) และเพิ่มเสียงระฆังและเสียงหวีดหวิวของตัวเอง อย่างไรก็ตาม ไลบรารีการแยกวิเคราะห์ที่ฉันชอบ - และแน่นอนว่าฉันไม่มีอคติโดยสิ้นเชิง - เป็นไลบรารีที่ฉันเขียนชื่อ TinyGPS++ ฉันออกแบบให้ครอบคลุม มีประสิทธิภาพ รัดกุม และใช้งานง่าย มาลองหมุนกันดู

ขั้นตอนที่ 6: การเข้ารหัสด้วย TinyGPS++

จากมุมมองของโปรแกรมเมอร์ การใช้ TinyGPS++ นั้นง่ายมาก:

1) สร้างวัตถุ gps

2) กำหนดเส้นทางอักขระแต่ละตัวที่มาจากโมดูลไปยังวัตถุโดยใช้ gps.encode()

3) เมื่อคุณต้องการทราบตำแหน่งหรือระดับความสูงหรือเวลาหรือวันที่ เพียงแค่ค้นหาวัตถุ gps

#รวม #รวม

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// การเชื่อมต่อแบบอนุกรมกับอุปกรณ์ GPSSoftwareSerial ss(RXPin, TXPin);

// วัตถุ TinyGPS++

TinyGPSPlus จีพีเอส;

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

Serial.begin(ConsoleBaud);

ss.begin(GPSBaud);

Serial.println ("ตัวอย่าง GPS 2");

Serial.println("ตัวติดตามอย่างง่ายโดยใช้ TinyGPS++");

Serial.println ("โดย Mikal Hart");

Serial.println();

}

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

// หากมีอักขระใดมาจาก GPS /

/ ส่งไปที่วัตถุ TinyGPS++

ในขณะที่ (ss.available() > 0)

gps.encode(ss.read());

// มาแสดงตำแหน่งและระดับความสูงใหม่กันเถอะ

// เมื่อใดก็ตามที่ได้รับการอัปเดต

ถ้า (gps.location.isUpdated() || gps.altitude.isUpdated())

{

Serial.print("ตำแหน่ง: ");

Serial.print(gps.location.lat(), 6);

Serial.print(", ");

Serial.print(gps.location.lng(), 6);

Serial.print(" ระดับความสูง: ");

Serial.println(gps.altitude.meters());

}

}

แอปพลิเคชันที่สองของเราแสดงตำแหน่งและความสูงของผู้รับอย่างต่อเนื่อง โดยใช้ TinyGPS++ เพื่อช่วยในการแยกวิเคราะห์ ในอุปกรณ์จริง คุณอาจบันทึกข้อมูลนี้ลงในการ์ด SD หรือแสดงบน LCD หยิบห้องสมุดแล้วสเก็ตช์ FindingYourself.ino (ด้านบน) ติดตั้งไลบรารีตามปกติในโฟลเดอร์ไลบรารี Arduino อัปโหลดภาพร่างไปยัง Arduino และเปิด Serial Monitor ที่ 115, 200 baud คุณควรเห็นการอัปเดตตำแหน่งและระดับความสูงของคุณแบบเรียลไทม์ หากต้องการดูว่าคุณยืนอยู่ตรงจุดใด ให้วางพิกัดละติจูด/ลองจิจูดที่เป็นผลลัพธ์ลงใน Google แผนที่ ต่อแล็ปท็อปของคุณแล้วออกไปเดินเล่นหรือขับรถ (แต่อย่าลืมจับตาดูถนน!)

ขั้นตอนที่ 7: "มิติที่สี่"

แม้ว่าเราจะเชื่อมโยง GPS กับตำแหน่งในอวกาศ แต่อย่าลืมว่าดาวเทียมเหล่านั้นกำลังส่งสัญญาณเวลาและวันที่ด้วยเช่นกัน นาฬิกา GPS เฉลี่ยมีความแม่นยำถึงหนึ่งในสิบล้านวินาที และขีดจำกัดทางทฤษฎีก็สูงขึ้นไปอีก แม้ว่าคุณจะต้องการให้โครงการของคุณติดตามเวลาเท่านั้น โมดูล GPS อาจยังคงเป็นโซลูชันที่ถูกที่สุดและง่ายที่สุด

หากต้องการเปลี่ยน FindingYourself.ino ให้กลายเป็นนาฬิกาที่มีความแม่นยำสูงสุด เพียงเปลี่ยนสองสามบรรทัดสุดท้ายดังนี้:

ถ้า (gps.time.isUpdated ()) {

ถ่านบัฟ[80];

sprintf(buf, "เวลาคือ %02d:%02d:%02d", gps.time.hour(), gps.time.minute(), gps.time.second()); Serial.println(buf);

}

ขั้นตอนที่ 8: ค้นหาเส้นทางของคุณ

ค้นหาทางของคุณ
ค้นหาทางของคุณ

แอปพลิเคชันที่สามและครั้งสุดท้ายของเราเป็นผลมาจากความท้าทายส่วนบุคคลในการเขียนร่าง TinyGPS++ ที่อ่านได้ โดยใช้โค้ดน้อยกว่า 100 บรรทัด ซึ่งจะนำทางผู้ใช้ไปยังปลายทางโดยใช้คำแนะนำแบบข้อความง่ายๆ เช่น "ให้ตรงไป" หรือ "เลี้ยวซ้าย"

#รวม #รวม

#define RXPin 2

#define TXPin 3

#define GPSBaud 4800

#define ConsoleBaud 115200

// การเชื่อมต่อแบบอนุกรมกับอุปกรณ์ GPSSoftwareSerial ss(RXPin, TXPin);

// วัตถุ TinyGPS++ จีพีเอส TinyGPSPlus;

LastUpdateTime แบบยาวที่ไม่ได้ลงชื่อ = 0;

#define EIFFEL_LAT 48.85823#define EIFFEL_LNG 2.29438

/* ตัวอย่างนี้แสดงกรอบพื้นฐานสำหรับวิธีที่คุณอาจใช้เส้นทางและระยะทางเพื่อนำทางบุคคล (หรือโดรน) ไปยังจุดหมายปลายทาง จุดหมายนี้คือหอไอเฟล เปลี่ยนได้ตามต้องการ

วิธีที่ง่ายที่สุดในการรับพิกัดละติจูด/ลองจิจูดคือการคลิกขวาที่ปลายทางใน Google แผนที่ (maps.google.com) แล้วเลือก "ที่นี่คืออะไร" ซึ่งจะใส่ค่าที่แน่นอนในช่องค้นหา

*/

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

Serial.begin(ConsoleBaud);

ss.begin(GPSBaud);

Serial.println ("ตัวอย่าง GPS 3");

Serial.println("ระบบคำแนะนำที่ไม่ครอบคลุม");

Serial.println ("โดย Mikal Hart");

Serial.println();

}

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

// หากมีอักขระใดมาจาก GPS // ส่งไปยังวัตถุ TinyGPS++ ในขณะที่ (ss.available() > 0) gps.encode(ss.read());

// ทุก ๆ 5 วินาที ทำการอัปเดต

ถ้า (มิลลิวินาที () - lastUpdateTime >= 5000)

{

LastUpdateTime = มิลลิวินาที ();

Serial.println();

// สร้างสถานะปัจจุบันของเรา

สองเท่า distanceToDestination = TinyGPSPlus::distanceBetween

gps.location.lat(), gps.location.lng(), EIFFEL_LAT, EIFFEL_LNG);

double courseToDestination = TinyGPSPlus::courseTo

gps.location.lat(), gps.location.lng(), EIFFEL_LAT, EIFFEL_LNG);

ถ่าน const *directionToDestination = TinyGPSPlus::cardinal(courseToDestination);

int courseChangeNeeded = (int)(360 + courseToDestination - gps.course.deg()) % 360;

// ดีบัก Serial.print ("DEBUG: Course2Dest: ");

Serial.print(courseToDestination);

Serial.print(" หลักสูตร: ");

Serial.print(gps.course.deg());

Serial.print(" Dir2Dest: ");

Serial.print (directionToDestination);

Serial.print(" RelCourse: ");

Serial.print (ต้องเปลี่ยนหลักสูตร);

Serial.print (" CurSpd: ");

Serial.println(gps.speed.kmph());

// ภายในระยะ 20 เมตรจากปลายทาง? อยู่ที่นี่

ถ้า (distanceToDestination <= 20.0)

{ Serial.println("ยินดีด้วย คุณมาถึงแล้ว!");

ทางออก(1);

}

Serial.print("DISTANCE: "); Serial.print(distanceToDestination);

Serial.println("เมตรที่จะไป.");

Serial.print("คำแนะนำ: ");

//ยืนนิ่ง? เพียงระบุทิศทางที่จะไป

ถ้า (gps.speed.kmph() < 2.0)

{

Serial.print("หัว");

Serial.print (directionToDestination);

Serial.println(".");

กลับ;

}

if (courseChangeNeeded >= 345 || courseChangeNeeded < 15) Serial.println("ตรงไปข้างหน้า!");

อื่นถ้า (courseChangeNeeded >= 315 && courseChangeNeeded < 345)

Serial.println("เบี่ยงไปทางซ้ายเล็กน้อย");

อื่นถ้า (courseChangeNeeded >= 15 && courseChangeNeeded < 45)

Serial.println("เบี่ยงไปทางขวาเล็กน้อย");

อื่นถ้า (courseChangeNeeded >= 255 && courseChangeNeeded < 315)

Serial.println("เลี้ยวซ้าย");

อื่นถ้า (courseChangeNeeded >= 45 && courseChangeNeeded < 105)

Serial.println("เลี้ยวขวา");

อื่น

Serial.println("พลิกกลับอย่างสมบูรณ์");

}

}

รหัสทุก ๆ 5 วินาทีจะจับตำแหน่งและเส้นทางของผู้ใช้ (ทิศทางการเดินทาง) และคำนวณทิศทาง (ทิศทางไปยังปลายทาง) โดยใช้วิธีการ TinyGPS++ courseTo() การเปรียบเทียบเวกเตอร์ทั้งสองทำให้เกิดคำแนะนำให้เดินตรงหรือเลี้ยวดังที่แสดงด้านล่าง

คัดลอกสเก็ตช์ FindingYourWay.ino (ด้านบน) แล้ววางลงใน Arduino IDE ตั้งจุดหมายปลายทางห่างออกไป 1 กม. หรือ 2 กม. อัปโหลดภาพสเก็ตช์ไปยัง Arduino รันบนแล็ปท็อปของคุณ และดูว่ามันจะนำทางคุณไปที่นั่นหรือไม่ แต่ที่สำคัญกว่านั้น ศึกษาโค้ดและทำความเข้าใจวิธีการทำงาน

ขั้นตอนที่ 9: ก้าวต่อไป

ศักยภาพในการสร้างสรรค์ของ GPS นั้นมีมากมาย หนึ่งในสิ่งที่น่าพึงพอใจที่สุดที่ฉันเคยทำคือกล่องปริศนาที่เปิดใช้งาน GPS ซึ่งเปิดขึ้นที่ตำแหน่งที่ตั้งโปรแกรมไว้ล่วงหน้าเพียงแห่งเดียวเท่านั้น หากเหยื่อของคุณต้องการล็อคสมบัติไว้ข้างใน เธอต้องหาว่าสถานที่ลับนั้นอยู่ที่ไหนและนำกล่องไปที่นั่นด้วยร่างกาย แนวคิดโครงการแรกที่ได้รับความนิยมคืออุปกรณ์บันทึกประเภทหนึ่งที่บันทึกตำแหน่งนาทีต่อนาทีและระดับความสูงของนักปีนเขาที่เดินตามเส้นทาง Trans-Pennine หรือตัวติดตามแม่เหล็กตัวใดตัวหนึ่งที่ตัวแทน DEA ใน Breaking Bad ติดอยู่กับรถของคนเลวล่ะ? ทั้งสองอย่างนี้เป็นไปได้โดยสิ้นเชิงและน่าจะสนุกที่จะสร้าง แต่ผมขอแนะนำให้คุณคิดให้กว้างขึ้น นอกเหนือไปจากสิ่งที่คุณสามารถซื้อได้ใน Amazon แล้ว มันเป็นโลกใบใหญ่ที่นั่น ท่องไปให้ไกลที่สุดเท่าที่จะทำได้

แนะนำ: