Управление питанием DFplayer mini

Делаю интерактивную игрушку. Говорящую, с акселерометром и светодиодами на Arduino PRO mini. Питание будет от аккумулятора. Пока схема питалась от USB - все шло гладко пока я в разрыв питания DFplayer mini не поставил ключ на двух транзисторах с P-канальным mosfet ибо 25 мА в спящем режиме это многовато и функция sleep(); из библиотеки плеера ничего не меняет. Ключ управляется с 13-ого пина. Со стороны плеера прут какие то пульсации до 1.5V (подобные пульсации заметил на линии Tx плеера), в динамике щелчки, ардуине не спится и все ломается, хотя на столе (отдельно) ключи работают отлично. Собрал два - один с 2N7002 по входу, другой с BCR515, силовой SI2309 в обоих, резисторы подобрал для надежного открывания-закрывания.

Коллеги!!! У меня кончились идеи. Вот код:

#include <Wire.h>  // Wire library - used for I2C communication
#include "LowPower.h"
#include <SoftwareSerial.h>               // Подключаем библиотеку SoftwareSerial
#include <DFPlayerMini_Fast.h>            // Подключаем библиотеку DFPlayerMini_Fast

SoftwareSerial mySerial(7, 4);          // Указываем к какими портам подключен DFPlayer
DFPlayerMini_Fast myMP3;                  // Создаем объект 

const int wakeUpPin = 2;
int ADXL345 = 0x53; // The ADXL345 sensor I2C address
int X_out, Y_out, Z_out;  // Outputs

int led_pins[6] = {3,5,6,9,10,11};
int hello[3] = {3,4,5};
float smoothness_pts = 800;//larger=slower change in brightness 
int ii = 0; 
int jj = 0;
int hh = 0;
int h_leds;
int time_del = 6000;

float gamma = 0.15; // affects the width of peak (more or less darkness)
float beta = 0.5; // shifts the gaussian to be symmetric
float pwm_val;
uint32_t tmr1, tmr2, tmr3, tmr4;

void wakeUp() {
  ii = 0; 
  jj = 0;
  pwm_val = 0;
if (digitalRead(2) == HIGH) {
digitalWrite(13, HIGH);
  }
}

void setup() {
  pinMode(12, INPUT);
  pinMode(wakeUpPin, INPUT_PULLUP);
  Serial.begin(9600); // Initiate serial communication for printing the results on the Serial monitor
  Wire.begin(); // Initiate the Wire library
  // Set ADXL345 in measuring mode
  Wire.beginTransmission(ADXL345); // Start communicating with the device 
  Wire.write(0x2D); // Access/ talk to POWER_CTL Register - 0x2D
  // Enable measurement
  Wire.write(8); // (8dec -> 0000 1000 binary) Bit D3 High for measuring enable 
  Wire.endTransmission();

  // Configure the ADXL345 to trigger an interrupt on the INT1 pin when new data is available
 Wire.beginTransmission(ADXL345);
 Wire.write(0x2C);     // BW_RATE register
 Wire.write(0x09);     // 50 Hz output data rate
 Wire.endTransmission();

 Wire.beginTransmission(ADXL345);
 Wire.write(0x31); // ENABLE sensivity  register (0x24)
 Wire.write(0x03); // sensivity 8g
 Wire.endTransmission();

 Wire.beginTransmission(ADXL345);
 Wire.write(0x24); // ENABLE active acceleration  register (0x24)
 Wire.write(0x0F); // 0xXX*62.5
 Wire.endTransmission();

 Wire.beginTransmission(ADXL345);
 Wire.write(0x27); // ENABLE activity for axes XYZ  register (0x27)
 Wire.write(0xF0); // Enable activity XYZ
 Wire.endTransmission();

 Wire.beginTransmission(ADXL345);
 Wire.write(0x2E); // Access the INT_ENABLE register (0x2E)
 Wire.write(0x10); // Enable activity interrupt (bit 4)
 Wire.endTransmission();

 Wire.beginTransmission(ADXL345);
 Wire.write(0x2F); // Access the INT_MAP register (0x2F)
 Wire.write(0x00); // Map data-ready interrupt to INT1 pin (bit 0)
 Wire.endTransmission();
 delay(20);

 mySerial.begin(9600);                   // Открываем последовательную связь
 myMP3.begin(mySerial);                  // инициализация
 myMP3.volume(27);                       // Указываем громкость (0-30)

  for (jj = 0; jj<sizeof(led_pins)/sizeof(int);jj++){
    pinMode(led_pins[jj],OUTPUT);
  }
  tmr1 = millis();
  tmr2 = micros();
  tmr3 = millis();
  tmr4 = millis();
}
 
void loop() {
  attachInterrupt(0, wakeUp, HIGH);
  if (millis() - tmr3 >= 30000) {
        tmr3 = millis();
  
  //digitalWrite(13, LOW);
  myMP3.play(2);
  h_leds = 0;
     for (jj=0; jj<sizeof(led_pins)/sizeof(int); jj++){
    analogWrite(led_pins[jj], h_leds);
  }
  delay(2000);
  digitalWrite(13, LOW);
  tmr4 = millis();
  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
  }
  detachInterrupt(0); 

 if (millis() - tmr4 == 100) {
  myMP3.play(1);
  delay(2000);
 //if(digitalRead(12) == HIGH) {
   myMP3.play(hello[random(4)]);
  //  }
  }

 if (millis() - tmr1 >= 200) {
        tmr1 = millis();

  //==reset flag==//
  Wire.beginTransmission(ADXL345);
  Wire.write(0x30); // Start with register 0x30 (INT_SOURCE)
  Wire.endTransmission(false);
  Wire.requestFrom(ADXL345, 1);
  Wire.read();
  
  // === Read acceleromter data === //
  Wire.beginTransmission(ADXL345);
  Wire.write(0x32); // Start with register 0x32 (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(ADXL345, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
  X_out = ( Wire.read()| Wire.read() << 8); // X-axis value
  //X_out = X_out/256; //For a range of +-2g, we need to divide the raw values by 256, according to the datasheet
  Y_out = ( Wire.read()| Wire.read() << 8); // Y-axis value
  //Y_out = Y_out/256;
  Z_out = ( Wire.read()| Wire.read() << 8); // Z-axis value
  //Z_out = Z_out/256;
 
  Serial.print("X= ");
  Serial.print(X_out);
  Serial.print("   Y= ");
  Serial.print(Y_out);
  Serial.print("   Z= ");
  Serial.println(Z_out);
  Serial.println(digitalRead(12));
  }
  if (digitalRead(2) == HIGH) {
    tmr3 = millis();
    time_del = 20;
  }
    else{time_del = 6000;}
  
  if (micros() - tmr2 >= time_del && ii<smoothness_pts) {
    tmr2 = micros();
    pwm_val = 255.0*(exp(-(pow(((ii/smoothness_pts)-beta)/gamma,2.0))/2.0));
        for (jj=0; jj<sizeof(led_pins)/sizeof(int); jj++){
    analogWrite(led_pins[jj], h_leds = pwm_val);
        }
    ii++;
  }
  if (ii >= smoothness_pts) {ii=0;}
 }

Принципиальную схему в студию, пожалуйста.

Вы забыли рассказать, проблема-то в чем?

Ну, как же …

“все ломается…”

так и запишем

А как картинку вставить?

Например, возьмите её в клипбоард и Ctrl+V в окно сообщения. Или просто киньте файла в окно сообщения – как хотите.

Типовая схема. Первый транзистор может быть NPN. Пробовал оба варианта - результат одинаковый.

Нужна не типовая, а та, что собрана у Вас. Иначе Вам будут давать “типовые ответы”. А то если смотреть на то, что Вы выложили, так у Вас я DFplayer mini давно дым выпустил от такого напряжения.

Питание 5V от USB-UART… Резисторы отличаются ибо тщательно подобраны под конкретные условия. Ключи работают - не сомневайтесь. И код работает если DFplayer mini запитать напрямую.

какого фига тогда в левом верхнем углу “Vin 12-24v” ???

Именно об этом вам и пишут - выкладывайте не схему, найденную в инете, а именно ту, по которой у вас собрано.
Иначе не тратьте наше время и идите искать ответы в другом месте.

Ну, вот и рисуйте.

Мне не в чем и незачем сомневаться или не сомневаться – проблема не у меня. Я готов обсудить проблему, если представлены код и схема и не готов её обсуждать, если вместо схемы вижу первую попавшуюся картинку из Интернета, на которой даже тема сисек не раскрыта. Хотите нормального технического разговора – ведите его.

А если Вам в лом рисовать схему для решения своей проблемы, то нам, уж тем более, в лом доставать хрустальный шар и пытаться угадать что у Вас там и как для решения чужой.

по симптомам, скорее всего, ты в схеме(не нарисованной, а реальной) мосфету сток и исток перепутал

Ну, фото сборки было бы следующим, после схемы.

Но, я так понимаю, ТС нас уже покинул. Не понравилось ему у нас.

Ардуиноруукушенные :slightly_smiling_face:
Интересно: а какой смысл постоянно проверять уровень в функции вызываемой прерыванием использующем туже ногу с тем же уровнем, фуу, устал.

…извините, отвлекся на обеденный перерыв…

ыв…

Так что такое Vin на схеме?
Пин на ардуино плате?

Покажите фото всей сборки.

А закрываться он как будет? хитрожопые транзисторы.

Ээээ… Там сложно что либо разобрать ибо это бутерброд из трех плат, но, я же говорю: пока плеер запитан постоянно - все нормально работает…

Засыпает со звуком через 30 сек при отсутствии активности акселерометра. Просыпается со звуком если дернуть акселерометр. Ключ в разрыв питания плеера отключает это самое питание, но появляются странные импульсы 1.5 V на пине Vcc плеера и такие же импульсы есть на пине Tx который я не отключаю. Возможно дело в схемотехнике плеера и он может подпитываться от Tx как ардуино может питаться от аналоговых входов. У библиотеки SoftwareSerial.h, наверняка, задействованы прерывания на Rx, Tx и они мешают ардуине спать. Если бы как нибудь попробовать остановить UART, но средствами библиотеки это не получится…