GPS는 Global Positioning System의 약식입니다. 2, 3, 4 개 이상의 위성에서 가져온 정확한 고도, 위도, 경도, UTC 시간 및 더 많은 정보를 제공하는 시스템입니다. GPS에서 데이터를 읽으려면 마이크로 컨트롤러가 필요하며 이미 GPS를 Arduino 및 Raspberry Pi와 인터페이스했습니다.
U-blox에서 만든 G7020 GPS 모듈 을 선택 했습니다. 위성으로부터 특정 위치의 경도와 위도를 수신하고 16x2 문자 LCD에 동일하게 표시합니다. 그래서 여기서는 마이크로 칩으로 GPS를 PIC16F877A 마이크로 컨트롤러와 인터페이스 할 것 입니다.
필요한 구성 요소:
- Pic16F877A – PDIP40 패키지
- 브레드 보드
- Pickit-3
- 5V 어댑터
- LCD JHD162A
- uBLOX-G7020 GPS 모듈
- 주변 장치를 연결하는 전선.
- 4.7k 저항기
- 10k 냄비
- 20mHz 크리스탈
- 2 개의 33pF 세라믹 커패시터
회로도 및 설명:-
16x2 문자 LCD는 PIC16F877A 마이크로 컨트롤러에 연결되며, 여기서 RB0, RB1, RB2는 각각 RS, R / W 및 E 인 LCD 핀에 연결됩니다. RB4, RB5, RB6 및 RB7은 LCD의 4 핀 D4, D5에 연결됩니다., D6, D7. LCD는 4 비트 모드 또는 니블 모드로 연결됩니다. LCD와 PIC 마이크로 컨트롤러의 인터페이스에 대해 자세히 알아보십시오.
33pF의 세라믹 커패시터 2 개가 OSC1 및 OSC2 핀에 연결된 20MHz의 수정 발진기입니다. 마이크로 컨트롤러에 일정한 20MHz 클록 주파수를 제공합니다.
uBlox-G7020 GPS 모듈, UART를 사용하여 데이터를 송수신합니다. PIC16F877A는 칩 내부에 하나의 USART 드라이버로 구성되며 USART에 의해 GPS 모듈에서 데이터를 수신하므로 마이크로 컨트롤러 Rx 핀에서 GPS의 Tx 핀과 GPS의 전송 핀을 통해 연결된 USART 수신 핀으로 교차 연결됩니다.
uBlox-G7020에는 핀에 대한 색상 코드가 있습니다. 양극 또는 5V 핀은 빨간색, 음극 또는 GND 핀은 검은 색, 전송 핀은 파란색입니다.
이 모든 것을 브레드 보드에 연결했습니다.
GPS에서 위치 데이터 가져 오기:
USART를 사용하여 GPS를 인터페이스하는 방법과 결과를 16x2 문자 LCD로 확인하겠습니다.
모듈은 9600 Baud Rate로 여러 문자열로 데이터를 전송합니다. 9600 Baud rate의 UART 단말기를 사용하면 GPS에서 수신 한 데이터를 볼 수 있습니다.
GPS 모듈 은 NMEA 형식으로 실시간 추적 위치 데이터를 전송합니다 (위 스크린 샷 참조). NMEA 형식은 여러 문장으로 구성되며, 아래에 4 개의 중요한 문장이 있습니다. NMEA 문장 및 데이터 형식 에 대한 자세한 내용은 여기에서 찾을 수 있습니다.
- $ GPGGA: 글로벌 포지셔닝 시스템 수정 데이터
- $ GPGSV: GPS 위성보기
- $ GPGSA: GPS DOP 및 활성 위성
- $ GPRMC: 권장되는 최소 특정 GPS / 대중 교통 데이터
여기에서 GPS 데이터 및 NMEA 문자열에 대해 자세히 알아보십시오.
이것은 9600 전송 속도로 연결되었을 때 GPS에서 수신 한 데이터입니다.
$ 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
위치를 추적 하기 위해 GPS 모듈 을 사용할 때 좌표 만 필요하며 $ GPGGA string에서 찾을 수 있습니다. $ 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 (hr): 18 (min): 48 (sec): 00 (ms)
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 번이 필요합니다.
PIC 마이크로 컨트롤러와 GPS 인터페이스 단계:-
- 오실레이터 구성을 포함하는 마이크로 컨트롤러의 구성을 설정합니다.
- TRIS 레지스터를 포함하여 LCD에 대한 원하는 포트를 설정합니다.
- USART를 사용하여 GPS 모듈을 마이크로 컨트롤러에 연결합니다.
- 9600 전송 속도 및 4 비트 모드의 LCD를 사용하여 연속 수신 모드에서 시스템 USART를 초기화합니다.
- 위도 및 경도 길이에 따라 두 개의 문자 배열을 사용합니다.
- 한 번에 한 문자 비트를 수신하고 $에서 시작되는지 여부를 확인하십시오.
- $ Receive이면 문자열 인 경우 GPGGA,이 5 개의 문자 및 쉼표를 확인해야합니다.
- GPGGA이면 시간을 건너 뛰고 위도와 경도를 찾습니다. N (북쪽)과 E (동쪽)가 수신되지 않을 때까지 위도와 경도를 두 문자 배열에 저장합니다.
- LCD에 배열을 인쇄합니다.
- 어레이를 지 웁니다.
코드 설명:
코드를 한 줄씩 살펴 보겠습니다. 처음 몇 줄은 이전 자습서에서 설명한 구성 비트를 설정하기위한 것이므로 지금은 건너 뛰겠습니다. 전체 코드는이 튜토리얼의 끝에 제공됩니다.
이 다섯 줄은 라이브러리 헤더 파일을 포함하는 데 사용되며 lcd.h 및 eusart.h 는 각각 LCD 및 USART 용입니다. 그리고 xc.h는 마이크로 컨트롤러의 헤더 파일입니다.
#포함
에서는 무효 메인 () 함수는 system_init () ; 기능은 LCD 및 USART를 초기화하는 데 사용됩니다.
Void main (void) { TRISB = 0x00; // 출력으로 설정 system_init ();
lcd_init (); 그리고 EUSART_Intialize (); 두 라이브러리 lcd.h 및 eusart.h 에서 호출됩니다.
무효 system_init (무효) { lcd_init (); // LCD를 초기화합니다 . EUSART1_Initialize (); // 이것은 Eusart를 초기화합니다 }
년 동안 우리는 경도와 위도 좌표를 얻을 수있는 GPGGA 문자열을 중단 루프. 우리는 한 번에 하나의 비트를 수신하고 GPGGA 문자열에있는 개별 문자와 비교합니다.
우리는 우리가 얻을 코드를 깨뜨립니다.
earnr_data = EUSART1_Read (); // '$ GPGGA'문자열 확인 / * ------------------------------ GPGGA 줄을 단계별로 찾기- --------------------------- * / if (incomer_data == '$') {// GPS 데이터의 첫 번째 문장은 $ sign earnr_data = EUSART1_Read (); // 첫 번째가 참이면 다음 단계 if (incomer_data == 'G') { comer_data = EUSART1_Read (); if (incomer_data == 'P'); { 소득원 _ 데이터 = EUSART1_Read (); if (incomer_data == 'G'); { 소득원 _ 데이터 = EUSART1_Read (); if (incomer_data == 'G') { comer_data = EUSART1_Read (); if (incomer_data == 'A') { comer_data = EUSART1_Read (); if (incomer_data == ',') {// 먼저, 수신 됨 earnr_data = EUSART1_Read (); //이 단계에서 최종 체크인이 완료되면 GPGGA가 발견됩니다.
이 코드를 사용하면 UTC 시간을 건너 뜁니다.
while (incomer_data! = ',') {// GMT 시간을 건너 뜁니다. earnr_data = EUSART1_Read (); }
이 코드는 위도 및 경도 데이터를 문자 배열에 저장하기위한 것입니다.
earnr_data = EUSART1_Read (); 위도 = 소득원 _ 데이터; while (incomer_data! = ',') { for (array_count = 1; incomer_data! = 'N'; array_count ++) { comer_data = EUSART1_Read (); latitude = incomer_data; // Latitude 데이터 저장 } earnr_data = EUSART1_Read (); if (incomer_data == ',') { for (array_count = 0; incomer_data! = 'E'; array_count ++) { comer_data = EUSART1_Read (); longitude = incomer_data; // 경도 데이터 저장 } }
마지막으로 LCD에 경도와 위도를 인쇄했습니다.
array_count = 0; lcd_com (0x80); // LCD 라인 1 개 선택 while (array_count <12) {// Latitude 데이터 배열은 11 자리입니다. lcd_data (latitude); // Latitude 데이터를 인쇄합니다 . array_count ++; } array_count = 0; lcd_com (0xC0); // Lcd 라인 2 개 선택 while (array_count <13) {// 경도 데이터 배열은 12 자리입니다. lcd_data (longitude); // 경도 데이터를 인쇄합니다 . array_count ++; }
이것은 GPS 모듈을 PIC 마이크로 컨트롤러와 인터페이스 하여 현재 위치의 위도와 경도를 얻는 방법입니다.
완전한 코드와 헤더 파일은 다음과 같습니다.