Pantalla 32x64 y lector tarjetas SD

Hola buenos días,
Hace ya un par de días que me estoy peleando con esto y no hay manera. Os explico.
Tengo una pantalla led de 32x64 y la tengo conectada de la siguiente manera:

Conexión pantalla arduino
Hasta aquí todo genial, el problema vino cuando le quise conectar un lector de tarjetas micro sd. Lo compre en aliexpress

Lector SD

Y lo tengo conectado a los pines 4,50,51,52 y a los 3.3v y no hay manera de que funcione. De hecho solo añadir la libreria de SD.h ya deja de funcionar todo.

Alguna idea?

Habitualmente el pin que se usa para habilitar deshabilitar un dispositivo SPI (tal como lo es tu tarjeta SD) no es 4 a menos que se lo indiques. Sino 53.

image
El pin indicado por defecto SS es el 53 no el 4
Para usar 4 debes por código indicarle que usarás ese pin y no el que esta por defecto.

Referencia:

Si, si al final lo tengo en el 53. El problema es que tengo la pantalla y el lector de micro sd. Si los pongo por separado me funcionan los dos pero en cuando combino los dos codigos, deja de funcionar. Adjunto el codigo:

#include <SD.h>
#include "RGBmatrixPanel.h"
#include "bit_bmp.h"
#include "fonts.h"
#include <string.h>
#include <stdlib.h>
#define CLK 11
#define OE   9
#define LAT 10
#define A   A0
#define B   A1
#define C   A2
#define D   A3


RGBmatrixPanel matrix(A, B, C, D, CLK, LAT, OE, false, 64);


void setup()
{
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Reginit();
  matrix.begin();

  Serial.println("Initializing SD card...");
  if (!SD.begin(53)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  delay(500);

}

void Reginit() {
  pinMode(24, OUTPUT); //R1
  pinMode(25, OUTPUT); //G1
  pinMode(26, OUTPUT); //B1
  pinMode(27, OUTPUT); //R2
  pinMode(28, OUTPUT); //G2
  pinMode(29, OUTPUT); //B2
  pinMode(CLK, OUTPUT);
  pinMode(OE, OUTPUT);
  pinMode(LAT, OUTPUT);

  digitalWrite(OE, HIGH);
  digitalWrite(LAT, LOW);
  digitalWrite(CLK, LOW);
  int MaxLed = 64;

  int C12[16] = {0, 1, 1, 1, 1,  1, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1};
  int C13[16] = {0, 0, 0, 0, 0,  0, 0, 0, 0, 1, 0,  0, 0, 0, 0, 0};

  for (int l = 0; l < MaxLed; l++)
  {
    int y = l % 16;
    digitalWrite(24, LOW);
    digitalWrite(25, LOW);
    digitalWrite(26, LOW);
    digitalWrite(27, LOW);
    digitalWrite(28, LOW);
    digitalWrite(29, LOW);
    if (C12[y] == 1)
    {
      digitalWrite(24, HIGH);
      digitalWrite(25, HIGH);
      digitalWrite(26, HIGH);
      digitalWrite(27, HIGH);
      digitalWrite(28, HIGH);
      digitalWrite(29, HIGH);
    }
    if (l > MaxLed - 12)
    {
      digitalWrite(LAT, HIGH);
    }
    else
    {
      digitalWrite(LAT, LOW);
    }
    digitalWrite(CLK, HIGH);
    delayMicroseconds(2);
    digitalWrite(CLK, LOW);
  }
  digitalWrite(LAT, LOW);
  digitalWrite(CLK, LOW);

  // Send Data to control register 12
  for (int l = 0; l < MaxLed; l++)
  {
    int y = l % 16;
    digitalWrite(24, LOW);
    digitalWrite(25, LOW);
    digitalWrite(26, LOW);
    digitalWrite(27, LOW);
    digitalWrite(28, LOW);
    digitalWrite(29, LOW);
    if (C13[y] == 1)
    {
      digitalWrite(24, HIGH);
      digitalWrite(25, HIGH);
      digitalWrite(26, HIGH);
      digitalWrite(27, HIGH);
      digitalWrite(28, HIGH);
      digitalWrite(29, HIGH);
    }
    if (l > MaxLed - 13)
    {
      digitalWrite(LAT, HIGH);
    }
    else
    {
      digitalWrite(LAT, LOW);
    }
    digitalWrite(CLK, HIGH);
    delayMicroseconds(2);
    digitalWrite(CLK, LOW);
  }
  digitalWrite(LAT, LOW);
  digitalWrite(CLK, LOW);
}

Si quito las siguientes lineas me funciona la SD:

 Reginit();
 matrix.begin();

o si quito estas otras, me funciona la pantalla

Serial.println("Initializing SD card...");
  if (!SD.begin(53)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

Pero si combino las dos, se jodió el invento.

¿Qué está tratando de lograr en el procedimiento Reginit(), enviando manualmente señales a los pines de la matriz? Estas matrices no funcionan de esa manera. Tienes una biblioteca RGBmatrixPanel.h, incluida en tu código. ¿Por qué no lo usas? Hay ejemplos en la biblioteca, échales un vistazo.

He quitado la llamada a Reginit() y he dejado solo el matrix.begin() pero tampoco me funciona.

Pero en esta linea tienes la solución, dices que cuando pones

if (!SD.begin(4)) {

no funciona? Esta realmente conectado a 4 no?
Los dispositivos SPI compartent todas las lineas de control MISO MOSI y SCK y solo se requiere que SS este con resistencia pull up. Cuando se selecciona pasa a LOW y el dispositvo se comunica ida y vuelta con el microcontrolador.

Esta conectado al 53.
MISO al 50
CLK al 52
MOSI al 51

No entiendo nada ya. :sob: :sob:

He reducido el código al máximo, simplemente inicializar las cosas y no funciona. Paso el código a ver si me podéis echar una mano.

#include <SD.h>
#include "RGBmatrixPanel.h"
#include "bit_bmp.h"
#include "fonts.h"
#include <string.h>
#include <stdlib.h>
#define CLK 11
#define OE   9
#define LAT 10
#define A   A0
#define B   A1
#define C   A2
#define D   A3

RGBmatrixPanel matrix(A, B, C, D, CLK, LAT, OE, false, 64);

void setup()
{
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  matrix.begin();

  Serial.println("Initializing SD card...");
  if (!SD.begin(53)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  delay(500);
}

El resultado en el monitor Serie, es el siguiente:

Initializing SD card...

Initializing SD card...

Y de ahí no pasa.

Si elimina la inicialización de la matriz,

¿se determina la tarjeta SD?

Lo que ocurre es que alguna librería esta tomando control de tu pin SS y tu no observas eso. Haz lo que sugiere @b707 y empieza a ser sistemático en la búsqueda dle problema. Identifica quien es responsable. Y luego investiga por qué!!

Si, si quito eso si funciona

Prueba con la librería SdFat en lugar de SD.
Cambia

#include <SD.h>

por

#include <SdFat.h>

y define

SdFat SD;

Obviamente debes instalar la librería desde el administrador.

Tal vez exista el mismo conflicto, pero con probar no pierdes nada.

Nada, igual. Ya no se que mas probar. Es que solo poner el include y la libreria de SD.h y ya deja de funcionar.

Parece ser que el pin que genera problemas seria OE 9 pero no esta mal.
Lo que si veo mal es que inicializas matrix con matrix.begin() pero luego nunca lo cierras. O sea el objeto sigue abierto y ahi el problema.
Si miras un código veo otros métodos.

  matrix->begin();
    matrix->setTextWrap(false);
    matrix->setBrightness(BRIGHTNESS);
    // Test full bright of all LEDs. If brightness is too high
    // for your current limit (i.e. USB), decrease it.
    matrix->fillScreen(LED_WHITE_HIGH);
    matrix->show();
    delay(1000);
    matrix->clear();

que viene de acá

Y tu solo tienes matrix.begin(), completa el código.

Gracias a todos por responder, ya encontré la solución! El problema era que las librerías RGBmatrixPanel.h y SD.h ocupan bastante memoria RAM de la placa arduino, además de estas dos librerías, tenía un par de arrays bastante grandes y esto hacía que la placa se quedara sin memoria.
Por eso quería el lector de tarjetas SD para quitar estos arrays y guárdalos en la SD, pero hice la programación sin quitar los arrays.

Trabajar con estas matrices. es mejor elegir controladores más rápidos con más memoria que arduino Uno-Nano. Por ejemplo ESP32, Rasberry Pico rp2040 o stm32.

Todas estas placas no son más caras (normalmente más baratas) que las Nano, pero al mismo tiempo tienen muchas veces más recursos

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