Arduino uno + ethernet SD + RF

Bonjour,

Je travail sur un projet :
une carte émet en RF --> pas de problème
une carte reçoit et émet en RF. Elle enregistre ce qu'elle reçoit sur une carte SD et met à jour un mini site :
Les bouts de code individuels (gestion du site / réception émission en RF / écriture sur la carte) fonctionnent. Le problème vient de la fusion de tous ces codes.

Par exemple, le code suivant (initialisation des différents éléments) pose problème

#include <SPI.h>
#include <Ethernet.h>
#include <VirtualWire.h>
#include <OneWire.h>
#include <SD.h>

int pinEmeteur = 3 ;
int pinRecepteur = 6 ;
const int idSD=4 ;

byte mac[] = {  0x90, 0xA2, 0xDA, 0x00, 0x7C, 0x48 }; // MAC adresse de mon arduino ethernet
IPAddress ip(192,168,1, 55);
EthernetServer server(80);


void etatSD()
{
  Sd2Card card;
  SdVolume volume;
  SdFile root;
  
  Serial.print("\nCarte SD :");

  if (!card.init(SPI_HALF_SPEED, idSD)) {
    Serial.println("Initialisation incorrecte. vérifiez :");
    Serial.println("* qu'une carte est insérée ?");
    Serial.println("* Is your wiring correct ?");
    Serial.println("* le numéro du pin est correct ?");
    return;
  } else {
   Serial.println("La carte est paramétrée et une SD est présente."); 
  }

  Serial.print("\nType de SD : ");
  switch(card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Inconnue");
  }

  if (!volume.init(card)) {
    Serial.println("Partition FAT16/FAT32 introuvable.\nVérifiez que la SD est formatée.");
    return;
  }


  uint32_t volumesize;
  Serial.print("\nVolume de type FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();
  
  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize *= 512;                            // SD card blocks are always 512 bytes
  Serial.print("Taille de la carte SD (bytes): ");
  Serial.println(volumesize);
  Serial.print("Taille de la carte SD (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Taille de la carte SD (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Taille de la carte SD (Gbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);

  
  Serial.println("\nFichiers sur la SD (nom, date et taille en bytes): ");
  root.openRoot(volume);
  
  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}





void setup()
{
  Serial.begin(9600); 



  Serial.println("Init..."); 



  //  ER
  // Setup Emeteur  
  Serial.println("  emeteur"); 
  vw_set_tx_pin(pinEmeteur);             
  vw_setup(2000);                

  // Setup Recepteur
  Serial.println("  recepteur"); 
  vw_set_rx_pin(pinRecepteur);
  vw_rx_start();
  //  /ER

    // SERVEUR
  Serial.println("  serveur"); 
  Ethernet.begin(mac, ip);

  pinMode(10, OUTPUT);
  etatSD() ;
  
  Serial.print("  SD");
  if (!SD.begin(idSD)) 
  {
    Serial.println("      ...pbl");
    return;
  }
  Serial.println("      ...OK");
  delay(10000) ;

}



void loop()
{
}

Lors du lancement, il affiche les éléments de l'initialisation mais plusieurs fois de façon anarchique
voici un résultat :

Init...
  emeteur
  recepteur
  serveur

Carte SD :La carte est paramétrée et une SD est présente.

Type de SD : SDHC

Volume de type FAT32

Taille de la carte SD (bytes): 3665821696
Taille de la carte SD (Kbytes): 3579904
Taille de la carte SD (Mbytes): 3496
Taille de la carte SD (Gbytes): 3

Fich´R+?¹..
  emeteur
  recepteur
  serveur

Carte SD :La carte est paramétrée et une SD est présente.

Type de SD : SDHC

Volume de type FAT32

Taille de la carte SD (bytes): 3665821696
Taille de la carte SD (Kbytes): 3579904
Taille de la carte SD (Mbytes): 3496
Taille de la carte SD (Gbytes): 3

Fic??%¹¥Ñ¹..
  emeteur
  recepteur
  serveur

Carte SD :La carte est paramétrée et une SD est présente.

Type de SD : SDHC

Volume de type FAT32

Taille de la carte SD (bytes): 3665821696
Taille de la carte SD (Kbytes): 3579904
Taille de la carte SD (Mbytes): 3496
Taille de la carte SD (Gbytes):Init...
  emeteur
  recepteur
  serveur

Carte SD :La carte est paramétrée et une SD est présente.

Type de SD : SDHC

Volume de type FAT32

Taille de la carte SD (bytes): 3665821696
Taille de la carte SD (Kbytes): 3579904
Taille de la carte SD (Mbytes): 3496
Taille de la carte SD (Gbytes):Init...
  emeteur
  recepteur
  serveur

Carte SD :La carte est paramétrée et une SD est présente.

Type de SD : SDHC

Volume de type FAT32

Taille de la carte SD (bytes): 3665821696
Taille de la carte SD (Kbytes): 3579904
Taille de la carte SD (Mbytes): 3496
Taille de la carte SD (Gbytes): 3

FichiInit...
  emeteur
  recepteur
  serveur

Carte SD :La carte est paramétrée et une SD est présente.

Type de SD : SDHC

Volume de type FAT32

Taille de la carte SD (bytes): 3665821696
Taille de la carte SD (Kbytes): 3579904
Taille de la carte SD (Mbytes): 3496
Taille de la carte SD (Gbytes): 3

Fichi?0ð

Si je commente les 2 lignes du serveur tout se passe bien :

/*
    // SERVEUR
  Serial.println("  serveur"); 
  Ethernet.begin(mac, ip);
*/

Si quelqu'un a une idée... je suis preneur (ça fait 2 semaines que je bataille sur ce problème).

Merci

Bonjour,

Met tout tes chaines de caractères en flash avec la macro F() :
"blabla" -> F("blabla")

À mon avis tu manques cruellement de mémoire RAM libre, ce qui a pour effet de faire apparaitre des bugs bizarre.

Bonjour,

Merci skywodd.

Tu me conseils d'utiliser F(...) mais dois-je l'utiliser à chaque utilisation de chaîne de caractère ou uniquement lors d'affectation aux variables ?
Et bien dans l'exemple que j'ai mis, il n'y a que Serial.println je suppose donc que je dois faire cela : Serial.println(F(" ...pbl"))
Peux tu m'en dire plus sur cette fonction F(...) ou un lien.
Merci

De plus tu parles de problème de mémoire, faudrait il que je prenne une carte plus puissante (et laquelle me conseils tu ?)
Merci

Assez logiquement une Mega

La DUE a plus de mémoire flash : 512 contre 256 pour la méga et est plus rapide. Vaut il mieux la DUE ou la MEGA ? Mon shield ethernet monté sur la UNO est il compatible avec la DUE et la MEGA ?

Merci

filloop:
Tu me conseils d'utiliser F(...) mais dois-je l'utiliser à chaque utilisation de chaîne de caractère ou uniquement lors d'affectation aux variables ?
Et bien dans l'exemple que j'ai mis, il n'y a que Serial.println je suppose donc que je dois faire cela : Serial.println(F(" ...pbl"))

Uniquement lors de la déclaration de chaine de caractère constante.

Exemple :

Serial.println(F("SD1"));

filloop:
Peux tu m'en dire plus sur cette fonction F(...) ou un lien.

C'est une macro qui place le texte entre guillemets dans la mémoire flash du microcontrôleur, ça permet d'économiser de la place en RAM.
Par contre ça ne marche qu'avec les fonctions supportant les variables PROGMEM (les fonctions arduino "textuelles" de base le supporte).

http://playground.arduino.cc/Learning/Memory

filloop:
De plus tu parles de problème de mémoire, faudrait il que je prenne une carte plus puissante (et laquelle me conseils tu ?)

Pas plus puissante mais avec plus de RAM, une mega2560 par exemple.
Mais avant tout de chose il faut voir si le bug ce règle avec F() !

Essaye aussi de voir ce qu'il reste de libre en terme de mémoire RAM avec cette fonction :
http://playground.arduino.cc/Code/AvailableMemory

Effectivement le fait d'utiliser la fonction F() rend l'appli plus stable. Je n'ai pas tester la mémoire restante. Je vais également tester avec tout le code (dans les exemple j'en avais enlevé pas mal).

Merci déjà et vous dis pour la suite.