极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: Ansifa

Arduino学习笔记A3 - Arduino连接HMC5883L三轴电子罗盘传感器

  [复制链接]
发表于 2012-12-5 22:42:31 | 显示全部楼层
wudan3551 发表于 2012-7-16 19:36
为什么我编译的时候会报错,说:
error: 'class TwoWire' has no member named 'send'
C:\Users\Wu Dan\D ...

请问1.0以上版本具体如何改库?
回复 支持 反对

使用道具 举报

发表于 2012-12-7 18:42:18 | 显示全部楼层
楼主,我用0023版本测试你的程序,但是报错'HMC5883L does not name a type' ,请问如何修改?
回复 支持 反对

使用道具 举报

发表于 2013-1-22 22:46:18 | 显示全部楼层
1.0以上版本具体如何改库

没有人解答,我自己百度百度,终于解决了。方法如下:
打开库里的cpp文件,找到错误提示的行号所在,把 send 改为 write,把 receive 改为read,就好了。

供参考。

评分

参与人数 1 +6 收起 理由
Ansifa + 6 嗯嗯,1.0的最大差别就是串口了。没人回答这.

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2013-1-28 10:56:10 | 显示全部楼层
谢谢
回复 支持 反对

使用道具 举报

发表于 2013-2-16 06:14:36 | 显示全部楼层
本帖最后由 cosailer 于 2013-2-16 06:53 编辑
wudan3551 发表于 2012-8-16 14:14
我也是小车,具体怎么八字校正呢?给我讲一讲吧


最近实在太忙,就先单独把我的八字校准程序贴上来。
其实很简单,我没去管Z轴,如果想要更高的精度,需要加一个加速度传感器,我刚好没有。

我的整个校准分2个子函数:calibRead() 和 calibration()

参照官方HMC5883L的程序先把该定义的变量定义好。


  1. HMC5883L digicomp;

  2. float X_max = 0.0;  //X轴最大读数
  3. float X_min = 0.0;  //X轴最小读数

  4. float Y_max = 0.0;  //Y轴最大读数
  5. float Y_min = 0.0;  //Y轴最小读数

  6. float X_offset = 0.0;  //X轴偏移
  7. float Y_offset = 0.0;  //Y轴偏移

  8. void calibRead() //指南针读数
  9. {
  10.         MagnetometerScaled scaled2 = digicomp.ReadScaledAxis();
  11.         
  12.         if (  (abs(scaled2.XAxis) < 500) && (abs(scaled2.YAxis) < 500) && (abs(scaled2.ZAxis) < 500)) //这行对于我很重要,能过滤掉很多干扰,增加校准的精度。
  13.         {  //下面几行就是读取到每个轴的最大值和最小值,然后算出相应的偏移量
  14.             if(scaled2.XAxis > X_max) {X_max = scaled2.XAxis;}
  15.             if(scaled2.YAxis > Y_max) {Y_max = scaled2.YAxis;}
  16.             
  17.             if(scaled2.XAxis < X_min) {X_min = scaled2.XAxis;}
  18.             if(scaled2.YAxis < Y_min) {Y_min = scaled2.YAxis;}

  19.             X_offset = (X_max + X_min) / 2.0;
  20.             Y_offset = (Y_max + Y_min) / 2.0;
  21.         }
  22. }
  23.    
  24. void calibration()
  25. {
  26.         int i = 0;
  27.         digitalWrite(motor1EnPin, 0);  // 定义转弯方向,对于我的小车来说是左转,逆时针方向
  28.         digitalWrite(motor2EnPin, 1);
  29.             
  30.         analogWrite(motor1, 80);  // 启动马达开始转动
  31.         analogWrite(motor2, 80);
  32.         
  33.         while(i < 1000)  // 逆时针方向循环读取XY轴每个方向的值,然后算出相应的偏移量
  34.         {  calibRead();
  35.             delay(10);
  36.             i++;
  37.         }
  38.         
  39.         i = 0;
  40.         digitalWrite(motor1EnPin, 1);  // 右转小车,顺时针方向
  41.         digitalWrite(motor2EnPin, 0);
  42.         
  43.         while(i < 1000)  // 再顺时针方向方向旋转测算偏移量
  44.         {  calibRead();
  45.             delay(10);
  46.             i++;
  47.         }
  48.         
  49.         analogWrite(motor1, 0);  // 停止小车,校准完成
  50.         analogWrite(motor2, 0);
  51. }

  52. float readCompass()  //得到偏移了就可以读数了
  53. {
  54.         MagnetometerScaled scaled = digicomp.ReadScaledAxis();
  55.    
  56.         float heading = atan2(scaled.YAxis - Y_offset, scaled.XAxis - X_offset);  // 读数的时候直接减掉偏移量就可以了
  57.   
  58.         //float declinationAngle = 36.36/1000.0;  [这几行是考虑磁偏角的,除非真的是想
  59.         //heading = heading + declinationAngle;    找地理北极,不然对方向判断用处不大]
  60.   
  61.         if(heading < 0)  heading += 2*PI;
  62.         if(heading > 2*PI)  heading -= 2*PI;
  63.    
  64.         float headingDegrees = heading * 180/M_PI;
  65.    
  66.         return headingDegrees;
  67. }
复制代码


严格来说这个传感器读出来的仅仅是三轴方向磁场强度而已,角度是算出来的。另外他对磁场感应很灵敏,周围有金属就会有干扰,拿块金属在他周围转转就能看到读数很大的变化,所以校准还是很有必要的。

手机的话因为画8字能很快测得XY的偏移,所以方法就叫8字校准。小车的话因为可以旋转,就没必要真的去走8字,直接转圈就可以了。这是我的理解。
回复 支持 反对

使用道具 举报

发表于 2013-2-26 13:34:38 | 显示全部楼层
wudan3551 发表于 2012-7-16 19:36
为什么我编译的时候会报错,说:
error: 'class TwoWire' has no member named 'send'
C:\Users\Wu Dan\D ...

将 该函数里的Wire.send 改为 Wire.write 就可以了,下面的错误同理
回复 支持 反对

使用道具 举报

发表于 2013-3-18 15:18:14 | 显示全部楼层
本帖最后由 瘦网虫 于 2013-3-18 15:23 编辑

arduino mega 2560接线不是a4,a5,是接20,21,上面标注了sda,scl。提个醒哈。
回复 支持 反对

使用道具 举报

发表于 2013-3-29 16:06:34 | 显示全部楼层
请问楼主,为什么在arduino1.52中使用您的库文件,会出现以下错误?
C:\Users\Yang\Documents\Arduino\libraries\HMC5883L\HMC5883L.cpp: In member function 'void HMC5883L::Write(int, int)':
C:\Users\Yang\Documents\Arduino\libraries\HMC5883L\HMC5883L.cpp:110: error: 'class TwoWire' has no member named 'send'
C:\Users\Yang\Documents\Arduino\libraries\HMC5883L\HMC5883L.cpp:111: error: 'class TwoWire' has no member named 'send'
C:\Users\Yang\Documents\Arduino\libraries\HMC5883L\HMC5883L.cpp: In member function 'uint8_t* HMC5883L::Read(int, int)':
C:\Users\Yang\Documents\Arduino\libraries\HMC5883L\HMC5883L.cpp:118: error: 'class TwoWire' has no member named 'send'
C:\Users\Yang\Documents\Arduino\libraries\HMC5883L\HMC5883L.cpp:129: error: 'class TwoWire' has no member named 'receive'
回复 支持 反对

使用道具 举报

发表于 2013-5-5 20:20:35 | 显示全部楼层
yangfanconan 发表于 2013-3-29 16:06
请问楼主,为什么在arduino1.52中使用您的库文件,会出现以下错误?

试试33楼的方法
回复 支持 反对

使用道具 举报

发表于 2013-5-6 17:53:52 | 显示全部楼层
楼主,为什么我的角度一直不变化?一直是89.92,270.00,273.5;我用的是GY-86集成的HMC5883
回复 支持 反对

使用道具 举报

发表于 2013-5-12 21:11:24 | 显示全部楼层
编译后出现error: 'class TwoWire' has no member named 'receive'
请问什么情况呀
回复 支持 反对

使用道具 举报

发表于 2013-5-28 08:58:19 | 显示全部楼层
既然电子罗盘能测旋转,那陀螺仪有啥意义呢?
回复 支持 反对

使用道具 举报

发表于 2013-6-8 17:44:47 | 显示全部楼层
有意思,回头买一块玩玩。。。
回复 支持 反对

使用道具 举报

发表于 2013-6-17 02:21:24 | 显示全部楼层
谢谢。宝贵的资料。
回复 支持 反对

使用道具 举报

发表于 2013-7-15 10:26:37 | 显示全部楼层
zhangzhe0617 发表于 2012-9-20 10:08
楼主,请问F:\arduino-1.0.1-windows\arduino-1.0.1\arduino-1.0.1\libraries\HMC5883L\HMC5883L.cpp: In m ...

可以到libraries下的HMC5883L.cpp文件中把wire.receive改成wire.read,把wire.send改成wire.write就可以了~
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-9-24 14:27 , Processed in 0.052251 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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