天南地北客
发表于: 2019-1-12 09:32:32 | 显示全部楼层

在之前的教程中,我们已经了解了如何将GPS模块与计算机连接以及如何使用GSM和GPS跟踪车辆。我们还使用Arduino和加速度计制作了车辆事故警报系统。在本篇文章中,我们再次制作相同的项目,但这次将使用MSP430 Launchpad开发板和振动传感器来检测车辆事故。因此,该项目还将介绍振动传感器与MSP430的连接。


振动传感器模块检测车辆的振动并向MSP430 Launchpad发送信号。然后MSP430从GPS模块获取数据,使用GSM模块通过SMS将其发送到用户移动电话。同时LED也会发出事故警报信号,这个LED可以使用其他一些警报设备取代。事故地点以谷歌地图链接的形式发送,源自GPS模块的纬度和经度。

Testing-Vehicle-Tracking-and-Accident-Alert-System-using-MSP430-and GPS_0.png


需要的组件

●    MSP430 Launchpad开发板

●    GSM模块

●    GPS模块

●    振动传感器模块

●    1602液晶显示屏

●    电源

●    连接导线

●    10K电位器

●    面包板


在开始制作之前,我们将先讨论GPS、GSM和振动传感器。


GPS模块及其工作原理

GPS(Global Positioning System),中文全称全球定位系统,用于检测地球上任何位置的纬度和经度,具有精确的UTC时间(协调世界时)。 GPS模块用于跟踪项目中事故的位置。该设备每时每秒接收卫星的坐标,包括时间和日期。我们之前在车辆跟踪系统中提取了$ GPGGA字符串,以查找纬度和经度坐标。

Sim900A-GPS-and-GSM-Module.jpg


GPS模块实时发送与跟踪位置相关的数据,并以NMEA格式发送大量数据(参见下面的屏幕截图)。 NMEA格式包含几个句子,我们只需要一个句子。这句话从$ GPGGA开始,包含坐标、时间和其他有用信息。该GPGGA被称为全球定位系统修复数据。


我们可以通过计算字符串中的逗号来从$ GPGGA字符串中提取坐标。假设您找到$ GPGGA字符串并将其存储在数组中,则可以在两个逗号后找到Latitude,并且可以在四个逗号后找到Longitude。现在,这个纬度和经度可以放在其他数组中。

GPS-module-data-in-arduino-serial-monitor.png

下面是$ GPGGA字符串及其描述:

  1. $GPGGA,104534.000,7791.0381,N,06727.4434,E,1,08,0.9,510.4,M,43.9,M,,*47
  2. $GPGGA,HHMMSS.SSS,latitude,N,longitude,E,FQ,NOS,HDP,altitude,M,height,M,,checksum data
复制代码
识别符 描述
$ GPGGA全球定位系统修复数据
hhmmss.sss 以小时为单位的时间和毫秒格式。
Latitude 纬度(坐标)
N 方向N =北,S =南
Longitude 经度(坐标)
Ë 方向E =东,W =西
FQ 修复质量数据
NOS 正在使用的卫星数量
HDP 水平稀释精度
Altitude 海拔高度(海拔以上米)
M
Height 高度
Checksum 校验和数据

GSM模块

SIM900是一个完整的四频GSM / GPRS模块,可以轻松嵌入客户或业余爱好者使用。 SIM900 GSM模块提供行业标准接口。 SIM900为语音、短信、数据提供GSM / GPRS 850/900/1800 / 1900MHz性能,功耗极低。它很容易在市场上买到。

◾    SIM900采用集成AMR926EJ-S内核的单芯片处理器设计

◾    小型GSM / GPRS四频模块。

◾    GPRS已启用

GSM-Module-SIM900A.jpg


AT命令

AT表示ATTENTION。该命令用于控制GSM模块。为了测试GSM模块,我们使用AT命令。收到AT命令后,GSM模块响应OK。这意味着GSM模块工作正常。下面是我们在这个项目中使用的一些AT命令:

●    ATE0用于回声

●    AT + CNMI = 2,2,0,0,0 <ENTER>自动打开信息接收。 (无需打开消息)

●    ATD <手机号码>; <ENTER>拨打电话(ATD + 919610126059; \ r \ n)

●    ●    AT + CMGF = 1 <ENTER>选择文本模式

●    AT + CMGS =“手机号码”<ENTER>分配收件人的手机号码

     >>现在我们可以写下我们的信息

     >>写完信息后

●    Ctrl + Z发送消息命令(十进制26)。

●    HEX中的ENTER = 0x0d


振动传感器模块

在这个MSP430事故警报系统项目中,我们使用了一个振动传感器模块来检测振动或突然调制。振动传感器模块根据模块提供数字输出HIGH / LOW逻辑。在我们的例子中,我们使用了一个有源HIGH逻辑振动传感器模块。这意味着每当振动传感器检测到振动时,它将为微控制器提供高逻辑。

Vibration-Sensor-Module.jpg


电路说明

该车辆事故警报系统项目的电路连接非常简单。这里GPS模块的Tx引脚直接连接到MSP430 Launchpad(硬件串口)的数字引脚号P1_1,5v用于为GPS模块供电。通过在此使用软件串行库,我们允许在引脚P_6和P1_7上进行串行通信,并分别使它们成为Rx和Tx并连接到GSM模块。 12伏电源用于为GSM模块供电。振动传感器连接在P1_3。 LED也用于指示事故检测。其余连接显示在电路图中。

Circuit-Diagram-for-Vehicle-Tracking-and-Accident-Alert-System-using-MSP430-and-GPS.png


Circuit-Hardware-for-Vehicle-Tracking-and-Accident-Alert-System-using-MSP430-and-GPS.jpg


编程说明

除GPS部分外,该项目的编程很简单。完成代码在本文结尾处给出。要在MSP430中编写或编译代码,我们使用了与Arduino兼容的Energia IDE。大多数Arduino IDE功能都可以直接在这个Energia IDE中使用。


首先,我们包含了一个必需的库,以及声明一些引脚和变量。

  1. #include <SoftwareSerial.h>
  2. SoftwareSerial GSM(P1_6, P1_7); // RX, TX

  3. float latitude=0;
  4. float logitude=0;                     

  5. #define led P1_0
  6. const int vibrationSensor=PUSH2;
  7. int i=0;
复制代码

以下函数用于读取振动传感器信号。 该函数也可以过滤小的或错误的振动。

  1. #define count_max 25
  2. char SensorRead(int pin)   // read sw with debounce
  3. {
  4.    char count_low=0,count_high = 0;
  5.    do
  6.   {
  7.     delay(1);
  8.     if (digitalRead(pin) == HIGH)
  9.     {
  10.      count_high++;
  11.      count_low = 0;
  12.     }

  13.     else
  14.     {
  15.        count_high = 0;
  16.        count_low++;
  17.     }
  18.   }while(count_low< count_max && count_high < count_max);

  19.   if (count_low >= count_max)
  20.   return LOW;
  21.   else
  22.   return HIGH;
  23. }
复制代码

下面的函数检测振动并调用gpsEvent()函数获取GPS坐标,最后调用Send()函数发送短信。

  1. void loop()
  2. {
  3.     if(SensorRead(vibrationSensor) == HIGH)
  4.     {
  5.         digitalWrite(led, HIGH);
  6.         gpsEvent();
  7.         Send();
  8.         digitalWrite(led, LOW);
  9.         delay(2000);
  10.     }
  11. }
复制代码

以下函数负责从GPS模块获取GPS字符串,从中提取坐标并以十进制格式转换它们。

  1. void gpsEvent()
  2. {
  3.   char gpsString[55];
  4.   char test[]="RMC";
  5.   i=0;
  6.   while(1)
  7.   {
  8.    while (Serial.available())            //Serial incomming data from GPS
  9.    {
  10.     char inChar = (char)Serial.read();
  11.      gpsString[i]=inChar;                    //store incomming data from GPS to temparary string str[]
  12.      i++;
  13.      if (i < 4)                     
  14.      {
  15.       if(gpsString[i-1] != test[i-1])         //check for right string
  16.         i=0;
  17.      }
复制代码

最后,Send()函数用于将SMS发送到此部分代码中插入的用户号码。

  1. void Send()
  2. {
  3.    GSM.print("AT+CMGS=");
  4.    GSM.print('"');
  5.    GSM.print("961****059"); // enter your Mobile number
  6.    GSM.println('"');
  7.    delay(500);
  8.   // GSM.print("Latitude:");
  9.   // GSM.println(latitude);
  10.    GSM.println("Accident Happned");
  11.    delay(500);
  12.   // GSM.print(" longitude:");
  13.   // GSM.println(logitude);
  14.    GSM.println("Click On link to see Location");
  15.    GSM.print("http://maps.google.com/maps?&z=15&mrt=yp&t=k&q=");
  16.    GSM.print(latitude,6);
  17.    GSM.print("+");            
  18.    GSM.print(logitude,6);
  19.    GSM.write(26);
  20.    delay(4000);  
  21. }
复制代码

代码

以下是本篇文章使用的完整代码: main.rar (1.18 KB, 下载次数: 11)

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 26 | 回复: 45



手机版|

GMT+8, 2024-3-29 03:54 , Processed in 0.210958 second(s), 7 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表