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