Alimentación de componentes a través de pines digitales Arduino

Hola

estoy utilizando un módulo DF Player Mini al que quería controlar el encendido y apagado a través de un Arduino Uno.

Quería hacer algo parecido a lo que he visto en la guía de esta página web: Power saving techniques for microprocessors, en la sección de "Powering off external devices". Es decir, utilizar un pin digital (por ejemplo el 8), definiéndolo como OUTPUT y estado HIGH conectado al pin de Vcc del módulo DF para alimentarlo, y estado LOW cuando quiera apagarlo.

Sin embargo, cuando lo hago se genera mucho ruido en el altavoz y es incapaz de reproducir ninguna pista (o si lo hace queda oculto por el ruido). He probado conectando la resistencia de 220 ohm (entre el Vcc del DF y el pin 8 del arduino) y el condensador de 0.1 uF (entre el Vcc del DF y GND), pero no hay ninguna mejora.

El código que estoy utilizando es el siguiente:

#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

int Control_DF = 8;

int serial1 = 10;
int serial2 = 11;

SoftwareSerial mySoftwareSerial(serial1, serial2); // RX, TX.
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup() {
  digitalWrite(Control_DF, HIGH);
  pinMode(Control_DF, OUTPUT);
  mySoftwareSerial.begin(9600);

  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
  
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.volume(25);
  myDFPlayer.play(1);
}

void loop() {
}

El mismo montaje, componentes y script, pero cambiando la conexión del pin 8 al pin +5V del Arduino con el Vcc del módulo DF y todo funciona perfectamente (sin ruidos en el altavoz y reproduce la pista de audio correctamente).

Creía que al ser las mismas tensiones y corrientes de trabajo no es necesario un transistor MOSFET para hacer esto, pero parece que de la forma que lo estoy planteando me estoy equivocando en algún punto. ¿Alguien puede ayudarme con esta duda?

Mi objetivo es poder apagar o dejar en modo de bajo consumo el DF Player cuando no lo necesite, así que si existe otra manera de hacerlo también me vale. He probado el comando de sleep(); de las librerías DFRobotDFPlayerMini.h y DFPlayerMini_Fast.h, pero aunque lo inhabilitan la corriente no baja de los 20 mA, por lo que sigue consumiendo energía en estado inactivo.

Gracias por vuestro soporte.

Un pin digital del UNO puede entregar como máximo 40 mA, el DF consume como mínimo 20 mA cuando no está en reproducción, pero en reproducción y conectando el parlante puede consumir fácilmente unos 600 mA. Imposible alimentarlo desde un pin digital.
Debes usar un mosfet o un bipolar (o ambos) que sí manejarás con el pin.

Algo así

Nota: Agregar un capacitor de 1000 uF entre Vcc y GND del DF Player.

Esos pines digitales al funcionar como estado lógicos manejan poca corriente, podrías usar ese estado lógico para activar en saturacion un transistor bjt de media potencia como el bd135 y ahi si calcularías la cantidad de corriente que necesitas.

Hola @MaximoEsfuerzo , @el_electronico ,

Muchas gracias por vuestras respuestas.

Siguiendo con vuestras recomendaciones, ayer fui a una tienda de electrónica y explicando este caso me dieron un MOSFET BS250 (datasheet), y me explicaron que debía hacer la conexión así (he modificado con Paint el esquema que me disteis):

Con R1 y R2 resistencias de 100kΩ y de 1kΩ, respectivamente, también por indicación del dependiente de la tienda. Con esto, debía cambiar el estado del pin digital a LOW cuando quiero tenerlo encendido y HIGH cuando lo quiero apagar.

Sin embargo, con estas resistencias el DF Player no se enciende. He ido probando con otras que tenía en casa y conforme voy bajando el valor de R1 y R2 consigo que el DF Player se encienda. Solo cuando quito las 2 resistencias es cuando consigo que la tensión sea de 5V y la intensidad del DF Player encendido sea de entre 20-30 mA, y si pongo el pin digital en High el consumo pasa a 0.2 mA. Si vuelvo a poner el pin en Low, el DF Player hace cosas raras, no se reinicia correctamente.

Además, cuando le doy corriente sigue escuchándose ese ruido en el altavoz, como si fuera de interferencia, que hace que no se reproduzca nada. Esto pasa con cualquier resistencia que ponga, y si las quito también, no hay diferencia. El altavoz que estoy utilizando es de 1 W (8 ohm), aunque he hecho una prueba con uno de 0.25 W y ocurre lo mismo.

He probado también conectando Vcc y GND del DF Player con un capacitor de 0.1 uF (es lo que tenía en casa), pero no se observa ninguna diferencia.

Hay algo que sigo haciendo mal, porque si conecto el pin de 5V del Arduino al pin VCC del DF todo funciona correctamente. Es decir, que doy por hecho que los componentes funcionan bien y soy yo quien está fallando con el conexionado, el código o que me siguen faltando componentes para eliminar ese ruido. ¿Alguien tiene alguna idea?

Gracias

Agrega el transistor NPN.
El BS250 es un poco "chico", es para 200 mA, tenelo en cuenta.
Es importante el condensador entre Vcc y GND del Dfplayer.

De acuerdo, buscaré el transistor NPN y el condensador de 1000 uF y cuando lo pruebe os informo de los resultados. ¿Recomendáis algún modelo del transistor NPN en concreto? ¿O alguna especificación a tener en cuenta?

Muchas gracias por tu ayuda

Cualquier NPN tipo BC548 ó 2N2222 va bien.

Perfecto, muchas gracias

Hola,

Disculpad que haya tardado tanto en responder a este tema pero con las vacaciones de por medio no he podido comprar los componentes que me faltaban y ponerme con vuestras recomendaciones hasta esta semana.

He probado las siguientes cosas y de momento ninguna me ha funcionado:

  1. El montaje del post #2, con el transistor NPN 2N2222A y el MOSFET BS250, las resistencias de 470 ohm y 10K y un condensador electrolítico de 1000 uF entre VCC y GND del DF Player Mini. Por un lado, el ruido en el altavoz no se ha ido, por lo que no llega a reproducirse nada. Si desconecto el altavoz, el consumo del DF Player comienza siendo el habitual (entre 18 – 20 mA), aunque se bloquea si le ordeno reproducir una pista (es decir, el DF Player no funciona correctamente aunque consuma energía). Si pongo el pin en LOW el consumo pasa a 0 mA, pero si paso de nuevo a HIGH el consumo se queda en unos 4 – 5 mA.

  2. Montando solo el MOSFET, como en el post #4, con el condensador de 1000 uF entre VCC y GND. Mismos resultados en cuanto al ruido en el altavoz. Sin el altavoz conectado el consumo sí que pasa de 18 mA a 0 mA alternando entre los modos LOW y HIGH, aunque después ya no vuelve al estado de consumo que debería.

  3. Montando solo el transistor 2N2222A, como en esta entrada del foro. El altavoz no hace ruido (o hace mucho menos que en las otras situaciones), pero estando encendido no reproduce nada, como si en realidad no estuviera funcionando aunque consuma energía. Aquí el paso de HIGH a LOW y vuelta a HIGH sí que lo hace bien, en cuanto al consumo de energía.

  4. Al no conseguir nada así he optado por probar con esta placa amplificadora (en la tienda no tenían el módulo de control IRF520 para Arduino y me dijeron que esta me podía servir para lo mismo). He conseguido que funcione correctamente para apagar y encender un LED, pero cuando cambio el led por el DF Player el consumo máximo estando encendido es de 3,5 mA, insuficiente para que funcione.

No sé qué estoy haciendo mal para que ninguna de estas opciones funcione, sobre todo la primera que es la que me habéis recomendado aquí. He cambiado resistencias, cables, probado los componentes por separado para asegurar que funcionan… Me sorprende lo difícil que puede ser apagar el DF Player.

Si se os ocurre algo más que pueda hacer, o corregir de lo que ya he probado, os lo agradecería.

Gracias de nuevo por vuestra ayuda.

Para descartar que el problema sea otro...
¿Has probado el funcionamiento alimentando el reproductor directamente desde los 5V? (O sea sin transistor alguno)
¿Funciona bien?

Solo para aclarar: el condensador de 1000uF debe ir entre los pines Vcc y GND de la placa del reproductor (haya o no transistor).

Sí, el módulo DF Player funciona correctamente si se conecta a la alimentación normal, sin transistores. Compré un segundo módulo para verificar que el que estaba utilizando no estuviera dañado, y ocurre lo mismo.

Creo que estoy montando bien el condensador, pero por si acaso, he editado el esquema que realizaste incluyendo la posición del condensador para confirmar que es correcto.

Si, es correcto.

El BS250 no es adecuado para el trabajo, apenas maneja 230 mA como máximo.
Necesitas algo mejor.

Hi,
Sugerencia. Elimina el mosfet y aplica 5 voltios al dfplayer. Usa el 2n222 conectado al dfplayer para que lo lleve a ground. Con esta configuracion energizas el 2n2222 para que provea el ground al dfplayer. Tratalo para ver si te trabaja. Se me olvido que debes conectar una resistencia de 1K en serie con el pin Rx para que no dane el dfplayer. El uso de la resistenciaa de 1K esta en las especificaciones del dfplayer.

Una pregunta tonta. ¿En todo lo que has probado al volver a encender el dfplayer lo reinicializas como lo haces en el setup al iniciar todo el sistema por primera vez?.

@MaximoEsfuerzo
El BS250 no es adecuado para el trabajo, apenas maneja 230 mA como máximo.
Necesitas algo mejor.

Entiendo que el DF Player puede tener consumos superiores, pero en las condiciones en las que lo estoy probando, el consumo máximo del DF Player es de 70 mA. Cuando monto el transistor y el mosfet, ¿no debería ser el mismo consumo si mantengo la misma SD y volumen?

@tauro0221
Se me olvido que debes conectar una resistencia de 1K en serie con el pin uno para que no dane el dfplayer. El uso de la resistenciaa de 1K esta en las especificaciones del dfplayer.

Sí. No lo he dicho antes pero en todo momento ha habido una resistencia de 1K conectada al pin RX del DF Player.

@gonpezzi
Una pregunta tonta. ¿En todo lo que has probado al volver a encender el dfplayer lo reinicializas como lo haces en el setup al iniciar todo el sistema por primera vez?

No. Lo inicializo la primera vez y luego simplemente pongo el pin del Arduino en estado LOW ( digitalWrite(Control_DF, HIGH); pinMode(Control_DF, OUTPUT); ) o HIGH ( pinMode(Control_DF, INPUT); digitalWrite(Control_DF, LOW); ).

@tauro0221
Sugerencia. Elimina el mosfet y aplica 5 voltios al dfplayer. Usa el 2n222 conectado al dfplayer para que lo lleve a ground. Con esta configuracion energizas el 2n2222 para que provea el ground al dfplayer. Tratalo para ver si te trabaja.

He estado probando de nuevo esta opción, montado como en el esquema 1 de esta entrada del foro. Puedo ir alternando entre los estados HIGH y LOW y las intensidades medidas varían entre los 20 mA y 0 mA sin problema. Sin embargo, el DF Player no es capaz de reproducir ninguna pista, se bloquea. Lo que me he dado cuenta haciendo pruebas es que si en el momento de dar corriente por primera vez al circuito el GND del DF Player se encuentra conectado al GND del Arduino en lugar de al transistor, y luego lo cambio y lo conecto al transistor, todo funciona correctamente. Puedo pasar de HIGH a LOW y puedo reproducir pistas de audio. Es como si el DF Player no se inicializara correctamente la primera vez si el GND está conectado al transistor. ¿Se os ocurre qué puede pasar? El transistor es un 2N2222A.

Yo considero siempre el peor caso, y el peor caso es que se dispare el consumo a 600 mA (que es lo típico del Dfplayer en reproducción).

Como dice el refrán: "Cada maestrito con su librito"

Saludos

Hi,
Aqui tienes que tener en cuenta que el dfplayer tiene un regulador que baja el voltaje a 3.8 votiios. Por lo tanto el voltaje Vcc tienes que compensar por la perdida del transistor. Por lo tanto vaz a tener que usar un voltaje de por lo menos 6 votios. Una sugerencia si vaz a usar la configuracion del mosfet entonces anadele un condesador electrolitico de por lo menos 470ufd 16 voltios y cuando energizes el mosfet haz un delay para que el condesador se cargue y despues inisilizas el dfplayer..

void setup() {
  digitalWrite(Control_DF, HIGH);
  pinMode(Control_DF, OUTPUT);

Haz primero el pinMode:

void setup() {
   pinMode(Control_DF, OUTPUT);
   digitalWrite(Control_DF, HIGH);

No lo entiendo, ¿ cambias el modo del pin a cada escritura ?. No el pin siempre ha de ser siempre OUTPUT y definido solamente en el "setup", luego en tu código simplemente pones el pin en alto o bajo según requieras.

Para mi cualquiera de las soluciones de harware que se están manejando debería de funcionar, (salvo una pequeña recomendación en las conexiones TX, RX que luego te comentare), luego pienso que el problema esta el el sofware no en el harware.

En mi anterior intervención te preguntaba si reinicializabas el dfplayer despues de cada encendido y me contestas que no. ¿Porque?. ¿Donde guarda el dfplayer la inicializacion cuando apagas el transistor?. En ningun sitio, obiamente si lo apagas desconectado el puerto USB y vuelves a conectar el puerto tu codigo ejecuta el "setup" y reinicializas el dfplayer, pero no lo haces si apagas y enciendes el transistor, creo que una secuencia logica de apagado y encendido podria ser:

#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

int Control_DF = 8;

int serial1 = 10;
int serial2 = 11;

SoftwareSerial mySoftwareSerial(serial1, serial2); // RX, TX.
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup() {
    
  mySoftwareSerial.begin(9600);
  pinMode(Control_DF, OUTPUT);
  digitalWrite(Control_DF, HIGH);
  ini_dfPlayer (); // Inicializa el reproductor.
  
  myDFPlayer.play(1);
}

void loop() {
//.......................................
//......................................
digitalWrite(Control_DF, LOW); // Apaga el reproductor
//.......................................
//.......................................
digitalWrite(Control_DF, HIGH); // Enciende el reproductor
ini_dfPlayer (); // Reinicializa el reproductor.
//.......................................
//.......................................  
}

void ini_dfPlayer (){
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
  
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while(true){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.volume(25);
}

Recomendaciones conexionado (RX,TX).
Esa resistencia de 1K que todo tutorial coloca e incluso algunos se atreven a decir que es para evitar ruidos, pues muy bonita pero no es lo optimo y no sirve para eso. Yo uso y he recomendado alguna vez el siguiente esquema:
dfplayer
Donde:

  • El diodo: el datasheet del dfplayer indica una alimentación de entre 3,2 y 5V siendo la típica de 4,2V. El diodo nos produce una caída de tensión de unos 0,6V y estamos alimentando al dfplayer a unos 4,4V , mas cercano a su alimentación típica de 4,2V. Esto si le quita algo de ruido.
  • TX(dfplayer) directa a RX(arduino), aunque alimentemos al dfplayer a 4,4V sus pines TX y RX van a 3,3V, tensión que el arduino reconoce perfectamente como HIGH sin sufrir daño sus pines.
  • TX(arduino) a RX(dfplayer), no por medio de una sola resistencia, (me gustaría saber como la han calculado), mejor usar un divisor de tensión que baje los 5V del arduino a unos 3,3V que es lo que soporta el dfplayer, además otro poco de ruido que quitamos. Otros compañeros usan el típico adaptador de nivel lógico de venta "online" o incluso un pequeño mosfet cuyo esquema no encuentro ahora, (si alguien lo tiene ruego lo publique).
  • Las GND unidas como siempre si unamos una alimentación externa al arduino.

Hola,

Disculpad que haya tardado tanto en dar respuesta por este tema, pero al no conseguir una solución he estado renovando todos los componentes para descartar que no estuvieran dañados.

He probado con un Arduino nuevo, otro DF Player, nuevas resistencias, altavoces, transistores, cables y placa protoboard. Al parecer, el lote de 10 altavoces que compré estaba defectuoso y cuando compré un nuevo paquete el funcionamiento ha mejorado.

Probando todos los circuitos que se han propuesto, el único que me ha funcionado es la que emplea únicamente el transistor 2N2222A, como la que indicaba @tauro0221 en el post #13 y que vi también en esta otra entrada del foro. Todavía se escucha alguna interferencia, pero es el único circuito en el que el DF Player arranca y funciona. Mantengo el condensador entre Vcc y GND del DF Player, aunque no se aprecia mucho cambio. He fijado bien el altavoz para evitar vibraciones que puedan alterar el funcionamiento y de momento lo dejaré así unos días.

He probado con el mosfet IRL 520 pero no he conseguido hacerlo funcionar correctamente. El altavoz parece muy sensible y cuantos más componentes agrego peor se comporta.

Gracias por tus sugerencias de conexiones. Las he probado y seguro que mejoran el funcionamiento, pero en mi caso con los pequeños ruidos del altavoz no he podido apreciar un cambio notable.

Muchas gracias a todos por vuestras valiosas aportaciones y espero que tengáis un buen comienzo de año.
Saludos,
Jose

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.