[貂蝉がプログラミングを学ぶ] Arduino ハンズオン (193) --- Quectel BC20 NB+GNSS モジュール 9

37 個のセンサーとモジュールというアイデアはインターネット上で広く広まっていますが、実際には、Arduino と互換性のあるセンサー モジュールは 37 個以上あるはずです。いくつかのセンサーとアクチュエータモジュールが手元に蓄積されているという事実を考慮して、真の知識(手作業で行う必要がある)の概念に従って、学習とコミュニケーションの目的で、より多くの実験を試みるつもりです——小さな進歩でも、解決できない問題でも、レンガを投げて翡翠に火花を散らすことができればと思っています。

【Arduino】168センサーモジュールシリーズ実験(データコード+シミュレーションプログラミング+グラフィックスプログラミング)
実験193:Gravity:I2C&UART BC20 NB-IoT&GNSS通信モジュール
NB-IoT広域小電力無線通信 GPS / 北斗正確測位屋外のモノのインターネットに必要

ここに画像の説明を挿入
ここに画像の説明を挿入
ナレッジポイント: Quectel BC20
BC20 は、高性能、低消費電力、マルチバンドを備え、GNSS 測位機能をサポートする NB-IoT 無線通信モジュールです。そのサイズはわずか18.7 mm × 16.0 mm × 2.1 mmで、小型モジュール製品の端末機器のニーズを最大限に満たすことができ、同時に顧客の製品サイズの縮小と製品コストの最適化に効果的に役立ちます。

BC20 は、Quectel GSM/GPRS/GNSS シリーズ MC20 モジュールと互換性があるように設計されており、顧客が製品を迅速かつ柔軟に設計およびアップグレードするのに便利です。BC20 は豊富な外部インターフェイスとプロトコル スタックを提供し、China Mobile OneNET、China Telecom IoT、Alibaba Cloud IoT などの IoT クラウド プラットフォームをサポートし、顧客のアプリケーションに大きな利便性を提供します。

高度な GNSS テクノロジーに基づいて、BC20 は北斗と GPS デュアル衛星ナビゲーション システムの復調アルゴリズムをサポートし、測位の精度を高め、マルチパス干渉防止を強化します。これにより、従来の単一 GPS 測位モジュールよりも多くの利点があります。さらに、BC20 モジュールには LNA と低電力アルゴリズムが組み込まれています。前者はより高い感度を保証し、後者は低電力モードでのより低い電流消費を保証します。

従来の NB-IoT + GNSS ソリューションと比較して、BC20 の統合設計により体積が 40% 削減されます。コンパクトなサイズ、超低消費電力、超広い動作温度範囲を備えた BC20 は、さまざまな用途で大きな利点を持っています; その主な応用分野は、自転車やオートバイの盗難防止、ペットの追跡、金融資産の追跡、ドライブレコーダーなどです。

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
【Arduino】168種類のセンサーモジュールシリーズ実験(データコード+シミュレーションプログラミング+グラフィックスプログラミング)
実験209:Gravity:I2C&UART BC20 NB-IoT&GNSS通信モジュール
NB-IoT広域小電力無線通信 GPS/北斗屋外のモノのインターネットには正確な測位が必要です。
項目 16: シリアル ポートを介して全地球航法衛星システムの RMC プロトコルの情報を問い合わせます。

実験的なオープンソース コード

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
  NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
  项目十六:通过串口查询全球导航卫星系统RMC协议的信息
  实验接线:
  BC20       UNO
  VIN        5V
  GND        GND
  SCL        A5
  SDA        A4
*/

#include "DFRobot_BC20_Gravity.h"

//RGB有7种颜色可供选择
#define  RED 0
#define  BLUE 1
#define  GREEN 2
#define  YELLOW 3
#define  PURPLE 4
#define  CYAN 5
#define  WHITE 6

//IIC通讯
#define USE_IIC

//硬件串口通讯
//#define USE_HSERIAL

//软件串口通讯
//#define USE_SSERIAL

DFRobot_BC20_IIC myBC20(0x33);

void setup() {
    
    
  Serial.begin(115200);
  myBC20.LED_OFF();

  //初始化 BC20
  Serial.print("正在启动BC20,请稍等...... ");
  myBC20.changeColor(RED);
  while (!myBC20.powerOn()) {
    
    
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
  }
  Serial.println("BC20 启动成功!");

  //禁用睡眠模式
  myBC20.configSleepMode(eSleepMode_Disable);

  //启动 GNSS
  Serial.print("打开全球导航卫星系统...  ");
  myBC20.setQGNSSC(ON);
  myBC20.changeColor(YELLOW);
  if (myBC20.getQGNSSC() == OFF) {
    
    
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
  }
  Serial.println("GNSS 开启");
  Serial.println("查询全球导航卫星系统RMC协议");
  myBC20.changeColor(CYAN);
}

void loop() {
    
    
  myBC20.getQGNSSRD(NMEA_RMC);

  //UTC 日期,格式:ddmmyy,例如,290519 = 2019/05/29
  Serial.print("UTC 日期: ");
  Serial.println(sRMC.UTC_Date());

  /*
     UTC 时间,格式:hhmmss.ss,例如。162436.54 = 16:24:36.54
     h - 小时
     m - 分钟
     s - 秒
  */
  Serial.print("UTC 时间: ");
  Serial.println(sRMC.UTC_Time());

 /*
     数据状态
     V - 无效
     一个有效的
  */
  Serial.print("数据状态: ");
  Serial.println(sRMC.DataStatus());

  /*
     纬度,格式:ddmm.mmmmm,例如。3150.7820 => 31 度 50.7820 分钟
     d - 度
     m - 分钟
  */
  Serial.print("纬度: ");
  Serial.print(sRMC.LatitudeVal());
  Serial.print(" ");
  
  /*
     北纬或南纬
     N - 北
     S - 南
  */
  Serial.println(sRMC.LatitudeDir());

  /*
     经度,格式:dddmm.mmmmm,例如。12135.6794 => 121 度 35.6794 分钟
     d - 度
     m - 分钟
  */
  Serial.print("经度: ");
  Serial.print(sRMC.LongitudeVal());
  Serial.print(" ");

  /*
     东经或西经
     E - 东
     W - 西
  */
  Serial.println(sRMC.LongitudeDir());

  //地速,对地速度,单位为节
  Serial.print("地速: ");
  Serial.print(sRMC.GroundSpeed());
  Serial.println(" 节");

  //地面航向,单位为度
  Serial.print("地面航向: ");
  Serial.println(sRMC.GroundHeading());

  //磁偏角,单位为度
  Serial.print("磁偏角: ");
  Serial.println(sRMC.MagDeclination());

  //磁偏角方向,磁偏角 E/W 指示器
  Serial.print("磁偏角方向: ");
  Serial.println(sRMC.MagDeclinationDir());

  /*
     定位方式
     N - 没有修复
     A - 自主 GPS 定位
     D - 差分 GPS 定位
  */
  Serial.print("定位模式: ");
  Serial.println(sRMC.PositioningMode());

   /*
     导航状态
     V - 无效
  */
  Serial.print("导航状态: ");
  Serial.println(sRMC.NaviStatus());
  Serial.println();
  Serial.println();
  myBC20.clearGPS();

  myBC20.LED_ON();
  delay(500);
  myBC20.LED_OFF();
#ifndef ARDUINO_ESP32_DEV  
  delay(500);
#else 
  delay(5000);
#endif
}

試験的なシリアルポートの復帰

ここに画像の説明を挿入
NMEA0183 標準センテンス(よく使われるGPSセンテンス)

G P R M C 例: GPRMC 例: GPRMCの例: GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,A*50
フィールド 0: $GPRMC、ステートメント ID。ステートメントが推奨される最小固有 GPS/TRANSIT データ (RMC) であることを示します。 ) 推奨事項 最小測位情報
フィールド 1: UTC 時間、hhmmss.sss 形式
フィールド 2: ステータス、A= 位置、V= 位置なし
フィールド 3: 緯度 ddmm.mmmm、度分形式 (先頭の桁が不十分な場合は 0 を追加) )
フィールド 4: 緯度 N (北緯) または S (南緯)
フィールド 5: 度形式の経度 dddmm.mmmm (先頭の桁が足りない場合は 0 を追加します)
フィールド 6: 経度 E (東経) または W (西経)
フィールド 7: 速度、ノット、ノット
フィールド 8: 方位角、度
フィールド 9: UTC 日付、DDMMYY 形式
フィールド 10: 磁気偏角、(000 - 180) 度 (先頭の桁が足りない場合は 0 を追加します)
フィールド 11 :磁気偏角方向、E=East W=West
フィールド16:チェック値

【Arduino】168種類のセンサーモジュールシリーズ実験(データコード+シミュレーションプログラミング+グラフィックスプログラミング)
実験209:Gravity:I2C&UART BC20 NB-IoT&GNSS通信モジュール
NB-IoT広域小電力無線通信 GPS/北斗屋外のモノのインターネットには正確な測位が必要です。
項目 17: シリアル ポートを介して全地球航法衛星システムの VTG プロトコルの情報を照会します。

実験的なオープンソース コード

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  实验二百零九:Gravity: I2C & UART BC20 NB-IoT & GNSS通信模块
  NB-IoT广域低功耗无线通信 GPS/北斗精准定位 户外物联网必备
  项目十七:通过串口查询全球导航卫星系统VTG协议的信息
  实验接线:
  BC20       UNO
  VIN        5V
  GND        GND
  SCL        A5
  SDA        A4
*/

#include "DFRobot_BC20_Gravity.h"

//RGB有7种颜色可供选择
#define  RED 0
#define  BLUE 1
#define  GREEN 2
#define  YELLOW 3
#define  PURPLE 4
#define  CYAN 5
#define  WHITE 6

//IIC通讯
#define USE_IIC

//硬件串口通讯
//#define USE_HSERIAL

//软件串口通讯
//#define USE_SSERIAL

DFRobot_BC20_IIC myBC20(0x33);

void setup() {
    
    
  Serial.begin(115200);
  myBC20.LED_OFF();

  //初始化 BC20
  Serial.print("正在启动BC20,请稍等...... ");
  myBC20.changeColor(RED);
  while (!myBC20.powerOn()) {
    
    
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
  }
  Serial.println("BC20 启动成功!");

  //禁用睡眠模式
  myBC20.configSleepMode(eSleepMode_Disable);

  //启动 GNSS
  Serial.print("打开全球导航卫星系统...  ");
  myBC20.setQGNSSC(ON);
  myBC20.changeColor(YELLOW);
  if (myBC20.getQGNSSC() == OFF) {
    
    
    Serial.print(".");
    myBC20.LED_ON();
    delay(500);
    myBC20.LED_OFF();
    delay(500);
  }
  Serial.println("GNSS 开启");
  Serial.println("查询全球导航卫星系统VTG协议");
  myBC20.changeColor(CYAN);
}

void loop() {
    
    
  myBC20.getQGNSSRD(NMEA_VTG);

  //地面路线(真),以度为单位
  Serial.print("地面路线: ");
  Serial.print(sVTG.GroundCourse_True());
  Serial.println(" 度");

  //对地航向(磁性),单位为度
  Serial.print("对地航向: ");
  Serial.print(sVTG.GroundCourse_Mag());
  Serial.println(" 度");

  //对地速度,单位为节
  Serial.print("地速: ");
  Serial.print(sVTG.GroundCourse_Knots());
  Serial.println(" 节");

  //对地速度,单位公里/小时
  Serial.print("地速: ");
  Serial.print(sVTG.GroundCourse_Kmh());
  Serial.println(" km/h");

  /*
     定位方式
     N - 没有修复
     A - 自主 GPS 定位
     D - 差分 GPS 定位
  */
  Serial.print("定位模式: ");
  Serial.println(sVTG.PositioningMode());
  Serial.println();
  Serial.println();
  myBC20.clearGPS();

  myBC20.LED_ON();
  delay(500);
  myBC20.LED_OFF();
#ifndef ARDUINO_ESP32_DEV  
  delay(500);
#else 
  delay(5000);
#endif
}

試験的なシリアルポートの復帰

ここに画像の説明を挿入

NMEA0183 標準センテンス(よく使われるGPSセンテンス)

GPVTG の例: GPVTG の例:GP V TGの例: GPVTG,89.68,T,M,0.00,N,0.0,K*5F
フィールド 0: $GPVTG、センテンス ID、センテンスが Track Made Good および Ground Speed (VTG) の対地速度情報であることを示す
フィールド 1: 移動角度、000 ~ 359 (先頭の桁が不足している場合は 0 を追加)
フィールド 2: T=真北基準系
フィールド 3: 移動角度、000 ~ 359 (先頭の桁が不足している場合は 0 を追加) )
フィールド 4: M=磁北基準
座標系 フィールド 5: 水平移動速度 (0.00) (先頭の桁が足りない場合は 0 を加算します)
フィールド 6: N= 断面、ノット
フィールド 7: 水平移動速度 (0.00) (0 は先頭の桁が足りない場合は追加)
フィールド 8: K = km/h、km/h
フィールド 9: 値をチェック

おすすめ

転載: blog.csdn.net/weixin_41659040/article/details/132138601