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

使用 Arduino UNO 和 NEO-6M GPS 模块构建目的地到达提醒器

组件与供应

Arduino UNO ×1
NEO-6M GPS 模块 ×1
LED(通用) ×1
L293D 双 H 桥驱动芯片 ×1
振动盘电机 ×1
可拼接实验板 ×1
9V 电池 ×1
9V 电池转 DC 插头 ×1
外壳盒 ×1
杜邦线若干 ×1

所需工具

软件与在线服务

项目介绍

问题与解决方案

交通拥堵是巨大的时间浪费,且无法准确预测到达时间。两个月前我搬到城市后,每天在路上耗费两小时以上。我想利用这段时间做些有意义的事:思考规划项目、在线学习课程,或者动手制作电子项目。

于是我利用 Arduino 和 GPS 模块制作了一个目的地到达提醒器。当接近预设目的地时,通过 LED 亮起或振动电机震动来提醒。下文提供了 LED 版和振动电机版两种电路方案。

核心逻辑:先获取目的地的经纬度,然后实时计算当前位置与目的地的距离,设定一个阈值范围,进入范围即触发提醒。

硬件连接说明

NEO-6M GPS 模块接线

模块有四个引脚:VCC、RX、TX、GND。通过软件串口与 Arduino 通信:

L293D 驱动振动电机

L293D 可将低电流控制信号转换为驱动电机所需的大电流。连接方式:

获取目的地经纬度

上传以下代码,打开串口监视器 (9600 波特率),等待 GPS 定位成功后记录输出的经纬度值。GPS 模块上的 LED 闪烁表示已捕获卫星信号。

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
void setup() {
  Serial.begin(9600);
  ss.begin(GPSBaud);
}
void loop() {
  while (ss.available() > 0) {
    gps.encode(ss.read());
    if (gps.location.isUpdated()) {
      Serial.print("Latitude= ");
      Serial.print(gps.location.lat(), 6);
      Serial.print(" Longitude= ");
      Serial.println(gps.location.lng(), 6);
    }
  }
}

LED 版目的地提醒器

将获取到的目的地经纬度填入代码中的 Dest_LAT 和 Dest_LON。代码每 5 秒计算一次当前位置到目的地的距离,当距离小于设定阈值 (示例中为 50 米) 时点亮 LED (D13)。

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
unsigned long last = 0UL;
int ledPin = 13;
void setup() {
  Serial.begin(115200);
  ss.begin(GPSBaud);
  pinMode(ledPin, OUTPUT);
}
void loop() {
  while (ss.available() > 0) gps.encode(ss.read());
  if (gps.location.isUpdated()) {
    Serial.print(F(" Lat="));
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(" Long="));
    Serial.println(gps.location.lng(), 6);
  } else if (millis() - last > 5000) {
    Serial.println();
    if (gps.location.isValid()) {
      static const double Dest_LAT = 18.786254, Dest_LON = 73.880798; // 修改为你的目的地坐标
      double distanceToDest = TinyGPSPlus::distanceBetween(
        gps.location.lat(), gps.location.lng(), Dest_LAT, Dest_LON);
      Serial.print(F("Distance to Destination ="));
      Serial.print(distanceToDest / 1000, 6); // 单位:公里
      if (distanceToDest / 1000 < 0.050000) { // 阈值 0.05 公里 = 50 米
        digitalWrite(ledPin, HIGH);
      } else {
        digitalWrite(ledPin, LOW);
      }
    }
    if (gps.charsProcessed() < 10)
      Serial.println(F("WARNING: No GPS data. Check wiring."));
    last = millis();
    Serial.println();
  }
}

振动电机版最终方案

将 LED 替换为振动电机,通过 L293D 驱动。代码逻辑相同,只是输出控制改为电机正反转(这里仅单向振动)。将整套电路装入外壳,使用 9V 电池供电,即可随身携带。

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
unsigned long last = 0UL;
int motorpin1 = 6;
int motorpin2 = 7;
void setup() {
  Serial.begin(115200);
  ss.begin(GPSBaud);
  pinMode(motorpin1, OUTPUT);
  pinMode(motorpin2, OUTPUT);
}
void loop() {
  while (ss.available() > 0) gps.encode(ss.read());
  if (gps.location.isUpdated()) {
    Serial.print(F(" Lat="));
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(" Long="));
    Serial.println(gps.location.lng(), 6);
  } else if (millis() - last > 5000) {
    Serial.println();
    if (gps.location.isValid()) {
      static const double Dest_LAT = 18.786254, Dest_LON = 73.880798;
      double distanceToDest = TinyGPSPlus::distanceBetween(
        gps.location.lat(), gps.location.lng(), Dest_LAT, Dest_LON);
      Serial.print(F("Distance to Destination ="));
      Serial.print(distanceToDest / 1000, 6);
      if (distanceToDest / 1000 < 0.050000) {
        digitalWrite(motorpin1, LOW);
        digitalWrite(motorpin2, HIGH); // 启动振动
      } else {
        digitalWrite(motorpin1, HIGH);
        digitalWrite(motorpin2, HIGH); // 停止
      }
    }
    if (gps.charsProcessed() < 10)
      Serial.println(F("WARNING: No GPS data. Check wiring."));
    last = millis();
    Serial.println();
  }
}

代码文件

原理图

提供 Fritzing 文件:read_lat_lng.fzz、destination_notifier_led.fzz、destination_notifier_motor.fzz。

制造工艺

  1. Arduino 数字骰子:LCD 显示随机点数的电子骰子
  2. JX 波形发生器 – 基于 Arduino 的 DDS 振荡器,带 OLED 显示屏
  3. DIY 钢铁侠人偶:Arduino 控制超声波触发音效与灯光
  4. Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
  5. 打造功能完整的 Arduino 驱动 3D 打印机械臂:分步指南
  6. Arduino Mega 2560 接 NEO-6M GPS 模块完整教程
  7. DIY Arduino 加湿器控制器:继电器安全控制高压电路
  8. u-blox LEA-6H GPS 模块:Arduino 与 Python 集成指南
  9. Arduino Nano 驱动 NeoPixel 矩阵:自制霓虹乒乓游戏
  10. DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
  11. Arduino + TEA5767 打造 FM 收音机:Nokia 5110 显频谱/信号强度/立体声
  12. Arduino 101 计步器:集成 DHT11 温湿度 + LCD 显示步数/距离/卡路里