亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

高级 GPS 数据记录器:实时飞行追踪、峰值高度与速度监测

组件与物料

组件数量备注
Arduino UNO1主控板
跳线套装1用于连接
Arduino 扩展板1原型板
1.8 英寸 TFT SPI LCD 屏(带 MicroSD 插槽)1或其他带 SD 卡的屏幕
u-blox GPS NEO-6M 模块1GPS 接收器

所需工具

项目简介

我热爱航空模型,想知道飞机的飞行速度和高度,但市售 GPS 数据记录器价格昂贵。因此我决定自制一款基于 Arduino 的 GPS 数据记录器,成本控制在 50 欧元以内。

第一代原型机采用 Arduino Uno R3、Sainsmart ST7735 屏幕(集成 SD 卡槽)和 NEO-6M V2 GPS 模块。第二代计划使用 Arduino Nano、SSD1306 OLED 屏幕、同款 GPS 模块和 Micro SD 卡,整机含外壳重量约 40 克,尺寸 50×30×22 mm,可轻松安装在中型飞机内部。第二代正在等待物料中,敬请期待。

测试情况

在车内拍摄 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("initilisation");
}

void loop() {
  tft.setTextSize(1);
  tft.setTextColor(ST7735_GREEN, ST7735_BLACK);

  while (ss.available() > 0) {
    gps.encode(ss.read());
    if (gps.location.isUpdated()) {
      drawFrame();
      // 显示经纬度
      tft.setCursor(5, 44);
      tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
      tft.print("Latitude :");
      tft.setTextColor(ST7735_CYAN, ST7735_BLACK);
      tft.print(gps.location.lat(), 6);

      tft.setCursor(5, 58);
      tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
      tft.print("Longitude :");
      tft.setTextColor(ST7735_CYAN, ST7735_BLACK);
      tft.print(gps.location.lng(), 6);

      // 日期
      tft.setCursor(5, 7);
      tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
      tft.print("date : ");
      tft.setTextColor(ST7735_CYAN, ST7735_BLACK);
      tft.print(gps.date.day()); tft.print(" ");
      tft.print(gps.date.month()); tft.print(" ");
      tft.print(gps.date.year());

      // 时间
      tft.setCursor(5, 20);
      tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
      tft.print("heure : ");
      tft.setTextColor(ST7735_CYAN, ST7735_BLACK);
      tft.print(gps.time.hour()+1); tft.print(" ");
      tft.print(gps.time.minute()); tft.print(" ");
      tft.print(gps.time.second()); tft.print(" ");

      // 海拔
      tft.setCursor(5, 80);
      tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
      tft.print("H m :");
      tft.setTextColor(ST7735_CYAN, ST7735_BLACK);
      tft.print(gps.altitude.meters(), 0);
      tft.print(" ");

      // 最大海拔
      tft.setCursor(5, 95);
      updateMaxAltitude();
      tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
      tft.print("Hmax :");
      tft.setTextColor(ST7735_CYAN, ST7735_BLACK);
      tft.print(maxhigh);
      tft.print(" ");
      drawAltitudeGraph();

      // 速度
      tft.setCursor(5, 115);
      tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
      tft.print("V act: ");
      tft.setTextColor(ST7735_CYAN, ST7735_BLACK);
      tft.print(gps.speed.kmph(), 0);
      tft.print(" ");

      // 最大速度
      tft.setCursor(5, 130);
      updateMaxSpeed();
      tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
      tft.print("vmax: ");
      tft.setTextColor(ST7735_CYAN, ST7735_BLACK);
      tft.print(maxspeed);
      tft.print(" ");
      drawSpeedGraph();

      // 卫星数
      tft.setCursor(5, 147);
      tft.setTextColor(ST7735_GREEN, ST7735_BLACK);
      tft.print("nombre de Sat : ");
      tft.setTextColor(ST7735_CYAN, ST7735_BLACK);
      tft.print(gps.satellites.value());
      tft.print(" ");

      Serial.print("HDOP = ");
      Serial.println(gps.hdop.value());

      smartDelay(400);
    }
  }
}

static void smartDelay(unsigned long ms) {
  unsigned long start = millis();
  do {
    while (ss.available()) gps.encode(ss.read());
  } while (millis() - start < ms);
}

void drawFrame() {
  // 绘制红色边框和分割线
  tft.drawLine(0,0,130,0,ST7735_RED);
  tft.drawLine(0,1,130,1,ST7735_RED);
  tft.drawLine(0,158,130,158,ST7735_RED);
  tft.drawLine(0,142,130,142,ST7735_RED);
  tft.drawLine(0,141,130,141,ST7735_RED);
  tft.drawLine(0,107,130,107,ST7735_RED);
  tft.drawLine(0,108,130,108,ST7735_RED);
  tft.drawLine(80,108,80,140,ST7735_RED);
  tft.drawLine(81,109,81,140,ST7735_RED);
  tft.drawLine(80,70,80,108,ST7735_RED);
  tft.drawLine(81,70,81,108,ST7735_RED);
  tft.drawLine(0,159,130,159,ST7735_RED);
  tft.drawLine(0,0,0,156,ST7735_RED);
  tft.drawLine(1,1,1,157,ST7735_RED);
  tft.drawLine(127,0,127,156,ST7735_RED);
  tft.drawLine(126,0,126,156,ST7735_RED);
  tft.drawLine(0,35,130,35,ST7735_RED);
  tft.drawLine(0,36,130,36,ST7735_RED);
  tft.drawLine(0,70,130,70,ST7735_RED);
  tft.drawLine(0,71,130,71,ST7735_RED);
}

void drawSpeedGraph() {
  int pixelValue = map(gps.speed.kmph(), 0, 150, 137, 110);
  x++;
  tft.drawPixel(x, pixelValue, ST7735_CYAN);
  if (x > 123) {
    x = 80;
    tft.fillRect(82, 110, 43, 30, ST7735_BLACK);
  }
}

void drawAltitudeGraph() {
  int pixelValue = map(gps.altitude.meters(), 0, 1000, 104, 72);
  xh++;
  tft.drawPixel(xh, pixelValue, ST7735_CYAN);
  if (xh > 123) {
    xh = 80;
    tft.fillRect(82, 72, 43, 35, ST7735_BLACK);
  }
}

void updateMaxSpeed() {
  speed1 = gps.speed.kmph();
  if (speed1 > maxspeed) maxspeed = speed1;
}

void updateMaxAltitude() {
  high1 = gps.altitude.meters();
  if (high1 > maxhigh) maxhigh = high1;
}

GPS 数据记录器(带 SD 卡存储版)

#include <SPI.h>
#include <SD.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;
const int cs_sd = 4;
#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("initilisation");
  tft.setCursor(5, 70);
  tft.print("init SD");
  delay(1000);

  if (!SD.begin(cs_sd)) {
    tft.setCursor(5, 82);
    tft.print("Defaut SD");
    return;
  }
  tft.setCursor(5, 82);
  tft.print("Carte SD OK");
  delay(1000);
  tft.fillScreen(ST7735_BLACK);

  File data = SD.open("donnees.txt", FILE_WRITE);
  data.println("");
  data.println("Dmarrage acquisition");
  data.close();
}

void loop() {
  tft.setTextSize(1);
  tft.setTextColor(ST7735_GREEN, ST7735_BLACK);

  while (ss.available() > 0) {
    gps.encode(ss.read());
    if (gps.location.isUpdated()) {
      drawFrame();
      // 显示经纬度、日期、时间、海拔、速度、卫星数(同基础版)
      // ... 此处省略重复显示代码 ...

      // 写入 SD 卡
      String Date = String(gps.date.day()) + " " + gps.date.month() + " " + gps.date.year();
      String Temps = String(gps.time.hour()+1) + " " + gps.time.minute() + " " + gps.time.second();

      File data = SD.open("donnees.txt", FILE_WRITE);
      data.println(Date + " " + Temps + " " +
                   String(gps.location.lat(), 6) + " " +
                   String(gps.location.lng(), 6) + " " +
                   String(gps.altitude.meters(), 0) + " " +
                   String(maxhigh) + " " +
                   String(gps.speed.kmph(), 0) + " " +
                   String(maxspeed));
      data.close();

      smartDelay(400);
    }
  }
}

// smartDelay、drawFrame、drawSpeedGraph、drawAltitudeGraph、updateMaxSpeed、updateMaxAltitude 函数同基础版

原理图

高级 GPS 数据记录器:实时飞行追踪、峰值高度与速度监测

制造工艺

  1. 树莓派 + Arduino UNO + 三星 SAMI 极速构建火灾检测系统
  2. Arduino 实时太阳能电池板监测:低成本数据采集系统
  3. 打造可靠的 Arduino 能源监测与数据记录仪——分步指南
  4. Arduino UNO 驱动 16x2 LCD 实现动画与小游戏
  5. Arduino + DHT11 + 以太网盾板温湿度数据记录仪
  6. Arduino 串口简易计算器:两数四则运算演示
  7. 自制便携式视觉暂留显示器:Arduino UNO 与 ATtiny85
  8. u-blox LEA-6H GPS 模块:Arduino 与 Python 集成指南
  9. 用 Arduino Uno 和 1Sheeld 构建 4x4x4 LED 立方体 - 互动音乐可视化项目
  10. Python 3 控制 Arduino UNO - 串口通信点亮内置 LED 入门教程
  11. 使用 Arduino Nano 和 RDA8057M 制作紧凑型 FM 收音机
  12. Arduino GPS与TFT触摸屏扩展板:实时定位显示项目