Uso del Arduino Ethernet Shield

Buenas!

Según tengo entendido el Arduino Ethernet Shield cuando es usado con las librerías Ethernet y SPI, debido a esta última utiliza los pines ICSP del Arduino para comunicar este último con el chip W5100 y la tarjeta micro SD. Estoy usando la Mega2560 R3, por tanto, según tengo entendido, los pines ICSP se corresponden con los pines digitales 10, 11, 12 y 13 del Arduino. Mi problema es que no puedo conectar el módulo Ethernet directamente sobre el Arduino, ya que entre este último y el módulo Ethernet tengo que colocar una Prototype Shield (una placa que he soldado), la cual impide la conexión de los pines ICSP del módulo Ethernet y del Arduino. Por tanto, mi pregunta es la siguiente:

¿Hay alguna manera de configurar que la comunicación entre el Arduino y el chip W5100/tarjeta micro SD se establezca mediante otros pines? Por ejemplo, podría utilizar directamente los pines 10, 11, 12 y 13, los cuales, obviamente, están libres debido a que no se puedan usar ya que se corresponden con los pines ICSP del Arduino.

¿Hay alguna manera de configurar que la comunicación entre el Arduino y el chip W5100/tarjeta micro SD se establezca mediante otros pines?

No porque la comunicación SPI esta en los pines 11 12 y 13 no en otros y no puede migrarse a otros pines.

Asi que debes ver como adapatar las cosas para usarlos. Solo puedes cambiar el Chip Select el pin que selecciona sea el chip Ethernet o el chip SD u otro cualquiera.

Ta he adaptado mi proyecto para establecer las conexiones pertinentes. Solo comentarte que en el caso de la Mega los pines correspondientes al bus SPI son el 50, 51 y 52. Según me han comentado, debido al funcionamiento de la librería SPI, el pin 53 se tiene que declarar como salida si el Arduino tiene que funcionar como maestro y el chip Wiznet y/o la targeta micro SD tienen que funcionar como esclavos.

Saludos!

Hi,
Esta es una sugerencia estupida pero miraste la libreria del spi.cpp. Posiblemente puedes cambiar los pines a otros pines en la libreria.

Acabo de hacer una búsqueda exhaustiva y en principio estos pines se pueden cambiar pero desde el archivo pins_arduino.h correspondiente a la placa Mega (en mi caso).

#define PIN_SPI_SS  (53)
#define PIN_SPI_MOSI  (51)
#define PIN_SPI_MISO (50)
#define PIN_SPI_SCK  (52)

static const uint8_t SS  = PIN_SPI_SS;
static const uint8_t MOSI = PIN_SPI_MOSI;
static const uint8_t MISO = PIN_SPI_MISO;
static const uint8_t SCK  = PIN_SPI_SCK;

Si los cambias tienes que ser consecuente después con lo que haces y todo esto suponiendo que la librería SPI.h no se queje por estos cambios (supongo que no). Al fin y al cabo, como ya he soldado la placa ya no necesito cambiar ningún pin.

Si es MEGA se usa el 53 y si es UNO/NANO/Mini Pro se usa el 10 pero no quita de usar cualquier otro.

static const uint8_t SS  = PIN_SPI_SS;

Ahora me llama la atencion que la librería le ponga static a una constante.

Según he entendido, si los declaras como static const estas variables ya no se pueden sobrescribir durante la inicialización ni después. Si los declaras como const, se pueden sobrescribir durante la inicialización, cosa que en este caso no interesa, ya que los pines son esos y no tiene sentido que alguna otra parte del programa/clase los sobrescriba.

Static se usa para convertir una variable local en una variable parecida a una global. O sea.. para la rutina local esa variable conserva los valores pero eso te permite llamar del mismo modo varias variables en todo el código definidas de esa forma y tener valores diferentes y exclusivos para cada rutina.

A ver si soy claro.
Si defines algo como global se puede usar en cualquier parte del código y su valor se converva siempre porque esta en RAM.

Si defines una variable static toma el valor que le indicas dentro de la rutina y si quieres modificarlo puedes en el contexto de dicha rutina que lo inicializó.

Ahora definir usando RAM algo que no se modificará como un pin es una tontería.

Para eso y ya lo hemos debatido tienes dos opciones

#define pin  2

y

const byte pin = 2;

Quieres usar otra cosa.. eres libre. pero todo tiene un costo.. en RAM