고급 GPS 데이터 로거: 실시간 비행 추적, 최고 고도 및 속도 모니터링
부품 및 소모품
| 부품 |
수량 |
| Arduino UNO |
1 |
| 점퍼(버스바), 점퍼 리드 세트 |
1 |
| Arduino 프로토 실드 |
1 |
| 1.8" TFT SPI LCD 화면 (마이크로 SD 소켓 포함) |
1 |
| u-blox GPS NEO 6M |
1 |
필요한 도구 및 장비
- 납땜 인두 (일반)
- 무연 납땜 와이어
- 와이어 스트리퍼 및 커터 (18-10 AWG / 0.75-4mm²)
프로젝트 소개
개요
저는 항공 모형 애호가로서 제 비행기의 속도와 고도를 알고 싶었습니다. 하지만 상용 GPS 데이터 로거는 매우 비쌉니다. 그래서 50유로 미만의 비용으로 Arduino 기반 GPS 데이터 로거를 직접 제작하기로 했습니다.
첫 번째 프로토타입
첫 번째 프로토타입은 Arduino Uno R3, 통합 SD 카드가 있는 Sainsmart ST7735 화면, NEO 6M V2 GPS 모듈로 구성되었습니다.
두 번째 프로토타입 (계획 중)
두 번째 버전에서는 Arduino Nano, SSD1306 OLED 화면, 동일한 GPS 모듈, 마이크로 SD 카드를 사용할 예정입니다. 케이스 포함 무게는 약 40g으로, 중형 항공기(50mm × 30mm × 22mm)에 쉽게 장착할 수 있습니다. 현재 부품 수령 대기 중입니다.
테스트
자동차 안에서 Arduino 화면을 촬영하기는 쉽지 않지만, 테스트 영상을 통해 결과를 확인할 수 있습니다. 다음 테스트는 더 작고 가벼운 프로토타입으로 무선 조종 항공기에서 진행할 예정입니다.
소스 코드
GPS 데이터 로거 (기본 버전)
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#define cs 10
#define dc 9
#define rst 8
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
#define OLED_RESET 5
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
int x = 80, xh = 80;
int maxhigh = 0;
int maxspeed = 0, speed1 = 0;
int high1 = 0;
void setup() {
Serial.begin(9600);
ss.begin(GPSBaud);
tft.initR(INITR_GREENTAB);
tft.fillScreen(ST7735_BLACK);
tft.setCursor(5, 58);
tft.setTextSize(1);
tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
tft.print("초기화 중");
}
void loop() {
tft.setTextSize(1);
tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
while (ss.available() > 0) {
gps.encode(ss.read());
if (gps.location.isUpdated()) {
drawFrame();
displayLocation();
displayDateTime();
displayAltitude();
displaySpeed();
displaySatellites();
smartDelay(400);
}
}
}
// 주요 함수들: drawFrame(), displayLocation(), displayDateTime(), displayAltitude(), displaySpeed(), displaySatellites(), smartDelay(), courbe(), courbeh(), vmax(), hmax()
// 상세 구현은 원본 코드 참조
SD 카드 저장 기능이 포함된 버전
// 기본 코드에 SD 라이브러리 추가 및 파일 쓰기 로직 포함
#include <SD.h>
const int cs_sd = 4;
void setup() {
// ... 기존 초기화 코드 ...
tft.setCursor(5, 70);
tft.print("SD 초기화");
delay(1000);
if (!SD.begin(cs_sd)) {
tft.setCursor(5, 82);
tft.print("SD 오류");
return;
}
tft.setCursor(5, 82);
tft.print("SD 카드 OK");
delay(1000);
tft.fillScreen(ST7735_BLACK);
File data = SD.open("donnees.txt", FILE_WRITE);
data.println("");
data.println("데이터 수집 시작");
data.close();
}
void loop() {
// ... 기존 루프 코드 ...
// GPS 데이터 수신 시마다 SD 카드에 기록
File data = SD.open("donnees.txt", FILE_WRITE);
data.println(날짜 + " " + 시간 + " " + 위도 + " " + 경도 + " " + 고도 + " " + 최대고도 + " " + 속도 + " " + 최대속도);
data.close();
}
회로도
회로도 이미지는 원본 프로젝트 페이지에서 확인할 수 있습니다. 주요 연결: GPS 모듈 TX→Arduino 핀 4, RX→핀 3, TFT SPI 인터페이스, SD 카드 모듈 CS 핀 4.