Go Down

Topic: [Solucionado] SD Card se inicializa pero NO lee el archivo (Read 1 time) previous topic - next topic

18turbo

Hola a todos,

Creo que el problema es de software, pero sino, por favor, moverme el hilo. Gracias.


Me pasa una cosa bastante rara.

Tengo un Arduino MEGA conectado a una TFT de 7 pulgadas de 800x480 con RA8875 por SPI de 4 hilos.

Por otro lado, tengo una SD Card conectadas a los pines 50, 51, 52 y 53 (MISO, MOSI, SCK y CS, respectivamente) del Arduino MEGA.

La SD Card se inicializa correctamente, pero no hay manera de leer un fichero de la tarjeta.

Probados los sketch de ejemplo de la librería SD, funcionan perfectos, solo con cambiar el ChipSelect a 53:

El sketch SD Card Info: devuelve:

Code: [Select]
Initializing SD card...Wiring is correct and a card is present.

Card type:         SDHC
Clusters:          1939502
Blocks x Cluster:  8
Total Blocks:      15516016

Volume type is:    FAT32
Volume size (Kb):  7758008
Volume size (Mb):  7576
Volume size (Gb):  7.40

Files found on the card (name, date and size in bytes):
MINIWOOF.BMP  2015-08-25 18:55:22 57654
A.BMP         2018-04-05 23:16:12 10922
KK.BMP        2018-04-05 15:52:10 35251


Como podéis ver tiene 3 ficheros la tarjeta SD.

El sketch Files Arduino, devuelve:

Code: [Select]
Initializing SD card...initialization done.
example.txt doesn't exist.
Creating example.txt...
example.txt exists.
Removing example.txt...
example.txt doesn't exist.


es decir, comprueba que el fichero no existe, lo crea y lo borra sin problemas.

Bien, ahora mi sketch:

Code: [Select]
#include <SPI.h>                                                              // Librería para la comunicación mediante el puerto serie (SPI) para la TFT
#include <SD.h>    
#include <avr/pgmspace.h>

void setup() {
  // put your setup code here, to run once:
  File     bmpFile;
  Sd2Card card;
  const int chipSelect = 53;

  Serial.begin(9600);  

  if (!card.init(SPI_HALF_SPEED, chipSelect))
  {
    Serial.println("Wiring is correct and a card is present.");
  }

  if (SD.open("A.BMP") == 0)
    {Serial.println("Mal");}
    else
    {Serial.println("Bien");}
  

}

void loop() {
  
  

}


En la tarjeta SD está el archivo "a.bmp" pero no hay manera de abrirlo, siempre devuelve "MAL" porque no lo abre. He probado con otros archivos, e idéntico resultado. También he cambiado por mayúsculas y lo mismo.

¿Me podéis ayudar? ¿Alguna sugerencia?

Gracias a todos




Eduardosanchez

Hola turbo.
Creo que tu problema tiene que ver a nivel de bits del fichero, es decir una cosa es abrir un archivo de texto y otra muy diferente abrir una imagen, es decir la estructura de la información es diferente mientras que en un archivo de texto, según santa Wikipedia dice
"Un archivo de texto simple, texto sencillo o texto sin formato (también llamado texto llano o texto simple; en inglés «plain text»), es un archivo informático que contiene únicamente texto formado solo por caracteres que son legibles por humanos, careciendo de cualquier tipo de formato tipográfico.1

Estos archivos están compuestos de bytes que representan caracteres ordinarios como letras, números y signos de puntuación (incluyendo espacios en blanco), también incluye algunos pocos caracteres de control como tabulaciones, saltos de línea y retornos de carro. Estos caracteres se pueden codificar de distintos modos dependiendo de la lengua usada. Algunos de los sistemas de codificación más usados son: ASCII, ISO-8859-1 o Latín-1 y UTF-8."
desde ahí ya tienes algo que saber, tu librería que codificación puede soportar, y dos si buscas la estructura de un BMP te darás cuenta que requieres con una librería que te permita trabajar a nivel de bit, además de implementar un algoritmo que te permita interpretar la imagen.  Puedes obtener mas información de la estructura del BMP en wikipedia.
lo que puedes hacer para comprobar es simple crea un archivo en block de notas pon cualquier texto guarda en la microSD y después cambia la extensión de TXT a BMP y si lee los caracteres te darás cuenta que trabaja con alguna codificación.
o si abre cualquier archivo de texto que haya guardado, pues el problema es que la biblioteca no puede admitir esos archivos.
Ademas no podras abrir el archivo completo si es de grandes dimensiones, por que no tendrás memoria en Arduino para almacenarlo. recuerda que tienes que guardar la información de la imagen en arduino, y de arduino a la pantalla y no podrás hacerlo de un solo "golpe" tendrás que idear una forma de hacer lo por filas quizás, siempre y cuando tengas acceso al BMP de otra forma tendras que codificar la imagen en ASCII.
Saludos y no te desanimes.


https://drive.google.com/open?id=1xAcWF7fl7kEnjWlTWOIyoByhYabPHzgG
Todo es posible.....(eso lo hice con arduino)

18turbo

@surbyte

Sí, ya lo comprobé.

La librería RA8875 usa el ChipSelect 9 o el que yo le asigne (pero lo dejé por defecto para la TFT), y modifiqué el de la SD Card al 53.

Ya digo, los ejemplos de las librerías funcionan bien. Mi programa no (y no sé porqué).



@EduardoSanchez

El código es parte de un programa de una librería que, si no recuerdo mal, funcionaba y veía BMP (eso hará como 2 años -los años que he tenido todos estos proyectos parados :( ). No recuerdo la librería, sino la pondría, pero sí que copié el código porque lo vi interesante y, es por eso, que creo que se puede hacer.

Probé con un fichero tipo texto, y tampoco lo abre, y por eso ando un poco perdido (ya no se me ocurren cosas).

Una vez que se abre el fichero BMP, el código de inicio de los BMP es 0x4D42 (para 16 bits) y luego hay que leer 2 bytes, teniendo en cuenta que primero es el menos significativo y luego el más significativo.

Para BMP de 32 bits hay que leer 4 bytes cada vez...

Pero todo esto una vez abierto el puñetero fichero.

Si tienes una TFT y una SD Card y quieres probar el código, te lo paso por si descartas algo más que yo.

Por supuesto, los BMP deben ocupar lo mínimo, para que pueda con ellos, pero eso creo que lo tenía ya pensado. Le echaré un vistazo por si acaso.

Voy a hacer unas pruebas más, sobre todo con ficheros de texto (a ver si consigo algo).



Si se os ocurre algo más, aquí espero sugerencias :)


18turbo

He quitado los cables SPI de la TFT y pasa lo mismo, no puedo leer ningún archivo.

También he quitado la corriente de la TFT y nada.

Por ir descartando cosas, vamos :(

Eduardosanchez

Claro pon el codigo que utilizas para abrir soo un fichero de la SD

18turbo

Claro pon el codigo que utilizas para abrir soo un fichero de la SD
No te entiendo, el que puse al principio?? ¿qué hay mal?

Lucario448

Oye 18turbo, no probaste con el clásico:

Code: [Select]
if (SD.begin(chipSelect))
  Serial.println("Correcto...");

bmpFile = SD.open("a.bmp");
if (bmpFile) { Serial.println("Bien"); bmpFile.close(); }
else Serial.println("Mal");



Lo siento Eduardosanchez, pero el hecho de que no sea un archivo de texto no es motivo para que no se pueda abrir. A fin de cuentas, un archivo es solo un conjunto de bytes, indiferentemente de que si estos representan texto, imagen, audio, video o lo que sea.
En realidad, la librería maneja los archivos como binarios; que se use para imprimir y recuperar texto es otra cosa...

18turbo

¡¡¡¡ Ostras Lucario448!!!

Tu código me funciona, me abre el fichero, ¿qué pasa? Voy a analizarlo a ver donde he metido la gamba

Gracias a los dos.

No lo doy por resuelto hasta que lo compruebe bien.

Saludos

18turbo

¡Madre mía!,, ¡Qué estupidez!, ¡Cómo no me he dado cuenta!

¿Y dónde está la inicialización de la SD Card en mi código?

Me faltaba:

Code: [Select]
bmpFile = SD.open(filename);

Pues me lleva loco.


Gracias Lucario448.  :)

Gracias Eduardosanchez.  :)

Por cierto, ya puedo ver ficheros BMP en la TFT. Ahora pongo un mensaje en el hilo correspondiente

Lucario448

¿Y dónde está la inicialización de la SD Card en mi código?
Es que usabas una instancia Sd2Card, y luego la preinstanciada SD; se me hacía raro esa inconsistencia...

18turbo

Es que usabas una instancia Sd2Card, y luego la preinstanciada SD; se me hacía raro esa inconsistencia...
Sí, es que el sketch original es larguísimo y sólo quise poner lo que no funcionaba, así que lo extracté en un nuevo sketch (y arrastré cosas que no eran importantes), y en fin, un fallo tonto pero que te vuelve loco.

S2

Eduardosanchez

#12
Apr 06, 2018, 07:44 pm Last Edit: Apr 06, 2018, 07:45 pm by Eduardosanchez
Lo siento Eduardosanchez, pero el hecho de que no sea un archivo de texto no es motivo para que no se pueda abrir. A fin de cuentas, un archivo es solo un conjunto de bytes, indiferentemente de que si estos representan texto, imagen, audio, video o lo que sea.
En realidad, la librería maneja los archivos como binarios; que se use para imprimir y recuperar texto es otra cosa...
Rayos estuve meses tratando como ver los binarios con esa libreria y nunca encontre la informacion.
gracias Lucario

Go Up