[résolu]Carte µSD >4Go et Arduino uno

Bonjour, je suis nouveau participant :

Auparavant j'utilisait les µC Pics que je programmais en C et assembleur.

L'environnement arduino me plait bien :

  • Facilité et rapidité d'écriture du code
  • µC Atmel 328 puissant
  • Utilisation possible d'interruptions externes sans gros soucis

Actuellement, étant aéromodéliste, je termine un projet de logger permettant de mesurer tension et intensité, puis de stocker les mesures sur carte SD. (Je développe avec un arduino Uno bien robuste et finalise le proto avec un arduino nano et µC Atmel 328)

Ma question sera la suivante :
" j'utilise la bibliothèque SD standart, mon logger fonctionne avec des µSD de 4GO mais pas avec celles de capacité > 4GO que je possède"

Or les capacités 2 et 4 GO commencent à se faire rare ....

Merci par avance pour des infos ....

S.D

des carte SD ou micro SD tu en trouve facilement sur ebay pour moins de 10€ et de tres bonne qualité entre 1G et 4go

Merci pour les indications, je me demandais seulement s'il existait une autre bibliothèque que celle standard mais qui accepterais les cartes de capacité supérieure à 4Go.

S.D

Effectivement, je viens de regarder les options de formatage, par défaut c'est 32kO sur mon PC.
C'est modifiable, mais l'option mini est de 2048 Octets et comme pour l'Atmel 328 la mémoire dynamique totale est justement de 2048 Octets je n'aurais d'autre solution que de prendre des cartes de 2 ou 4 Go moins "gourmandes".

Merci beaucoup pour l'info

S.D

Bon projet, J'ai en effet travailler sur un projet similaire (mésure de tension et intensité avec l'arduino pour commander des relais). Cependant pourrions nous en discuté pour le partage d'expérience.

Merci

Charli:
Bon projet, J'ai en effet travailler sur un projet similaire (mésure de tension et intensité avec l'arduino pour commander des relais). Cependant pourrions nous en discuté pour le partage d'expérience.

Merci

OK, ouvrez un autre sujet, je m'y abonnerai

S.D

aligote:
OK, ouvrez un autre sujet, je m'y abonnerai

S.D

Ok, merci. je le nommerai "partage d'expérience mesure tension et intensité et stockage des données."

pepe:
Par acquis de conscience, j'ai remonté un lecteur SD sur un Arduino Uno (interface SPI), et j'ai pu utiliser avec succès une carte SDHC SanDisk de 16 Go.

...........................

Merci d'avoir vérifié, je pense quand même que cette histoire de 4Go correspond à quelque chose puisque j'ai lu quelque part un sujet qui en parlait.
Maintenant j'ai rencontré ce problème deux fois : sur µSD soit sur une SD "format normal"

Au passage, j'ai constaté que l'exemple "CardInfo" fourni dans l'IDE donnait des résultats incorrects. En effet, la taille du volume retournée est calculée sur 32 bits, alors qu'il en faudrait au minimum 34 pour ne pas faire de dépassement de capacité (16G = 234).

Pas de chance, car justement pour vérifier une carte dans un environnement minima, j'utilisais cela.

Il faudrait donc connaître plus précisément la situation afin de découvrir la raison pour laquelle tes cartes 4Go fonctionnent, mais pas celles de capacité supérieure.

J'en suis bien conscient, pour l'instant j'ai deux proto qui fonctionnent bien avec une "ancienne" 2GO et une µSD récente 4 Go.

Sans doute que l'origine se situe quelque part au niveau du formattage.

Merci de m'avoir permis d'avancer, quand mon projet actuel sera bien finalisé, je tenterai d'éclaircir tout cela.

S.D

pepe:
La limitation de la taille du volume se situe plutôt à 2 Go pour la FAT16, correspondant aux clusters de 32 Ko maxi. Dans l'absolu, certains systèmes FAT16 supportent 4 Go avec des clusters de 64 Ko, mais ce n'est pas conseillé par soucis de compatibilité.

Sinon, dans les systèmes FAT, les 4 Go correspondent aussi à la taille maximale d'un fichier.

Bon, c'est résolu.

J'ai téléchargé un formateur de SD, opéré un formatage de ma µSD de 8Go et tout s'est bien passé.

Maintenant mon arduiino nano (Atmel 328) peut lire et écrire sur cette carte.

Grand Merci à pépé qui à su me mettre sur la bonne piste.

S.D

PS : Je voulais vous faire parvenir le schéma de mon proto, maus je ne sais pas (encore?) joindre un fichier au post

Voila le schéma : (Il est presque terminé)

S.D

L'Arduino Nano disposant déjà d'un régulateur 5V intégré (µA78M05), y a-t-il une raison particulière pour que tu utilises un régulateur 78L05 extérieur ?

Très bonne question. je vais tenter des réponses :

  • Je n'en suis qu'au stade essai sur boite de connexion, on verra pour le proto, mais quand même ....

----- 1 Pour des mesures analogiques un peu précises, on a intérêt à ce que la tension +5V soit la plus stable possible car elle est utilisée par défaut comme référence pour le CAN interne au µC
Donc il ne faut pas trop solliciter le régulateur interne à la carte nano
----- 2 Pour des tensions destinées à l'alimentation 5V, comme le régulateur interne est "petit" il faut éviter des tensions trop élevées au delà de 9V à cause d'une dissipation thermique très limitée pour la carte nano.
----- 3 Justement, le proto définitif sera utilisé en " nomade" sur un terrain d'aéromodélisme ou les batteries lithium sont disponibles facilement pour l'alimentation, mais avec des tensions éventuellement élevées (12V, 18V ...)

----- 4 l'ajout d'un régulateur externe 7805 en boitier T0220 laisse deux éventualités ouvertes :

  • mettre un petit refroidisseur en alu si la conso doit être élevée
  • mettre un électrochimique "Low esr" de capacité plus élevée si nécessaire pour un filtrage efficace. (Actuellement par défaut j'ai mis un 100 µF)

Bon le proto n'est pas définitif, il faudrait aussi déplacer l'inter de validation d'écriture (Inter) vers une E/S digitale avec résistance de rappel et ainsi gagner un composant (retirer R2); il y a une Led permettant de visualiser le mode "écriture ou lecture"; cette led ne figure pas encore sur le schéma .... etc ... etc

On s'écarte du sujet .... j'y revient doucement :

il y a plusieurs fichiers nommés 0.Watt; 1.Watt .... etc et les données sont archivées successivement dans ces fichiers *.Watt.
Au moment de l'écriture, le n° du fichier actif est bipé.
(Comme je ne possède pas d'horloge temps réel, je ne peux pas mettre à jour l'heure du fichier)

Y aurait-il une ruse possible pour contourner cela?

Bonne journée.

S.D

Voila le code correspondant (à peigner et fignoler)
Conventions d'écriture : les fonctions sont en MAJUSCULES

Il y a 4 onglets :

1 -- Les déclarations et le programme
2 -- les fonctions
3 -- Le s/p d'initialisations
4 -- La partie principale

Ci dessous les onglets 1 et 4

S.D

//*********************************
// Programme Nano3 19 Mars 2016 16h24
// 15 090 octets (49%) de l'espace de stockage
// 1 061 octets (51%) de mémoire dynamique
//*********************************
#include <SPI.h>
#include <SD.h>
#include <Wire.h> 
#include <EEPROM.h>
const byte TensionPin = A7;const byte IntensitePin=A6;
const byte BpSuitePin=6;const byte BpChangePin=5;const byte BpRazPin=4;
const byte SckPin=13;
const byte BuzzerPin=A5;
const byte LedPin=3;const int ChipSelect = 10;
const byte InterPin=A4;
byte CodeBas;byte CodeHaut;
int Tension;int Intensite;int Offset_I;
int Tempo[3]={1,108,240};byte Index=2;
//**** Pour SD **********************
boolean Ecriture=true;//Autorisation d'écrire sur SD
char Fichier1[6]="0.Wat";//Nom générique de fichier
boolean SD_existe=false;
byte nF=48;// n° fichier courant :char(48)="0"
const byte Adresse_nF=0;// adresse de stockage en Eeprom
byte N_fichiers=3;// nombre de fichiers possibles
int n=0;//pointeur de n° octet dans fichier
int Max_Points=2500;
//********
void setup() 
   {INIT();}
//*******
void loop()
   {MESURES(); }
//*************************
// Programmes principal Nano3 
//**************************  
void MESURES()
 {   SCRUTE_CLAVIER();         
     if  (Ecriture)// demande écriture surRS232 et éventuellement sur SD
         {Tension=analogRead(TensionPin);
          Intensite=analogRead(IntensitePin)-Offset_I;  
          delay(2);ENVOIE_VARIABLE(Tension, 0);      
          if (PEUT_ECRIRE())// Ecrire 1ere variable sur SD
               {digitalWrite(LedPin,HIGH);
                ECRIT_FILE(Max_Points);// ecrire max 2500 valeurs
               } 
          else { digitalWrite(LedPin,LOW);delay(22);}
          ENVOIE_VARIABLE(Intensite, 2); 
          if (PEUT_ECRIRE())// Ecrire 2eme variable sur SD
               {digitalWrite(LedPin,HIGH);ECRIT_FILE(Max_Points);} 
          else { digitalWrite(LedPin,LOW);delay(22); }      
         } 
      else // de if (Ecriture) demande de lecture SD
            {if (SD_existe)
               { LIT_FILE();
                 while(!TOUCHE(BpSuitePin))
                   {CLIGNOTER();}
                 if (digitalRead(InterPin))   
                   { AJOUR_N_FICHIER();} 
                 BIP_N_FICHIER(); 
                 Index=2;delay(200);Ecriture=true; 
               } 
             else // de if SD_existe
                 {digitalWrite(LedPin, LOW);
                  delay(40);         
                 }  
           }    
  }

Bon,

Voila, j'ai toutes les infos que je souhaitais.

Grand merci à Pépé qui m'a beaucoup aidé.

S.D