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. Может кто-нибудь подсказать мне, что я делаю не так?
@Kilroy, 👍2
Обсуждение1 ответ
На макете верхняя синяя направляющая не соединена с нижней синей направляющей. На схеме вывод 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
- Альтернатива мосфету IRF520 в схеме выключения Arduino
- Подключение Arduino Arduino к MOSFET
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Какое максимальное энергопотребление Arduino Nano 3.0?
- Как навсегда изменить скорость передачи данных ESP8266 (12e)?
- Питание светодиодной ленты - Сколько ампер?
- Arduino nano как клавиатура HID
пожалуйста, добавьте принципиальную схему схемы, @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