GPS 모듈은 경도 및 위도 좌표를 기반으로 위치를 추적하기 위해 전자 애플리케이션에서 널리 사용됩니다. 차량 추적 시스템, GPS 시계, 사고 감지 경보 시스템, 교통 내비게이션, 감시 시스템 등은 GPS 기능이 필수적인 몇 가지 예입니다. GPS는 고도, 위도, 경도, UTC 시간 및 둘 이상의 위성에서 가져온 특정 위치에 대한 기타 많은 정보를 제공합니다. GPS에서 데이터를 읽으려면 마이크로 컨트롤러가 필요하므로 여기에서는 GPS 모듈을 AVR 마이크로 컨트롤러 Atmega16 과 인터페이스 하고 16x2 LCD 디스플레이에 경도와 위도를 인쇄합니다.
필요한 구성 요소
- Atmega16 / 32
- GPS 모듈 (uBlox Neo 6M GPS)
- 긴 와이어 안테나
- 16x2 LCD
- 2.2k 저항기
- 1000uf 커패시터
- 10uF 커패시터
- 와이어 연결
- LM7805
- DC 잭
- 12v DC 어댑터
- Burgstips
- PCB 또는 범용 PCB
Ublox Neo 6M 은 직렬 통신을 통해 위치 정보를 제공하는 직렬 GPS 모듈입니다. 4 개의 핀이 있습니다.
핀 |
기술 |
Vcc |
2.7 – 5V 전원 공급 장치 |
Gnd |
바닥 |
TXD |
데이터 전송 |
RXD |
데이터 수신 |
Ublox neo 6M GPS 모듈은 TTL과 호환되며 사양은 다음과 같습니다.
캡처 시간 |
쿨 스타트: 27 초, 핫 스타트: 1 초 |
통신 프로토콜 |
NMEA |
직렬 통신 |
9600bps, 8 데이터 비트, 1 정지 비트, 패리티 없음 및 흐름 제어 없음 |
작동 전류 |
45mA |
GPS에서 위치 데이터 가져 오기
GPS 모듈은 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 번이 필요합니다. 이 프로젝트에서 우리는 위도와 경도를 추출하는 몇 가지 기능을 제공하는 GPS 라이브러리를 사용했기 때문에 그것에 대해 걱정할 필요가 없습니다.
이전에는 GPS를 다른 마이크로 컨트롤러와 인터페이스했습니다.
- Arduino에서 GPS를 사용하는 방법
- Raspberry Pi GPS 모듈 인터페이스 자습서
- PIC 마이크로 컨트롤러와 GPS 모듈 인터페이스
- Arduino, ESP8266 및 GPS를 사용하여 Google지도에서 차량 추적
여기에서 모든 GPS 관련 프로젝트를 확인하십시오.
회로도
AVR Atemga16 마이크로 컨트롤러와 GPS 인터페이스를 위한 회로도 는 다음과 같습니다.
전체 시스템은 12v DC 어댑터로 전원이 공급되지만 회로는 5v에서 작동하므로 전원 공급 장치는 LM7805 전압 조정기에 의해 5v로 조정됩니다. 16x2 LCD는 4 비트 모드로 구성되며 핀 연결은 회로도에 나와 있습니다. GPS는 또한 5v로 구동되며 tx 핀은 Atmega16 마이크로 컨트롤러의 Rx에 직접 연결됩니다. 8MHz 수정 발진기는 마이크로 컨트롤러를 클럭하는 데 사용됩니다.
GPS를 AVR 마이크로 컨트롤러와 인터페이스하는 단계
- 오실레이터 구성을 포함하는 마이크로 컨트롤러의 구성을 설정합니다.
- DDR 레지스터를 포함한 LCD 용 원하는 포트를 설정합니다.
- USART를 사용하여 GPS 모듈을 마이크로 컨트롤러에 연결합니다.
- ISR 모드에서 9600 보오율 및 4 비트 모드의 LCD를 사용하여 시스템 UART를 초기화합니다.
- 위도 및 경도 길이에 따라 두 개의 문자 배열을 사용합니다.
- 한 번에 한 문자 비트를 수신하고 $에서 시작되는지 여부를 확인하십시오.
- $를 받으면 문자열이므로 $ GPGGA를 확인해야합니다.이 6 개의 문자는 $를 포함합니다.
- GPGGA 인 경우 전체 문자열을 수신하고 플래그를 설정합니다.
- 그런 다음 두 배열의 방향으로 위도와 경도를 추출합니다.
- 마지막으로 LCD에 위도 및 경도 배열을 인쇄합니다.
코드 설명
데모 비디오와 함께 완전한 코드가 마지막에 제공되며 여기에서는 코드의 몇 가지 중요한 부분에 대해 설명합니다.
먼저 코드에 필요한 헤더를 포함하고 LCD 및 UART 구성을위한 비트 마스크의 MACROS를 작성합니다.
#define F_CPU 8000000ul #include #include
이제 GPS 문자열, 위도 경도 및 플래그를 저장하기위한 일부 변수와 배열을 선언하고 초기화합니다.
char buf; 휘발성 char ind, flag, stringReceived; char gpgga = { '$', 'G', 'P', 'G', 'G', 'A'}; 문자 위도; 문자 로그;
그 후에 우리는 LCD를 구동하는 LCD 드라이버 기능이 있습니다.
void lcdwrite (char ch, char r) { LCDPORT = ch & 0xF0; RWLow; if (r == 1) RSHigh; 그렇지 않으면 RSLow; ENHigh; _delay_ms (1); ENLow; _delay_ms (1); LCDPORT = ch << 4 & 0xF0; RWLow; if (r == 1) RSHigh; 그렇지 않으면 RSLow; ENHigh; _delay_ms (1); ENLow; _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); }
그 후 GPS와 직렬 통신을 초기화하고 수신 된 문자열을 "GPGGA" 와 비교했습니다.
void serialbegin () { UCSRC = (1 << URSEL)-(1 << UCSZ0)-(1 << UCSZ1); UBRRH = (BAUD_PRESCALE >> 8); UBRRL = BAUD_PRESCALE; UCSRB = (1 <
이제 수신 된 문자열이 GPGGA와 성공적으로 일치하면 주 함수에서 위치의 위도와 경도 좌표를 추출하여 표시합니다.
lcdwrite (0x80,0); lcdprint ("Lat:"); serialprint ("위도:"); for (int i = 15; i <27; i ++) { 위도 = buf; lcdwrite (위도, 1); serialwrite (위도); if (i == 24) { lcdwrite ('', 1); i ++; } } serialprintln (""); lcdwrite (192,0); lcdprint ("로그:"); serialprint ("Logitude:"); for (int i = 29; i <41; i ++) { logitude = buf; lcdwrite (logitude, 1); serialwrite (logitude); if (i == 38) { lcdwrite ('', 1); i ++; } }
이것이 GPS 모듈이 ATmega16과 연결되어 위치 좌표를 찾는 방법입니다.
아래 에서 전체 코드와 작동하는 비디오를 찾으 십시오.