MPU9250使用WOM

时间:2018-01-19 03:01:42

标签: arduino esp8266 motion-detection imu

我一直在试验ESP8266 wifi芯片和MPU9250 IMU的睡眠选项。 ESP具有深度睡眠命令,基本上将芯片从实时时钟切断,直到RESET引脚被拉低,由ESP GPIO16或外部中断拉低。

MPU9250以其WOM(运动唤醒)功能的形式提供此中断,该功能使芯片具有最小功能,直到它检测到内置加速度计上的运动,此时其INT引脚被拉高(我将此引脚连接到ESP的RESET引脚和GND之间的NMOS晶体管的栅极,以反转中断。)

然而,当我进行设置并使用以下代码时,设置进入重置循环;两个打印语句都执行,但我不确定ESP是否真的有时间执行DeepSleep命令,因为它会在"到达此处后立即重置。打印并且不会等待动作。

但是,如果我在程序运行时断开并重新连接NMOS的INT连接,它会暂时工作并休眠直到它检测到运动,此时复位循环再次开始(即使MPU9250完全保持在移动)。这意味着WOM功能正在工作,但有些东西会导致INT引脚在不应该的情况下ping通,并且我无法弄清楚问题是什么。有谁知道是什么问题?这是我可以单独用代码修复的东西吗?

主要代码(loop()为空):

#include <quaternionFilters.h>
#include <MPU9250.h>
#include <ESP8266WiFi.h>

extern "C" {
  #include "gpio.h"
}

extern "C" {
  #include "user_interface.h"
}

MPU9250 myIMU;

void setup()
{
    Wire.begin(5, 14);
    Serial.begin(74880);
    printf("WAKE ME UP INSIDE");
    delay(500);
    sensorMpu9250WomEnable();
    printf("Got Here");
    ESP.deepSleep(0, WAKE_RF_DEFAULT);

}

在另一个文件中:

bool sensorMpu9250WomEnable(void)
{
  uint8_t val;
  // Clear registers
  val = 0x80;
  myIMU.writeByte(MPU9250_ADDRESS, PWR_MGMT_1, val);
  delay(10);

  // Enable accelerometer, disable gyro
  val = 0x07;
  myIMU.writeByte(MPU9250_ADDRESS, PWR_MGMT_2, val);
  delay(10);

  // Set Accel LPF setting to 184 Hz Bandwidth
  val = 0x01;
  myIMU.writeByte(MPU9250_ADDRESS, ACCEL_CONFIG2, val);
  delay(10);

  // Enable Motion Interrupt
  val = 0x40;
  myIMU.writeByte(MPU9250_ADDRESS, INT_ENABLE, val);
  delay(10);

  // Enable Accel Hardware Intelligence
  val = 0xC0;
  myIMU.writeByte(MPU9250_ADDRESS, MOT_DETECT_CTRL, val);
  delay(10);

  // Set Motion Threshold
  val = 0x40;
  myIMU.writeByte(MPU9250_ADDRESS, WOM_THR, val);
  delay(10);

  // Set Frequency of Wake-up
  val = 6;
  myIMU.writeByte(MPU9250_ADDRESS, LP_ACCEL_ODR, val);
  delay(10);


  // Enable Cycle Mode (Accel Low Power Mode)
  val = 0x20;
  myIMU.writeByte(MPU9250_ADDRESS, PWR_MGMT_1, val);
  delay(10);

  return true;
}

1 个答案:

答案 0 :(得分:0)

非常感谢您提供的这些片段,它们帮助我启动并运行了我的项目。

我可以通过在开始深度睡眠之前添加延迟来解决这个问题:

Wire.begin(I2C_SDA, I2C_SCL);
Serial.begin(115200);
Serial.println("WAKE ME UP INSIDE");
delay(500);
sensorMpu9250WomEnable();
Serial.println("Got Here");

Serial.flush();
delay(1000);
esp_sleep_enable_ext0_wakeup(GPIO_NUM_27, 1);
esp_deep_sleep_start();

希望对你也有帮助。