Arduino Mega 2560 + Ethernet shield + Mémoire shield

Un log shield sur carte SD avec horloge RTC et zone de prototypage à pastilles carrées

Arduino Mega 2560 + Ethernet shield + Mémoire shield

Message non lude jmatgou » Lun 7 Nov 2011 16:32

Bonjour,

Pour un projet, j'ai besoin d'une Ardiuno Mega et de l’Ethernet shield. Dans un 2nd temps, j'ai besoin de loguer des données et de les horodatées. Le shield mémoire me semble tout indiqué.
J'ai cependant plusieurs questions :
- Est-ce que je peux empiler l'Ethernet Shield ET le shield mémoire sur ma Arduino Méga 2560 ?
- Y'aura t'il des conflits entre le lecteur de carte SD et le lecteur microSD de l'Ethernet Shield ?
- Et du coups, comment sélectionner tel ou tel lecteur SD ? J'imagine que ce sera avec la pin SS (53 sur la mega) mais je ne saurais pas comment faire.

Merci d'avance aux personnes qui pourront m'aider.
Si quelqu'un à déjà expérimenté un montage similaire, je suis preneur de tous les bons conseils.

Merci.
Jean-Mat'
Amateur Arduino et Raspberry pi
Ma centrale de consommation énergétique
Avatar de l’utilisateur
jmatgou
 
Messages: 41
Inscription: Lun 7 Nov 2011 16:19

Re: Arduino Mega 2560 + Ethernet shield + Mémoire shield

Message non lude Lionel » Lun 7 Nov 2011 17:24

Bonjour,

a priori, il n'y a pas de contre indication, puisque :
concernant le shield mémoire :
l'horloge rtc est sur un bus i2c, qui est capable d'adresser plusieurs équipements, il faudra cependant détourner les signaux vers les pins 20 & 21 de l'arduino mega
la carte sd est sur le bus spi, qui est capable d'adresser plusieurs équipements (sélectionnable via pin SS qui détermine l'équipement avec qui l'on discute) , il faudra cependant détourner les signaux vers les pins 50,51,52 et 53 de l'arduino mega
concernant le shield ethernet :
le composant wizznet est sur le bus spi, rien a détourner
la carte sd est sur le bus spi, rien a détourner
donc à prori, pas de contre indication

cependant, mécaniquement, l'empilement sera sportif, possible, mais moyennant bricolage. En effet, la carte ethernet empêche (sauf pin super longues) tout empilage supérieur, et sur l'arduino méga elle doit être placée juste au dessus de l'arduino pour récupérer le bus spi sur le connecteur 6 points ISP (placé en bout de carte uno et au milieu des cartes 2560).

Donc, sur le shield mémoire (rtc + sd snootlab) il sera nécessaire de placer des connecteurs avec des pattes plus longues. On doit pouvoir trouver des barettes sécables qui conviendraient mais il est très difficile de trouver des connecteurs empilables avec des pattes assez longues pour passer au dessus (sauf a les commander par 1000...)

Cependant si c'est uniquement l'horodatage qui vous interresse, et pas forcément deux cartes sd, plusieurs pistes sont a considérer :
- récupérer l'heure sur un serveur ntp
- utiliser uniquement la fonction rtc du shield mémoire en détournant les signaux 5V, GND, SDA, SCL et les relier a l'aide de cordons a l'arduino Mega...
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Arduino Mega 2560 + Ethernet shield + Mémoire shield

Message non lude jmatgou » Lun 7 Nov 2011 21:04

Bonjour,

Merci pour votre réponse.
En fait, je n'ai pas réellement besoin de 2 lecteur SD, mais ce qui me plait sur le "shield mémoire" c'est, l'horloge ainsi que la partie pastillé sur la quelle je vais pouvoir mettre mon petit montage.
La solution de l'heure sur un serveur NTP ne me plait pas trop, car si j'ai une coupure de courant, il faudra que je refasse une mise à l'heure et mon montage ne doit pas être dépendant de ma connexion à Internet.
C'est vrai que j'aurais pu me contenter d'un petit montage à base du DS1307 comme celui vendu par Adafruit.
D'ailleurs, je ne vais pas détourner les signaux du DS1307 vers les pins 20 et 21 car j'en ai besoin pour gérer des interruptions ; il va donc falloir que je créer un autre port I2C par "soft" en utilisant la librairie "softI2C". Je pourrais donc affecter les pins 4 et 5 à cette fonction.
Pour ce qui est de rehausser le "shield mémoire" afin qu'il tienne par dessus le shield Ethernet, ça ne me pause pas de problème.

Par contre, la partie SS (pin 53) est toujours obscure.
Je ne vois pas comment, par le code, passer d'un shield à un autre pour choisir le lecteur de carte SD ; ou même n'en sélectionner qu'un, car pour moi si les 2 cartes sont empilé et que le bus SPI est connecté au 2 cartes de la même façon, elles recevront toutes les 2 les même données. (ou alors y'a un truc concernant le bus SPI que j'ai pas compris).

Si vous pouviez m'expliquer ce détail ce serait parfait.

D'avance merci.
Jean-Mat'
Amateur Arduino et Raspberry pi
Ma centrale de consommation énergétique
Avatar de l’utilisateur
jmatgou
 
Messages: 41
Inscription: Lun 7 Nov 2011 16:19

Re: Arduino Mega 2560 + Ethernet shield + Mémoire shield

Message non lude Lionel » Lun 7 Nov 2011 21:32

Je vais essayer de vous expliquer, mais je pense que vous allez vite comprendre, c'est assez simple.
La page wikipedia sur le bus SPI est assez bien faite (d'ailleurs, je vais coller une image de l'article pour illustrer mes propos)

On va partir directement sur un maître et plusieurs esclaves

Image

C'est donc le SPI master (l'arduino) qui va choisir a qui il va parler et échanger des données, il va donc sélectionner l'esclave en envoyant un signal sur la patte SS. Il va générer l'horloge et les échanges de données peuvent donc avoir lieu via les pattes MOSI et MISO au rythme de l'horloge. Et c'est tout !!

Avantages majeurs : c'est rapide, on ne transmet pas d'adresse (par rapport à l'I2C par exemple), pas de collision, ...
Inconvénients : c'est consommateur de pattes de sélection, on peut causer dans le vide, ...

Lire l'article wikipedia pour plus d'infos a ce propos

Pour les cartes SD par exemple, c'est la librairie qui se charge de causer a la carte une fois définie la patte SS (parfois appelée CS) en début de sketch, je ne sais pas si il est possible de déclarer plusieurs cartes avec une patte CS différente, c'est techniquement possible, mais il faut que ce soit prévu par la librairie.
De même pour le composant ethernet de l'ethershield (wizznet 5100), c'est la librairie qui se chargera d'activer l'esclave au moment de lui parler.
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Arduino Mega 2560 + Ethernet shield + Mémoire shield

Message non lude jmatgou » Lun 7 Nov 2011 21:54

ok.
Donc je peut utiliser SS1 sur la broche 53 (pin par défault) et attribuer la broche 49 (par exemple) à SS2.
Ensuite je doit adapter le librairie SD pour pouvoir en gérer 2 différentes.

Code: Tout sélectionner
SD.begin(53)
et
Code: Tout sélectionner
SD.begin(49)


Je ne suis pas sur d'avoir bien compris !
Jean-Mat'
Amateur Arduino et Raspberry pi
Ma centrale de consommation énergétique
Avatar de l’utilisateur
jmatgou
 
Messages: 41
Inscription: Lun 7 Nov 2011 16:19

Re: Arduino Mega 2560 + Ethernet shield + Mémoire shield

Message non lude Lionel » Lun 7 Nov 2011 22:14

Je crains que la librairie SD par défaut ne soit pas capable de gérer plusieurs cartes, par contre, la dernière mouture de la librairie SDfat en est capable on dirait
http://code.google.com/p/sdfatlib/downloads/list
Muiltiple card support. See changes.txt for compatibility warnings
Image - Distributeur officiel Arduino - Conception de shields
Avatar de l’utilisateur
Lionel
 
Messages: 734
Inscription: Mar 21 Déc 2010 09:52
Localisation: Toulouse

Re: Arduino Mega 2560 + Ethernet shield + Mémoire shield

Message non lude jmatgou » Lun 7 Nov 2011 22:21

ouaip.
Nickel.

Merci

Code: Tout sélectionner
/*
 * Example use of two SD cards.
 */
#include <SdFat.h>
#include <SdFatUtil.h>
#if !USE_MULTIPLE_CARDS
#error You must set USE_MULTIPLE_CARDS nonzero in SdFatConfig.h
#endif

SdFat sd1;
const uint8_t SD1_CS = 10;  // chip select for sd1

SdFat sd2;
const uint8_t SD2_CS = 9;   // chip select for sd2

const uint8_t BUF_DIM = 100;
uint8_t buf[BUF_DIM];

const uint32_t FILE_SIZE = 1000000;
const uint16_t NWRITE = FILE_SIZE/BUF_DIM;
//------------------------------------------------------------------------------
// print error msg, any SD error codes, and halt.
// store messages in flash
#define errorExit(msg) errorHalt_P(PSTR(msg))
#define initError(msg) initErrorHalt_P(PSTR(msg))
//------------------------------------------------------------------------------
void setup() {
  Serial.begin(9600);
  PgmPrint("FreeRam: ");
  Serial.println(FreeRam());
 
  // fill buffer with known data
  for (int i = 0; i < sizeof(buf); i++) buf[i] = i;
 
  PgmPrintln("type any character to start");
  while (Serial.read() < 0) {}

  // disable sd2 while initializing sd1
  pinMode(SD2_CS, OUTPUT);
  digitalWrite(SD2_CS, HIGH);
 
  // initialize the first card
  if (!sd1.init(SPI_FULL_SPEED, SD1_CS)) {
    sd1.initError("sd1:");
  }
  // create DIR1 on sd1 if it does not exist
  if (!sd1.exists("/DIR1")) {
    if (!sd1.mkdir("/DIR1")) sd1.errorExit("sd1.mkdir");
  }
  // initialize the second card
  if (!sd2.init(SPI_FULL_SPEED, SD2_CS)) {
    sd2.initError("sd2:");
  }
 // create DIR2 on sd2 if it does not exist
  if (!sd2.exists("/DIR2")) {
    if (!sd2.mkdir("/DIR2")) sd2.errorExit("sd2.mkdir");
  }
  // list root directory on both cards
  PgmPrintln("------sd1 root-------");
  sd1.ls();
  PgmPrintln("------sd2 root-------");
  sd2.ls();

  // make /DIR1 the default directory for sd1
  if (!sd1.chdir("/DIR1")) sd1.errorExit("sd1.chdir");
 
  // make /DIR2 the default directory for sd2
  if (!sd2.chdir("/DIR2")) sd2.errorExit("sd2.chdir");
 
  // list current directory on both cards
  PgmPrintln("------sd1 DIR1-------");
  sd1.ls();
  PgmPrintln("------sd2 DIR2-------");
  sd2.ls();
  PgmPrintln("---------------------");
 
  // remove RENAME.BIN from /DIR2 directory of sd2
  if (sd2.exists("RENAME.BIN")) {
    if (!sd2.remove("RENAME.BIN")) {
      sd2.errorExit("remove RENAME.BIN");
    }
  }
  // set the current working directory for open() to sd1
  sd1.chvol();
 
  // create or open /DIR1/TEST.BIN and truncate it to zero length
  SdFile file1;
  if (!file1.open("TEST.BIN", O_RDWR | O_CREAT | O_TRUNC)) {
    sd1.errorExit("file1");
  }
  PgmPrintln("Writing TEST.BIN to sd1");
 
  // write data to /DIR1/TEST.BIN on sd1
  for (int i = 0; i < NWRITE; i++) {
    if (file1.write(buf, sizeof(buf)) != sizeof(buf)) {
      sd1.errorExit("sd1.write");
    }
  }
  // set the current working directory for open() to sd2
  sd2.chvol();
 
  // create or open /DIR2/COPY.BIN and truncate it to zero length
  SdFile file2;
  if (!file2.open("COPY.BIN", O_WRITE | O_CREAT | O_TRUNC)) {
    sd2.errorExit("file2");
  }
  PgmPrintln("Copying TEST.BIN to COPY.BIN");
 
  // copy file1 to file2
  file1.rewind();
  uint32_t t = millis();

  while (1) {
    int n = file1.read(buf, sizeof(buf));
    if (n < 0) sd1.errorExit("read1");
    if (n == 0) break;
    if (file2.write(buf, n) != n) sd2.errorExit("write2");
  }
  t = millis() - t;
  PgmPrint("File size: ");
  Serial.println(file2.fileSize());
  PgmPrint("Copy time: ");
  Serial.print(t);
  PgmPrintln(" millis");
 
  // close TEST.BIN
  file1.close();
 
  // rename the copy
  file2.close();
  if (!sd2.rename("COPY.BIN", "RENAME.BIN")) {
    sd2.errorExit("sd2.rename");
  }
  PgmPrintln("Done");
}
//------------------------------------------------------------------------------
void loop() {}
Jean-Mat'
Amateur Arduino et Raspberry pi
Ma centrale de consommation énergétique
Avatar de l’utilisateur
jmatgou
 
Messages: 41
Inscription: Lun 7 Nov 2011 16:19


Retourner vers Mémoire

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité