[Solucionado]Tarjeta microSD no inicia / Desactivar salida digital en modo Sleep

Estimados usuarios del foro,

Para mi proyecto estoy usando un Arduino Pro mini de 5 volts, un mpu6050 (giroscopio-acelerómetro), un módulo lector/grabador en tarjeta microSD y 3 termistores NTC.

He de alimentar todo con batería y quiero poner el Arduino en modo Sleep para ahorrar batería. Por ello quiero alimentar los sensores y el grabador de tarjeta a través de una salida digital y que ésta se active cada 8 seg y dormir así los sensores durante 8 seg cada vez.

El consumo del módulo de la tarjeta es de 4,4 mA, por lo que la salida digital puede dar esta intensidad sin problema.

El módulo se alimenta entre 4,5 y 5,5 volts, por lo que la tensión tampoco es u problema.

Ahora vienen los dos problemas: Mientras el MPU y los termistores se inician bien, la tarjeta microSD no se inicia aunque sí lo hace cuando alimento el módulo directamente de la salida Vcc del arduino.
El otro problema es que al dormir el arduino, la salida digital que alimenta a los sensores no se desactiva sino que permanece activa todo el tiempo con lo que los sensores y la tarjeta consumen continuamente. Para dormir el arduino uso la librería lowpower con la función delay(500);
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);

EL código empleado viene aquí (lo que nos interesa)

#include <SD.h> //Librería tarjeta
#include "LowPower.h"  //Libreria de ahorro de bateria 

const int pin = 8; // Usaré este PIN como salida de Vcc para alimentar los sensores

File myFile; //Para el archivo que se creara en la microSD

void setup( )
{
  Serial.begin( 9600);

pinMode(10, OUTPUT); //Pin que conecta pin CS de tarjeta a pin SS de Arduino

   pinMode(8, OUTPUT); //define el PIN 8 como salida
   digitalWrite(8, HIGH);
   delay (10); //Para que le dé tiempo a iniciar los sensores tras activarse la salida digital de alimentación

Wire.begin(); //empieza MPU6050
   mpu.initialize();
   Serial.println(mpu.testConnection() ? F("IMU iniciado correctamente") : F("Error al iniciar IMU")); //acaba MPU6050
   
  Serial.print("Iniciando MicroSD ...");
  
  if (!SD.begin(10)) {
    Serial.println("MicroSD no se pudo iniciar");
    return;
    
  }
  Serial.println("MicroSD Iniciada correctamente");

  if(!SD.exists("datalog.csv"))
  {
      myFile = SD.open("datalog.csv", FILE_WRITE);
      if (myFile) {
        Serial.println("Archivo nuevo, Escribiendo encabezado(fila 1)");
        myFile.println("Tiempo(Tiempo;Sensor1;Sensor2;Sensor3;sensor4;sensor5");
        myFile.close();
      } else {

        Serial.println("Error creando el archivo datalog.csv");      
      }
  }
}

void loop( )
{

delay(500);
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); 

  // Leer las aceleraciones  del MPU6050
   mpu.getAcceleration(&ax, &ay, &az);
 
   //Calcular los angulos de inclinacion
   float accel_ang_x = atan(ax / sqrt(pow(ay, 2) + pow(az, 2)))*(180.0 / 3.14);
   float accel_ang_y = atan(ay / sqrt(pow(ax, 2) + pow(az, 2)))*(180.0 / 3.14);
 
   // Mostrar resultados
  
 Serial.print(F("\;    Inclinacion en X:"));
   Serial.print(accel_ang_x);
   Serial.print(F(";             \Inclinacion en Y: "));
   Serial.println(accel_ang_y);

     myFile = SD.open("datalog.csv", FILE_WRITE);//abrimos  el archivo
  
  if (myFile) { 
        Serial.print("");
        
   myFile.print(F("\;    Inclinacion en X:"));
   myFile.print(accel_ang_x);
   myFile.print(F(";             \Inclinacion en Y: "));
   myFile.println(accel_ang_y);
        
        myFile.close(); //cerramos el archivo
  } else {
    Serial.println("Error al abrir el archivo"); 
  }
  }
  }

¿Alguien me puede echar un cable?

Muchas gracias por vuestra atención

Hi,
Haz leido el voltaje que alimenta el modulo del microsd cuando inizialisas el systema. Leyendo el voltaje te puede decir donde esta el problema ya que dices que cuando alimentas el modulo usando los 5 voltios del arduino te trabaja.

Hola,
Muchas gracias por tu rápida respuesta.
El voltaje es de 4,85 Volts (el mínimo para alimentar el módulo es 4,5 Volts, así que, en principio debería servir). De todos modos, para eliminar esa posibilidad de error he empleado un convertidor DC DC que me eleva la tensión a 5,13V (La máxima para alimentar el módulo es de 5,5 Volt)

Hi,
Trata de anadirle un condesador de 10uf y no trates de leer el modulo imediatamente. Haz un delay para darle tiempo para que el voltaje se estabilize.

Muchas gracias nuevamente.
He conectado un condensador electrolítico de 10 uF entre el positivo y GND y he probado diefrentes delays, desde 10mseg a 10 seg... pero el resultado ha sido el mismo, no se inicia el módulo.. ¿He conectado bien el condensador?
Gracias por tu atencion

Estas preguntando lo mismo que en el otro hilo, para que abres una consulta nueva?
Dirás que no es lo mismo pero, mismo código, mismo problema.
Uno los temas y se responde todo en el mismo.

Gracias por estar pendiente y agrupar los dos hilos en uno surbyte.
Pensé que eran dos problemas diferentes y por ello debían estar en dos hilos diferentes
He modificado el asunto y la primera consulta para que engloben ambos problemas.
Un saludo

Hi,
Los condesadores tienen dos marcas uno que indica el positivo y el negativo.La mayoria tienen una banda para indicar el negativo. El negativo va al ground y positivo al voltaje. No dice que clase de SD estas usando para poder ver porque no trabaja. Por lo regular usan el I2C

No lo habías resuelto?

tauro0221:
Hi,
Los condesadores tienen dos marcas uno que indica el positivo y el negativo.La mayoria tienen una banda para indicar el negativo. El negativo va al ground y positivo al voltaje. No dice que clase de SD estas usando para poder ver porque no trabaja. Por lo regular usan el I2C

Hola tauro,
Muchas gracias por tu respuesta.
Sí, he tenido en cuenta la polaridad del condensador.
Uso un módulo de tarjeta microSD que funciona con interfaz SPI (Pines MOSI, MISO, SCK y CS)
Gracias por tu atención

Hi,

Aqui veo que estas tarjetas algunas tienen un regulador de 5 voltios a 3,3 voltios. Si esa que tu usas tiene un regulador posiblemente si estas alimenatandola con un pin posiblemente no tiene suficiente corriente para alimentarla. Si tiene el regulador entonces le el voltaje de los 3.3 voltios en el modulo despues del regulador.

surbyte:
No lo habías resuelto?

Hola surbyte,
Muchas gracias por tu atención.
He resuelto la iniciación del MPU6050 gracias al delay de 10 mseg después de activar la salida digital que me comentaste (Gracias de nuevo)
Pero el módulo de la tarjeta microSD no inicia...
Y tampoco sé cómo desactivar la salida digital que alimenta los sensores cuando el arduino duerme...
Un cordial saludo

Gracias de nuevo tauro.
Sí tiene un AMS1117-5.0
He medido y a la salida del regulador presenta 3,24 Volts. La misma tensión que alimentando el módulo con VCC de arduino.
El consumo (4,4 mA) también es el mismo con ambas alimentaciones.
Gracias por tu atencion

Hi,
Entonces te sugiero que hagas la siguiente prueba. Desconectas los otro modulos y trata de leer el SD sola para ver si la puedes leer.

Bueno, por lo visto te he maltentendido.
La SD necesita 5V si o si.
Si la alimentas con un pin y esa era tu idea y no esta funcionando es porque requiere mas corriente que los 40mA que puede entregar.

Esto es lo que una simple búsqueda de SD current consumition arroja:

From my experience, typical SD card current consumption is ~30mA in SPI mode and ~100mA in 4-bit SD mode. My advice would be to include the first figure with a 2x or 3x safety margin (that is, 60 or 90 mA) in your device power budget, and make sure that the rest of your circuit never consumes more than 500-60 = 440mA or 500-90 = 410mA respectively.

Debes disponer de al menos 100mA y eso no lo da 1 pin. Asi que considera lo que hablamos antes, un transitor MOSFET canal P o N para cerrar el circuito.
Dime cual tienes o puedes conseguir.

Gracias de nuevo surbyte.
He medido el consumo de nuevo focalizándome en el inicio y me he dado cuenta de que, aunque el consumo normal es de 4,4 mA, durante un lapso muy corto de tiempo, al inicar, consume mucho más, alrededor de 30 mA. Así que, tal y como comentas, el problema es de consumo.
Tengo un Mosfet IRLZ44N y un IRF520.
Es alguno de ellos adecuado?
Gracias por tu atención

Vamos con el IRF520 que será suficiente para esto.

Probemos asi

tu carga será la microSD con GND conectada al MOSFET IRF520 y VCC de la microSD conectada a 5V

Usa una R de 10k o 100K entre Gate y GND y conecta el Gate al pin de salida del Arduino.
Cuando le des HIGH, va a cerrar el circuito y hará que funcione la microSD.
Hazlo sin LowPower primero enciendela, configura el pin de salida antes.. lo pones en HIGH y lo dejas asi.
Luego en el loop lo apagas, le pones un delay de 1000 mseg simulando LowPower y luego lo habilitas de nuevo y actuas sobre la SD leyendo o escribiendo.

Recapitulemos.
Inicias normal.
configuras Pin que alimenta la microSD. Lo pones en HIGH
inicializas la SD, y debe decir OKAY etc etc
llegas a loop y observas normalmente todo.

Luego cuando estes seguro, repites con LowPower.

Hi,
Estoy de acuerdo con surbyte de usar un transitor pero un mosfet de 9 amperios para energizar una carga de 40 miliamperios Yo trataria primero con un transitor como el 2N2222 con corriente max de 800ma. Si no trabaja entonces trataria un mosfet como el BS170 MOSFET N-Channel de 60 v 500 ma. Solamente una sugerencia

A ver tauro tienes razón pero son los MOSFET de que dispone.

El BS170 tiene 5 Ω de Rds.
El 2N7000 tiene 5 Ω tmb.
El IRF520 tiene 0.27 Ω
El IRLZ44N tiene 0.028 Ω

Yo no gastaría un IRLZ44N para esa tarea. Por eso, sugerí el IRF520.

Hi,
Sugerencia porque no conectas todos los componentes a los 5 voltios y usas un transistor ya sea un mosfet o tambien puedes usar un reedd relay y cuando vayas a leer los modulos entonces le provees el ground a todos ellos. Una vez que los leas remueve el ground. Tambien puedes usar el reed relay que tiene contactos con una resistencia de zero para conectar el ground. Vienen de 3.3 voltios y de 5 voltios 1 amp.