# 可攜式GPS軌跡記錄器

<img src="https://r2cdn.perplexity.ai/pplx-full-logo-primary-dark%402x.png" class="logo" width="360"/>

## 一、專案簡介

本專案旨在設計並製作一套可攜式GPS軌跡記錄器，利用Arduino主控板搭配NEO-6M GPS模組，將即時取得的經緯度與時間資料記錄於SD卡中，並以CSV格式儲存，方便後續資料分析與應用。整套系統以18650鋰電池供電，透過升壓模組確保運作穩定，達到無線與便攜的目標。

---

## 二、系統架構

### 1. 硬體組成

| 元件名稱 | 型號/規格 | 功能說明 |
| :-- | :-- | :-- |
| 主控板 | Arduino UNO/Nano | 控制與資料處理 |
| GPS模組 | NEO-6M | 取得定位與時間資料 |
| SD卡模組 | SPI介面 | 資料儲存 |
| 鋰電池 | 18650（3.7V, 2200mAh） | 提供電力 |
| 升壓模組 | 3.7V→5V（如MT3608） | 穩定供電至5V |
| 連接線 | 杜邦線 | 電路連接 |

### 2. 系統連接圖

```
[18650鋰電池] 
    ↓
[升壓模組 (3.7V→5V)]
    ↓
[Arduino] ←→ [NEO-6M GPS模組]
    ↓
[SD卡模組]
```


---

## 三、電路接線說明

| 模組 | 連接到Arduino腳位 |
| :-- | :-- |
| NEO-6M VCC | 5V |
| NEO-6M GND | GND |
| NEO-6M TX | D4（軟體序列埠RX） |
| NEO-6M RX | D3（軟體序列埠TX） |
| SD卡 VCC | 5V |
| SD卡 GND | GND |
| SD卡 MOSI | D11 |
| SD卡 MISO | D12 |
| SD卡 SCK | D13 |
| SD卡 CS | D10 |


---

## 四、軟體設計

### 1. 使用函式庫

- TinyGPS++：解析GPS NMEA資料
- SD：SD卡操作
- SPI：SPI通訊
- SoftwareSerial：額外序列埠


### 2. 程式邏輯流程

1. 初始化SD卡與GPS模組
2. 建立CSV檔案並寫入標題行
3. 持續讀取GPS模組資料
4. 每當GPS位置資料更新時，解析經緯度與UTC時間
5. 將資料以CSV格式寫入SD卡
6. 重複步驟3~5，實現即時紀錄

### 3. 程式碼範例

```cpp
#include <SoftwareSerial.h>
#include <TinyGPS++.h>
#include <SPI.h>
#include <SD.h>

SoftwareSerial gpsSerial(4, 3); // RX, TX
TinyGPSPlus gps;
const int chipSelect = 10; // SD卡CS腳位

void setup() {
  Serial.begin(9600);
  gpsSerial.begin(9600);

  if (!SD.begin(chipSelect)) {
    Serial.println("SD卡初始化失敗");
    while (1);
  }
  // 建立CSV檔案並寫入標題
  File dataFile = SD.open("gpslog.csv", FILE_WRITE);
  if (dataFile) {
    dataFile.println("Date,Time,Latitude,Longitude");
    dataFile.close();
  }
}

void loop() {
  while (gpsSerial.available() > 0) {
    gps.encode(gpsSerial.read());
    if (gps.location.isUpdated()) {
      String dataString = "";
      // 日期
      dataString += String(gps.date.year()) + "-" + String(gps.date.month()) + "-" + String(gps.date.day()) + ",";
      // 時間
      char timeBuffer[9];
      sprintf(timeBuffer, "%02d:%02d:%02d", gps.time.hour(), gps.time.minute(), gps.time.second());
      dataString += String(timeBuffer) + ",";
      // 經度與緯度
      dataString += String(gps.location.lat(), 6) + "," + String(gps.location.lng(), 6);

      // 寫入SD卡
      File dataFile = SD.open("gpslog.csv", FILE_WRITE);
      if (dataFile) {
        dataFile.println(dataString);
        dataFile.close();
      }
      delay(1000); // 每秒記錄一次
    }
  }
}
```


---

## 五、成果展示

- **資料格式**：
檔案名稱：gpslog.csv
內容範例：

```
Date,Time,Latitude,Longitude
2025-05-20,14:23:10,25.047800,121.531900
2025-05-20,14:23:11,25.047805,121.531905
...
```

- **可用工具**：
    - 直接用Excel、Google Sheets開啟分析
    - 可將資料匯入Google地圖或其他地理資訊系統軟體，進行軌跡顯示

---

## 六、注意事項與建議

- 18650鋰電池需加保護板，確保安全
- 升壓模組應選用輸出電流足夠（建議1A以上）
- SD卡建議格式化為FAT32
- 若需更長續航可並聯多顆電池
- 可依需求擴充紀錄內容（如速度、海拔等）

---

## 七、未來展望

- 增加無線傳輸功能（如LoRa、藍牙、WiFi），實現即時上傳
- 加入OLED/LCD顯示即時資訊
- 結合移動偵測，節省儲存空間與電力
- 應用於戶外活動紀錄、車輛追蹤、科學實驗等多元場域

---

## 八、參考資料

1. [TinyGPS++ Library](https://github.com/mikalhart/TinyGPSPlus)
2. [Arduino SD Library](https://www.arduino.cc/en/Reference/SD)
3. [Instructables - Arduino GPS Data Logger](https://www.instructables.com/Arduino-GPS-Data-Logger/)
4. [Maker Portal - Arduino GPS Logger](https://makersportal.com/blog/arduino-gps-logger)

---

**結論**：
本專案成功實現以Arduino為核心的無線GPS軌跡記錄器，具備低成本、易擴充、便攜等特點，能有效記錄移動路徑與時間資訊，並以標準CSV格式儲存，方便後續資料分析與應用。