El escudo TFT consiste en una pantalla táctil y un módulo de tarjeta micro SD que no es compatible con la placa Arduino Mega. Hemos visto en tutoriales anteriores cómo utilizar la pantalla shield y su módulo de tarjeta SD. Ahora veremos cómo modificar la librería SD para que el módulo de tarjeta SD sea compatible con la placa Arduino Mega.
Hardware
- Ordenador
- Arduino MEGA
- Cable USB A macho
- Pantalla LCD TFT con módulo SD
- tarjeta microSD
Explicación
El escudo TFT utiliza el puerto SPI para comunicarse con el módulo SD. Sin embargo, como la mayoría de los escudos, fue desarrollado para el Arduino UNO y no es compatible con el Arduino Mega. De hecho, los pines del módulo SD están conectados a los pines 11, 12 y 13 del Arduino, que corresponden al puerto SPI de un UNO pero no de un Mega (51, 52, 53).
Arduino Board | MOSI | MISO | SCK | SS |
UNO | 11 | 12 | 13 | 10 |
Mega | 51 | 50 | 52 | 53 |
Solución 1: Soldar las patillas
Para no modificar el código, los pines pueden soldarse según la siguiente lista:
- MOSI 11 –> 51
- MISO 12 –> 50
- SCK 13 –> 52
La ventaja es que no tienes que profundizar en el código de las librerías de Arduino y conservas el rendimiento del puerto SPI. La desventaja es que pierdes E/S.
Solución 2: Modificar la biblioteca SD.h
Si no quieres soldar cables al Arduino, puedes modificar el código de la librería SD.h.
Para hacer compatible el módulo SD del escudo TFT, es necesario modificar 3 archivos: Sd2Card.h, Sd2Card.cpp y SD.cpp.
Archivo Sd2Card.h
Este archivo se encuentra en el directorio, C:Archivos de programa (x86)\rduino\libraries\SD\src\utility
En la línea 47, ponga la variable MEGA_SOFT_SPI a 1, comente la línea 38 y ponga #define USE_SPI_LIB después de la línea #ifndef SOFTWARE_SPI, línea 56.
- Antes de
/** USE_SPI_LIB: if set, use the SPI library bundled with Arduino IDE, otherwise run with a standalone driver for AVR. */ #define USE_SPI_LIB /** Define MEGA_SOFT_SPI non-zero to use software SPI on Mega Arduinos. Pins used are SS 10, MOSI 11, MISO 12, and SCK 13. MEGA_SOFT_SPI allows an unmodified Adafruit GPS Shield to be used on Mega Arduinos. Software SPI works well with GPS Shield V1.1 but many SD cards will fail with GPS Shield V1.0. */ #define MEGA_SOFT_SPI 0 //XW //------------------------------------------------------------------------------ #if MEGA_SOFT_SPI && (defined(__AVR_ATmega1280__)||defined(__AVR_ATmega2560__)) #define SOFTWARE_SPI #endif // MEGA_SOFT_SPI //------------------------------------------------------------------------------ // SPI pin definitions // #ifndef SOFTWARE_SPI // hardware pin defs
- En
/** USE_SPI_LIB: if set, use the SPI library bundled with Arduino IDE, otherwise run with a standalone driver for AVR. */ //#define USE_SPI_LIB /** Define MEGA_SOFT_SPI non-zero to use software SPI on Mega Arduinos. Pins used are SS 10, MOSI 11, MISO 12, and SCK 13. MEGA_SOFT_SPI allows an unmodified Adafruit GPS Shield to be used on Mega Arduinos. Software SPI works well with GPS Shield V1.1 but many SD cards will fail with GPS Shield V1.0. */ #define MEGA_SOFT_SPI 1 //------------------------------------------------------------------------------ #if MEGA_SOFT_SPI && (defined(__AVR_ATmega1280__)||defined(__AVR_ATmega2560__)) #define SOFTWARE_SPI #endif // MEGA_SOFT_SPI //------------------------------------------------------------------------------ // SPI pin definitions // #ifndef SOFTWARE_SPI #define USE_SPI_LIB
Archivo Sd2Card.cpp
Este archivo se encuentra en el directorio, C:Archivos de programa (x86)\rduino\libraries\SD\src\utility
En la línea 20, comente el comandodefine USE_SPI_LIB. A continuación, coloque esta línea en #if #endif después de llamar al archivo Sd2Card.h.
- Antes de
#define USE_SPI_LIB #include <Arduino.h> #include "Sd2Card.h"
- En
//#define USE_SPI_LIB #include <Arduino.h> #include "Sd2Card.h" //modif mega #ifndef SOFTWARE_SPI //Added to enable use of MEGA #define USE_SPI_LIB #endif //SOFTWARE_SPI //modif mega
Archivo SD.cpp
- Antes de
boolean SDClass::begin(uint32_t clock, uint8_t csPin) { if (root.isOpen()) { root.close(); } return card.init(SPI_HALF_SPEED, csPin) && card.setSpiClock(clock) && volume.init(card) && root.openRoot(volume); }
- En
#ifndef SOFTWARE_SPI boolean SDClass::begin(uint32_t clock, uint8_t csPin) { return card.init(SPI_HALF_SPEED, csPin) && card.setSpiClock(clock) && volume.init(card) && root.openRoot(volume); } #else boolean SDClass::begin(uint32_t clock, uint8_t csPin) { return card.init(SPI_HALF_SPEED, csPin) && volume.init(card) && root.openRoot(volume); } #endif //SOFTWARE_SPI
Ahora puedes operar el módulo SD en el escudo TFT con la placa Arduino Mega y utilizar el código de los tutoriales anteriores.
N.B: No olvides poner MEGA_SOFT_SPI a 0 cuando uses otra placa Arduino.