简介:这份JY901官方使用说明文档面向使用JY901高精度惯性导航模块的嵌入式开发者、机器人及无人机爱好者,系统讲解模块的姿态解算原理、加速度与角速度测量、磁场与角度输出,以及JY901B的气压高度和GPS-IMU组合导航功能。文档涵盖性能参数、引脚与轴向定义、串口和IIC硬件连接方法、上位机调试与校准流程,并给出陀螺加计校准、磁场校准、恢复出厂设置等实操细节,可帮助读者快速完成模块接入与数据验证。资源包共1个PDF文件,约1.35MB,内容完整、查阅方便。目前已有3533人学习下载,适合需要对照官方说明进行开发调试的工程师参考。
1. 姿态传感器 JY901 上电前的第一道坎:版本、电平与接口选型
手里拿到一块 JY901 姿态传感器,很多人第一反应是插上 USB 转串口模块看数据,结果上位机一片空白,或者数据跳得没法用。这玩意儿在飞控、云台、机器人、倾角监测里太常见了,装不好不是模块坏,而是电平、波特率、校准三件事没对齐。我见过最典型的翻车,是把 TTL 电平的 RX/TX 直接怼到 RS232 接口上,模块当场报废。这篇笔记按“先认清硬件版本、再连线上电、然后校准配置、最后验证数据”的顺序走一遍,适合刚拿到模块的嵌入式新手,也适合从其他 IMU 迁移过来、想少走弯路的熟手。JY901 和 JY901B 的差别只在气压和高度输出,接线和配置流程完全一致,下面不再分开啰嗦。
2. 硬件连接与驱动准备:串口和 IIC 两条路怎么选
2.1 先确认你手里是 JY901 还是 JY901B
模块正面丝印一般会标型号,JY901B 多一颗气压传感器,能输出气压和高度,其余加速度、角速度、磁场、角度、GPS 能力完全一样。选型上,做倾角测量、云台增稳、机器人姿态反馈,JY901 够用;要做气压定高或者室内外高度辅助,才需要 JY901B。这一步不确认,后面在上位机里勾了气压输出却收不到 0x56 包,会白白怀疑串口线。
供电范围 3V~6V,电流小于 40mA,模块内部有 LDO,所以 3.3V 和 5V 系统都能直接带。引脚电平兼容 3.3V/5V,但注意它是 TTL 电平,不是 RS232,也不是 RS485。我一般会在模块 VCC 和 GND 之间并一个 0.1uF 去耦电容,尤其是用长杜邦线接单片机的时候,能压掉不少上电瞬间的毛刺。
2.2 串口连接:USB 转 TTL 模块的交叉接法
和电脑连接需要 USB 转 TTL 串口模块,CH340、CP2102、FT232 都行。接线口诀就一句:TX 接 RX,RX 接 TX,VCC 接 VCC,GND 接 GND。
# 以 Linux 下 CH340 为例,插上后确认串口设备 ls /dev/ttyUSB* # 输出类似 /dev/ttyUSB0 即识别成功 # 若没有设备,先看内核是否加载了 ch341 驱动 lsmod | grep ch341这段命令的作用是确认系统认到了 USB 转串口芯片。/dev/ttyUSB0就是后面上位机要选的串口号。Windows 下对应的是设备管理器里的 COMx。如果ls /dev/ttyUSB*没有任何输出,先换线、换 USB 口,再检查驱动,别急着怀疑模块。
接单片机时同理,单片机 TX 接模块 RX,单片机 RX 接模块 TX。模块默认波特率 9600,8 位数据位、1 位停止位、无校验。串口速率支持 2400bps 到 921600bps,但第一次连一定先用 9600,因为出厂默认就是这个。
提示:六合一串口模块接 JY901 时,需要把 2 号拨码开关拨到 OFF 端,否则电平逻辑不对,收不到数据。
2.3 IIC 连接:上拉电阻不能省
IIC 方式适合 MCU 引脚紧张、或者总线上要挂多个传感器的场景。模块 IIC 地址默认 0x50,支持全速 400K。接线是 SCL 对 SCL、SDA 对 SDA、VCC 和 GND 对应接好。
关键点:模块 IIC 总线是开漏输出,MCU 侧必须把 SCL 和 SDA 通过 4.7K 电阻上拉到 VCC。很多新手直接连四根线,读不到数据,就是少了这两个上拉。我一般会在面包板上直接焊两个 4.7K 贴片电阻到排针上,做成一个小转接板,后面复用方便。
// STM32 硬件 IIC 初始化片段(标准库风格,仅示意引脚与速率配置) GPIO_InitTypeDef gpio; I2C_InitTypeDef i2c; RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; // SCL=PB6, SDA=PB7 gpio.GPIO_Mode = GPIO_Mode_AF_OD; // 开漏复用,外部 4.7K 上拉 gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &gpio); i2c.I2C_Mode = I2C_Mode_I2C; i2c.I2C_ClockSpeed = 400000; // 400K 全速 i2c.I2C_Ack = I2C_Ack_Enable; I2C_Init(I2C1, &i2c); I2C_Cmd(I2C1, ENABLE);这段配置里GPIO_Mode_AF_OD是开漏复用,对应模块的开漏总线;I2C_ClockSpeed设 400000 就是 400K,和模块标称一致。如果上拉电阻没接,I2C_Init不会报错,但读寄存器会一直 NACK,现象就是程序卡在等待 ACK 的死循环里。所以 IIC 这条路,先量 SCL/SDA 对 VCC 的电阻,确认有 4.7K 左右再上电。
3. 上位机连接与基础配置:波特率、回传内容和速率
3.1 打开上位机并连上模块
装好 USB 转 TTL 驱动后,设备管理器里能看到 COM 号。打开 JY901 上位机,先点“波特率”菜单选 9600,再点“串口设置”选对应 COM 口,正常就能看到数据曲线。
如果打开串口没有图像,按这个顺序查:先看 TX/RX 是否交叉、VCC 是否供上;再确认波特率。忘了模块当前波特率,可以点“波特率 → Auto”自动搜索,前提是模块输出速率大于 5Hz,速率太低搜不到。实在不行就走恢复出厂设置,回到 9600 再连。
上位机里几个按钮的实际用途:点“记录”会把采集数据写到上位机根目录下以记录起始时间命名的文本文件,注意必须点“停止”才会真正写盘,直接关软件文件是空的;点“清图”能加快图表刷新,长时间间隔后再采集时很有用;点“三维”进入全屏姿态显示,按 F 键切回窗口,如果没反应,先按 Ctrl+空格关掉中文输入法再按 F。
3.2 设置回传内容:按需勾选,别全开
回传内容在“设置”选项卡里勾选,对应协议里的 RSW 寄存器。默认输出时间、加速度、角速度、角度这几类包。勾选逻辑很直接:要姿态就留 0x53 角度包,要原始数据就留 0x51、0x52,接 GPS 才需要 0x57 经纬度和 0x58 地速。
RSW 位定义(对应 0xFF 0xAA 0x02 RSW 0x00) bit0 0x50 时间包 bit1 0x51 加速度包 bit2 0x52 角速度包 bit3 0x53 角度包 bit4 0x54 磁场包 bit5 0x55 端口状态包 bit6 0x56 气压高度包(仅 JY901B) bit7 0x57 经纬度包(需 GPS)这里有个容易忽略的点:气压包和经纬度包不是所有型号、所有接线都有意义。JY901 没气压传感器,勾了 0x56 也收不到有效值;没接 GPS,0x57 和 0x58 就是空转。设置完一定点“保存配置”,否则掉电就丢。
3.3 回传速率和通信波特率:两个“速率”别搞混
回传速率是模块往外吐数据的频率,默认 10Hz,最高 200Hz,在设置选项卡里选完点“更改”立即生效,但要掉电保存还得点“保存配置”。通信波特率是串口本身的速率,默认 9600,改完不会立刻生效,必须重新上电。
回传速率寄存器 RATE(0xFF 0xAA 0x03 RATE 0x00) 0x01 0.1Hz 0x02 0.5Hz 0x03 1Hz 0x04 2Hz 0x05 5Hz 0x06 10Hz(默认) 0x07 20Hz 0x08 50Hz 0x09 100Hz 0x0a 200Hz 0x0b 单次 0x0c 不输出实际取舍:回传内容多、波特率又低时,模块会自动降频到能传的最大速率。比如 9600 波特率下开满所有包再要 200Hz,肯定跑不满。我一般姿态应用设 100Hz、只开角度和角速度包,波特率提到 115200,链路很稳。改波特率前先确认上位机也能切到同一档,否则改完模块“失联”,只能靠恢复出厂救回来。
4. 校准与恢复出厂:陀螺加计、磁场、高度三步走
4.1 陀螺仪和加速度计校准
模块出厂有零偏,不校准静止时角速度输出不在 0 附近。校准方法:模块保持水平放稳,点“设置”选项卡进设置页,点“陀螺、加计校准”,上位机会自动算零偏,等 AxOffset、AyOffset、AzOffset、GxOffset、GyOffset、GzOffset 六个值稳定,再点“正常模式”,最后点“保存配置”写进模块内部 FLASH。
校准相关寄存器 0x01 CALSW:0 退出校准 1 陀螺加计校准 2 磁场校准 3 高度置 0 0x05~0x0a:AX/AY/AZ/GX/GY/GZ 零偏 0x0b~0x0d:HX/HY/HZ 磁场零偏零偏也可以手动填,点对应按钮写入。我一般自动校准后记下这六个值,换同批次模块时先填一遍再微调,能省不少时间。校准完不点保存,掉电全丢,这是最高频的“白干”操作。
4.2 磁场校准:绕三轴各转一圈
磁场零偏误差比陀螺大得多,不校准航向角基本没法看。把模块放在远离电机、磁铁、大电流线缆的地方,点“磁场校准”,先绕 X 轴转 360 度,来回几圈;再绕 Y 轴转 360 度;再绕 Z 轴转 360 度;最后随意转几圈,直到 HxOffset、HyOffset、HzOffset 不再变化,点“正常模式”,再点“保存配置”。
磁场校准操作顺序(上位机设置页) 1. 远离干扰源,模块静止放置 2. 点“磁场校准”进入校准模式 3. 绕 X 轴 360° → 绕 Y 轴 360° → 绕 Z 轴 360° → 随意转动 4. 等 HxOffset/HyOffset/HzOffset 稳定 5. 点“正常模式” → 点“保存配置”校准环境很关键。我在一张铁桌上校准过一次,航向角漂了十几度,换到木桌上重来才正常。校准值同样可以手动填,点 HxOffset 等按钮写入。
4.3 高度置零与恢复出厂设置
高度置零只对 JY901B 有意义,点“高度校准”把当前气压对应的高度当零点。这个值模块不保存,所以不用点保存配置,每次上电按需置零即可。
恢复出厂有两种方法。短路法:把 D2 引脚和 VCC 用导线短接,再给模块上电,LED 长亮约 2 秒后熄灭,恢复完成。指令法:模块连好电脑,点设置页“恢复默认”,但前提是知道当前波特率,波特率不对指令不生效,这时只能回到短路法。恢复后要重新上电,并且之前所有校准值都没了,得重新校准。
注意:短路法操作时 D2 和 VCC 短接时间别太长,上电看到 LED 长亮后熄灭就断开,避免长时间短接电源。
5. 避坑与排查:五条血泪记录
5.1 现象:上位机完全没数据,串口也打不开
原因:TX/RX 没交叉,或者 USB 转 TTL 模块电平不对。JY901 是 TTL 电平,RX 要接对方 TX。还有一种是把模块接到了 RS232 电平的串口上,可能直接损坏模块。
解决:先核对 TX-RX 交叉,再用万用表量模块 VCC 是否有 3.3V 或 5V。确认 USB 转串口模块是 TTL 输出。如果之前误接过 RS232,模块大概率已经伤了,换一块对比测试最快。
5.2 现象:有数据但全是乱码或跳变
原因:波特率不匹配,或者共地没做好。USB 转串口和模块只接了 TX/RX 没接 GND,参考电平漂移,数据就乱。
解决:上位机波特率菜单逐个试,或者用 Auto 自动搜(模块输出速率需大于 5Hz)。务必把 GND 接上。长线场景下降低波特率到 9600 先验证,再往上提。
5.3 现象:静止时角速度不为 0,角度缓慢漂移
原因:没做陀螺加计校准,或者校准后没点保存配置,掉电丢了零偏。
解决:水平放置重新做陀螺加计校准,等六个 Offset 稳定后点正常模式,再点保存配置。上电后静止观察,角速度应回到 0°/s 附近。角度漂移还可能是磁场未校准导致航向修正不对,补做磁场校准。
5.4 现象:航向角乱跳,转动时角度突变
原因:磁场校准环境有干扰,或者校准动作没覆盖三轴。模块附近有电机、扬声器磁铁、大电流走线都会污染磁场。
解决:换到远离干扰源的桌面重做磁场校准,严格绕 X、Y、Z 三轴各转 360 度。校准后如果还跳,检查模块安装位置是否靠近金属结构,必要时加高或换位。
5.5 现象:改了波特率或 IIC 地址后模块“失联”
原因:波特率和 IIC 地址改完要重新上电才生效,上位机还停在旧参数上,自然连不上。
解决:改之前记下新值,改完给模块断电再上电,上位机同步切到新波特率。IIC 地址改错连不上,用串口方式连回来改,或者短路法恢复出厂。我现在的习惯是每次改通信参数前,先把旧值和新值写在便签上贴模块旁边,省得回头猜。
6. 装完怎么验证:三组数据判断模块是否真的跑通
验证不是看到曲线动就算完,要分三层看。第一层,静止水平放置,串口助手或上位机看角度包 0x53,Roll 和 Pitch 应在 0 度附近小幅波动,Yaw 允许慢漂但不应跳变;角速度包 0x52 三轴应接近 0°/s。第二层,手动绕单轴转动,对应角度线性变化,松手回稳,说明姿态解算和校准都正常。第三层,接 GPS 的话看 0x57 经纬度是否有值、0x58 地速是否合理,同时确认 D1 端口模式设为 GPSRX、GPS 波特率和 GPS 模块输出一致。
# 串口解析 JY901 角度包 0x55 0x53 的最小验证脚本 import serial, struct ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1) def parse_angle(frame): # frame: 55 53 RollL RollH PitchL PitchH YawL YawH TL TH SUM roll = struct.unpack('<h', frame[2:4])[0] / 32768 * 180 pitch = struct.unpack('<h', frame[4:6])[0] / 32768 * 180 yaw = struct.unpack('<h', frame[6:8])[0] / 32768 * 180 temp = struct.unpack('<h', frame[8:10])[0] / 100 return roll, pitch, yaw, temp buf = b'' while True: buf += ser.read(32) while len(buf) >= 11: if buf[0] == 0x55 and buf[1] == 0x53: frame, buf = buf[:11], buf[11:] print(parse_angle(frame)) else: buf = buf[1:] # 丢一个字节重新找帧头这段脚本的关键在struct.unpack('<h', ...),小端有符号 short,和手册里“低字节在前、高字节在后、按有符号 short 组合”完全对应。除以 32768 再乘 180 是角度包的量程换算。校验和这里为了简洁没做,实际项目里建议把 SUM 也验一遍,丢帧会少很多。跑起来后,静止时 Roll/Pitch 接近 0、转动时线性变化,就说明从接线、波特率、校准到协议解析整条链路通了。
我自己的习惯是,每块新模块上机前都强制走一遍“静止看零偏 → 单轴转动看线性 → 保存配置后断电再上电复查”,少一步后面都可能变成玄学漂移。希望帮到你。
本文还有配套的精品资源,点击获取