目录
一、概述
GY-26 是一款低成本平面数字罗盘模块。输入电压低,功耗小,体积小。其工作原理是通过磁传感器中两个相互垂直轴同时感应地球磁场的磁分量,从而得出方位角度,此罗盘以RS232 协议及IIC 协议与其他设备通信。该产品精度高,稳定性高。并切具有重新标定的功能,能够在任意位置得到准确的方位角,其输出的波特率是 9600bps,数据以询问方式输出,具有硬铁校准功能磁偏角补偿功能,适应不同的工作环境。
二、串口通信协议
1.串口通信参数
波特率:9600 bps 校验位:N 数据位:8 停止位:1
2.模块输出格式,每帧包含 8 个字节:
①.Byte0: 0x0D (ASCII 码 回车)
②.Byte1: 0x0A (ASCII 码 换行)
③.Byte2: 0x30~0x33 角度百位 (ASCII 0~3)
④.Byte3: 0x30~0x39 角度十位 (ASCII 0~9)
⑤.Byte4: 0x30~0x39 角度个位 (ASCII 0~9)
⑥.Byte5: 0x2E (ASCII 码小数点)
⑦.Byte6: 0x30~0x39 角度小数位(ASCII 0~9)
⑧.Byte7: 0x00~0xFF 校验和 (仅低 8bit)
注:校验和 Byte7 =(Byte0+ Byte1+…….Byte6)结果仅取低 8bit
例:一帧数据 <0x0D-0x0A-0x33-0x35-0x39-0x2E-0x36-0x1C> = 359.6°
3.命令字节,由外部控制器发送至模块(十六进制)
①.0x31:进行一次角度测量
②.0xC0: 校 准 磁 场 开 始
③.0xC1 :校准磁场结束
④.0xA0-0XAA-0XA5-0XC5 :恢复出厂设定
⑤.0xA0-0XAA-0XA5-IIC_ADDR :模块的 IIC 地址修改
⑥.0x03 + 磁偏高 8 位 :磁偏角设定,正北方向设定
⑦.0x04 + 磁偏低 8 位 :磁偏角设定,正北方向设定
例:发送 0XC0 至模块时,模块应答以下 1 帧
<0x0D-0x0A-0x30-0x30-0x30-0x2E-0x30-0x05> 表示成功
Led 灯亮起,进入校准
例:发送 0x03,0x00,0x04,0x64 至模块时,模块应答以下 1 帧(2 次)
<0x0D-0x0A-0x30-0x30-0x30-0x2E-0x30-0x05> 表示成功
磁偏角被修改为 10.0 度
三、IIC 通信协议
1.内部地址
实际当前角度值为上表“角度值高 8 位”与“角度值低 8 位”合成的 16位数据,数据范围 0-3599(因为分辨率为 0.1°)
实际当前磁偏角值为“磁偏角高 8 位”与“磁偏角低 8 位”合成的 16位数据,数据范围 0-3599(因为分辨率为 0.1°)
2.命令表
磁偏角的值,范围 0-3599(因为分辨率为 0.1°),是由 2 个 8 位的数据组成,当修改模块磁偏角时,分为高 8 位值,低 8 位值,写入模块。
3.IIC 地址
模块的 IIC 地址可修改,出厂默认是 0xe0。模块上电时 led 对应 IIC 地址闪动,闪动的次数由模块上电 led 亮起,led 灭掉开始记。若模块上电立即向模块发送命令,则 led 不闪动。向模块写入地址时,模块只接收以下16 个数据地址,其他无效
四、术语说明
1.磁偏角
磁北线与真北线之间的夹角(如图),地球表面任一点的磁子午圈同地理子午圈的夹角。不同的地点磁偏角不同,同一地点不同的时间磁偏角也不同。模块的磁偏角=原始角度+设定磁偏角度,即顺时针加上。例如:磁偏角为 0 的 100度,此时更改磁偏角为 10 度,那么模块输出为 100+10=110 度。
2.硬铁补偿,磁场校准
当电子指南针使用的环境发生改变时,由于受到周围磁场的影响,输出的角度也将会受到干扰,为了消除干扰,需要进行环境磁场校准。本模块的校准方法有三种种 如下:
①. 在模块的第 9(CAL)引脚,接一按键至电源负极(GND),当第一次按下按键时,进入校准状态,LED 常亮起。保持模块水平,缓慢旋转 1 周(旋转 1 周时间大约 1 分钟)。再次按下按键 LED 灭,校准结束。
②. 控制器串口发送数据 0XC0 至模块后 LED 常亮起,模块应答成功数据。保持模块水平,缓慢旋转 1 周(旋转 1 周时间大约 1 分钟)。发送数据 0XC1 至模块,LED 灭,校准结束。此时模块模块应答本次校准的等级(0 级~9 级,级数越大说明校准越好),应答一帧格式为:
注:校验和 Byte7 =(Byte0+ Byte1+…….Byte6)结果仅取低 8bit
例:发送 0XC1 至模块时,模块应答以下 1 帧
<0x0D-0x0A-0x30-0x30-0x30-0x2E-0x39-0x0E> 表示成功校准等级 9
③. 控制器经 IIC 总线发送数据 0x00+ 0xC0 至模块后 LED 常亮起保持模块水平,缓慢旋转 1 周(旋转 1 周时间大约 1 分钟)。发送数据 0x00+0XC1至模块,LED 灭,校准结束。
五、驱动程序
#include <REG52.H>
#include <math.h>
#include <stdio.h>
#include <INTRINS.H>
#include <UART.h>
#include <KEY.H>
#include <LCD1602.H>
void Delay_x_ms(unsigned int x)//延时函数
{
unsigned char data i, j;
while(x--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void Show()//数据处理以及LCD显示
{
unsigned char SUM;
if(RCE_uart.arr[0]==0X0D&&RCE_uart.arr[1]==0X0A)
{
SUM=RCE_uart.arr[6]+RCE_uart.arr[5]+RCE_uart.arr[4]+RCE_uart.arr[3]+RCE_uart.arr[2]+RCE_uart.arr[1]+RCE_uart.arr[0];//计算校验和
if(RCE_uart.arr[7]==SUM) //判断校验和
{
LCD_ShowChar(1,1,RCE_uart.arr[2]); //角度百位值 写入LCD,因为是字符类型,所以不用转换,直接显示
LCD_ShowChar(1,2,RCE_uart.arr[3]); //角度十位值 写入LCD
LCD_ShowChar(1,3,RCE_uart.arr[4]); //角度个位值 写入LCD
LCD_ShowChar(1,4,RCE_uart.arr[5]); //小数点
LCD_ShowChar(1,5,RCE_uart.arr[6]); //角度小数位值 写入LCD
}
}
}
void ReadKey()
{
EA=0;
switch(Key_return())
{
case 3:
UART_SendByte(0XC0);Show();
break;
case 4:
UART_SendByte(0XC1);Show();
break;
case 5:
UART_SendByte(0XA0);Show();
UART_SendByte(0XAA);Show();
UART_SendByte(0XA5);Show();
UART_SendByte(0XC5);Show();
break;
case 6:
UART_SendByte(0X03);Show();
UART_SendByte(0X00);Show();
UART_SendByte(0X04);Show();
UART_SendByte(0X64);Show();
break;
}
EA=1;
}
void main()
{
Delay_x_ms(1000);
KEY_Init();
LCD_Init();
Uart_Init();
EA=1;
while(1)
{
RCE_uart.len=0;
UART_SendByte(0x31); //发送1帧读取命令
Show();
ReadKey();
Delay_x_ms(200);
}
}
程序及相关资料可留言获取,IIC没有实例测试工程,只提供参考程序
六、实物演示
方位对比,箭头指向为北
按下第一个按键时,LED常亮, 开始校准磁场,按下第二个按键退出校准
按下第三个按键恢复出厂,按下第四个按键磁偏角设置为10(左边是未设置磁偏角,右边是按下按键设置磁偏角为10,可以看到输出方位角度变化了10度左右)