Pages: [1] 2 3   Go Down
Author Topic: Carte SD - programmation [mettre en tableau key et val liées] - config.txt  (Read 2358 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir,

Je m'interroge depuis quelques jours sur la possibilité de mémorisé des paramètres sur une carte SSD de type appareil photo.

Chaque modèle utilisé avec ma télécommande à sa propre programmation. Ainsi, en extérieur, je me crée un .txt qui contient des infos.

Quote
Modèle-01
Nom = Test1
Mixage_V1V2 = false
Mixage_V3V4 = false
Mixage_V1I1 = false
... Ainsi de suite

J'aimerais éviter de passer par une shield éthernet donc brancher en direct sur l'arduino. Que me conseilleriez-vous au niveau câblage simple pour utiliser la mémoire externe.

Sinon, la solution bis est de se servir de la mémoire interne à l'arduino. Je trouve qu'il serais plus pratique d'avoir une carte pour stocker ces infos. La compatibilité avec le pc en plus.

Merci pour les infos.
« Last Edit: November 01, 2012, 04:42:00 am by Microbulle » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 112
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La carte SD semble une bonne solution avec pourquoi pas un stockage dans un fichier xml, mais ne compte pas stocker directement sur l'arduino trop peux de place...
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok pour passé sur une SD.

J'ai un lecteur que je peux dessouder d'un appareil qui ne fonctionne plus et d'ont le lecteur (la pièce qui permet de plugger une micro sd) est récupérable. Par contre, si j'ai bien suivie les tutos que j'ai pu voir, deux écoles s'offre à moi. La solution SPI et la solution pin à partir de 53 sur la méga.

Je vais faire des essais sur une uno puis porter sur méga. Je pensait me servir du SPI. Par contre faut-il faire un raccordement direct SPI -> Lecteur ou il y a besoin d'une électronique d'interfaçage ?

Voila, pour le moment j'en suis là.

Ok pour le xml quoi que le parser j'en ai de très mauvais souvenir. Peut-être qu'avec un exemple sur la librairie SPI... ? Enfin je veux bien quelques sources pour me pencher dessus.

Je laisse tomber la carte éthernet car elle a beaucoup d'options qui ne seront pas mise en ouvre au final.
Logged

Ales
Offline Offline
Faraday Member
**
Karma: 29
Posts: 3176
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pourquoi ne pas simplement utiliser la librairie faite pour ? http://arduino.cc/en/Reference/SD

smiley
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok pour ça !

A ce moment là, comme je disait plus haut, comment passé de l'interface SPi à la carte SD (électroniquement parlant) ?

Si c'est jouable, bien sûr que je me baserais sur le code déjà écrit !
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut,

Il faut adapter les signaux 0-5V de l'Arduino vers des signaux 0-3,3V de la carte SD. Tu peux t'inspirer de shields existants : Arduino Wireless Shield,  Snootlab Mémoire, Adafruit Logger Shield, etc...

++
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ah wai ! Du 3.3V !

Alors, dans ce cas, peut-être que je devrais pour démystifier le principe de fonctionnement du SPI et de la carte SD, passé par le shield ethernet...

Ensuite, étudier un schéma pour s'affranchir du module et descendre sur 3.3V.

Ceci dit, je dispose aussi d'une sortie en 3.3V au niveau de la méga. Peut-être qu'en passant par cette tension, cela résoudrais le souci d'interfaçage.

Merci pour les liens, certain m'étais déjà connus et je pensait à tort que c'étais une liaison type fil à fil.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

J'ai de la chance, le module shield éthernet me permet quand même de me servir, sur ma méga 2560, de mes voies analogiques à priori. Je me sert de toutes les voies, c'est à dire de AN0 à AN15.

Je vais donc non seulement pouvoir stocher sur une carte SD 512Mo pour les test, mais plus tard, pourquoi pas 1 ou 2Go mes modèles.

Est-ce que se servir de l'ICSP bloque les voies analogiques ? Est-ce que ça risque de poser problème sur les voies type PWM et I2C ?

Enfin, dernière question, si je me base sur la librairie ICSP, SD et éthernet, je risque pas de voir des fonctions qui fonctionnent parfaitement poser problème ?

Pour info, mon programme doit resté dans les 80 à 90ms pour que la transmission entre la télécommande et le modèle soit bien prise en compte.

Merci beaucoup pour votre retour.
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 23
Posts: 2054
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Le shield Ethernet n'utilise que le bus SPI, les pins numériques 4 (CS de la SD) et 10 (CS de l'Ethernet)

Aucun conflit avec les analog et les PWM

Attention, sur une Mega, le bus SPI présent sur le connecteur ICSP se retrouve aussi sur les broches 52 à 54 de mémoire (vérifier).
Sur une UNO c'est les broches 11, 12 et 13.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

En effet, sur la méga, ça me prends 4 pins de plus  smiley-eek

Code:
/*
  Télécommande sur 433 Mhz bi-directionnelle
  ------------------------------------------

  Création : le 29 octobre 2012
  Version 1.0
  ------------------------------------------
 
            Pins utilisés
  TX1 -> Modem 433Mhz
  RX1 <- Modem 433Mhz
  SDA <-> Data I2C
  SCL <-> Horloge I2C
 
  SPI <-> Carte Ethernet / SD Card
  04 (PWM) -> Ethernet CS
 
  10 (PWM) -> Ethernet Librairie
  50 (Digit) -> Ethernet Librairie
  51 (Digit) -> Ethernet Librairie
  52 (Digit) -> Ethernet Librairie
  53 (Digit) -> Ethernet Librairie
 
  AN0 -> Voie 1
  AN1 -> Voie 2
  AN2 -> Voie 3
  AN3 -> Voie 4
 
  22 (Digit) -> Voie 5 = Btn On/Off/On 1
  23 (Digit) -> Voie 5 = Btn On/Off/On 1
  24 (Digit) -> Voie 6 = Btn On/Off/On 2
  25 (Digit) -> Voie 6 = Btn On/Off/On 2
 
  Pour infos:
  - Les voies analogiques sont reliée chacune à leur potar.
 
  - 22 et 23 Corresponde à un potar à 3 positions.
  - 00 = Milieu
  - 10 = Haut
  - 01 = Bas
 
  - 24 et 25 Corresponde à un potar à 3 positions.
  - 00 = Milieu
  - 10 = Haut
  - 01 = Bas
 
*/

Ceci dit, je pense m'orienter sur un fichier config.txt organisé comme suit :
Quote
MODELE-01,Nom,Type,Conf1,Conf2,Conf3,Conf4...
MODELE-02,Nom,Type,Conf1,Conf2,Conf3,Conf4...
MODELE-03,Nom,Type,Conf1,Conf2,Conf3,Conf4...

MODELE-01 à 99 : pour passer d'un modèle à un autre.
Nom : Nom à rappeler sur l'écran LCD
Type : Le type de modèle à rappeler sur l'écran LCD
Conf1, Conf2....Conf4 peuvent prendre consécutivement des chiffres(0, 1... 10, 100, 1000), des lettres (true, false) ou bien des caractères de personnalisation tel que (a,b,c...toto, tata...) et enfin des bytes (0x00 à 0xFF) voir même des binaires ou des exa (00000000 à 11111111  et 0 à 255). Bref tout ce qui doit concerner la personnalisation de mon programme.

A terme je devrais à la fois pouvoir lire les infos mais aussi modifier certaines valeurs. Il sera impossible de créer un modèle car ce sera fait de l'extérieur avec des données standards par défaut. En l'absence de carte, on se fie aux données de la télécommande. Remarque je peux aussi partir de ces données et créer un profil. Je commence par la lecture, je verrais l'écriture après smiley
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J'avance un peu.

J'ai fait un bout de code qui me retourne un nomnre. Hélas, ce n'est pas le nombre de lignes comme je le supposait au départ mais je pense le nombre de caractère. Ou autre chose.

Mon fichier, pour le moment contient 3 lignes. Le code me retourne 39  smiley-sweat

Voila le bout de code que j'ai fait:
Code:
/* FONCTION qui retournera le nombre de ligne du fichier */
int lectureConf_NB() {
 
  int nb=0;
 
  while(myFile.read() != '\n') {
   
    nb++;
  }
  return nb;
}

/*  FONCTION qui retournera un tableau des valeurs contenus */

Je m'y suis peut-être mal pris !
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut,

En effet, il y a une erreur de logique. Dans ce que tu as écrit ton compteur s'incrémente tant que le caractère lu est différent de '\n'.
Sauf que tu veux parcourir ton fichier jusqu'à la fin, c'est à dire tant que tu n'as pas trouvé le caractère nul '\0'. Et compter le nombre de '\n' rencontrés sur le parcours.

Je te laisse chercher un peu smiley-wink
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci SesechXP.

Grâce à ta piste je viens de trouver la solution.

En fait, je me suis souvenu avoir li que myFile.available() passé jusqu'au prochain caractère, sauf quand c'est un null. Ça tombe bien, c'est ce que je voulais faire !

Du coup, je n'ai plus eu à faire que:
Code:
/* FONCTION qui retournera le nombre de ligne du fichier */
int lectureConf_NB() {
 
 
  int nb=0;
 
  //Parcourir le fichier jusqu'à un caractère null
  while(myFile.available()) {
     
    //Si il est rencontrer un saut de ligne
    if(myFile.read() == '\n') {
       
      //Compter
      nb++;
    }
  }
 
  //Retourner le nombre de lignes parcouru
  return nb;
}

Bon, maintenant, je passe à la suite. La fonction qui va me retourné un tableau de String de la ligne spécifique.
Algorithmiquement parlant, je ferais ceci:
Code:
//lectureConf_LN(int ligne_a_lire)
  //aller à la ligne_a_lire
  //parcourir la ligne jusqu'au saut de ligne
    //Parser le contenu sur les ',' le dernier caractère étant le saut de ligne
    //Charger le tableau de string avec les valeurs parsés
 //Fin de parcours
 //Return tableau

Ensuite dans mon code, je dois me retrouver avec :
Quote
tableau[0]=MODELE-01
tableau[1]=Robot Go
tableau[2]=Robot
tableau[3]=true
tableau[4]=false
tableau[5]=false
tableau[6]=false

Il va de soit que je ne connais pas le nombre de variable à l'avance. Donc je pense limité à la seule ligne. Ensuite, je ne sait pas si par exemple, on peut faire cela:
Code:
boolean Mix_V1V2 = false;

//Charger la configuration
Mix_V1V2 = tableau[3];

//Si le mixage Voie 1 avec Voie 2 est activé
  if(Mix_V1V2) {
    //Mixage voie 1 et voie 2
    mixVoie1 = abs(voies[1] - (voies[2]-90));
    mixVoie2 = abs(voies[1] + (voies[2]-90));
   
    //Réécrire les voies avec le mixage
    voies[1] = mixVoie1;
    voies[2] = mixVoie2;
  }

Comme on va le voir, j'ai besoin de tester des cas sur du contenu de variable. Pas sûr que ça fonctionne.

Déjà, voyons pour récupérer les infos et éventuellement anticiper pour traiter ensuite les données.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 38
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bon et bien, j'ai changer d'avis ! Comme quoi, il faut parfois en arrivé à un stade pour re pensé la problématique.

Donc, au lieu de gérer des lignes, très lourd et obligeant à parcourir le fichier intégrale plusieurs fois, je me suis dit que ce serais mieux d'a voir la liste de plusieurs fichiers qui eux aurait la configuration d'un modèle.

Ainsi, actuellement la SD card à 4 fichiers. memo.txt, modele-001.txt, modele-002.txt et modele-003.txt.

Je cherche à lister les fichiers étant nommé modele-xxx.txt et à les placés dans un tableau.

Voila je galère à trouvé ça bien que j'ai quelques pistes que j'essaie. Rien de probant pour le moment.

<Edit: Microbulle>

Bon, j'ai trouver une piste sérieuse. Ici : http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertMemorisationSDCardAfficheContenu

J'ai synthétisé pour faire mon code afin de garder que l'essentiel. Je n'aurais pas de répertoire à gérer donc pas autant besoin de tab. Bref le code que j'ai extrait et qui fonctionne pratiquement:

Code:
File myFile;

/* SETUP */
void setup() {
//Initialiser la carte SD
  if(initSD()) {
    //Lister les fichiers présent dans la carte SD
   
    myFile = SD.open("/");
   
    while(true) {
     
      File entry = myFile.openNextFile();
     
      if(!entry) {
        break;
      }
     
      String fichier = entry.name();
     
     
      Serial.println(fichier);
    }
   
  }
 
  //Fermer le fichier
  myFile.close();
}

Par contre voila ce que ça m'affiche:
Quote
TRASH-~1
MEMO.TXT
MODELE~1.TXT
MODELE~2.TXT
MODELE~3.TXT

Donc il me faut géré le problème des noms long et nom court. Ainsi que l'élimination de TRASH-~1 et MEMO.TXT.

Merci à ceux qui sauront m'aider.
« Last Edit: October 30, 2012, 12:05:50 pm by Microbulle » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La bibliothèque SD ne gère que les fichiers au nom court au format 8.3 : 8 caractères pour le nom, 3 pour l'extension.
Logged


Pages: [1] 2 3   Go Up
Jump to: