Le shield TFT se compose d’un écran tactile et d’un module de carte micro SD qui n’est pas compatible avec la carte Arduino Mega. Nous avons vu dans les précédents tutoriels comment utiliser l’écran du shield et son module de carte SD. Nous allons voir comment modifier la librairie SD pour rendre compatible le module de carte SD et la carte Arduino Mega
Matériel
- Ordinateur
- Arduino MEGA
- Câble USB A Mâle/B Mâle
- TFT LCD Shield muni d’un module SD
- Carte microSD
Explication
Le shield TFT utilise le port SPI pour communiquer avec le module SD. Or, comme la plupart des shields, il est développé pour l’Arduino UNO et n’est pas compatible avec l’Arduino Mega. En effet, les broches du module SD sont connectées aux broches 11,12 et 13 de l’Arduino qui correspond au port SPI d’une UNO mais pas d’une Mega (51,52,53).
Arduino Board | MOSI | MISO | SCK | SS |
UNO | 11 | 12 | 13 | 10 |
Mega | 51 | 50 | 52 | 53 |
Solution 1: souder les broches
Pour ne pas modifier le code, il est possible de souder les broches selon la liste suivante:
- MOSI 11 –> 51
- MISO 12 –> 50
- SCK 13 –> 52
L’avantage est que vous n’avez pas à plongez dans le code des librairies Arduino et vous conservez les performances du port SPI. L’inconvénient est que vous perdez des entrées-sorties.
Solution 2: Modifier la librairie SD.h
Si vous ne souhaitez pas souder des fils sur l’Arduino, vous pouvez modifier le code de la libraire SD.h.
Pour rendre compatible le module SD du shield TFT, il faut modifier 3 fichiers Sd2Card.h, Sd2Card.cpp et SD.cpp
Fichier Sd2Card.h
Ce fichier se trouve dans le répertoire, C:\Program Files (x86)\Arduino\libraries\SD\src\utility
Ligne 47, mettez la variable MEGA_SOFT_SPI à 1, commentez la ligne 38 et placez #define USE_SPI_LIB après la ligne #ifndef SOFTWARE_SPI, ligne 56
- Avant
/** 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
- Après
/** 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
Fichier Sd2Card.cpp
Ce fichier se trouve dans le répertoire, C:\Program Files (x86)\Arduino\libraries\SD\src\utility
Ligne 20, commentez la commande #define USE_SPI_LIB. Puis placez cette ligne dans #if #endif après l’appel du fichier Sd2Card.h
- Avant
#define USE_SPI_LIB #include <Arduino.h> #include "Sd2Card.h"
- Après
//#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
Fichier SD.cpp
Ligne 356, modifiez la définition de la fonction SDClass::begin() pour retirer la ligne sdSpiClock.
- Avant
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); }
- Après
#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
Vous pouvez désormais faire fonctionner le module SD du shield TFT avec la carte Arduino Mega et utiliser les codes des tutoriels précédents.
N.B: N’oubliez pas de mettre MEGA_SOFT_SPI à 0 lorsque vous utilisez une autre carte Arduino.
Bonjour,
Déjà merci pour l’article.
Mais ou avez vous trouvé cette solutions ?
Bonjour,
Merci pour votre commentaire
j’ai vu qu’il était possible d’utiliser soft SPI sur l’Arduino Mega dans la librairie SD.h.
J’ai modifié la librairie en parcourant le web et en résolvant un problème à la fois.
Bonjour,
Vous avez tenté de remonter le patch sur le github ?
Bonne idée. C’est fait
Reste plus qu’a espérer que le patch soit plus rapidement accepté que le précédent de 2017 https://github.com/arduino-libraries/SD/pull/47