【GPS模组】移远EC20 基于Arduino的GPS流速仪

基本思路: 物体速度 = 两点的坐标差 / 定位时间差
也就是说,按照1Hz的频率采集GPS数据,就能算出物体运动速度

一、硬件结构

  • Arduino UNO
  • EC20 USB DongleA(GNSS)模块
    具有4G和GPS功能

在这里插入图片描述
如图按照TX->RX,RX->TX,GND->GND,5V->5V接线即可

二、方案验证

EC20模块USB接口连接PC,可以看到三个串口:AT port用于发送AT指令,NMEA
port用于接收GNSS数据。但我们最终需要连接MCU使用,所以这里要测试串口,此串口引出的是AT功能。
在这里插入图片描述

1.GPS功能验证步骤

  • 因为使用了UART,所以配置数据输出到串口:AT+QGPSCFG="outport","uartdebug" ,另外两种为输出到USB或无输出
  • 使能GPS功能AT+QGPS=1
  • 将NMEA数据输出到AT口AT+QGPSCFG="nmeasrc",1
  • 输出NMEA中GGA这条数据AT+QGPSGNMEA="GGA"
    在这里插入图片描述
    $GPGGA,,,,,,0,,,,,,,,*66中无有效数据是因为在室内没有GPS信号,可以按照GPGGA标准格式解析出定位、海拔高等信息。

2.GPRS功能验证步骤

(1)使用GPRS功能的目的是连接服务器,发送数据,看一下官方文档TCP部分
在这里插入图片描述
在这里插入图片描述
(2) 按照上图顺序发送AT指令
在这里插入图片描述
(3)串口助手输出如下:

在这里插入图片描述
(4) 服务器收到的16进制ASCII码消息如下:
在这里插入图片描述

3.至此,我们PC与EC20模块UART的通信验证完成,接下来我们可以用MCU代替PC了,逻辑如下:
在这里插入图片描述

三、编程实现

1.设备(MCU+EC20)与服务器间tcp通信

(1)代码实现

#include <SoftwareSerial.h>
SoftwareSerial ATserial(12, 13);//RX,TX 创建模拟串口
enum{
    CPIN=0,
    COPS,
    CREG,
    CGREG,
    QICSGP,
    QIACT,
    QIOPEN
}AT;

void setup()
{
  delay(5000);
  pinMode(0,  INPUT_PULLUP); 
  pinMode(1,  INPUT_PULLUP); 
  Serial.begin(115200); 
  while (!Serial) {}
  	Serial.println("serial ok!");
  ATserial.begin(115200);
  while (!ATserial) {}
  	Serial.println("ATserial ok!");
  	
  ATserial.listen();
  ATserial.println("AT");
  delay(300);
  if(ATserial.find("OK")){
    Serial.println("EC20 is ready!");
  }
  clear_serial();
  
  AT = CPIN;
  switch(AT)//状态机
  {
  case CPIN:  
    cpin();
  case COPS:
    cops();
  case CREG:
    creg();
  case CGREG:
    cgreg();
  case QICSGP:
    qicsgp();
  case QIACT:
   qiact();
  case QIOPEN:
    qiopen();
  break;
  default:
  break;  
  }
}
void loop() {
	at_send();//发送测试数据
}

void cpin()
{
  ATserial.println("AT+CPIN?");
  delay(300);
  if(ATserial.find("OK")){
      Serial.println("AT+CPIN,ok");
    AT = COPS;
  }
  clear_serial();
}
void cops()
{
  ATserial.println("AT+COPS?");
  delay(500);
  if(ATserial.find("OK")){
      Serial.println("AT+COPS,ok");
    AT = CREG;
  }
  clear_serial();
}
void creg()
{
  ATserial.println("AT+CREG?");
  delay(300);
  if(ATserial.find("OK")){
      Serial.println("AT+CREG,ok");
    AT = CGREG;
  }
  clear_serial();
}
void cgreg()
{
  ATserial.println("AT+CGREG?");
  delay(300);
  if(ATserial.find("OK")){
      Serial.println("AT+CGREG,ok");
    AT = QICSGP;
  }
  clear_serial();
}
void qicsgp()
{
  ATserial.println("AT+QICSGP=1,1,\"CMNET\",\"\",\"\",1");
  delay(300);
  if(ATserial.find("OK")){
      Serial.println("AT+QICSGP,ok");
    AT = QIACT;
  }
  clear_serial();
}
void qiact()
{
  ATserial.println("AT+QIDEACT=1");
  delay(300);
  clear_serial();
  ATserial.println("AT+QIACT=1");
  delay(300);
  if(ATserial.find("OK")){
      Serial.println("AT+QIACT,ok");
    AT = QIOPEN;
  }
  clear_serial();
}
void qiopen()
{
  ATserial.println("AT+QIOPEN=1,0,\"TCP\",\"180.97.81.180\",54501,0,0");
  delay(1000);
  if(ATserial.find("OK")){
      Serial.println("AT+QIOPEN,ok");
  }
  clear_serial();
}
void at_send()
{
  ATserial.println("AT+QISENDEX=0,\"3132333435\"");
  delay(1000);
  if(ATserial.find("OK")){
      Serial.println("AT+QISENDEX,ok");
  }
  clear_serial();
}
void clear_serial()//清除串口缓存,否则每次都能检测到"OK"
{
  while(ATserial.read() >= 0){}
  while(Serial.read() >= 0){}
  
}

(2)Arduino串口监控器输出LOG如下
在这里插入图片描述
(3)TCP服务器收到数据
在这里插入图片描述

2.发送GPS数据

(1)代码实现
模块gps功能初始化函数,在setup()中调用

void gps_init()
{
  //AT+QGPSCFG="outport","uartdebug"
  //AT+QGPS=1
  //AT+QGPSCFG="nmeasrc",1
  ATserial.println("AT+QGPSCFG=\"outport\",\"uartdebug\"");
  delay(300);
  if(ATserial.find("OK")){
      Serial.println("AT+QGPSCFG_outport,ok");
  }
  clear_serial();
  ATserial.println("AT+QGPS=1");
  delay(300);
  if(ATserial.find("OK")){
      Serial.println("AT+QGPS,ok");
  }
  clear_serial();
  ATserial.println("AT+QGPSCFG=\"nmeasrc\",1");
  delay(300);
  if(ATserial.find("OK")){
      Serial.println("AT+QGPSCFG_nmeasrc,ok");
  }
  clear_serial();
}

定位获取和发送写在loop()中

void loop(){
  clear_serial();
  ATserial.println("AT+QGPSGNMEA=\"GGA\"");
  delay(300);
  if(ATserial.find("GGA")){
      String comdata = "";//缓存清零
      Serial.println("GPGGA消息:
      while (ATserial.available() > 0)//循环串口是否有数据
      {
       comdata += char(ATserial.read());//叠加数据到comdata
       delay(4);//延时等待响应
      }
      Serial.println(comdata);

      ATserial.println("AT+QISWTMD=0,2");
      delay(300);
      if(ATserial.find("CONNECT")){
        Serial.println("++++++++进入透传模式++++++++++");
        clear_serial();
        ATserial.println(comdata);
        delay(300);
        if(ATserial.find("OK")){
        Serial.println("send,ok");
        }
      }
  }
  delay(1000);
  ATserial.print("+++");//退出透传模式
  delay(1000);
}

(2)Arduino监控串口输出
在这里插入图片描述
(3)服务器接收到GNSS数据,到这里基本功能就完成了
在这里插入图片描述可以透传到服务器供后端解析,也可以在本地解析通过经纬度和时间戳计算设备速度(v=s/t),这个很简单就不展开了

3.说明

(1)这里只是一个测试mode,理论可行,但与事实相去甚远(实际项目已采用其他方案)
(2)理论上2G或者NB更便宜,但是没有采用,因为在2G的频段,由于多普勒效应,如果物体高速运动,2G会发生频移,导致信号很差,丢包严重,谨记

### 如何在Linux系统上配置EC200模块 #### 准备工作 为了使EC200模块能够在Linux系统下正常运行,需确认系统的内核版本支持该设备。对于基于Linux 5.10内核构建的官方系统,应当确保内核已包含EC200A的PID和VID的支持[^1]。 #### 连接与检 连接EC200模块至Linux主机后,可通过`lsusb`命令来验证USB接口上的设备是否被正确识别。此操作有助于初步判断硬件连接状态以及操作系统对该设备的基础识别能力[^3]。 ```bash lsusb ``` #### 加载必要驱动程序 为了让Linux能够有效管理并利用4G模块的功能,需要加载特定的驱动程序。这一步骤涉及两个主要动作: - 使用`modprobe`指令装载名为`option`的通用串行总线(USB)驱动程序,它允许Linux处理多种类型的调制解调器和其他类似设备。 ```bash sudo modprobe option ``` - 向指定路径写入代表厂商ID(Vendor ID)和产品ID(Product ID)组合的数据字符串,以便让系统知道如何关联这些标识符到相应的驱动逻辑中去。这里假设使用的具体型号为EC200U-CN,则对应的VID/PID应为`2c7c:0901`。 ```bash sudo sh -c 'echo "2c7c 0901" > /sys/bus/usb-serial/drivers/option1/new_id' ``` 完成上述设置之后,理论上应该可以实现对EC200模块的基本控制和支持了。如果遇到任何异常情况或性能问题,建议查阅更详细的文档资料或者联系技术支持获取进一步的帮助。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

外来务工人员徐某

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值