DFPlayer Mini ненадежно загружается после выключения питания

Для проекта с низким энергопотреблением мне нужно включить мини-модуль DFPlayer, дать ему что-нибудь сказать и снова выключить его, используя Arduino Nano (без регулятора мощности и светодиодов). Во время простоя Arduino погрузится в глубокий сон. Это должно повторяться регулярно, например, ежедневно. Однако, похоже, я не могу правильно отключить питание модуля. Модуль подключен к Arduino через n-канальный МОП-транзистор логического уровня (IRLZ44N), так что VCC плеера постоянно составляет ~5,3 В (батареи 4x1, 3 В), но ток не может протекать через слив FET на землю (источник), если МОП-транзистор не включен через один из выводов ардуино на его затворе. У меня есть понижающий резистор на затворе, чтобы предотвратить плавающее состояние, и конденсатор 100 мкФ от 5 В до GND, в противном случае включение МОП-транзистора, по-видимому, вызывает скачок тока, который может сбросить Arduino. Приемник проигрывателя защищен резистором 1k, как описано в нескольких руководствах. 5.3 В не совсем соответствует спецификациям проигрывателя, но, похоже, в этом нет проблемы, поскольку следующий код работает в том смысле, что плеер последовательно выполняет свою работу хорошо на первой итерации цикла, но затем каждый раз терпит неудачу.

#include <Arduino.h>
#include <LowPower.h>
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>

// MP3 module is powered through logic-level MOSFET
// 100uF capacitor is connected across 5V - GND to smoothen current spikes
static const int MP3Power = 2;
static const int MP3Tx    = 3;
static const int MP3Rx    = 4;
static const int MP3Baud  = 9600; // Default hardware baud rate

uint32_t loop_count = 50000; // large loop_count: start into working loop after reset
//unsigned long loop_max;

uint32_t loop_max   = 1;     // 8 sec * 1 ~ 8 sec

DFRobotDFPlayerMini player;
SoftwareSerial MP3serial(MP3Rx, MP3Tx); // RX, TX

void speak(int filenumber, int volume=20);

void setup() {
  // Set all pins connected to MOSFET gates as low outputs.
  pinMode(MP3Power, OUTPUT); digitalWrite(MP3Power, LOW);
}

void loop() {
  if (loop_count < loop_max) {
    // increase loop counter, then go to deep sleep for 8 sec.
    loop_count++;
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
  } else {
    // reset loop count, speak
    loop_count = 0;
    speak(1);
  }
}

void speak(int filenumber, int volume) {
  // turn on power for mp3 module
  digitalWrite(MP3Power, HIGH);
  // wait for the module to cope with being powered up
  // it does light up its LED when powered up and doesn't seem to like
  // to be talked to right away.
  delay(1500);

  // initialise mp3 serial communication
  MP3serial.begin(MP3Baud);
  // sometimes I added another delay here, but it didn't really change to much.

  if (!player.begin(MP3serial)) {
    // MP3 Player can't start -- shut down everything and return early (but gracefully?)
    /*
     * This is where I end up after the first time worked. I can confirm this e.g. by blinking an
     * LED in here or reading the player's state, which returns a timeout error, whatever this means.
     */
    MP3serial.flush();
    MP3serial.end();
    digitalWrite(MP3Power, LOW);
    delay(100);
    return ;
  }

  player.setTimeOut(1000);
  player.EQ(DFPLAYER_EQ_POP);
  player.outputDevice(DFPLAYER_DEVICE_SD);

  player.volume(volume);
  player.playMp3Folder(filenumber);

  // enter this loop until playing is finished
  while (true) {
    delay(250); // give the player a little time before querying
    int i = player.readState();
    delay(250); // give the player a little more time, just in case
    if (i != 1) {
      // 1 means playing, break out when finished
      break;
    }
  }

  // close mp3 module
  MP3serial.flush();
  MP3serial.end();
  // wait a bit?
  delay(100);
  // turn off power
  digitalWrite(MP3Power, LOW);
  // wait until everything is turned off for good
  delay(100);

  // I also tried this, but it didn't really change anything
  //pinMode(MP3Tx,OUTPUT); digitalWrite(MP3Tx, HIGH); 
  //pinMode(MP3Rx,OUTPUT); digitalWrite(MP3Rx, HIGH);
}

Мне также удалось получить некоторые настройки задержки методом проб и ошибок, так что иногда он воспроизводил другой трек, но это было очень нестабильным. Как вы можете видеть, у меня много задержек, что делает меня несчастным. Я подозреваю, что ошибка кроется где-то в той части, которая отключает мини-модуль DFPlayer. Может кто-нибудь подсказать мне, что я делаю не так?

wiring schematic

, 👍2

Обсуждение

пожалуйста, добавьте принципиальную схему схемы, @jsotola

Я добавил две диаграммы, это нормально?, @Kilroy

На макетной плате верхняя синяя направляющая не имеет соединения с нижней синей направляющей. На схеме контакт GND на DFPLAYER MINI ни к чему не подключен., @tim

Что ж, прямой связи между верхней и нижней синими шинами нет, так как цель полевого МОП-транзистора состоит в том, чтобы отключить их, если он выключен. Они подключены к МОП-транзистору на его выводах стока и истока соответственно. Так это и задумано. Контакт 10 (GND) DFPlayer Mini ни к чему не подключен, но тот же самый GND (контакт 7) на самом деле подключен к верхней синей направляющей. Я мог бы соединить контакты 7 и 10, но это не имеет никакого значения, так как они уже подключены внутри., @Kilroy

Было бы лучше иметь переключатель MOSFET верхнего плеча для управления питанием DFPLAYER и подключения обоих GND к земле., @tim

К сожалению, у меня есть только два типа полевых МОП-транзисторов логического уровня: IRLZ44N (тот, который я использовал до сих пор) и IRL540N, оба являются полевыми МОП-транзисторами N-канального режима расширения. Как написано в вопросе, первый запуск работает совершенно нормально, поэтому настройка питания, кажется, работает (питание изначально отключено!). Проблема возникает только после того, как я выключаю DFPlayer и снова включаю его. На самом деле он снова включается, но связь, похоже, не работает должным образом, так как я получаю эти ошибки тайм-аута. Следовательно, я на самом деле предполагаю, что это скорее программная проблема из-за выключения и повторного включения последовательной связи., @Kilroy

Попробуйте использовать механический переключатель или проводную связь вместо переключателя MOSFET верхнего плеча, чтобы увидеть, сможете ли вы отключить и снова включить DFPLAYER и успешно продолжить работу с программой., @tim

Следуя вашему предложению, я полностью удалил полевой МОП-транзистор с макетной платы и вместо этого соединил верхнюю синюю шину с нижней (так что на самом деле здесь больше нет переключателя). Я оставил скетч, как указано выше. Происходит тоже самое: плеер работает первый раз после включения/перезапуска Arduino, потом начиная со второй итерации плеер каждый раз не воспроизводит файл., @Kilroy

Дополнительная информация: с мостовыми рельсами установка **работает**, если я закомментирую строки, содержащие MP3serial.flush(); и MP3serial.end();. Однако, снова убрав мост и снова подключив MOSFET, та же проблема: работает в первой итерации, затем дает сбой, но иногда он запускает звук, а затем останавливается., @Kilroy

Что происходит с мостовыми шинами и отсутствием полевого МОП-транзистора, когда вы отключаете и снова включаете питание DFPLAYER через высоковольтную проводную связь во время 8-секундного сна? Будет ли это работать во время последующей итерации?, @tim

Я удалил МОП-транзистор и добавил невесту, с.т. обе шины 5V и GND соединены мостами. Это работает, если я закомментирую команды flush и end. Затем, если я потяну ** 5 В ** мост или мост GND и верну его на место, он сработает (на самом деле он работает независимо от того, подключим ли я его вовремя или нет, что меня серьезно смущает). При этом, если я отключу мост 5 В, Arduino потребляет более 3 мА в глубоком сне (из-за того, что последовательный порт остается включенным !?), Но без моста GND он потребляет всего ~ 0,1 мА. Я стремлюсь к последнему, так как он будет работать в течение года на батарее емкостью 1900 мАч., @Kilroy


1 ответ


0

На макете верхняя синяя направляющая не соединена с нижней синей направляющей. На схеме вывод GND на DFPLAYER MINI ни к чему не подключен.

,

Ну, между верхней и нижней синими направляющими нет прямой связи, так как цель МОП-транзистора-отключить их, если он выключен. Они подключены к МОП-транзистору на его выводах стока и источника соответственно. Так это и задумывалось. Вывод 10 (GND) DFPlayer Mini ни к чему не подключен, но тот же GND (вывод 7) фактически подключен к верхней синей направляющей. Я мог бы подключить контакты 7 и 10, но это не имеет никакого значения, так как они уже подключены внутренне., @Kilroy

Было бы лучше иметь МОП-транзисторный переключатель на верхней стороне для управления питанием DFPLAYER и подключения обоих GND к заземлению., @tim

К сожалению, у меня есть только два доступных типа МОП-транзисторов логического уровня: IRLZ44N (тот, который я использовал до сих пор) и IRL540N, оба являются МОП-транзисторами в режиме усиления N-канала. Как написано в вопросе, первый запуск работает совершенно нормально, поэтому настройка питания, похоже, работает (изначально питание отключено!). Проблема возникает только после того, как я выключаю DFPlayer и снова включаю его. Он действительно снова включается, но связь, похоже, не работает должным образом, так как я получаю эти ошибки тайм-аута. Следовательно, я на самом деле предполагаю, что это скорее проблема с программным обеспечением из-за отключения и повторного включения последовательной связи., @Kilroy

Попробуйте использовать механический переключатель или проводную связь вместо переключателя МОП-транзисторов на верхней стороне, чтобы узнать, можно ли отключить и снова включить DFPLAYER и успешно продолжить выполнение программы., @tim

Следуя вашему предложению, я полностью удалил МОП-транзистор с макета и вместо этого соединил верхнюю синюю рейку с нижней (так что на самом деле больше нет переключателя). Я оставил скетч, как указано выше. Происходит то же самое: Проигрыватель работает в первый раз после включения / сброса Arduino, затем, начиная со второй итерации, проигрыватель каждый раз не воспроизводит файл., @Kilroy

Дополнительная информация: С мостовыми рельсами настройка **работает**, если я закомментирую строки, содержащие "MP3serial.flush ();" и " MP3serial.end ();". Однако, снова убирая мост и снова подключая МОП-транзистор, та же проблема: работает на первой итерации, затем завершается неудачно, но иногда он запускает звук, а затем останавливается., @Kilroy

С мостовыми рельсами и без МОП-транзистора, что произойдет, когда вы отключите и восстановите DFPLAYER по высоковольтной проводке во время 8-секундного сна? Будет ли это работать во время последующей итерации?, @tim

Я удалил МОП-транзистор и добавил невесту, s.th. как 5 В, так и рельсы GND соединены через мосты. Это работает, если я закомментирую команды "сброс" и `завершение". Затем, если я потяну **или** 5 В или мост GND и снова подключу его на место, он работает (на самом деле он работает независимо от того, подключу ли я его вовремя или нет, что серьезно сбивает меня с толку). Тем не менее, если я подключу мост 5 В, Arduino будет использовать более 3 мА в глубоком сне (из-за того, что последовательный режим включен!?), но без моста GND он будет использовать только ~0,1 мА. К последнему я и стремлюсь, так как он будет работать в течение года от батареи емкостью 1900 мАч., @Kilroy