반응형
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 기본 설정
- 바탕화면 라즈베리파이 아이콘 클릭
- Preferences → Raspberry Pi Configuration → Interfaces
- Serial Port: Enable
- Serial Console: Disable
- 터미널에서 다음 명령 실행
- sudo raspi-config
- Interface Options → Serial Port 선택 후 다음 설정 적용
- 로그인 셸 액세스: No
- 시리얼 포트 하드웨어 허용: Yes
UART 상세 설정
- 사용 가능한 UART 확인
- dtoverlay –a | grep uart dtoverlay –h uart5
- /boot/firmware/config.txt 수정
- sudo vi /boot/firmware/config.txt
- 파일 하단에 다음 내용 추가
- dtoverlay=uart5 enable_uart=1
- 재부팅
- 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 데이터 파싱 오류 발생")
반응형