Arduino解码高速GPS

飞控使用的GPS刷新率高达18Hz以上,使用UBX协议,除了能高速读出位置坐标,还能直接读出天向、东向、北向速度等信息,利于飞控使用。无人机上通常使用飞控板解码,不够灵活和微型化。本文报道Arduino单片机解码高速GPS,可组成更为简单灵活、微型化的飞控系统。

1,器材:

GPS模块,深圳市飞空科技RC12-B0带地磁,35元/片。

单片机采用Arduino Pro Micro或更小体积的Nano mini。

2,连线:

将GPS TX线连单片机D8脚,RX连D9,Vcc和GND分别连到单片机上。

3,代码:

使用软串口(8,9)读取GPS数据,UBX数据格式固定以B5 62开头,该GPS模块数据默认为NAV-PVT格式(码01 07)。数据头B5 62后面会接92个GPS数据,判断找到数据头后,逐个读出这些数据即可,详细数据格式可参考文章《UBX 协议报文整理》CIStoner。

注意每个读数操作后要加一个delay(1)延迟一下,不然数据不对,原因不明,实测有效。不需要的数据用for循环读,节约语句和内存。该示例中所有数据打印到串口显示,实际应用于飞控就不需要串口打印。

代码故意未做过多优化,利于初学者理解和调试,可以先写短一点只读最前面几个数,一步步调试,用串口打印如Serial.println(length),看看读出的数据对不对。

#include <SoftwareSerial.h>

SoftwareSerial gpsSerial(8, 9); // RX, TX

 

void setup() {

  Serial.begin(115200);

  gpsSerial.begin(115200);

}

void loop() {

  if (gpsSerial.available()) {

    if (gpsSerial.read() == 0xB5 ) {

      delay(1);

      if (gpsSerial.read() == 0x62 ) { // 同步字符判断

        delay(1);

      uint8_t msgClass = gpsSerial.read();

        delay(1);

      uint8_t msgId = gpsSerial.read();

        delay(1);

      uint8_t length = (gpsSerial.read());

        delay(1);

        gpsSerial.read();

        delay(1);

        Serial.println(length);    

        Serial.println(msgId);    

      if (msgClass == 0x01 && msgId == 0x07) { // NAV-PVT消息

        for(int i=0;i<4;i++){

          uint8_t Dt00 = gpsSerial.read();

          delay(1);  

        }

        uint8_t Dt1 = gpsSerial.read();

        delay(1);

        uint8_t Dt2 = gpsSerial.read();

        delay(1);      

        uint8_t Dt3 = gpsSerial.read();

        delay(1);

        uint8_t Dt4 = gpsSerial.read();

        delay(1);      

        uint8_t Dt5 = gpsSerial.read();

        delay(1);

        uint8_t Dt6 = gpsSerial.read();

        delay(1);      

        uint8_t Dt7 = gpsSerial.read();

        delay(1);

             

        // 日期和时间信息...

        Serial.print(Dt1+Dt2*256);

        Serial.print("-");

        Serial.print(Dt3);

        Serial.print("-");

        Serial.print(Dt4);

        Serial.print("  ");

        Serial.print(Dt5);  

        Serial.print("-");

        Serial.print(Dt6);

        Serial.print("-");

        Serial.println(Dt7);

        for(int i=0;i<12;i++){

          uint8_t Dt00 = gpsSerial.read();

          delay(1);  

        }  

//经纬度信息…

        uint8_t Dt8 = gpsSerial.read();

        delay(1);

        uint8_t Dt9 = gpsSerial.read();

        delay(1);      

        uint8_t Dt10 = gpsSerial.read();

        delay(1);

        uint8_t Dt11 = gpsSerial.read();

        delay(1);

        uint8_t Dt12 = gpsSerial.read();

        delay(1);      

        uint8_t Dt13 = gpsSerial.read();

        delay(1);      

        uint8_t Dt14

        delay(1);

        uint8_t Dt15 = gpsSerial.read();

        delay(1);

        uint8_t Dt16 = gpsSerial.read();

        delay(1);            

        Serial.print("卫星数");    

        Serial.println(Dt8);

        Serial.print("经度");    

Serial.println((1.0*Dt9+1.0*Dt10*256+1.0*Dt11*256*256+1.0*Dt12*256*256*256)/10000000.0);

        Serial.print("纬度");    

Serial.println((1.0*Dt13+1.0*Dt14*256+1.0*Dt15*256*256+1.0*Dt16*256*256*256)/10000000.0);

      }

    }

  }

  }

}​​​​​​​

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值