风筝
发表于: 2019-8-17 10:45:42 | 显示全部楼层

在某些电子项目中,我们需要随时了解地理位置并相应地执行特定操作。在本篇文章中,您将学习如何使用Arduino和LSM303DLHC GY-511罗盘模块制作数字罗盘。首先,您将了解到该模块及其工作原理,然后您将了解如何将LSM303DLHC GY-511模块与Arduino开发板连接。


罗盘模块

GY-511模块包括一个3轴加速度计和一个3轴磁力计。该传感器可以测量满量程±2 g /±4 g /±8 g /±16 g的线性加速度,满量程±1.3 /±1.9 /±2.5 /±4.0 /±4.7 /±5.6 /±8.1高斯的磁为。


当该模块置于磁场中时,根据洛伦兹定律,激励电流在其微观线圈中产生。罗盘模块将该电流转换为每个坐标方向的差分电压。使用这些电压,您可以计算每个方向的磁场并获得地理位置。


小提示:QMC5883L是另一种常用的罗盘模块。该模块具有与LMS303模块类似的结构和应用,其性能略有不同。因此,如果您正在编写项目,请注意您的模块类型。如果您的模块是QMC5882L,请使用文章中包含的相应库和代码。

compass-1.jpg


所需的材料

●    Arduino UNO R3开发板

●    GY-511 3轴加速度计+磁力计

●    伺服电机

●    1602 LCD模块

●    跳线

●    Arduino IDE

compass-required-materials.compressed.jpg


将GY-511指南针模块与Arduino连接

GY-511罗盘模块有8个引脚,但只需要4个与Arduino接口。该模块使用I2C协议与Arduino通信,因此将模块的SDA(I2C输出)和SCK(I2C时钟输入)引脚连接到Arduino开发板上的I2C引脚。

compass-pinout.compressed.jpg


GY-511罗盘模块校准

为了导航,首先需要校准模块,这意味着将测量范围设置为0到360度。为此,请将模块连接到Arduino,如下所示,并在电路板上上载以下代码。执行代码后,您可以在串行监视器窗口中查看X、Y和Z轴测量范围的最小值和最大值。您将在下一部分中需要这些数字,因此请将它们写下来。


电路连接

compass-circ1.jpg


代码

在此代码中,您需要Wire.h库用于I2C通信,而LMS303.h库用于罗盘模块。您可以从以下链接下载这些库。

●     LMS303.h库

●     Wire.h库


注意:如果您使用的是QMC5883,则需要以下库MechaQMC5883L.h

  1. /*   
  2. Compass Calibration
  3. by Hanie Kiani
  4. https://electropeak.com/learn/
  5. */
  6. #include <Wire.h>
  7. #include <LSM303.h>

  8. LSM303 compass;
  9. LSM303::vector<int16_t> running_min = {32767, 32767, 32767}, running_max = {-32768, -32768, -32768};

  10. char report[80];

  11. void setup() {
  12.   Serial.begin(9600);
  13.   Wire.begin();
  14.   compass.init();
  15.   compass.enableDefault();
  16. }

  17. void loop() {  
  18.   compass.read();
  19.   
  20.   running_min.x = min(running_min.x, compass.m.x);
  21.   running_min.y = min(running_min.y, compass.m.y);
  22.   running_min.z = min(running_min.z, compass.m.z);

  23.   running_max.x = max(running_max.x, compass.m.x);
  24.   running_max.y = max(running_max.y, compass.m.y);
  25.   running_max.z = max(running_max.z, compass.m.z);
  26.   
  27.   snprintf(report, sizeof(report), "min: {%+6d, %+6d, %+6d}    max: {%+6d, %+6d, %+6d}",
  28.     running_min.x, running_min.y, running_min.z,
  29.     running_max.x, running_max.y, running_max.z);
  30.   Serial.println(report);
  31.   
  32.   delay(100);
  33. }
  34.   compass.init();
  35.   compass.enableDefault();
复制代码

让我们看看一些新的函数:

  1. compass.enableDefault();
复制代码

模块初始化

  1.   compass.read();
复制代码

读取罗盘模块的输出值

  1. running_min.z = min(running_min.z, compass.m.z);
  2.   running_max.x = max(running_max.x, compass.m.x);
复制代码

通过比较测量值确定测量范围的最小值和最大值。


制作数字罗盘

校准模块后,我们将通过将伺服电机连接到模块来构建罗盘。所以伺服指示器总是向我们显示北方向,就像指南针上的红色箭头一样。为此,首先罗盘模块首先计算地理方向并将其发送到Arduino然后,通过应用适当的系数,您将计算伺服电机应旋转的角度,使其指示器指向磁北。最后,我们将该角度应用于伺服电机。


电路连接

compass-circ-2.png


代码

对于这部分,您还需要Servo.h库,默认情况下安装在Arduino软件上。

  1. /*   
  2. Compass Calibration
  3. by Hanie Kiani
  4. https://electropeak.com/learn/
  5. */
  6. #include <Wire.h>
  7. #include <LSM303.h>
  8. #include <Servo.h>
  9. LSM303 compass;
  10. int servoPin = 3;
  11. Servo Servo1;
  12. void setup() {
  13.   Serial.begin(9600);
  14.   Wire.begin();
  15.   Servo1.attach(servoPin);
  16.   compass.init();
  17.   compass.enableDefault();
  18.   

  19.   compass.m_min = (LSM303::vector<int16_t>){-32767, -32767, -32767};
  20.   compass.m_max = (LSM303::vector<int16_t>){+32767, +32767, +32767};
  21. }

  22. void loop() {
  23.   compass.read();
  24.   

  25.   float heading =compass.heading((LSM303::vector<int>){0, 0, 1});
  26.   
  27.   Serial.println(heading);
  28.   Servo1.write(180-heading);
  29.   delay(100);
  30. }
复制代码

让我们看看一些新的函数:

  1. Servo Servo1;
复制代码

模块初始化

  1.   compass.read();
复制代码

引入伺服电机对象

  1. Servo1.attach(servoPin);
复制代码

初始化罗盘模块和伺服电机

  1. compass.init();
  2. compass.enableDefault();
复制代码

Servo1.attach()的参数是连接到伺服电机的引脚编号。

  1. compass.m_min = (LSM303::vector){-32767, -32767, -32767};
  2.   compass.m_max = (LSM303::vector){+32767, +32767, +32767};
复制代码

使用这些代码可以定义用于测量前一部分中获得的范围的最小值和最大值。

  1. float heading =compass.heading((LSM303::vector){0, 0, 1});
复制代码

heading()函数返回坐标轴和固定轴之间的角度。您可以在函数参数中使用向量定义固定轴。例如,这里,通过定义 (LSM303 :: vector ) {0, 0, 1},Z轴被视为常数轴。

  1. Servo1.write(heading);
复制代码

Servo1.write()函数将罗盘模块的读取值应用于伺服电机。

compass-performance.compressed.jpg

提示:请注意,伺服电机可能具有磁场,因此最好将伺服电机放置在距罗盘模块适当的距离处,这样不会导致罗盘模块偏离。


以上就是本篇文章的全部内容。如遇到问题,请随时在本帖下面进行回复。

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

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-20 01:13 , Processed in 0.145088 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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