私は、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;
}