Raspberry Pi3 GPS 연동

1. 하드웨어 연결 및 설정
1) 하드웨어 연결
– GPS 연동을 위하여 NEO-6M 모듈을 이용하였다.
– NEO-6M을 라즈베리파이에 연결하기 위해서 NEO-6M의 핀을 다음과 같이 꽂으면 된다.

NEO-6M 라즈베리파이3
VCC PIN01(3.3v)
RX PIN10(GPIO15)
TX PIN08(GPIP14)
GND PIN14

2) 라즈베리파이 설정
GPS를 시리얼로 연결하귀 위해 다음과 같이 설정을 수정한다.
– cmdline.txt 파일 수정

sudo vi /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=tty1 root=PARTUUID=53707d2f-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

– 파이썬3 시리얼로 GPS 데이터를 받기 위해 시리얼모듈 설치

sudo apt-get install python3-serial

2. NMEA(National Marine Electronics Association) 프로토콜 분석
GPS 모듈을 연결하면 문자열로 된 GPS 데이터가 넘어오는데 이를 NMEA 데이터라 하고,
우리는 이 포맷을 파싱하여 필요한 데이터만 가져다 사용하면 된다.
NMEA의 섹션의 다음과 같다. 하지만 대부분 GPCGA와 GPRMC만 이용하게 된다.

1) $GPGGA: Global Positioning System Fix Data의 약어로 시간 및 경위도 좌표를 구할때 주로 쓰인다.

    Ex) $GPGGA,103022.132,3735.0079,N,12701.6446,E,1,04,5.4,50.1,M,20.6,M,0.0,0000*48
       - 103022.132: 시간
       - 3735.0079 : 위도
       - N은 북위
       - 12701.6446 : 경도
       - E : 동경
       - 1 : Fix의 종류 [0 : 위성이 안 잡혀 Invalid, 1 : GPS에서 제공하는 기본 위성을 가지고만 계산할 경우, 2 : DGPS를 이용하여 보정하여 계산할 경우)
       - '04':  계산에 사용한 위성을 개수
       - '5.4': horizontal dilution of Precision
       - '50.1M' : 해수면 기준 고도
       - '20.6M' : WGS-84에서 정해놓은 타원체로서 모델링한 지구와 구체로서 모델링된 지구의 고도차이
       - '0.0'과 '0000' : DGPS 사용시 마지막으로 update한 시간과 DGPS 기지국의 ID
       - '48': Check Sum

2) $GPRMC: Recommended minimum specific GPS/Transit data의 약어로 최소한의 데이터가 들어오게 되는데 날자가 들어오므로
주로 날짜를 구하기 위해 사용된다.

   EX) $GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A
       - 114455.532: 시간
       - A : GPS 신호의 신뢰성[A: 신뢰, V : 미신뢰]
       - 3735.0079: 위도
       - N : 북위
       - 12701.6446 : 경도
       - E : 동경
       - '0.000000' : Speed over ground로서 knots 단위의 속도- air speed의 약자이다. km/h로 변환시 대략 1.8을 곱한다.
       - '121.61': 방향 
       - '110706' : 날짜
       - ' ' : Magnetic Variation나침반
       - '*0A': 체크섬

3) $GPGSV: GPS satellites in view의 약어로 현재 GPS Module이 수신할 수 있는 모든 위성의 정보를 출력한다.
4) $GPGSA: GPS DOP and active satellites

3. 파이썬을 이용한 NMEA 파싱

1) $GPRMC의 파싱
– GPMRC의 경우 최소한의 정보가 모두 들어오지만, 그중에 제일 중요한것은 날짜가 들어온다는 것이다. 그리고
날짜는 UTC시간이므로 반드시 Locale시간으로 변환해서 사용해야 한다.
– 속도의 경우 단위는 Knots이므로 Km/h로 환산하려면 반드시 * 1.852을 해야 한다.
– 다음은 GPRMC를 파싱한 파이썬 소스 예제이다.

2) $GPGGA의 파싱
– GPGGA는 시간, 경위도, 고도등의 모든 데이터가 들어오기때문에 주의를 기울여 파싱할 필요가 있다. \
– 시간의 경우, UTC시간이므로 Locale 시간으로 변환해서 사용해야 한다.