본문 바로가기
작업/Rasp & Arduino

GPS 센서 NEO-6M 연결하기 (라즈베리파이)

 

 

이전 글에는 "아두이노" 기준으로 GPS 모듈인 NEO-6M을 연결했었습니다.

 

 

https://zifmfmphantom.tistory.com/117

 

GPS 센서 NEO-6M 연결하기 (아두이노, 라즈베리파이)

GPS(Global Positioning System)은 현재의 위치정보를 획득하는 용도로 사용합니다. 아두이노와 라즈베리파이에서 사용 가능한 GPS 센서인 NEO-6M을 사용하여 위치정보를 얻어보았습니다. 이번 글은 아두

zifmfmphantom.tistory.com

 

 

이번 글은 "라즈베리파이" 기준으로 GPS를 연결하는 과정을 적어보았습니다.

아두이노보다 설정해야 할 것이 많아서 최대한 자세히 작성하겠습니다.

 

 

목차

 

1. NEO-6M 제품 사양(Specification)과 회로 연결

2. 라즈베리파이 UART(Serial) 인터페이스 설정

3. GPS 관련 패키지 설치 및 확인

4. GPS 데이터 확인

5. 오류에 대한 수동 설정 (값이 안나오는 경우)

 

 

 


NEO-6M 제품 사양(Specification)과 회로 연결

 

 

NEO-6M 제품 구성

 

 

 

일반적으로 NEO-6M을 구매하시면 회로판(좌측)과 안테나(우측)로 구성된 제품을 받을 수 있습니다.

 

여기서 중요한 것은 회로판에 핀 헤더가 포함되어 있지 않기 때문에

아두이노(또는 라즈베리파이)와 연결하기 위해서는 별도로 핀 헤더를 구매해서 납땜을 해야 합니다.



 

Supply Voltage: 3.3 – 5V Module Size: 35 x 26 x 3mm
Antena Size: 50 x 25mm
UART Interface Baud Late: 9600bps

 

 

라즈베리파이 회로 연결

VCC 3.3V
GND GND
Rx GPIO14(Tx)
Tx GPIO15(Rx) 

 

 

라즈베리파이의 안정적인 작동을 위해서는 3.3V 전원 연결을 해야 합니다.

 

아두이노 호환 모듈에서는 5V에서만 작동하는 것을 볼 수 있는데,

이런 경우에는 라즈베리파이에서 전압 분배를 통해 3.3V로 변환시켜야 합니다.

 

 

다행히도 NEO-6M은 3.3V, 5V 모두 호환되기 때문에 VCC를 3.3V에 바로 연결하면 됩니다.

 

 

NEO-6M은 UART(Universal asynchronous receiver/transmitter [범용 비동기화 송수신기]) 통신입니다.

흔히 시리얼 통신(Serial [직렬])으로 불리며 Tx, Rx 교차를 통해 데이터를 주고받는 방식입니다. 

 

 

 

"교차"로 연결해야 하므로 모듈의 Rx는 라즈베리파이의 Tx,

모듈의 Tx는 라즈베리파이의 Rx에 연결해야 합니다.

 

(출처) https://wikidocs.net/3172

 

라즈베리파이에서는 UART 통신 전용 핀이 GPIO14, GPIO15에 배치되어 있습니다.

GPIO14에 모듈의 Rx, GPIO15에 모듈의 Tx를 연결합니다.

 

 


라즈베리파이 UART(Serial) 인터페이스 설정

 

이제 라즈베리파이를 작동시켜서 UART 통신을 위한 설정을 진행합니다.

 

 

라즈베리파이의 UART는 miniUART, PL011을 지원합니다.

일반적으로 UART를 통해 외부 콘솔 장비와 연결하거나 블루투스 모듈 활성화에 사용합니다.

여기서 GPIO14. GPIO15는 miniUART에 해당하며 연결 확인은 아래의 표와 같습니다.

 

 

라즈베리파이 UART 기본값

Model UART0 (First PL011) miniUART
Raspberry Pi 3 secondary (Bluetooth) primary
Raspberry Pi 4 secondary (Bluetooth) primary

 

 

라즈베리파이 OS (리눅스) UART 연결 위치 (장치 경로)

/dev/serial0 primary UART
/dev/serial1 secondary UART
/dev/ttyS0 mini UART
/dev/ttyAMA0 UART0 (First PL011)

 

 

 

⑴ 라즈베리파이 UART 기본 설정

 

UART 설정 절차의 목적은

"외부 장치(GPS 모듈)를 연결하는데 다른 UART 연결 장치(콘솔, 블루투스 등)와의 충돌을 없애기 위함"

입니다.

 

 

라즈베리파이에서 "Preferences" -> "Raspberry Pi Configuration" -> "Interfaces"

"Serial Port"를 Enable, "Serial Console"을 Disable 설정합니다.

 

 

 

 

 

 

다음으로 CMD(명령 프롬프트)에서 "sudo raspi-config" 명령을 통해 환경 설정 도구를 실행합니다.

 

sudo raspi-config

 

 

다음으로 "Interface Options" -> "Serial Port Enable/Disable ..." 항목을 선택합니다.

라즈베리파이 모델이나 버전에 따라서 설정명이 다를 수 있습니다.

 

 

설정은 총 2가지입니다.

 

1. 로그인 셸(Login shell) 엑세스 관련 설정   ->  <No>

2. 시리얼 포트 하드웨어(Serial Port Hardware) 허용 관련 설정  ->  <Yes>

 

 

 

 

 

⑵ 라즈베리파이 UART 상세 설정

 

이번에는 이전의 기본 설정을 바탕으로 외부 장치(GPS)의 활성화를 위한 설정 과정입니다.

핀으로 연결했다고 끝이 아니라 연결된 장비를 활성화하는 과정이 필요한 것입니다.

 

 

활성화하는 것은 "디바이스 트리 오버레이" 설정을 통해 가능합니다. (dtoverlay)

이는 시스템(라즈베리파이)이 작동하는 동안 연결된 하드웨어나 오버레이를 관리합니다.

 

 

과정은 다음과 같습니다.

 

1. GPIO14, 15의 BCM(Broadcom Chip-specific pin numbers)번호에 맞는 UART 그룹을 확인한다.

2. /boot/config.txt에서 장치 인터페이스를 활성화한다.

 

 

dtoverlay –a | grep uart <- uart에 해당하는 dtoverlay 정보 출력
dtoverlay –h uart5 <- uart5에 해당하는 정보 상세 출력

 

 

 

첫 명령어는 사용 가능한 UART 리스트를 확인하는 명령입니다.

다음으로 uart5에 해당하는 BCM 핀 번호를 확인합니다.

라즈베리파이의 Rx, Tx는 uart5에서 확인할 수 있습니다.

 

 

확인한 내용을 바탕으로 /boot/config.txt 파일에서 활성화 설정을 진행합니다. 파일을 텍스트 편집 프로그램(본 글에서는 nano 편집기)을 통해 열고, 가장 하단의 [all] 항목에 다음과 같이 작성합니다.

 

sudo nano /boot/config.txt
[all] 항목에 dtoverlay=uart5 추가 <- uart5에 인터페이스 등록
[all] 항목에 enable_uart=1 추가 <- miniUART 활성화

 

 

설정이 모두 완료되었다면 재부팅합니다.

 

 


 

GPS 관련 패키지 설치 및 확인

 

라즈베리파에서 GPS 데이터를 수신하고 표현하기 위한 패키지를 설치합니다.

CMD에서 다음과 같은 순서로 패키지 설치를 진행합니다.

(참고로 옵션에서 활용된 하이픈 기호 --를 주의하세요)

 

sudo apt-get update <- 사용 가능한 패키지 리스트의 버전 업데이트
sudo apt-get full-upgrade <- 변경된 의존성을 포함한 패키지 버전 업그레이드
sudo apt-get install python3-pip <- python3 버전 pip3 설치
sudo pip install pip —upgrade <- pip 업그레이드 (최신 버전 확인 용도)
sudo pip3 install pyserial <- 시리얼 통신 관련 라이브러리
sudo pip3 install pynmea2 <- GSP NMEA 프로토콜 관련 라이브러리
sudo apt-get install gpsd gpsd-clients <- GPS 데이터 수집 및 클라이언트 애플리케이션 프로그램

 

설치된 패키지의 정상 작동을 위해서 재부팅 후에 진행했습니다.

 

 

NEO-6M이 정상적으로 연결되어 있는지 확인합니다.

miniUART에 해당하는 장치는 Serial0이며 이는 ttyS0으로 명시해도 됩니다.

Serial1은 지금에서는 중요하지 않기 때문에 존재 여부에 큰 영향이 없습니다.

 

ls -l /dev

 

 

 

이렇게 최종적으로 NEO-6M을 UART로 연결하는 것을 완료했습니다!

이제 GPS 값을 확인하는 데몬인 gpsd를 통해서 정상적으로 값이 들어오는지 확인합니다.

 

 


GPS 데이터 확인

 

GPS의 정상적인 작동을 위한 데몬(gpsd)을 설정합니다.

 

관련 설정은 /etc/default/gpsd 파일에서 진행합니다.

 

항목은 3가지이며

1. 시스템(라즈베리파이) 실행 시 자동으로 gpsd 실행

2. GPS가 연결된 장치 경로 설정

3. gpsd 제어 소켓 경로

 

 

sudo nano /etc/default/gpsd <- gpsd 관련 설정 파일 수정
 
START_DAEMON = “true” <- 시스템 작동 시 자동으로 gpsd 데몬 실행
DEVICES = “/dev/serial0” <- GPS와 연결된 UART 인터페이스 지정
GPSD_OPTIONS = “-F /var/run/gpsd.sock” <- gpsd 제어 소켓 생성

 

 

 

다음 설정이 완료되었다면 재부팅 합니다.

 

 

이제 GPS 모듈을 측정 잘 되는 장소(건물 내부 X, 야외 O)에 배치하여 값을 확인합니다.

정상적으로 작동한다면 장치 파일(/dev/serial0)에서 값이 들어오는 것을 확인할 수 있습니다.

 

 

아래의 명령을 수행했는데 값이 나타나지 않고 종료되었다면

글 하단의 "오류에 대한 수동 설정" 내용을 참고합니다.

 

cat /dev/serial0 (또는 cat /dev/ttyS0)

 

 

cgps 명령으로 수신한 GPS 데이터를 해석하여 좌표 정보를 출력해주는 프로그램을 실행할 수 있습니다.

 

 

sudo cgps –s   <- GPS 해석 프로그램

 

 

Latitude = 위도,  Longitude = 경도

 

 

표시된 위도 경도 좌표를 구글맵스에 쉼표(,) 구분으로 검색하면 GPS가 수신한 위치를 확인할 수 있습니다.

 

 

 

 

 

 

 


오류에 대한 수동 설정 (값이 안나오는 경우)

 

NEO-6M의 수신 감도가 강하진 않기 때문에 설치 위치가 건물 밖이어야 측정이 빠릅니다.

다만, 밖에서 측정했음에도 불구하고 값이 나타나지 않는 경우에는 다음과 같은 수동 설정을 해봅니다.

 

 

sudo killall gpsd      <-  실행 중인 gpsd 강제 종료
sudo systemctl enable gpsd.socket        <- gpsd 소켓 활성화
sudo systemctl start gpsd.socket           <- gpsd 소켓 실행 

sudo cgps -s        <- gps 해석 프로그램 실행

 

이렇게 했음에도 안 되는 경우에는 제 지식 밖이어서 다른 해결 방안을 찾아보시길 바랍니다!

 

 

이상으로 라즈베리파이에서 GPS 모듈인 NEO-6M 설치 및 실행과정을 마칩니다.

긴 글 읽어주셔서 감사합니다.

 

 

 

-끝-