- Thành phần bắt buộc
- Nhận dữ liệu vị trí từ GPS
- Sơ đồ mạch
- Các bước để giao diện GPS với Vi điều khiển AVR
- Giải thích mã
Mô-đun GPS được sử dụng rộng rãi trong các ứng dụng điện tử để theo dõi vị trí dựa trên tọa độ kinh độ và vĩ độ. Hệ thống theo dõi xe, Đồng hồ GPS, Hệ thống Cảnh báo Phát hiện Tai nạn, điều hướng giao thông, hệ thống giám sát, v.v. là một số ví dụ mà chức năng GPS là cần thiết. GPS cung cấp Cao độ, Vĩ độ, Kinh độ, giờ UTC và nhiều thông tin khác về vị trí cụ thể, được lấy từ nhiều vệ tinh. Để đọc dữ liệu từ GPS, cần có bộ vi điều khiển, vì vậy ở đây chúng tôi đang giao tiếp mô-đun GPS với bộ vi điều khiển AVR Atmega16 và in kinh độ và vĩ độ trên màn hình LCD 16x2.
Thành phần bắt buộc
- Atmega16 / 32
- Mô-đun GPS (uBlox Neo 6M GPS)
- Antenna dây dài
- LCD 16x2
- Điện trở 2,2k
- Tụ 1000uf
- Tụ điện 10uF
- Kết nối dây
- LM7805
- DC Jack
- Bộ chuyển đổi DC 12v
- Burgstips
- PCB hoặc Mục đích chung PCB
Ublox Neo 6M là một mô-đun GPS nối tiếp cung cấp thông tin chi tiết về vị trí thông qua giao tiếp nối tiếp. Nó có bốn chân.
Ghim |
Sự miêu tả |
Vcc |
Nguồn điện 2.7 - 5V |
Gnd |
Đất |
TXD |
Chuyển dữ liệu |
RXD |
Nhận dữ liệu |
Mô-đun GPS Ublox neo 6M tương thích với TTL và thông số kỹ thuật của nó được đưa ra bên dưới.
Nắm bắt thời gian |
Khởi động nguội: 27 giây, Khởi động nóng: 1 giây |
Giao thức truyền thông |
NMEA |
Truyền thông nối tiếp |
9600bps, 8 bit dữ liệu, 1 bit dừng, không có tính chẵn lẻ và không có điều khiển luồng |
Hoạt động hiện tại |
45mA |
Nhận dữ liệu vị trí từ GPS
Mô-đun GPS sẽ truyền dữ liệu theo nhiều chuỗi với tốc độ 9600 Baud. Nếu chúng tôi sử dụng thiết bị đầu cuối UART với tốc độ 9600 Baud, chúng tôi có thể thấy dữ liệu nhận được bằng GPS.
Mô-đun GPS gửi dữ liệu vị trí theo dõi Thời gian thực ở định dạng NMEA (xem ảnh chụp màn hình ở trên). Định dạng NMEA bao gồm một số câu, trong đó bốn câu quan trọng được đưa ra dưới đây. Bạn có thể xem thêm chi tiết về câu NMEA và định dạng dữ liệu của nó tại đây.
- $ GPGGA: Dữ liệu sửa chữa hệ thống định vị toàn cầu
- $ GPGSV: Các vệ tinh GPS trong chế độ xem
- $ GPGSA: GPS DOP và các vệ tinh đang hoạt động
- $ GPRMC: Dữ liệu GPS / Phương tiện công cộng tối thiểu được đề xuất
Tìm hiểu thêm về dữ liệu GPS và chuỗi NMEA tại đây.
Đây là dữ liệu nhận được bằng GPS khi kết nối với tốc độ 9600 baud.
$ 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, A, A * 65
Khi chúng tôi sử dụng mô-đun GPS để theo dõi bất kỳ vị trí nào, chúng tôi chỉ cần tọa độ và chúng tôi có thể tìm thấy điều này trong chuỗi $ GPGGA. Chỉ chuỗi $ GPGGA (Dữ liệu sửa chữa hệ thống định vị toàn cầu) chủ yếu được sử dụng trong các chương trình và các chuỗi khác bị bỏ qua.
$ GPGGA, 141848.00,2237,63306, N, 08820.86316, E, 1,03,2.56,1,9, M, -54,2, M,, * 74
Ý nghĩa của dòng đó là gì?
Ý nghĩa của dòng đó là: -
1. Chuỗi luôn bắt đầu bằng dấu "$"
2. GPGGA là viết tắt của Global Positioning System Fix Data
3. Dấu phẩy “,” cho biết khoảng cách giữa hai giá trị
4. 141848.00: Giờ GMT là 14 (giờ): 18 (phút): 48 (giây): 00 (mili giây)
5. 2237,63306, N: Vĩ độ 22 (độ) 37 (phút) 63306 (giây) Bắc
6. 08820.86316, E: Kinh độ 088 (độ) 20 (phút) 86316 (giây) Đông
7. 1: Sửa Số lượng 0 = dữ liệu không hợp lệ, 1 = dữ liệu hợp lệ, 2 = sửa DGPS
8. 03: Số lượng vệ tinh đang xem.
9. 1.0: HDOP
10. 2,56, M: Độ cao (Độ cao trên mực nước biển tính bằng mét)
11. 1.9, M: Chiều cao Geoids
12. * 74: tổng kiểm tra
Vì vậy, chúng ta cần số 5 và số 6 để thu thập thông tin về vị trí mô-đun hoặc vị trí của nó. Trong dự án này, chúng tôi đã sử dụng Thư viện GPS cung cấp một số chức năng để trích xuất vĩ độ và kinh độ nên chúng tôi không phải lo lắng về điều đó.
Trước đây chúng tôi đã giao diện GPS với các bộ vi điều khiển khác:
- Cách sử dụng GPS với Arduino
- Hướng dẫn giao diện mô-đun GPS Raspberry Pi
- Giao diện mô-đun GPS với Vi điều khiển PIC
- Theo dõi xe trên Google Maps bằng Arduino, ESP8266 & GPS
Kiểm tra tất cả các dự án liên quan đến GPS tại đây.
Sơ đồ mạch
Sơ đồ mạch cho giao tiếp GPS với vi điều khiển AVR Atemga16 được đưa ra dưới đây:
Toàn bộ hệ thống được cấp nguồn bằng Bộ chuyển đổi DC 12v, nhưng các mạch hoạt động trên 5v nên nguồn điện được điều chỉnh thành 5v bởi bộ điều chỉnh điện áp LM7805. Màn hình LCD 16x2 được cấu hình ở chế độ 4 bit và các kết nối chân của nó được hiển thị trong sơ đồ mạch. GPS cũng được cung cấp bởi 5v và chân tx của nó được kết nối trực tiếp với Rx của vi điều khiển Atmega16. Bộ dao động tinh thể 8MHz được sử dụng để tạo xung nhịp cho bộ vi điều khiển.
Các bước để giao diện GPS với Vi điều khiển AVR
- Đặt cấu hình của bộ vi điều khiển bao gồm cấu hình Bộ tạo dao động.
- Đặt cổng mong muốn cho LCD bao gồm thanh ghi DDR.
- Kết nối mô-đun GPS với bộ vi điều khiển bằng USART.
- Khởi tạo UART hệ thống ở chế độ ISR, với tốc độ truyền 9600 và LCD ở chế độ 4bit.
- Lấy hai mảng ký tự tùy thuộc vào Độ dài của Vĩ độ và Kinh độ.
- Nhận từng bit một ký tự tại một thời điểm và kiểm tra xem nó có được bắt đầu từ $ hay không.
- Nếu nhận được $ thì đó là một chuỗi, chúng ta cần kiểm tra $ GPGGA, 6 chữ cái này bao gồm cả $.
- Nếu đó là GPGGA, thì hãy nhận chuỗi hoàn chỉnh và đặt cờ.
- Sau đó trích xuất vĩ độ và kinh độ với các hướng trong hai mảng.
- Cuối cùng là in các mảng kinh độ và vĩ độ trong LCD.
Giải thích mã
Mã hoàn chỉnh với video Trình diễn được đưa ra ở cuối, ở đây một số phần quan trọng của mã được giải thích.
Trước hết bao gồm một số tiêu đề bắt buộc trong mã và sau đó viết MACROS của mặt nạ bit cho cấu hình LCD và UART.
#define F_CPU 8000000ul #include #include
Bây giờ khai báo và khởi tạo một số biến và mảng để lưu chuỗi GPS, kinh độ vĩ độ và cờ.
char buf; biến char ind, flag, stringReceive; char gpgga = {'$', 'G', 'P', 'G', 'G', 'A'}; vĩ độ char; char logitude;
Sau đó, chúng ta có một số chức năng LCD Driver để điều khiển màn hình LCD.
void lcdwrite (char ch, char r) { LCDPORT = ch & 0xF0; RWLow; if (r == 1) RSHigh; khác RSLow; ENHigh; _delay_ms (1); THẤP; _delay_ms (1); LCDPORT = ch << 4 & 0xF0; RWLow; if (r == 1) RSHigh; khác RSLow; ENHigh; _delay_ms (1); THẤP; _delay_ms (1); } void lcdprint (char * str) { while (* str) { lcdwrite (* str ++, DATA); // __ delay_ms (20); } } void lcdbegin () { char lcdcmd = {0x02,0x28,0x0E, 0x06,0x01}; for (int i = 0; i <5; i ++) lcdwrite (lcdcmd, CMD); }
Sau đó, chúng tôi khởi tạo giao tiếp nối tiếp với GPS và so sánh chuỗi nhận được với "GPGGA":
void serialbegin () { UCSRC = (1 << URSEL) - (1 << UCSZ0) - (1 << UCSZ1); UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB = (1 <
Bây giờ nếu chuỗi đã nhận được khớp thành công với GPGGA thì trong chức năng chính sẽ trích xuất và hiển thị tọa độ kinh độ và vĩ độ của vị trí:
lcdwrite (0x80,0); lcdprint ("Lat:"); serialprint ("Vĩ độ:"); for (int i = 15; i <27; i ++) { latitude = buf; lcdwrite (vĩ độ, 1); serialwrite (vĩ độ); if (i == 24) { lcdwrite ('', 1); i ++; } } serialprintln (""); lcdwrite (192,0); lcdprint ("Nhật ký:"); serialprint ("Logitude:"); for (int i = 29; i <41; i ++) { logitude = buf; lcdwrite (logitude, 1); ghi tuần tự (logitude); if (i == 38) { lcdwrite ('', 1); i ++; } }
Vì vậy, đây là cách mô-đun GPS có thể được giao tiếp với ATmega16 để tìm tọa độ vị trí.
Tìm mã hoàn chỉnh và video làm việc bên dưới.