- ส่วนประกอบที่จำเป็น
- การรับข้อมูลตำแหน่งจาก GPS
- แผนภูมิวงจรรวม
- ขั้นตอนในการเชื่อมต่อ GPS กับไมโครคอนโทรลเลอร์ AVR
- คำอธิบายรหัส
โมดูลGPSใช้กันอย่างแพร่หลายในแอพพลิเคชั่นอิเล็กทรอนิกส์เพื่อติดตามตำแหน่งตามพิกัดลองจิจูดและละติจูด ระบบติดตามยานพาหนะนาฬิกา GPS ระบบแจ้งเตือนการตรวจจับอุบัติเหตุการนำทางจราจรระบบเฝ้าระวัง ฯลฯ เป็นตัวอย่างบางส่วนที่จำเป็นต้องใช้ฟังก์ชัน GPS GPS ให้ระดับความสูงละติจูดลองจิจูดเวลา UTC และข้อมูลอื่น ๆ อีกมากมายเกี่ยวกับตำแหน่งนั้น ๆ ซึ่งนำมาจากดาวเทียมมากกว่าหนึ่งดวง ในการอ่านข้อมูลจาก GPS จำเป็นต้องใช้ไมโครคอนโทรลเลอร์ดังนั้นที่นี่เราจึงเชื่อมต่อโมดูล GPS กับไมโครคอนโทรลเลอร์ AVR Atmega16และพิมพ์ลองจิจูดและละติจูดบนจอ LCD 16x2
ส่วนประกอบที่จำเป็น
- Atmega16 / 32
- โมดูล GPS (uBlox Neo 6M GPS)
- สายอากาศยาว
- 16x2 LCD
- 2.2k ตัวต้านทาน
- ตัวเก็บประจุ 1000uf
- ตัวเก็บประจุ 10uF
- สายเชื่อมต่อ
- LM7805
- แจ็ค DC
- อะแดปเตอร์ 12v DC
- Burgstips
- PCB หรือ PCB สำหรับวัตถุประสงค์ทั่วไป
Ublox Neo 6M เป็นโมดูล GPS แบบอนุกรมที่ให้รายละเอียดตำแหน่งผ่านการสื่อสารแบบอนุกรม มีสี่หมุด
พิน |
คำอธิบาย |
Vcc |
แหล่งจ่ายไฟ 2.7 - 5V |
Gnd |
พื้น |
TXD |
ส่งข้อมูล |
RXD |
รับข้อมูล |
โมดูล GPS Ublox neo 6M สามารถใช้งานร่วมกับ TTL ได้และมีการระบุข้อมูลจำเพาะด้านล่าง
จับเวลา |
เริ่มเย็น: 27 วินาทีเริ่มร้อน: 1 วินาที |
โปรโตคอลการสื่อสาร |
NMEA |
การสื่อสารแบบอนุกรม |
9600bps, 8 บิตข้อมูล, 1 บิตหยุด, ไม่มีความเท่าเทียมกันและไม่มีการควบคุมการไหล |
กระแสไฟฟ้าที่ใช้งาน |
45mA |
การรับข้อมูลตำแหน่งจาก GPS
โมดูล GPS จะส่งข้อมูลในหลาย ๆ สตริงที่ 9600 Baud Rate หากเราใช้เทอร์มินัล UART ที่มีอัตรารับส่งข้อมูล 9600 เราสามารถดูข้อมูลที่ GPS ได้รับ
โมดูล GPS ส่งข้อมูลตำแหน่งการติดตามแบบเรียลไทม์ในรูปแบบ NMEA (ดูภาพหน้าจอด้านบน) รูปแบบ NMEA ประกอบด้วยหลายประโยคโดยมีสี่ประโยคสำคัญด้านล่าง สามารถดูรายละเอียดเพิ่มเติมเกี่ยวกับ ประโยค NMEA และรูปแบบข้อมูลได้ที่นี่
- $ GPGGA: ข้อมูลการแก้ไขระบบกำหนดตำแหน่งบนโลก
- $ GPGSV: ดาวเทียม GPS ในมุมมอง
- $ GPGSA: GPS DOP และดาวเทียมที่ใช้งานอยู่
- $ GPRMC: ข้อมูล GPS / การขนส่งขั้นต่ำที่แนะนำ
เรียนรู้เพิ่มเติมเกี่ยวกับข้อมูล GPS และสตริง NMEA ที่นี่
นี่คือข้อมูลที่ GPS ได้รับเมื่อเชื่อมต่อด้วยอัตราบอด 9600
$ GPRMC, 141848.00, A, 2237.63306, N, 08820.86316, E, 0.553,, 100418``, A * 73 $ GPVTG, T, M, 0.553, N, 1.024, K, A * 27 $ GPGGA, 141848.00, 2237.63306, N, 08820.86316, E, 1,03,2.56,1.9, M, -54.2, M, * 74 $ GPGSA, A, 2,06,02,05,,,,,,,,,, 2.75, 2.56,1.00 * 02 $ GPGSV, 1,1,04,02,59,316,30,05,43,188,25,06,44,022,23,25,03,324, * 76 $ GPGLL, 2237.63306, N, 08820.86316, E, 141848.00, ก, ก * 65
เมื่อเราใช้โมดูลจีพีเอส สำหรับการติดตามสถานที่ใด ๆ เราจะต้องพิกัดและเราสามารถหานี้ในสตริง เฉพาะ $ GPGGA (Global Positioning System Fix Data) โดยส่วนใหญ่จะใช้ในโปรแกรมและสตริงอื่น ๆ จะถูกละเว้น
$ GPGGA, 141848.00,2237.63306, N, 08820.86316, E, 1,03,2.56,1.9, M, -54.2, M,, * 74
ความหมายของเส้นนั้นคืออะไร?
ความหมายของบรรทัดนั้นคือ: -
1. สตริงจะขึ้นต้นด้วยเครื่องหมาย“ $” เสมอ
2. GPGGA ย่อมาจาก Global Positioning System Fix Data
3. “,” ลูกน้ำหมายถึงการแยกระหว่างสองค่า
4. 141848.00: GMT เวลาเป็น 14 (ชม.): 18 (นาที): 48 (วินาที): 00 (มิลลิวินาที)
5. 2237.63306, N: ละติจูด 22 (องศา) 37 (นาที) 63306 (วินาที) เหนือ
6. 08820.86316, E: ลองจิจูด 088 (องศา) 20 (นาที) 86316 (วินาที) ตะวันออก
7. 1: แก้ไขปริมาณ 0 = ข้อมูลไม่ถูกต้อง, 1 = ข้อมูลที่ถูกต้อง, 2 = แก้ไข DGPS
8. 03: จำนวนดาวเทียมที่รับชมในปัจจุบัน
9. 1.0: HDOP
10. 2.56, M: ระดับความสูง (ความสูงเหนือระดับน้ำทะเลเป็นเมตร)
11. 1.9, M: ความสูงของ Geoids
12. * 74: เช็คซัม
ดังนั้นเราจึงต้องการหมายเลข 5 และหมายเลข 6 เพื่อรวบรวมข้อมูลเกี่ยวกับตำแหน่งโมดูลหรือที่ตั้งของโมดูล ในโครงการนี้เราได้ใช้ห้องสมุด GPS ที่มีฟังก์ชันบางอย่างเพื่อดึงละติจูดและลองจิจูดดังนั้นเราจึงไม่ต้องกังวลเรื่องนั้น
ก่อนหน้านี้เราได้เชื่อมต่อ GPS กับไมโครคอนโทรลเลอร์อื่น ๆ:
- วิธีใช้ GPS กับ Arduino
- การสอนการเชื่อมต่อโมดูล Raspberry Pi GPS
- การเชื่อมต่อโมดูล GPS กับไมโครคอนโทรลเลอร์ PIC
- ติดตามยานพาหนะบน Google Maps โดยใช้ Arduino, ESP8266 และ GPS
ตรวจสอบโครงการที่เกี่ยวข้องกับ GPS ทั้งหมดที่นี่
แผนภูมิวงจรรวม
แผนภาพวงจรสำหรับการเชื่อมต่อ GPS กับไมโครคอนโทรลเลอร์ AVR Atemga16มีดังนี้:
ระบบทั้งหมดใช้พลังงานจากอะแดปเตอร์ DC 12v แต่วงจรทำงานที่ 5v ดังนั้นแหล่งจ่ายไฟจึงถูกควบคุมเป็น 5v โดยตัวควบคุมแรงดันไฟฟ้า LM7805 จอ LCD 16x2 ถูกกำหนดค่าในโหมด 4 บิตและการเชื่อมต่อพินจะแสดงในแผนภาพวงจร GPS ยังใช้พลังงานจาก 5v และขา tx เชื่อมต่อโดยตรงกับ Rx ของไมโครคอนโทรลเลอร์ Atmega16 ออสซิลเลเตอร์คริสตัล 8MHz ใช้เพื่อนาฬิกาไมโครคอนโทรลเลอร์
ขั้นตอนในการเชื่อมต่อ GPS กับไมโครคอนโทรลเลอร์ AVR
- ตั้งค่าคอนฟิกของไมโครคอนโทรลเลอร์ซึ่งรวมถึงคอนฟิกูเรชันออสซิลเลเตอร์
- ตั้งค่าพอร์ตที่ต้องการสำหรับ LCD รวมถึงการลงทะเบียน DDR
- เชื่อมต่อโมดูล GPS กับไมโครคอนโทรลเลอร์โดยใช้ USART
- เริ่มต้นระบบ UART ในโหมด ISR ด้วยอัตรารับส่งข้อมูล 9600 และ LCD ในโหมด 4 บิต
- ใช้อาร์เรย์อักขระสองตัวขึ้นอยู่กับความยาวของละติจูดและลองจิจูด
- รับครั้งละหนึ่งอักขระและตรวจสอบว่าเริ่มต้นจาก $ หรือไม่
- หากได้รับ $ แสดงว่าเป็นสตริงเราต้องตรวจสอบ $ GPGGA ตัวอักษร 6 ตัวนี้รวมถึง $
- หากเป็น GPGGA ให้รับสตริงที่สมบูรณ์และตั้งค่าแฟล็ก
- จากนั้นแยกละติจูดและลองจิจูดด้วยทิศทางในสองอาร์เรย์
- ในที่สุดพิมพ์อาร์เรย์ละติจูดและลองจิจูดใน LCD
คำอธิบายรหัส
โค้ดที่สมบูรณ์พร้อมวิดีโอสาธิตจะได้รับในตอนท้ายซึ่งจะมีการอธิบายบางส่วนที่สำคัญของโค้ด
ก่อนอื่นรวมส่วนหัวที่จำเป็นบางส่วนในโค้ดจากนั้นเขียน MACROS ของ bitmask สำหรับการกำหนดค่า LCD และ UART
# กำหนด F_CPU 8000000ul # รวม # รวม
ตอนนี้ประกาศและเริ่มต้นตัวแปรและอาร์เรย์สำหรับจัดเก็บสตริง GPS ลองจิจูดและแฟล็ก
ถ่าน buf; ดัชนีระเหยระเหยธง stringReceived; ถ่าน gpgga = {'$', 'G', 'P', 'G', 'G', 'A'}; ละติจูดถ่าน; ตรรกะถ่าน;
หลังจากนั้นเราก็มีฟังก์ชั่น LCD Driver เพื่อขับเคลื่อน LCD
โมฆะ lcdwrite (ถ่าน ch, ถ่าน r) { LCDPORT = ch & 0xF0; RWLow; ถ้า (r == 1) RSHigh; อื่น RSLow; สูง; _delay_ms (1); ENLow; _delay_ms (1); LCDPORT = ch << 4 & 0xF0; RWLow; ถ้า (r == 1) RSHigh; อื่น RSLow; สูง; _delay_ms (1); ENLow; _delay_ms (1); } โมฆะ lcdprint (ถ่าน * str) { while (* str) { lcdwrite (* str ++, DATA); // __ delay_ms (20); } } โมฆะ lcdbegin () { ถ่าน lcdcmd = {0x02,0x28,0x0E, 0x06,0x01}; สำหรับ (int i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
หลังจากนั้นเราได้เริ่มต้นการสื่อสารแบบอนุกรมกับ GPS และเปรียบเทียบสตริงที่ได้รับกับ "GPGGA":
เป็นโมฆะ serialbegin () { UCSRC = (1 << URSEL) - (1 << UCSZ0) - (1 << UCSZ1); UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB = (1 <
ตอนนี้ถ้าสตริงที่ได้รับจับคู่กับ GPGGA สำเร็จแล้วในฟังก์ชัน หลัก แยกและแสดงพิกัดละติจูดและลองจิจูดของตำแหน่ง:
LCDwrite (0x80,0); lcdprint ("Lat:"); serialprint ("ละติจูด:"); สำหรับ (int i = 15; i <27; i ++) { latitude = buf; lcdwrite (ละติจูด 1); Serialwrite (ละติจูด); ถ้า (i == 24) { lcdwrite ('', 1); ผม ++; } } serialprintln (""); lcdwrite (192,0); lcdprint ("บันทึก:"); serialprint ("ตรรกะ:"); สำหรับ (int i = 29; i <41; i ++) { logitude = buf; lcdwrite (ตรรกะ 1); Serialwrite (ลอจิจูด); ถ้า (i == 38) { lcdwrite ('', 1); ผม ++; } }
นี่คือวิธีที่โมดูล GPS สามารถเชื่อมต่อกับ ATmega16เพื่อค้นหาพิกัดตำแหน่ง
ค้นหาโค้ดทั้งหมดและวิดีโอการทำงานด้านล่าง