Modulo SD controlado por transistor no funciona correctamente

Hola buenas, estoy teniendo problemas a la hora de realizar lecturas y escrituras con mi módulo de SD, en concreto es éste y las conexiones del circuito son las siguientes:

¿Fácil verdad? El caso es que cuando inicio mi programa se debe encender la SD para borrar el contenido, lo cual hace correctamente. Más tarde debe volver a encender la SD para escribir unos datos pero este último paso no lo hace, no detecta que esté correctamente encendida la SD. Lo curioso de todo esto es que no había tenido ningún problema hasta ahora, siempre ha leído correctamente los datos y no sé por qué ahora ha dejado de funcionar.

La función donde no conecta con la SD es ésta:

void writeInSDCard(){
  digitalWrite(PIN_TRANSB_SD, HIGH);    //Encendido del modulo SD
  while(!sd.begin(10, SPI_HALF_SPEED))
    Serial.print(F("SD card cannot be initialized correctly. Check that SD card is connected to its socket.\n"));

  myFile = sd.open(FILE_NAME, FILE_WRITE);
  printBuffer(buffer);  //DEBUG
  myFile.close();
  delay(100);
  digitalWrite(PIN_TRANSB_SD, LOW);
}

La función de inicio es prácticamente similar solo que con más mensajes de depuración y la escritura de una cabecera en el fichero. El pin de voltaje del módulo está directamente conectado a los 5V que alimenta el circuito y la librería que utilizo es la SDFat.h de Greiman. Depurando un poco, usando la función initErrorHalt de la clase SdFat me responde lo siguiente:

Can't access SD card. Do not reformat.
SD errorCode: 0XA,0X1

Mis preguntas son:

  • El transistor que tengo es uno de potencia de tipo MOSFET (éste), controlado por voltaje, ¿cierto? No he colocado una resistencia de base, ¿sería necesaria?
  • Se me ha ocurrido que podría colocar una resistencia en paralelo con el transistor entre colector y emisor para que, cuando el transistor esté apagado, el módulo SD esté en un estado definido (según cosas que he leído por ahí). ¿Sería buena idea o no ayudaría para nada? Algo como esto:

Muchas gracias por la ayuda :slight_smile:

¿Con qué necesidad estarla apagando?
Además la susodicha resistencia es de 10k, y va entre gate y source, no entre drain y source

Como digo la enciendo al principio del programa para borrar el fichero contenido en la raíz de la SD, si es que lo tiene, y si no lo crea y le pone una cabecera. Por otro lado,tengo implementado un buffer en la memoria del Arduino donde se van guardando datos y, cuando se llena, escribo los datos en la SD. Insisto en que puedo realizar una primera escritura en la SD, el resto de veces no puedo escribir en la tarjeta.

En este hilo comentan que este problema surge cuando varios dispositivos utilizan la interfaz SPI (no es mi caso) y que consiste en parar por completo la comunicación SPI.

En cuanto a la resistencia, ¿me puedes explicar por qué tiene que ser de 10k y por qué debe ir entre gate y source y no entre drain y source?

Un saludo y gracias por tu respuesta Lucario448.

Leo el hilo y me encuentro con esto:

fat16lib:
SD cards are designed for hot insertion. You should wait a few ms for power to stabilize after you insert the card before initializing the card with a begin() call.

Quizá debas añadir un delay después de activar el MOSFET, pero antes de llamar a begin.
En otra parte también mencionó que es mejor retirar/desconectar la tarjeta pasado un segundo desde su último acceso; y por supuesto de antemano habiendo cerrado cualquier archivo abierto.

PinaGamer:
En cuanto a la resistencia, ¿me puedes explicar por qué tiene que ser de 10k y por qué debe ir entre gate y source y no entre drain y source?

Colocar una resistencia en paralelo al MOSFET equivale a colocar una resistencia en paralelo a un interruptor: siempre dejará pasar algo de corriente.

Si hablamos de un MOSFET canal N, la resistencia que va de Gate a Source se le conoce como "pull-down"; mantiene un estado bajo estable. Sin esta, hasta una diminuta interferencia electromagnética encendería el MOSFET.
De 10k porque una impedancia (resistencia) muy alta disminuye su efecto estabilizador. Una impedancia muy baja potencia este efecto, pero genera una carga eléctrica innecesaria.

Solucionado! El problema no tenía nada que ver a nivel software. Como ya dije, en su momento, con el código que escribí anteriormente ya funcionaba. Todo estaba relacionado con el voltaje de entrada de la tarjeta.

Lo único que hice fue conectar el pin de voltaje del módulo de la tarjeta al VCC del Arduino y funcionó correctamente. Antes estaba conectada al voltaje suministrado por 4 pilas de 1.2 V cada una (aunque luego se cargan a 1.33V apróx.). Según tengo entendido, el pin VCC del Arduino suministra de forma estable 5V, ¿cierto?¿Alguien sabría decirme porque esa diferencia de voltaje hacia que el lector no funcionase correctamente?

Gracias :slight_smile:

¿Puedo ver el módulo que utilizaste?

Lo que no queda claro es si usaste el IRF520 con la R en paralelo o no.
Te respondo cuando tu digas que hiciste.

Respuesta para Lucario448

El módulo SD que utilicé fue éste

Respuesta para surbyte

No, no usé ninguna resistencia, ni entre colector y emisor, ni tampoco entre base y emisor.

IRF = MOSFET no hay colector, emisor, base.
Hay Drain (Drenaje), Source (fuente), Gate (compuerta)

Ahora porque funcionó con 5V y no con 4.8 (4x1.2V)
Supongo que la tensión no es el problema sino la corriente.
NO se que baterias usaste, no se si estan bien cargadas y si pueden entregar corriente como se supone.

Es la explicación que encuentro. 4.8 a 5V no es diferencia para que el IRF520 conduzca o no lo haga adecuadamente.
La hoja de datos dice que con 4.5V y un Vgs de 5V funciona entregando 1A asi que esa no puede ser la razón.

Si es posible que las baterias no estuvieran bien y no entreguen la corriente necesaria pero estoy suponiendo.

Respuesta a surbyte

Gracias por corregirme la forma de nombrar las patillas del transistor, así no me malacostumbro jejeje

Respecto al enigma de las baterías, utilicé 4 pilas de éstas que tienen cada una 1.2V y proporcionan 1900 mAh. Con lo que parezco tener problema es por el hecho de creer que el voltaje y la intensidad decrecen proporcionalmente. Me refiero, estoy confundido al pensar que, conforme menor es voltaje, también lo es la intensidad y por lo que me estás diciendo esto no es así, ¿verdad?

En cuanto al transistor, ¿me puedes decir en que sección del datasheet estás visualizando esa información? Lo digo porque yo visualizo las gráficas (concretamente la de Typical Trasnfer Characteristics de este datasheet) y siendo Vgs = 5V, la intensidad ofrecida es de 2A, no de 1A. Hago especial hincapié en el transistor puesto que también estoy teniendo problemas con este módulo GSM de comunicaciones controlado por otro transistor idéntico y esta vez si está siendo alimentado con 4 pilas como las que estoy usando en vez de con VCC y no consigo hacerlo funcionar con el transistor (sin él funciona correctamente)

Un saludo y gracias :slight_smile: