1341浏览
楼主: 驴友花雕

[项目] 【Arduino】168种传感器模块系列实验(158)---QMC5883L三轴罗盘

[复制链接]

驴友花雕  初级技神
 楼主|

发表于 2021-9-29 16:19:44

  【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
   实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
  项目之六:测试方向

  实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  3.   实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
  4.   项目之六:测试方向
  5.   实验接线:
  6.   QMC5883L-------------- UNO
  7.   VCC------------------- 5V
  8.   GND------------------- GND
  9.   SCL ------------------- A5
  10.   SDA------------------- A4
  11.   DRDY------------------ N/C
  12. */
  13. #include <QMC5883LCompass.h>
  14. QMC5883LCompass compass;
  15. void setup() {
  16.   Serial.begin(9600);
  17.   compass.init();
  18. }
  19. void loop() {
  20.   compass.read();
  21.   byte a = compass.getAzimuth();
  22.   char myArray[3];
  23.   compass.getDirection(myArray, a);
  24.   Serial.print(myArray[0]);
  25.   Serial.print(myArray[1]);
  26.   Serial.print(myArray[2]);
  27.   Serial.println();
  28.   delay(250);
  29. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-29 16:23:15

实验串口返回情况

24.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-29 16:34:55

  【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
  项目之七:三轴XYZ实时数据

  实验开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  3.   实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
  4.   项目之七:三轴XYZ实时数据
  5.   实验接线:
  6.   5883L-------------- UNO
  7.   VCC------------------- 5V
  8.   GND------------------- GND
  9.   SCL ------------------- A5
  10.   SDA------------------- A4
  11.   DRDY------------------ N/C
  12. */
  13. #include <QMC5883LCompass.h>
  14. QMC5883LCompass compass;
  15. void setup() {
  16.   Serial.begin(9600);
  17.   Serial.print("5883L准备就绪");
  18.   compass.init();
  19.   /*
  20.      调用 setSmoothing(STEPS, ADVANCED);
  21.      STEPS = int 平滑结果的步数。有效 1 到 10。
  22.      更高的步骤等于更平滑但更长的处理时间。
  23.      ADVANCED = bool 打开或关闭高级平滑。True 将从每个步骤中删除最大值和最小值,然后正常处理。
  24.      启用此功能将导致更加平滑,但需要更长的处理时间。
  25.   */
  26.   compass.setSmoothing(10, true);
  27. }
  28. void loop() {
  29.   int x, y, z;
  30.   // Read compass values
  31.   compass.read();
  32.   // Return XYZ readings
  33.   x = compass.getX();
  34.   y = compass.getY();
  35.   z = compass.getZ();
  36.   Serial.print("X: ");
  37.   Serial.print(x);
  38.   Serial.print(" Y: ");
  39.   Serial.print(y);
  40.   Serial.print(" Z: ");
  41.   Serial.print(z);
  42.   Serial.println();
  43.   delay(250);
  44. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-29 16:58:04

实验串口返回情况
25.jpg



回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-29 16:59:55

实验串口绘图器返回情况

02.gif
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-29 17:15:16

   【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
   实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
   项目之八:简单的QMC5883L 指南针演示

  实验开源代码

  1. /*
  2.    【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  3.    实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
  4.    项目之八:简单的QMC5883L 指南针演示
  5.    实验接线:
  6.    5883L-------------- UNO
  7.    VCC------------------- 5V
  8.    GND------------------- GND
  9.    SCL ------------------- A5
  10.    SDA------------------- A4
  11.    DRDY------------------ N/C
  12. */
  13. #include <QMC5883L.h>
  14. #include <Wire.h>
  15. QMC5883L compass;
  16. void setup() {
  17.   Wire.begin();
  18.   compass.init();
  19.   compass.setSamplingRate(50);
  20.   Serial.begin(9600);
  21.   Serial.println("QMC5883L 指南针演示");
  22.   Serial.println("向各个方向转动罗盘来校准....");
  23. }
  24. void loop(){
  25.   int heading = compass.readHeading();
  26.   if (heading == 0) {
  27.     /* Still calibrating, so measure but don't print */
  28.   } else {
  29.     Serial.println(heading);
  30.   }
  31.   delay(250);
  32. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-29 17:17:09

实验串口返回情况

26.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-29 21:35:09

   【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
   实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
   项目之九:动态四组数据,xyz+方位角a

  实验开源代码

  1. /*
  2.    【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  3.    实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
  4.    项目之九:动态四组数据,xyz+方位角
  5.    实验接线:
  6.    5883L-------------- UNO
  7.    VCC------------------- 5V
  8.    GND------------------- GND
  9.    SCL ------------------- A5
  10.    SDA------------------- A4
  11.    DRDY------------------ N/C
  12. */
  13. #include <Wire.h>
  14. #include <MechaQMC5883.h>
  15. MechaQMC5883 qmc;
  16. void setup() {
  17.   Wire.begin();
  18.   Serial.begin(9600);
  19.   qmc.init();
  20.   //qmc.setMode(Mode_Continuous,ODR_200Hz,RNG_2G,OSR_256);
  21. }
  22. void loop() {
  23.   int x, y, z;
  24.   int azimuth;
  25.   //float azimuth; //is supporting float too
  26.   qmc.read(&x, &y, &z, &azimuth);
  27.   //azimuth = qmc.azimuth(&y,&x);//you can get custom azimuth
  28.   Serial.print("x: ");
  29.   Serial.print(x);
  30.   Serial.print(" y: ");
  31.   Serial.print(y);
  32.   Serial.print(" z: ");
  33.   Serial.print(z);
  34.   Serial.print(" a: ");
  35.   Serial.print(azimuth);
  36.   Serial.println();
  37.   delay(800);
  38. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-29 21:47:19

实验串口返回情况

27.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-29 21:49:25

实验串口绘图器返回情况

03.gif
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 04:58:09

模块实验接线示意图

28.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 05:16:39

磁偏角(magnetic declination)
地磁偏角是指地球上任一处的磁北方向和正北方向之间的夹角。当地磁北向实际偏东时,地磁偏角为正,反之为负。地磁偏角在历史上最早由中国北宋科学家沈括记录在著作《梦溪笔谈》中:“方家以磁石磨针锋,则能指南,然常微偏东,不全南也。”而西方最早的记录则在此之后约400年。在地球上不同的地方,地磁偏角一般也不相同。在同一个地方,地磁偏角随着时间的推移也在不断变化。发生磁暴时和在磁力异常地区,如磁铁矿和高压线附近,地磁偏角将会产生急剧变化。在中国大陆的大部分地区,地磁偏角在-10°~+2°之间。在台湾则是-4°~-3°左右。正北(真北TN):

29.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 05:18:55

方格北(图北GN):以方格北线所测之方位角为方格方位角。
磁北(MN):地磁偏角:当地磁北向实际偏东时,地磁偏角为正,反之为负。

30.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 05:20:55

指北针指的方向是磁北(MN),假定磁偏角为偏东14度(14°E) ,正北(TN)会在磁北(MN)右边14度。xx°E:正北在磁北右边xx度。xx°W:正北在磁北左边xx度。

31.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 05:36:51

磁偏角是根据您当前位置应用的校正
为了从磁北得到真北,它因地而异。
例子:
基督城,东经 23° 35'
惠灵顿 , 22° 14' EAST
但尼丁,东经 25° 8'
奥克兰,东经 19° 30'

您所在地区的磁偏角可以从​​ http://www.magnetic-declination.com/ 获得

32.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 05:52:10

实际测量几个地方的磁偏角


33.jpg

34.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 05:54:02

35.jpg

36.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 06:39:35

   【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
   实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
   项目之十:根据当前位置来校正磁偏角

  实验开源代码

  1. /*
  2.    【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  3.    实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
  4.    项目之十:根据当前位置来校正磁偏角
  5.    实验接线:
  6.    5883L-------------- UNO
  7.    VCC------------------- 5V
  8.    GND------------------- GND
  9.    SCL ------------------- A5
  10.    SDA------------------- A4
  11.    DRDY------------------ N/C
  12. */
  13. #include <Arduino.h>
  14. #include <Wire.h>
  15. #include <HMC5883L_Simple.h>
  16. // Create a compass
  17. HMC5883L_Simple Compass;
  18. void setup() {
  19.   Serial.begin(9600);
  20.   Wire.begin();
  21.   // Magnetic Declination is the correction applied according to your present location
  22.   // in order to get True North from Magnetic North, it varies from place to place.
  23.   //
  24.   // The declination for your area can be obtained from http://www.magnetic-declination.com/
  25.   // Take the "Magnetic Declination" line that it gives you in the information,
  26.   //
  27.   // Examples:
  28.   //   Christchurch, 23° 35' EAST
  29.   //   Wellington  , 22° 14' EAST
  30.   //   Dunedin     , 25° 8'  EAST
  31.   //   Auckland    , 19° 30' EAST
  32.   //
  33.   Compass.SetDeclination(-0, 23, 'W');
  34.   //   The device can operate in SINGLE (default) or CONTINUOUS mode
  35.   //   SINGLE simply means that it takes a reading when you request one
  36.   //   CONTINUOUS means that it is always taking readings
  37.   //   for most purposes, SINGLE is what you want.
  38.   Compass.SetSamplingMode(COMPASS_CONTINUOUS);
  39.   //   The scale can be adjusted to one of several levels, you can probably leave it at the default.
  40.   //   Essentially this controls how sensitive the device is.
  41.   //   Options are 088, 130 (default), 190, 250, 400, 470, 560, 810
  42.   //   Specify the option as COMPASS_SCALE_xxx
  43.   //   Lower values are more sensitive, higher values are less sensitive.
  44.   //   The default is probably just fine, it works for me.  If it seems very noisy
  45.   //  (jumping around), incrase the scale to a higher one.
  46.   Compass.SetScale(COMPASS_SCALE_250);
  47.   //   The compass has 3 axes, but two of them must be close to parallel to the earth's surface to read it,
  48.   //   (we do not compensate for tilt, that's a complicated thing) - just like a real compass has a floating
  49.   //   needle you can imagine the digital compass does too.
  50.   //
  51.   //   To allow you to mount the compass in different ways you can specify the orientation:
  52.   //   COMPASS_HORIZONTAL_X_NORTH (default), the compass is oriented horizontally, top - side up. when pointing North the X silkscreen arrow will point North
  53.   //   COMPASS_HORIZONTAL_Y_NORTH, top-side up, Y is the needle,when pointing North the Y silkscreen arrow will point North
  54.   //   COMPASS_VERTICAL_X_EAST,    vertically mounted (tall) looking at the top side, when facing North the X silkscreen arrow will point East
  55.   //   COMPASS_VERTICAL_Y_WEST,    vertically mounted (wide) looking at the top side, when facing North the Y silkscreen arrow will point West
  56.   Compass.SetOrientation(COMPASS_HORIZONTAL_X_NORTH);
  57. }
  58. // Our main program loop.
  59. void loop() {
  60.   float heading = Compass.GetHeadingDegrees();
  61.   Serial.print("Heading: \t");
  62.   Serial.println( heading );
  63.   delay(500);
  64. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 06:50:14

实验串口返回情况
37.jpg


项目之十实验说明:这是第二次无法完成磁偏角的校准
第一次是使用QMC5883L的库,这次是使用HMC5883L的库,而实验采用模块的芯片是国产的DB5883L
这是三种有一定差异的不同产家的芯片,估计是在校准程序上有些不能兼容,其他功能还没有发现不兼容的情况。


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 07:10:03

   【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
   实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
   项目十一:使用Adafruit库的HMC5883 磁力计测试

  实验开源代码

  1. /*
  2.    【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  3.    实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
  4.    项目十一:使用Adafruit库的HMC5883 磁力计测试
  5.    实验接线:
  6.    5883L-------------- UNO
  7.    VCC------------------- 5V
  8.    GND------------------- GND
  9.    SCL ------------------- A5
  10.    SDA------------------- A4
  11.    DRDY------------------ N/C
  12. */
  13. #include <Wire.h>
  14. #include <Adafruit_Sensor.h>
  15. #include <Adafruit_HMC5883_U.h>
  16. /* Assign a unique ID to this sensor at the same time */
  17. Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(666666);
  18. void displaySensorDetails(void)
  19. {
  20.   sensor_t sensor;
  21.   mag.getSensor(&sensor);
  22.   Serial.println("------------------------------------");
  23.   Serial.print  ("Sensor:       "); Serial.println(sensor.name);
  24.   Serial.print  ("Driver Ver:   "); Serial.println(sensor.version);
  25.   Serial.print  ("Unique ID:    "); Serial.println(sensor.sensor_id);
  26.   Serial.print  ("Max Value:    "); Serial.print(sensor.max_value); Serial.println(" uT");
  27.   Serial.print  ("Min Value:    "); Serial.print(sensor.min_value); Serial.println(" uT");
  28.   Serial.print  ("Resolution:   "); Serial.print(sensor.resolution); Serial.println(" uT");
  29.   Serial.println("------------------------------------");
  30.   Serial.println("");
  31.   delay(500);
  32. }
  33. void setup(void)
  34. {
  35.   Serial.begin(9600);
  36.   Serial.println("HMC5883 Magnetometer Test"); Serial.println("");
  37.   /* Initialise the sensor */
  38.   if (!mag.begin())
  39.   {
  40.     /* There was a problem detecting the HMC5883 ... check your connections */
  41.     Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
  42.     while (1);
  43.   }
  44.   /* Display some basic information on this sensor */
  45.   displaySensorDetails();
  46. }
  47. void loop(void)
  48. {
  49.   /* Get a new sensor event */
  50.   sensors_event_t event;
  51.   mag.getEvent(&event);
  52.   /* Display the results (magnetic vector values are in micro-Tesla (uT)) */
  53.   Serial.print("X: "); Serial.print(event.magnetic.x); Serial.print("  ");
  54.   Serial.print("Y: "); Serial.print(event.magnetic.y); Serial.print("  ");
  55.   Serial.print("Z: "); Serial.print(event.magnetic.z); Serial.print("  "); Serial.println("uT");
  56.   // Hold the module so that Z is pointing 'up' and you can measure the heading with x&y
  57.   // Calculate heading when the magnetometer is level, then correct for signs of axis.
  58.   float heading = atan2(event.magnetic.y, event.magnetic.x);
  59.   // Once you have your heading, you must then add your 'Declination Angle', which is the 'Error' of the magnetic field in your location.
  60.   // Find yours here: http://www.magnetic-declination.com/
  61.   // Mine is: -13* 2' W, which is ~13 Degrees, or (which we need) 0.22 radians
  62.   // If you cannot find your Declination, comment out these two lines, your compass will be slightly off.
  63.   float declinationAngle = 0.1;
  64.   heading += declinationAngle;
  65.   // Correct for when signs are reversed.
  66.   if (heading < 0)
  67.     heading += 2 * PI;
  68.   // Check for wrap due to addition of declination.
  69.   if (heading > 2 * PI)
  70.     heading -= 2 * PI;
  71.   // Convert radians to degrees for readability.
  72.   float headingDegrees = heading * 180 / M_PI;
  73.   Serial.print("Heading (degrees): "); Serial.println(headingDegrees);
  74.   delay(500);
  75. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 07:12:33

实验串口返回情况

38.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail