SW개발/RPI5 프로젝트

라즈베리파이5에 GPS 모듈(NEO-6M) 연결 및 설정 방법

코코도롱 2025. 3. 5. 12:17
반응형

1. NEO-6M 제품 사양 및 회로 연결

NEO-6M 제품 구성

  • 일반적으로 NEO-6M 모듈과 안테나로 구성

※ 추천 사항

  • 핀 헤더가 납땜 된 것을 사자.(원래 제품은 위 그림의 빨간 부분에 핀이 없음, 본인이 직접 납땜해야함)
  • 차량 네비게이션용 안테나를 사자! (감도가 좋고, 선이 길어, 실내에서 건물 외벽에 붙이면 수신 가능.)
  • 나는 안테나 SMA 소켓 인것과 (안테나 끝부분) + SMA to u.FL 젠더 (u.FL이 NEO-6M 그림에서 노란 부분) 구매함

차량 네비게이션용 안테나

주요 사양

  • 전압: 3.3V ~ 5V (라파는 꼭 3.3v에 하세요)
  • 크기: 35 x 26 x 3mm
  • UART 인터페이스: Baud Rate 9600bps

라즈베리파이 회로 연결

NEO-6M 라즈베리파이 보드
VCC 3.3V
GND GND
Rx GPIO14 (Tx)
Tx GPIO15 (Rx)
  • Rx, Tx 핀을 교차 연결해야 함
  • 라즈베리파이에서는 3.3V 사용!!!!! 보드 망가져요!!!

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

UART 기본 설정

  1. 바탕화면 라즈베리파이 아이콘 클릭
  2. PreferencesRaspberry Pi ConfigurationInterfaces
    • Serial Port: Enable
    • Serial Console: Disable
  3. 터미널에서 다음 명령 실행
  4. sudo raspi-config
  5. Interface OptionsSerial Port 선택 후 다음 설정 적용
    • 로그인 셸 액세스: No
    • 시리얼 포트 하드웨어 허용: Yes

UART 상세 설정

    1. 사용 가능한 UART 확인
    2. dtoverlay –a | grep uart dtoverlay –h uart5
    3. /boot/firmware/config.txt 수정
  1.  sudo vi /boot/firmware/config.txt
    • 파일 하단에 다음 내용 추가
    • dtoverlay=uart5 enable_uart=1
  2. 재부팅
  3. sudo reboot

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

패키지 설치 명령어

sudo apt-get update
sudo apt-get full-upgrade
sudo apt-get install python3-pip
sudo pip3 install --upgrade pip
sudo pip3 install pyserial pynmea2
sudo apt-get install gpsd gpsd-clients

연결 장치 확인

ls -l /dev

 

실행 코드

- 제가 PJT 중에 만든 파일이라 싱글톤, 옵저버 패턴으로 구성되어 있음. 코드 복붙하면 안돌아가니 참고만 해주세요.

import serial
import pynmea2
import csv
from datetime import datetime
from utils.observer import Subject

GPS_PORT = "/dev/ttyAMA0"
BAUD_RATE = 9600
CSV_FILE = "gps_data.csv"

class GPSNeo6M(Subject):
    def __init__(self):
        super().__init__()
        self.serial_connection = None

        try:
            self.serial_connection = serial.Serial(GPS_PORT, BAUD_RATE, timeout=1)
            log_info("GPS 모듈이 성공적으로 연결됨.")
        except serial.SerialException as e:
            log_error(f"GPS 연결 오류: {e}")

    def read_gps_data(self):
        if not self.serial_connection:
            log_error("GPS 모듈이 연결되지 않음.")
            return

        while True:
            line = self.serial_connection.readline().decode('utf-8', errors='ignore').strip()

            if line.startswith("$GPGGA") or line.startswith("$GPRMC"):
                try:
                    msg = pynmea2.parse(line)
                    timestamp = datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")
                    latitude = msg.latitude
                    longitude = msg.longitude

                    gps_data = {
                        "timestamp": timestamp,
                        "latitude": latitude,
                        "longitude": longitude,
                    }

                    print(f"{timestamp} - 위도: {latitude}, 경도: {longitude}")

                    # 옵저버들에게 알림
                    return gps_data

                except pynmea2.ParseError:
                    log_warning("GPS 데이터 파싱 오류 발생")

 

 

 

반응형