MPU9250 застревает в цикле сброса с ESP8266 с использованием WOM

Я экспериментировал с параметрами сна как для чипа Wi-Fi ESP8266, так и для IMU MPU9250. ESP имеет команду глубокого сна, которая, по существу, отключает микросхему, кроме часов реального времени, до тех пор, пока на выводе RESET не будет установлен низкий уровень либо с помощью ESP GPIO16, либо с помощью внешнего прерывания.

MPU9250 предоставляет это прерывание в виде функции WOM (Wake On Motion), которая обеспечивает минимальную функциональность чипа до тех пор, пока он не обнаружит движение на встроенном акселерометре, после чего его вывод INT становится высоким (я приложил это контакт к затвору транзистора NMOS между контактом RESET ESP и GND, чтобы инвертировать прерывание).

Однако, когда я настраиваю его и использую следующий код, установка входит в цикл сброса; оба оператора печати выполняются, но я не уверен, действительно ли у ESP есть время для выполнения команды DeepSleep, потому что он мгновенно сбрасывается, как только печатается «Попал сюда», и не ждет движения.

Однако, если я отключаю и снова подключаю соединение INT от NMOS во время работы программы, она временно работает и спит, пока не обнаружит движение, после чего цикл сброса начинается снова (даже если MPU9250 остается полностью неподвижным после движения). Это означает, что функциональность WOM работает, но что-то вызывает высокий уровень пинга на выводе INT, когда этого не должно быть, и я не могу понять, в чем проблема. Кто-нибудь знает, в чем может быть проблема? Это что-то, что я могу исправить только с помощью кода?

Основной код (цикл() пуст):

#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;
}

person Isaac Middlemiss    schedule 19.01.2018    source источник
comment
Порог движения составляет около 240 мг или около того, частота пробуждения около 15 Гц.   -  person Isaac Middlemiss    schedule 19.01.2018
comment
Пробуждение — это просто проверка акселерометром необходимости пропинговать вывод INT, а не запуск пробуждения ESP.   -  person Isaac Middlemiss    schedule 19.01.2018
comment
Вы выяснили, что тянуло булавку в ВЫСОКОЕ положение во время глубокого сна?   -  person Gero    schedule 12.11.2020
comment
@Gero, это было очень давно ????, если я правильно помню, булавка пробуждения просто не успела подняться до сброса esp, так что это была своего рода аппаратная проблема. Тогда я, вероятно, изменил бы конфигурацию выводов WOM на активный высокий и добавил бы транзистор или полевой транзистор или что-то в этом роде.   -  person Isaac Middlemiss    schedule 13.11.2020
comment
Хотя я могу ошибаться или перепутать его с другим старым проектом в моей памяти.   -  person Isaac Middlemiss    schedule 13.11.2020
comment
Перечитав код, который у меня был, похоже, что он уже должен был быть активным на высоком уровне. Я почти уверен, что это была аппаратная проблема, и мне просто нужно было переосмыслить соединение с прерыванием.   -  person Isaac Middlemiss    schedule 13.11.2020


Ответы (1)


Большое спасибо за эти фрагменты, они помогли мне запустить мой проект.

Я мог бы исправить проблему, добавив задержку перед началом глубокого сна:

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();

Надеюсь, это поможет и вам.

person Maik    schedule 12.05.2021