1

私は、ESP8266 wifi チップと MPU9250 IMU の両方のスリープ オプションを試してきました。ESP にはディープ スリープ コマンドがあり、ESP の GPIO16 または外部割り込みによって RESET ピンがローに引き下げられるまで、リアルタイム クロックとは別にチップをシャットダウンします。

MPU9250 は、この割り込みを WOM (Wake On Motion) 機能の形で提供します。これにより、内蔵の加速度計でモーションが検出されるまで、チップの機能が最小限に抑えられます。モーションが検出されると、その INT ピンがハイに引き上げられます (私はこれを取り付けました)。ピンを ESP の RESET ピンと GND の間の NMOS トランジスタのゲートに接続して、割り込みを反転します)。

ただし、セットアップして次のコードを使用すると、セットアップがリセット ループに入ります。両方の印刷ステートメントが実行されますが、ESP が実際に DeepSleep コマンドを実行する時間があるかどうかはわかりません。これは、「Got here」が印刷されるとすぐにリセットされ、モーションを待機しないためです。

ただし、プログラムの実行中にNMOSからINT接続を切断して再接続すると、一時的に動作し、動きを検出するまでスリープ状態になり、その時点でリセットループが再び開始されます(移動後にMPU9250が完全に静止していても)。これは、WOM 機能が動作していることを意味しますが、何らかの原因で INT ピンが高くなってはならず、何が問題なのかわかりません。問題が何であるかを知っている人はいますか?コードだけで修正できるものですか?

メインコード (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;
}
4

1 に答える 1