DeDeLab Docs

供电与接口

电源要求、连接器、方向定义与 I2C 读取说明

本页用于解决第一次接线时最常见的问题,包括供电、电平、接口定义、坐标方向以及 I2C 接入示例。

电气要求

项目说明
工作电压5V
建议电流能力大于 300mA
当前通信方式I2C
支持的 I2C 速率100kHz 到 400kHz
最高输出速率250Hz

务必先确认供电极性

请先确认正负极,再接入 5V 电源。不要插反,也不要让输入电压超过 5V。

接口与连接器

  • 推荐优先使用 PH2.0 的 4Pin 接口,装配更稳妥,也更适合常规调试。
  • 如对体积有更严格要求,可改用 SH1.0 接口。
  • SH1.0 与 PH2.0 的 IO 属性一致,两个接口为并联关系。
  • 若你的机械空间非常受限,可以直接拆除 PH2.0 接口。
DeDeIMU 接口示意图

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 数据读取能力。解锁、归零、速率配置、保存等高级写入命令,后续将随着固件版本逐步对齐和完善。

On this page