falla al leer sd card

Actualmente estoy trabajando en un proyecto con el arduino mega 2560, les explico, primero me dio un problema al intentar trabajar en conjunto arduino mega + ethernet shield + usb host shield, lo anterior debido a que ambos ethernet y usb usan el mismo pin SS 10 entonces el ethernet lo deje en 10 y cambie el del usb (cambiando la libreria y haciendo un jumper con el arduino) al 6.

Hasta aqui todo perfecto puedo leer un scanner usb y buscar la informacion obtenida mediante el ethernet (gracias a esto implemente un proyecto que esta funcionando a la perfeccion con arduino uno). Pero bueno, tengo otro proyecto de mayor tamaño por eso lo estoy desarrollando con arduino mega, y, como la memoria de arduino es muy limitada opte por aprovechar el slot sd del ethernet, pero el problema esta en que o funciona el sd o funciona el usb, no pueden funcionar los dos, le he movido a configuraciones jumpers yno logro hacerlo funcionar.

Se supone que en principio no deberia de haber problema dado que el pin SS del sd es el 4 y no lo tengo ocupado, estuve tratando de enternder la libreria del usb host shield y no parece hacer uso del pin 4.

Cual creen que pueda ser el problema?

#include <hidboot.h>
#include <usbhub.h>
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#define CHAR_ESC "\x1B"
#define pSd   4
#define pEth 53
#define pUsb  6

EthernetClient cliente;
byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0xF3, 0x01};   // Direccion mac del ethernet shield
IPAddress ip(192, 168, 1, 19);                       // Direccion ip del ethernet shield
IPAddress myDns(192, 168, 1, 1);                     // Direccion dns
IPAddress gate(192, 168, 1, 1);                      // Direccion gateway
IPAddress mask(255, 255, 255, 0);                    // Direccion subred
IPAddress servidor(192, 168, 1, 10);                 // Direccion del servidor

String _cadena = "";
int _indice1 = 0, _indice2 = 0;
String _v0 = "", _v1 = "", _v2 = "", _v3 = "", _v4 = "";
String _v5 = "", _v6 = "", _v7 = "", _v8 = "", _v9 = "";
String _v10 = "", _v11 = "", _v12 = "", _v13 = "", _v14 = "";
String _v15 = "", _v16 = "";
int _v17 = 0;

String _tic = "", _cam = "", _alz = "";
int _imp = 0, _cas = 0, _bas = 0;
long _bru = 0;
boolean _ade = false;

long _tiempoEstado = 0;

boolean estadoTicket = false, estadoCamion = false, estadoAlzadora = false;
boolean estadoOtros = false, estadoChecar = false, estadoPeso = false;
boolean estadoPantalla = true;

String _dato = "";
boolean _lectura = false;

class KbdRptParser : public KeyboardReportParser
{
  void PrintKey(uint8_t mod, uint8_t key);
  protected:
    virtual void OnControlKeysChanged(uint8_t before, uint8_t after);
    virtual void OnKeyDown	(uint8_t mod, uint8_t key);
    virtual void OnKeyUp	(uint8_t mod, uint8_t key);
    virtual void OnKeyPressed(uint8_t key);
};
void KbdRptParser::PrintKey(uint8_t m, uint8_t key)
{
  MODIFIERKEYS mod;
  *((uint8_t*)&mod) = m;
  Serial.print((mod.bmLeftCtrl   == 1) ? "C" : " ");
  Serial.print((mod.bmLeftShift  == 1) ? "S" : " ");
  Serial.print((mod.bmLeftAlt    == 1) ? "A" : " ");
  Serial.print((mod.bmLeftGUI    == 1) ? "G" : " ");
  Serial.print(" >");
  PrintHex<uint8_t>(key, 0x80);
  Serial.print("< ");
  Serial.print((mod.bmRightCtrl   == 1) ? "C" : " ");
  Serial.print((mod.bmRightShift  == 1) ? "S" : " ");
  Serial.print((mod.bmRightAlt    == 1) ? "A" : " ");
  Serial.println((mod.bmRightGUI    == 1) ? "G" : " ");
};
void KbdRptParser::OnControlKeysChanged(uint8_t before, uint8_t after)
{
  MODIFIERKEYS beforeMod;
  *((uint8_t*)&beforeMod) = before;

  MODIFIERKEYS afterMod;
  *((uint8_t*)&afterMod) = after;

  if(beforeMod.bmLeftCtrl != afterMod.bmLeftCtrl)
  {
    //Serial.println("LeftCtrl changed");
  }
  if(beforeMod.bmLeftShift != afterMod.bmLeftShift)
  {
    //Serial.println("LeftShift changed");
  }
  if(beforeMod.bmLeftAlt != afterMod.bmLeftAlt)
  {
    //Serial.println("LeftAlt changed");
  }
  if(beforeMod.bmLeftGUI != afterMod.bmLeftGUI)
  {
    //Serial.println("LeftGUI changed");
  }
  if(beforeMod.bmRightCtrl != afterMod.bmRightCtrl)
  {
    //Serial.println("RightCtrl changed");
  }
  if(beforeMod.bmRightShift != afterMod.bmRightShift)
  {
    //Serial.println("RightShift changed");
  }
  if(beforeMod.bmRightAlt != afterMod.bmRightAlt)
  {
    //Serial.println("RightAlt changed");
  }
  if(beforeMod.bmRightGUI != afterMod.bmRightGUI)
  {
    //Serial.println("RightGUI changed");
  }
}
void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)
{
  uint8_t c = OemToAscii(mod, key);
  if(c)
  {
    OnKeyPressed(c);
  }
}
void KbdRptParser::OnKeyUp(uint8_t mod, uint8_t key){ }
void KbdRptParser::OnKeyPressed(uint8_t key)
{
  if(key != 19 || (key == 84 || key == 116 || key == 79 || key == 111 || key == 67 || key == 99) || (key >= 48 && key <= 57))
  {
    _dato = _dato + (char)key;
  }
  else if(key == 19)
  {
    if((_dato.substring(0, 1) == "t" || _dato.substring(0, 1) == "T") && (estadoTicket == false && estadoCamion == false && 
    estadoAlzadora == false && estadoOtros == false && estadoChecar == false && estadoPeso == false))
    {
      _dato = _dato.substring(1);
      estadoTicket = true;
    }
    else if(_dato.substring(0, 1) == "o" || _dato.substring(0, 1) == "O" && (estadoTicket == false && estadoCamion == false && 
    estadoAlzadora == false && estadoOtros == false && estadoChecar == false && estadoPeso == false))
    {
      _dato = _dato.substring(1);
      estadoOtros = true;
    }
    else if(_dato.substring(0, 1) == "c" || _dato.substring(0, 1) == "C" && (estadoTicket == false && estadoCamion == false && 
    estadoAlzadora == false && estadoOtros == false && estadoChecar == false && estadoPeso == false))
    {
      _dato = _dato.substring(1);
      estadoChecar = true;
    }
    else
    {
      if(_dato.length() >= 8)
      {
        int _long = _dato.length();
        _dato = _dato.substring((_long - 8), _long);        
      }
    }
    _lectura = true;
    _tiempoEstado = millis();
  }
};

USB    Usb;
USBHub Hub(&Usb);
HIDBoot<HID_PROTOCOL_KEYBOARD | HID_PROTOCOL_KEYBOARD> HidComposite(&Usb);
HIDBoot<HID_PROTOCOL_KEYBOARD> HidKeyboard(&Usb);
uint32_t next_time;
KbdRptParser KbdPrs;
void setup()
{
  Serial.begin(57600);
  Serial1.begin(9600, SERIAL_7E1);
  Serial2.begin(2400);
  Serial3.begin(2400);
  delay(200);  

  pinMode(pSd, OUTPUT);
  pinMode(pEth, OUTPUT);
  pinMode(pUsb, OUTPUT);
  
  digitalWrite(pSd, HIGH);
  digitalWrite(pEth, HIGH);
  digitalWrite(pUsb, HIGH);
  delay(100);
  
  
  digitalWrite(pUsb, LOW);
  delay(100);
  if(Usb.Init() == -1)
  {
    Serial.println("Conexion USB no inicializada");
  }
  delay(100);
  digitalWrite(pUsb, HIGH);
  delay(500);


  digitalWrite(pSd, LOW);
  delay(100);
  if(!SD.begin(pSd))
  {
    Serial.println("Error al leer la tarjeta SD.");
  }
  delay(100);
  digitalWrite(pSd, HIGH);
  delay(500);
  
  
  digitalWrite(pEth, LOW);
  delay(100);  
  Ethernet.begin(mac, ip, myDns, gate, mask);
  delay(100);
  digitalWrite(pEth, HIGH);
  delay(500);
  
  
  next_time = millis() + 5000;
    
  HidComposite.SetReportParser(0, (HIDReportParser*)&KbdPrs);
  HidComposite.SetReportParser(1, (HIDReportParser*)&KbdPrs);
  HidKeyboard.SetReportParser(0, (HIDReportParser*)&KbdPrs);
  HidKeyboard.SetReportParser(1, (HIDReportParser*)&KbdPrs);
  delay(500);
}

Saludos
Anexo foto del montaje

Tienes idea del costo en memoria que representan cosas como esta si no las manejas bien?

String _v0 = "", _v1 = "", _v2 = "", _v3 = "", _v4 = "";[color=#222222][/color]
String _v5 = "", _v6 = "", _v7 = "", _v8 = "", _v9 = "";[color=#222222][/color]
String _v10 = "", _v11 = "", _v12 = "", _v13 = "", _v14 = "";[color=#222222][/color]
String _v15 = "", _v16 = "";

Dejemos de lado eso, te recomiendo que agregues AvailableMemory para vigilar que no te queden sin SRAM.

Ahora tu consulta.
Los chip selects siempre pueden configurarse a menos que esten fijos por las placas a usar. En ese caso, doblas el PIN correspondiente para lo cual debes analizar que pin esta siendo usado por dos placas a la vez, y le sueldas un cable a otro pin que determines. Y asunto arreglado!!!

Jajajaja si sabia del uso de memoria de hecho por eso mismo quiero usar una sd para evitar llenar la ram del mega, ademas tambien estoy con lo de la optimizacion del codigo, ahora sobre lo qeu me dices de doblar el pin asi es como pude conectar el usb shield, doble el pin 10 e hice un puente del 6 al 10 entonces el mega cree que se conecta al usb mediante el 6 pero con el puente en el usb lo manda al 10 dado que es fijo y no se puede cambiar

Asi mismo lo trate de hacer con el pin 4 de la sd card pero no me funciono, igual algo hice mal, deja checar y te aviso

A muy bien, entonces estas bien encaminado!!!!
Sigue buscándole la vuelta que verás que vas a encontrar la solución.

Listo surbyte ya quedo, por fin puedo hacer request del ethernet leer ya sea scanner o teclado y guardar en memoria, este proyecto va por muy buen camino.

El problema eran los pines del arduino que yo creia que era el 10 pero como es mega es el 53.

Ya ahora con esto voy a borrar las variables globales que como dijiste era un uso desmesurado de memoria.

Saludos