ARDUINO Помогите перезагрузить плату MPU6050 (вывести из спящего режима) при питании от кроны (9v)

Fareld

✩✩✩✩✩✩✩
13 Мар 2023
6
0
Доброго времени суток!
Ситуация такая: при работе от питания от компьютера никаких проблем не возникает, режим отрабатывает как надо.
Когда питание осуществляется от внешнего источника питания и включается по кнопке - при включении на второй, третий раз режим не работает.
Почитал, что возможно произвести перезагрузку модуля и все пройдет, но не понимаю как это сделать...
Код программы:
// простая сигнализация
// датчик реагирует даже на постукивание
// пальцем на противоположном конце стола
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"

MPU6050 mpu;
int16_t ax, ay, az;
int16_t gx, gy, gz;
long ACC, GYR;
long maxACC, maxGYR, trACC, trGYR;
int chystv = 10000;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  pinMode (2, INPUT_PULLUP);
  pinMode (13, OUTPUT);
  mpu.initialize();
  mpu.setFullScaleAccelRange(MPU6050_ACCEL_FS_2);
  //delay(1000);

  // "калибровка" максимальных значений
  for (int i = 0; i < 30; i++) {
    mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
    ACC = abs(ax) + abs(ay) + abs(az);
    GYR = abs(gx) + abs(gy) + abs(gz);
    if (ACC > maxACC) maxACC = ACC;
    if (GYR > maxGYR) maxGYR = GYR;
    //delay(5);
  }
  maxACC = maxACC + trACC;
  maxGYR = maxGYR + trGYR;
}

void loop() {
  boolean button1 = !digitalRead (2);
  if (button1 == 1) {
    mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
    // сумма модулей
    ACC = abs(ax) + abs(ay) + abs(az);
    GYR = abs(gx) + abs(gy) + abs(gz);
    if (ACC > maxACC + chystv || GYR > maxGYR + chystv) {
      digitalWrite (13,1);
      //Serial.println("Move!");
    }
    else digitalWrite (13,0);
  }
  //delay(10);
}
 
Изменено:

Bruzzer

★★★✩✩✩✩
23 Май 2020
588
176
Универсальный совет, если при питании от комппа и БП работает по разному.
Попробовать поставить delay(2000); первой командой в setup
2000 взято с большим запасом, чтоб наверняка. Если поможет и хочется меньше, то можно уменьшать.

Как правильно выполнить reset платы MPU6050 я не знаю, не работал с ними. Возможно mpu.reset(); delay(100);
Но опять таки общие советы. Выполняя подключение, желательно проверить его успешность. В случае MPU6050 это
mpu.testConnection(). И если соединение есть, то можно дать команды mpu.reset(); delay(100); Если соединения нет, то mpu.reset(); не сработает.