O shield TFT é composto por um ecrã tátil e um módulo de cartão micro SD que não é compatível com a placa Arduino Mega. Já vimos em tutoriais anteriores como utilizar o ecrã do shield e o seu módulo de cartão SD. Veremos agora como modificar a biblioteca SD para tornar o módulo de cartão SD compatível com a placa Arduino Mega.
Hardware
- Computador
- Arduino MEGA
- Cabo USB A macho
- Escudo LCD TFT com módulo SD
- cartão microSD
Explicação
O shield TFT utiliza a porta SPI para comunicar com o módulo SD. No entanto, como a maioria dos shields, foi desenvolvido para o Arduino UNO e não é compatível com o Arduino Mega. De facto, os pinos do módulo SD estão ligados aos pinos 11, 12 e 13 do Arduino, o que corresponde à porta SPI de um UNO mas não de um Mega (51, 52, 53).
Arduino Board | MOSI | MISO | SCK | SS |
UNO | 11 | 12 | 13 | 10 |
Mega | 51 | 50 | 52 | 53 |
Solução 1: Soldar os pinos
Para evitar modificar o código, os pinos podem ser soldados de acordo com a lista seguinte:
- MOSI 11 –> 51
- MISO 12 –> 50
- SCK 13 –> 52
A vantagem é que não tem de se aprofundar no código das bibliotecas do Arduino e mantém o desempenho da porta SPI. A desvantagem é que se perde a E/S.
Solução 2: Modificar a biblioteca SD.h
Se não quiser soldar fios ao Arduino, pode modificar o código na biblioteca SD.h.
Para tornar o módulo SD do shield TFT compatível, 3 arquivos precisam ser modificados: Sd2Card.h, Sd2Card.cpp e SD.cpp.
Arquivo Sd2Card.h
Este ficheiro está localizado no diretório C:\Program Files (x86)\Arduino\libraries\SD\src\utility
Na linha 47, defina a variável MEGA_SOFT_SPI como 1, comente a linha 38 e coloque #define USE_SPI_LIB após a linha #ifndef SOFTWARE_SPI, linha 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
/** 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
Arquivo Sd2Card.cpp
Este ficheiro está localizado no diretório C:\Program Files (x86)\Arduino\libraries\SD\src\utility
Na linha 20, comente o comando #define USE_SPI_LIB. Em seguida, coloque esta linha em #if #endif depois de chamar o ficheiro Sd2Card.h.
- Antes de
#define USE_SPI_LIB #include <Arduino.h> #include "Sd2Card.h"
//#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
Ficheiro 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); }
#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
Pode agora operar o módulo SD no shield TFT com a placa Arduino Mega e utilizar o código dos tutoriais anteriores.
N.B: Não se esqueça de definir MEGA_SOFT_SPI para 0 quando utilizar outra placa Arduino.