供电与接口
电源要求、连接器、方向定义与 I2C 读取说明
本页用于解决第一次接线时最常见的问题,包括供电、电平、接口定义、坐标方向以及 I2C 接入示例。
电气要求
| 项目 | 说明 |
|---|---|
| 工作电压 | 5V |
| 建议电流能力 | 大于 300mA |
| 当前通信方式 | I2C |
| 支持的 I2C 速率 | 100kHz 到 400kHz |
| 最高输出速率 | 250Hz |
务必先确认供电极性
请先确认正负极,再接入 5V 电源。不要插反,也不要让输入电压超过 5V。
接口与连接器
- 推荐优先使用 PH2.0 的 4Pin 接口,装配更稳妥,也更适合常规调试。
- 如对体积有更严格要求,可改用 SH1.0 接口。
- SH1.0 与 PH2.0 的 IO 属性一致,两个接口为并联关系。
- 若你的机械空间非常受限,可以直接拆除 PH2.0 接口。
I2C 电平建议
- 模块内部已经做了 I2C 上拉。
- 在 ESP32 上实测不需要额外上拉电阻。
- 推荐主控使用 3.3V 逻辑电平,例如 STM32、ESP32。
- 在 Arduino UNO 等 5V 开发板上通常也能通讯,但不建议长期直接连接。
- 若主控侧为 5V 逻辑,建议加入逻辑电平转换器。
坐标方向与兼容性
- 模块上的 XYZ 方向请以丝印标识为准。
- 当前方向定义与数据格式与维特系列保持兼容。
- 若你已有维特系列的上位机或读取程序,可以优先复用已有解析逻辑,再根据实际地址做适配。
I2C 读取建议
- 先扫描总线地址,再把代码中的地址常量改成实测结果。
- 读取频率建议从 100Hz 左右开始,再根据主控负载和控制需求逐步提高。
- 实测在输出角度与实际物理角度之间,延迟大约滞后 10ms 到 12ms,会比 JY61 更好更加的实时。
Arduino / ESP32 示例
下面的示例适合作为 I2C 接入基线。若你使用 STM32 或其他 MCU,也可以先保留寄存器与比例换算逻辑,再替换底层 I2C 驱动。
/*******************************************************
* JY61 / JY61P I2C Read Full Example (Arduino / ESP32)
*******************************************************/
#include <Wire.h>
#define I2C_SDA 7
#define I2C_SCL 6
#define JY61_ADDR 0x50
static const float ACCEL_RANGE = 16.0f * 9.80665f;
static const float GYRO_RANGE = 2000.0f;
#define REG_ACC_GYRO_START 0x34
#define REG_ANGLE_START 0x3D
struct JY61Data {
float ax, ay, az;
float gx, gy, gz;
float roll, pitch, yaw;
};
JY61Data imu;
bool jy61ReadBytes(uint8_t devAddr, uint8_t regAddr, uint8_t *out, size_t len) {
Wire.beginTransmission(devAddr);
Wire.write(regAddr);
if (Wire.endTransmission(false) != 0) return false;
size_t got = Wire.requestFrom((int)devAddr, (int)len);
if (got != len) return false;
for (size_t i = 0; i < len; i++) out[i] = Wire.read();
return true;
}
static inline int16_t u8ToS16(uint8_t lo, uint8_t hi) {
return (int16_t)((hi << 8) | lo);
}
bool jy61ReadAngles(JY61Data &d) {
uint8_t buf[6];
if (!jy61ReadBytes(JY61_ADDR, REG_ANGLE_START, buf, 6)) return false;
d.roll = (float)u8ToS16(buf[0], buf[1]) / 32768.0f * 180.0f;
d.pitch = (float)u8ToS16(buf[2], buf[3]) / 32768.0f * 180.0f;
d.yaw = (float)u8ToS16(buf[4], buf[5]) / 32768.0f * 180.0f;
return true;
}
bool jy61ReadAccGyro(JY61Data &d) {
uint8_t buf[12];
if (!jy61ReadBytes(JY61_ADDR, REG_ACC_GYRO_START, buf, 12)) return false;
int16_t axRaw = u8ToS16(buf[0], buf[1]);
int16_t ayRaw = u8ToS16(buf[2], buf[3]);
int16_t azRaw = u8ToS16(buf[4], buf[5]);
int16_t gxRaw = u8ToS16(buf[6], buf[7]);
int16_t gyRaw = u8ToS16(buf[8], buf[9]);
int16_t gzRaw = u8ToS16(buf[10], buf[11]);
d.ax = (float)axRaw / 32768.0f * ACCEL_RANGE;
d.ay = (float)ayRaw / 32768.0f * ACCEL_RANGE;
d.az = (float)azRaw / 32768.0f * ACCEL_RANGE;
d.gx = (float)gxRaw / 32768.0f * GYRO_RANGE;
d.gy = (float)gyRaw / 32768.0f * GYRO_RANGE;
d.gz = (float)gzRaw / 32768.0f * GYRO_RANGE;
return true;
}
void setup() {
Serial.begin(115200);
Wire.begin(I2C_SDA, I2C_SCL);
Wire.setClock(400000);
}
void loop() {
bool ok1 = jy61ReadAccGyro(imu);
bool ok2 = jy61ReadAngles(imu);
if (ok1 && ok2) {
Serial.printf(
"ACC ax=%.3f ay=%.3f az=%.3f | GYRO gx=%.3f gy=%.3f gz=%.3f | ANG roll=%.2f pitch=%.2f yaw=%.2f\n",
imu.ax, imu.ay, imu.az,
imu.gx, imu.gy, imu.gz,
imu.roll, imu.pitch, imu.yaw
);
} else {
Serial.println("Read failed");
}
delay(50);
}当前固件说明
当前能力边界
当前文档优先覆盖稳定可用的 I2C 数据读取能力。解锁、归零、速率配置、保存等高级写入命令,后续将随着固件版本逐步对齐和完善。