1650浏览
楼主: 驴友花雕

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

[复制链接]

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 07:40:55

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

  实验开源代码

  1. /*
  2.    【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  3.    实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
  4.    项目十二:使用简单的代码扫描三轴磁场传感器GY-271的 I2C 地址
  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> //include Wire.h library
  14. void setup()
  15. {
  16.   Wire.begin(); // Wire communication begin
  17.   Serial.begin(9600); // The baudrate of Serial monitor is set in 9600
  18.   while (!Serial); // Waiting for Serial Monitor
  19.   Serial.println("\nI2C Scanner");
  20. }
  21. void loop()
  22. {
  23.   byte error, address; //variable for error and I2C address
  24.   int nDevices;
  25.   Serial.println("Scanning...");
  26.   nDevices = 0;
  27.   for (address = 1; address < 127; address++ )
  28.   {
  29.     // The i2c_scanner uses the return value of
  30.     // the Write.endTransmisstion to see if
  31.     // a device did acknowledge to the address.
  32.     Wire.beginTransmission(address);
  33.     error = Wire.endTransmission();
  34.     if (error == 0)
  35.     {
  36.       Serial.print("I2C device found at address 0x");
  37.       if (address < 16)
  38.         Serial.print("0");
  39.       Serial.print(address, HEX);
  40.       Serial.println("  !");
  41.       nDevices++;
  42.     }
  43.     else if (error == 4)
  44.     {
  45.       Serial.print("Unknown error at address 0x");
  46.       if (address < 16)
  47.         Serial.print("0");
  48.       Serial.println(address, HEX);
  49.     }
  50.   }
  51.   if (nDevices == 0)
  52.     Serial.println("No I2C devices found\n");
  53.   else
  54.     Serial.println("done\n");
  55.   delay(5000); // wait 5 seconds for the next I2C scan
  56. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 07:42:59

实验串口返回情况

39.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 08:10:46

   【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 <Wire.h> //I2C Arduino Library
  14. #define HMC5883L_ADDR 0x0D //0011110b, I2C 7bit address of HMC5883
  15. bool haveHMC5883L = false;
  16. bool detectHMC5883L ()
  17. {
  18.   // read identification registers
  19.   Wire.beginTransmission(HMC5883L_ADDR); //open communication with HMC5883
  20.   Wire.write(10); //select Identification register A
  21.   Wire.endTransmission();
  22.   Wire.requestFrom(HMC5883L_ADDR, 3);
  23.   if(3 == Wire.available()) {
  24.     char a = Wire.read();
  25.     char b = Wire.read();
  26.     char c = Wire.read();
  27.     if(a == 'H' && b == '4' && c == '3')
  28.       return true;
  29.   }
  30.   return false;
  31. }
  32. void setup()
  33. {
  34.   //Initialize Serial and I2C communications
  35.   Serial.begin(9600);
  36.   Serial.println("GY271 TEST");
  37.   Wire.begin();
  38.   // lower I2C clock http://www.gammon.com.au/forum/?id=10896
  39.   TWBR = 78;  // 25 kHz
  40.   TWSR |= _BV (TWPS0);  // change prescaler  
  41. }
  42. void loop()
  43. {
  44.   bool detect = detectHMC5883L();
  45.   if(!haveHMC5883L)
  46.   {
  47.     if(detect)
  48.     {
  49.       haveHMC5883L = true;
  50.       Serial.println("We have HMC5883L, moving on");
  51.       // Put the HMC5883 IC into the correct operating mode
  52.       Wire.beginTransmission(HMC5883L_ADDR); //open communication with HMC5883
  53.       Wire.write(0x02); //select mode register
  54.       Wire.write(0x00); //continuous measurement mode
  55.       Wire.endTransmission();
  56.     }
  57.     else
  58.     {  
  59.       Serial.println("No HMC5883L detected!");
  60.       delay(2000);
  61.       return;
  62.     }
  63.   }
  64.   else
  65.   {
  66.     if(!detect) {
  67.       haveHMC5883L = false;
  68.       Serial.println("Lost connection to HMC5883L!");
  69.       delay(2000);
  70.       return;
  71.     }
  72.   }
  73.   
  74.   int x,y,z; //triple axis data
  75.   //Tell the HMC5883 where to begin reading data
  76.   Wire.beginTransmission(HMC5883L_ADDR);
  77.   Wire.write(0x0D); //select register 3, X MSB register
  78.   Wire.endTransmission();
  79. //Read data from each axis, 2 registers per axis
  80.   Wire.requestFrom(HMC5883L_ADDR, 6);
  81.   if(6<=Wire.available()){
  82.     x = Wire.read()<<8; //X msb
  83.     x |= Wire.read(); //X lsb
  84.     z = Wire.read()<<8; //Z msb
  85.     z |= Wire.read(); //Z lsb
  86.     y = Wire.read()<<8; //Y msb
  87.     y |= Wire.read(); //Y lsb
  88.   }
  89.   
  90.   //Print out values of each axis
  91.   Serial.print("x: ");
  92.   Serial.print(x);
  93.   Serial.print("  y: ");
  94.   Serial.print(y);
  95.   Serial.print("  z: ");
  96.   Serial.println(z);
  97.   
  98.   delay(250);
  99. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 08:13:23

实验串口返回情况(未能识别国产芯片)
40.jpg

回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 09:54:31

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

  实验开源代码

  1. /*
  2.    【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)
  3.    实验一百五十八:QMC5883L电子指南针罗盘模块 三轴磁场传感器GY-271
  4.    项目十四:QMC5883LCompass三轴磁力计罗盘传感器
  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(void) {
  16.   // start serial port
  17.   Serial.begin(115200);
  18.   Serial.println("\n\n\nQMC5883 磁力计测试");
  19.   Serial.println("");
  20.   
  21.   compass.init();
  22. }
  23. void loop() {
  24. int x, y, z, a, b;
  25.   char myArray[3];
  26.   
  27.   compass.read();
  28.   
  29.   x = compass.getX();
  30.   y = compass.getY();
  31.   z = compass.getZ();
  32.   a = compass.getAzimuth();
  33.   b = compass.getBearing(a);
  34.   compass.getDirection(myArray, a);
  35.    
  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.print(" 方位角: ");
  43.   Serial.print(a);
  44.   Serial.print(" 方位: ");
  45.   Serial.print(b);
  46.   Serial.print(" 方向: ");
  47.   Serial.print(myArray[0]);
  48.   Serial.print(myArray[1]);
  49.   Serial.print(myArray[2]);
  50.   Serial.println();
  51.   delay(500);
  52. }
复制代码


回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 09:55:50

实验串口返回情况

41.jpg
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 10:02:43

实验串口绘图器返回情况

04.gif
回复

使用道具 举报

驴友花雕  初级技神
 楼主|

发表于 2021-9-30 10:11:57

  实验场景图

42.jpg
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail