Lectura de SD con Arduino UNO sin shield

Buenas,

llevo varios días pegándome con poder leer una tarjeta SD (más bien una uSD en un adaptador), sin usar ningún shield o módulo aparte.

Ya probé con diferentes tarjetas y adaptadores y usado diferentes códigos (tanto del foro, como de páginas de internet).

Os adjunto el esquema de montaje (todas las resistencias son de 1K).

Y aquí os dejo el último código que probé (sacado de aquí):

/*EducaChip – Cómo Leer Y Escribir Datos En La Tarjeta SD De Arduino*/
/* www.educachip.com */

//Se incluye la librería <SD.h>
#include <SD.h>

File Archivo;

void setup() {

  //Se esablece comunicación con el monitor serial para la comprobación de la
  //carga de datos.
  Serial.begin(9600);

  //Se muestra por pantalla que se va a iniciar la comunicación con la SD
  Serial.print(“Comenzando la comunicación con la tarjeta SD”);

  //Se establece como salida el pin correspondiente a SS.
  pinMode(10, OUTPUT);

  //Se muestra por el monitor si la comunicación se ha establecido correctamente
  //o ha habido algún tipo de error.
  if (!SD.begin(10)) {

    Serial.println(“Se ha producido un fallo al iniciar la comunicación”);
    return;
  }
  Serial.println(“Se ha iniciado la comunicación correctamente”);

  /* ESCRIBIENDO DATOS EN LA MEMORIA SD DE ARDUINO */

  //Se abre el documento sobre el que se va a leer y escribir.
  Archivo = SD.open(“datos.txt”, FILE_WRITE);

  //Se comprueba que el archivo se ha abierto correctamente y se procede a
  //escribir en él.
  if (Archivo) {

    //Se escribe información en el documento de texto datos.txt.
    Archivo.println(“Esto es lo que se está escribiendo en el archivo”);

    //Se cierra el archivo para almacenar los datos.
    Archivo.close();

    //Se muestra por el monitor que los datos se han almacenado correctamente.
    Serial.println(“Todos los datos fueron almacenados”);
  }

  //En caso de que haya habido problemas abriendo datos.txt, se muestra por pantalla.
  else {

    Serial.println(“El archivo datos.txt no se abrió correctamente”);
  }

  /* FIN DE LA ESCRITURA DE DATOS EN LA MEMORIA SD DE ARDUINO */

  /* LEYENDO DATOS EN LA MEMORIA SD DE ARDUINO */

  //Se vuelve a abrir el fichero, esta vez para leer los datos escritos.
  Archivo = SD.open(“datos.txt”);

  //Si el archivo se ha abierto correctamente se muestran los datos.
  if (Archivo) {

    //Se muestra por el monitor que la información que va a aparecer es la del
    //archivo datos.txt.
    Serial.println(“Información contenida en datos.txt: ”);

    //Se implementa un bucle que recorrerá el archivo hasta que no encuentre más
    //información (Archivo.available()==FALSE).
    while (Archivo.available()) {

      //Se escribe la información que ha sido leída del archivo.
      Serial.write(Archivo.read());
    }

    //Si todo ha ido bien cierra el archivo para no perder datos.
    Archivo.close();
  }

  //En caso de que haya habido problemas abriendo datos.txt, se muestra por pantalla.
  else {

    Serial.println(“El archivo datos.txt no se abrió correctamente”);
  }

}

void loop()
{
  //En este ejemplo el bucle loop() no realiza ninguna acción ya que toda la información
  //fue gestionada en el setup.
  //En caso de que se desee almacenar la información obtenida de algún sensor, la escritura
  //debería realizarse en el loop().
}

Muchas gracias por vuestra ayuda.

Un saludo.

Que mensajes obtienes por monitor serie ?

Kike_GL:
Que mensajes obtienes por monitor serie ?

Buenas Kike_GL,

esto es lo que se ve en el monitor serie.

Un saludo.

Y no has leido tu código que dice justamente eso?

Serial.print("Comenzando la comunicación con la tarjeta SD");   <= primer mensaje y como no tiene LF se 
                                                                                            <= se paga al siguiente
  //Se establece como salida el pin correspondiente a SS.
  pinMode(10, OUTPUT);

  //Se muestra por el monitor si la comunicación se ha establecido correctamente
  //o ha habido algún tipo de error.
  if (!SD.begin(10)) {

    Serial.println("Se ha producido un fallo al iniciar la comunicación");   <= Aca dice que no puede leer la SD
    return;
  }

Entonces varias cosas posibles.

  1. que no sea 10 el CS que debes usar. En algunos equipos es 4.
    Tampoco dices si usas un UNO/NANO o un MEGA por dar 3 casos de Arduinos.
    Si fuera MEGA el CS sería 53 si mal recuerdo.

  2. La memoria SD debes estar formateada en FAT32 o FAT . Verifica.

  3. Hay alternativas y/o problemas con la velocidad del SPI pero lo dejamos para luego.

Intenta el ejemplo CardInfo y muéstranos la salida.

No le va a funcionar tampoco Lucario. Su problema esta en la SD, la velocidad SPI o simplemente el CS, según me parece.

Si funcionara Cardinfo.ino entonces no le daría error al intentar inicializar la SD.

Sí pero recuerda que SD.begin() ejecuta tres procesos en uno: cambiar la tarjeta a modo SPI, detectar la capacidad y tipo de SD (mediante la lectura de ciertos registros grabados de fábrica), y encontrar la partición FAT. Decir que falla es porque alguno de los tres no se logró. ¿Cuál? CardInfo tiene la respuesta.

Ok. Te doy la razón.

Buenas, gracias por vuestras respuestas.

surbyte:
Y no has leido tu código que dice justamente eso?

Si, leí mi código y sé que dice eso, pero no sé por qué da ese problema de comunicación.

surbyte:
Entonces varias cosas posibles.

  1. que no sea 10 el CS que debes usar. En algunos equipos es 4.
    Tampoco dices si usas un UNO/NANO o un MEGA por dar 3 casos de Arduinos.
    Si fuera MEGA el CS sería 53 si mal recuerdo.

  2. La memoria SD debes estar formateada en FAT32 o FAT . Verifica.

  3. Hay alternativas y/o problemas con la velocidad del SPI pero lo dejamos para luego.

Todas estas preguntas son culpa mía porque no expliqué todo esto, sorry.

  1. Probé con los pines 10, 8, 4 y hasta 9 del arduino (algunas veces ponen ese pin para el CS por código, no me digas por qué), tanto físicamente como por código. Y el arduino es un UNO, está en el título del hilo.

  2. La SD está formateada en FAT actualmente, pero probé también todo estando formateda en FAT32, por si acaso.

  3. Ok.

Lucario448:
Intenta el ejemplo CardInfo y muéstranos la salida.

Ahora mismo pruebo y os lo paso en otro post, para no hacer más largo este.

Muchas gracias!!!

Esto es lo que me da por el monitor serie si uso el ejemplo CardInfo:

Dejemos a Lucario que responda jajaja, a ver que opina.

Un comentario: no uses capturas de pantalla tan grandes, es mas fácil que captures el tecto luego copies y pegues aca como Cita o Quote. Casi ni se lee la información.
Se que no fue mala voluntad pero a veces las imagenes no colaboran.

Respecto a tu problema te recomiendo busques otra SD a ver si va por ahi el inconveniente y restringe los cambios de CS a solo dos 10 y 4.

Acabo de darme cuenta que tienes Divisor resistivo para todos los pines. Esta bien salvo para D0 que debería estar directo al Arduin oy tal vez sea la causa del problema.
Si una salida de 3.3V la pasas por un divisor al arduino no lo debs proteger y termina recibiendo menos de lo minimo para reconocer un nivel Alto.

3.3 x 2/3 = 2,2V

Mira que cerca estas de tener problemas si no lo tienes claro..

Coloca directo D0 al Arduino y repite pruebas

Vale, ya está solucionado, y gracias a un amigo que lo probó con su arduino, vimos que era por problema de hardware.

Dos para ser más exactos:

1º) Al parecer no hace falta un divisor de tensión, vale con conectarlo directamente, por lo que supongo que la tarjeta SD soporta 5V en sus pines.

2º) La protoboard que estaba usando tenía problema de continuidad en un par de líneas, así que lo cambié a otra, y sin problema.

Y respecto al primer punto (esto será, seguramente, más adecuado para la sección de hardware), tenía entendido que las SD tienen que ir a 3.3V y no a 5V, y eso decían varios blogs por internet, así que no sé que podrá ser.

Muchas gracias a todos por la ayuda, seguramente no tarde en preguntar alguna cosa más (aunque si no pregunto mejor, que eso quiere decir que me van saliendo las cosucas, XDD).

Un saludo.

Justo contestaste cuando escribía surbyte, jajaja.

surbyte:
Dejemos a Lucario que responda jajaja, a ver que opina.

Un comentario: no uses capturas de pantalla tan grandes, es mas fácil que captures el tecto luego copies y pegues aca como Cita o Quote. Casi ni se lee la información.
Se que no fue mala voluntad pero a veces las imagenes no colaboran.

Ok, tomo nota de lo de las capturas, sorry.

surbyte:
Respecto a tu problema te recomiendo busques otra SD a ver si va por ahi el inconveniente y restringe los cambios de CS a solo dos 10 y 4.

Al final CS funciona en el pin 8.

surbyte:
Acabo de darme cuenta que tienes Divisor resistivo para todos los pines. Esta bien salvo para D0 que debería estar directo al Arduin oy tal vez sea la causa del problema.
Si una salida de 3.3V la pasas por un divisor al arduino no lo debs proteger y termina recibiendo menos de lo minimo para reconocer un nivel Alto.

3.3 x 2/3 = 2,2V

Mira que cerca estas de tener problemas si no lo tienes claro..

Coloca directo D0 al Arduino y repite pruebas

Ok, voy a probar eso también, y os cuento.

surbyte:
Dejemos a Lucario que responda jajaja, a ver que opina.

Sé que el problema ya fue solucionado, sin embargo vengo aquí para cumplir.

Cuando CardInfo falla en el primer paso, es seña de problema de hardware. Con esto quiero decir que verifiques conexión, que el CS especificado en código esté en el pin correcto; o incluso probar con otra tarjeta SD.
A veces podría no haber del todo problema de hardware, el error puede estar simplemente en, antes de subir, olvidar cambiar el número de pin utilizado para el CS.

Dakmor:
1º) Al parecer no hace falta un divisor de tensión, vale con conectarlo directamente, por lo que supongo que la tarjeta SD soporta 5V en sus pines.

Podría ser, pero nunca se ha comprobado que sea seguro. El hecho de intentarlo corre bajo tu propio riesgo; y ese riesgo es que al tiempo la tarjeta se dañe definitivamente; pero de algo estoy seguro: no la va a quemar inmediatamente.

Dakmor:
2º) La protoboard que estaba usando tenía problema de continuidad en un par de líneas, así que lo cambié a otra, y sin problema.

¡Que coincidencia! Cuando adquirí mi módulo para tarjetas SD, las primeras pruebas me fallaban justamente por esa misma razón. Quién lo diría...

Bueno una vez mas el protoboard!!!
No usen protoboard!!

Aprendan a trabajar con placas PCB para desarrollos chicos/medianos y suelden las conexiones.
De paso aprenden o se ejercitan.

Lucario448:
Sé que el problema ya fue solucionado, sin embargo vengo aquí para cumplir.

Cuando CardInfo falla en el primer paso, es seña de problema de hardware. Con esto quiero decir que verifiques conexión, que el CS especificado en código esté en el pin correcto; o incluso probar con otra tarjeta SD.
A veces podría no haber del todo problema de hardware, el error puede estar simplemente en, antes de subir, olvidar cambiar el número de pin utilizado para el CS.

¡¡Muchas gracias Lucario448, por contestar igualmente!! Como pudimos ver, el error si era de hardware.

Lucario448:
Podría ser, pero nunca se ha comprobado que sea seguro. El hecho de intentarlo corre bajo tu propio riesgo; y ese riesgo es que al tiempo la tarjeta se dañe definitivamente; pero de algo estoy seguro: no la va a quemar inmediatamente.

Pues probé lo que comentaba surbyte y finalmente me funciona también con los divisores de tensión, así que perfecto.

Lucario448:
¡Que coincidencia! Cuando adquirí mi módulo para tarjetas SD, las primeras pruebas me fallaban justamente por esa misma razón. Quién lo diría...

surbyte:
Bueno una vez mas el protoboard!!!
No usen protoboard!!

Pues no pensaba yo, que daban tantos problemas la verdad...

surbyte:
Aprendan a trabajar con placas PCB para desarrollos chicos/medianos y suelden las conexiones.
De paso aprenden o se ejercitan.

Toda la razón en que así es la mejor forma de coger práctica.

¡¡Muchas gracias a todos por la ayuda!!

Se que implica todo un problema, cablear, equivocarse mas porque no ven el lado soldadura y a veces cuesta imagiarse. Pero digamos que si son cuidadosos y cuando terminan vuelven a verificar dese el lado componentes con el multímetro continuidad, se aseguran varias veces que este bien.

Lleva tiempo acostumbrarse al soldador, el estaño, pelar cables, etc. pero el resultado es un prototipo mas o menos potable. Luego mejoraran y verán que con el tiempo ni lo piensan.
Si falla sera por error de conexión algo que pasa con protoboard pero no por falla de protoboard.