Aide Besoin d'aide pour lire une carte SD avec Arduino

  • Auteur de la discussion JCS
  • Date de début
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #1
Salut à tous,

J'ai besoin de votre aude !

Pour un nouveau projet, j'ai besoin de lire, avec un Arduino Uno, des nombres stockés sur une carte SD. J'ai connecté mon lecteur de carte à mon Arduino dans lequel j'ai téléversé le sketch suivant :

Le sketch fonctionne très bien, toutefois je ne sais pas comment lire les nombres de façon séquentielle, afin de pouvoir les exploiter :?:

Je subodore qu'il s'agit d'un truc du genre

variable = SD.read(quelque chose) :belzedar:
Cela fait 3 jours que je cherche sur le net !

Merci d'avance de votre aide.

JC.
 
jpbbricole
jpbbricole
Compagnon
26 Mai 2016
2 248
Corsier-sur-Vevey (Vaud)
Salut JCS
En fait il faut concaténer les caractères (char en chaîne de caractères et ensuite les convertir en chiffres (int) qui sont, eux, séparés, sur la carte, par un caractère "nouvelle ligne" \n
ce qui donne:
Ca doit être quelque chose comme celà.
Je n'ai, malheureusement pas, actuellement, le temps d'essayer. En fin de journée je peut te faire un topo concret.

Cordialement
jpbbricole
 
Dernière édition:
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #3
Grand merci Jpbbricole !

Je vais essayer cela cet-après midi, si je peux.
Je te tiens au courant des résultats.

Encore merci !
JC.
 
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #5
Jpbbricole,

J'ai essayé d'intégrer la première partie de sketch sans succès.
Quant au dernier sketch, ça fonctionne ( pour ce qui est du test de la carte SD), mais les valeurs contenues dans ma carte SD ne s'affichent pas. Comme si le module :

void nombreExploitation(String nombreLu)
ne s’exécutait pas :sad:

Pour infos, je n'utilise que des nombres entiers, c'est pour piloter un moteur PAP.

N'y aurait-il pas une formule plus simple pour lire les données ?

Merci d'avance pour ta réponse.

Joyeuses Pâques !

JC.
 
jpbbricole
jpbbricole
Compagnon
26 Mai 2016
2 248
Corsier-sur-Vevey (Vaud)
Salut JCS
Je te mettrai une version plus simple.
Pour ton problème, mets ton fichier essai.txt en pièce jointe pour que je puisse l'examiner.

Cordialement
jpbbricole
 
nopxor
nopxor
Compagnon
27 Mai 2010
1 412
Yvelines
Contenu de la librairie SD:
Les fonctions de la classe SD sont détaillées ici http://arduino.cc/en/Reference/SD

begin () initialise la librairie et la carte SD.
exists () vérifie si un fichier ou un dossier existe sur la carte SD.
mkdir () crée un dossier (répertoire) sur la carte SD, et les répertoires intermédiaires d'accès.
open () ouvre un fichier sur la carte SD, le crée s'il n'existe pas encore pour l'écriture.
remove () efface un fichier de la carte SD.
rmdir () efface un répertoire (qui doit être vide) de la carte SD.


Les fonctions de manipulation de fichiers:

available() vérifie s'il y a des octets à lire dans le fichier.
close() ferme le fichier et vérifie qu'il a bien été écrit et sauvegardé physiquement dans la carte SD.
flush() s'assure que les octets écrits sur la carte SD l'ont bien été physiquement (à la fermeture c'est automatique).
peek() lit un octet dans un fichier sans avancer au suivant.
position() retourne la position actuelle du curseur dans le fichier où sera écrit le prochain octet.
print() écrire des données dans le fichier ouvert en écriture au préalable, en ASCII.
println()
seek() cherche une nouvelle position dans le fichier, entre 0 et la taille de fichier.
size() retourne la taille du fichier.
read() lit un octet dans le fichier.
write() écrit des données dans le fichier.
isDirectory() les répertoires sont des types de fichiers particuliers, cette fonction reconnaît les répertoires.
openNextFile() ouvre le fichier suivant dans un répertoire.
rewindDirectory() on retourne sur le premier fichier d'un dossier, à utiliser avec openNextFile.

infos provenant de:
http://tiptopboards.free.fr/arduino...f=2&t=40&sid=9f18f016763f42f515fa8b7407c98617
 
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #9
Merci Nopxor pour ces infos.

Je cherche une méthode simple pour lire des nombres entiers > 255 à partir d'une carte SD, sans me prendre la tête.

@+
JC.
 
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #12
Merci à vous deux pour votre super réactivité !

Concernant le sketch de Jpbbricole, la phase test se déroule semble-t-il avec succès, le moniteur série affiche :

Initialisation OK
Fin


mais les valeurs ne s'affichent pas sur le moniteur série.

Concernant le sketch de Nopxor, voici le message de l'IDE après compilation :

Les options de compilation ont été modifiées, tout sera recompilé
Le croquis utilise 13706 octets (42%) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 1777 octets (86%) de mémoire dynamique, ce qui laisse 271 octets pour les variables locales. Le maximum est de 2048 octets.
La mémoire disponible faible, des problèmes de stabilité pourraient survenir.


Le moniteur série affiche une longue suite de "à".

J'ai fait les essais en alimentant le module lecteur de carte en 3,3 V et en 5 V à partir de l'Arduino.

Merci encore pour votre aide.

JC.
 
jpbbricole
jpbbricole
Compagnon
26 Mai 2016
2 248
Corsier-sur-Vevey (Vaud)
Je ne pense pas à un problème de tension, parceque l'initialisation est OK.
Essay un petit truc, ajoute, dans mon programme, ceci à cet endroit:

char fileChar = (char)fichierSD.read();
Serial.println(fileChar);
if (fileChar == '\n')

Lance le programme et dis moi ce qui se passe.
Je pense que le problème provient de la façon de "fabriquer essai.txt. Si tu pouvais me décrire la méthode je pourrais la reproduire chez mois.

Cordialement$jpbbricole
 
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #14
Rien ne change :roll:

J'enregistre mon fichier sur ma carte SD en mode CSV à partir d'un tableur.

Y a-t-il une autre solution ?

Cdlt.
JC.
 
jpbbricole
jpbbricole
Compagnon
26 Mai 2016
2 248
Corsier-sur-Vevey (Vaud)
Essaies d'écrire le fichier, toi-même, à la main.
 
jpbbricole
jpbbricole
Compagnon
26 Mai 2016
2 248
Corsier-sur-Vevey (Vaud)
Essayes avec ce fichier
 
Fichiers joints
nopxor
nopxor
Compagnon
27 Mai 2010
1 412
Yvelines
Bonsoir,

Si la carte électronique de la carte SD ressemble à celle là, l'adaptation des tensions est inutile car les composants qui effectuent cela sont présents.
module microSD.jpg


Ci-joint un autre programme de test plus sommaire, le premier fourni m'ayant donné un résultat partiel.
 
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #18
Bonjour et merci Nopxor pour cette nouvelle mouture.

Malheureusement cela ne fonctionne toujours pas.
Ce doit certainement être mon module carte SD qui est défectueux, c'est un comme celui-ci :

sku_297664_1.jpg

J'en ai commandé un autre. Je vais attendre de la recevoir pour faire de nouveaux essais.
Quelle est le meilleur module lecteur de carte SD ?
Merci encore à vous deux pour votre participation.

Bonne journée à tous !

JC.
 
Dernière édition:
J
JMe87
Nouveau
5 Avr 2015
47
Bonjour a tous, bonjour Jean-Claude,
sur cette carte il n'y a rien, juste un regulateur 5V > 3V3 avec ses capas et 4 resistances de protection.
Si tu es parvenu, une seule fois, a ecrire et lire avec ce module, il ne faut pas l'incriminer. Il est bon.
Ton probleme viens soit de la carte SD, de la facon dont elle est formatee ou de ton programme.
Que comptes-tu faire avec ce montage ?. Je parie que tu essaies de rendre ton diviseur "commandable" par un Arduino.
Si oui, tu es de nouveau en train de chercher midi a quatorze heure, ce qui est un comble pour un horloger !!
Comme je te l'ai deja dis, un Arduino Uno est capable de gerer tout seul tous les axes d'une fraiseuse CNC pour tailler des roues ou autre pinions.

Bon dimanche de Paques a tous

Jacques
 
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #20
Bonjour Jacques,

Je vais essayer une autre carte SD, dès que possible. Je la formate en FAT 32, comme suggéré sur de nombreux sites.

Que comptes-tu faire avec ce montage ?. Je parie que tu essaies de rendre ton diviseur "commandable" par un Arduino.
Bingo !

J'image que l'Arduino est sûrement capable de gérer tout tout seul, mais cela devient une "usine à gaz" que je maîtrise pas encore.
Je système de diviseur que j'au mis au point il y a 10 ans avec un PIC et le PC donne d'excellents résultats. J'essaie donc, dans un premier temps, de le reproduire avec l'Arduino.
Ce sera un diviseur "programmable". Les données seront inscrites sur une carte SD, à partir d'un PC.
Cette méthode est certainement critiquable, mais c'est la mienne et elle me donne d'excellents résultats. Elle me permet aussi de m'initier à l'Arduino.

Bon dimanche.

JC.
 
J
JMe87
Nouveau
5 Avr 2015
47
Une usine a gaz ??

En realite, c'est BEAUCOUP plus simple que ce que tu tentes de faire. 5 lignes de code et c'est tout. Pas besoin de PC, tableur, transfert de carte SD etc etc.
Le but d'un forum comme celui-ci c'est de vulgariser la technique, c'est a dire la rendre accessible au plus grand nombre et non pas de compliquer au maximum sous pretexte que cette solution donnait satisfaction, sous Basic, il y a 10 ans, au risque de degouter ceux qui seraient tentes de s'y mettre.

Bon dimanche

Jacques
 
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #22
J attends ton sketch.
Merci d avance.
JC.
 
jpbbricole
jpbbricole
Compagnon
26 Mai 2016
2 248
Corsier-sur-Vevey (Vaud)
Salut JCS

Une idée me fait tic-tac dans la tête!
Puisque tes données sont générées depuis Excel, pourquoi ne pas les envoyer directement depuis Excel sur l'Arduino.
Serais-tu tenté par l'aventure?
Je suis prêt à t'aider, pas à pas, si nécessaire. As-tu des connaissances en macro VBA (pas forcément nécessaire mais ça peut aider)?

Cordialement
jpbbricole
 
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #24
Salut à tous,

@ Jpbbricole,

Ton idée est excellente ! Il me semble que tu en as déjà parlé. Mais je n'avais pas compris que l'on pouvait ainsi gérer plusieurs nombres à la suite.
Je suis preneur et je pense que cela intéressera beaucoup de monde.

Le problème, lorsque l'on fait une diviseur numérique est qu'il faut "tricher" en ajoutant ou retranchant un pas de temps en temps, pour certains nombres de dents, si l'on veut qu'après un tour complet de broche, on se retrouve exactement au point de départ.

Voilà comment j'explique et je traite le problème ici, dans la seconde moitié :

http://sulka.fr/diviseur_numerique/cn.pdf

Il me tarde de voir le "5 lignes" que Frère Jacques va nous pondre, peut-être, à son retour de Rome !

En realite, c'est BEAUCOUP plus simple que ce que tu tentes de faire. 5 lignes de code et c'est tout. Pas besoin de PC, tableur, transfert de carte SD etc etc.
Joyeuses Pâques !
 
Dernière édition:
J
JMe87
Nouveau
5 Avr 2015
47
Bonjour a tous, bonjour Jean-Claude,
je suis ton projet depuis 10 ans et je m'apercois que tu n'a pas encore compris la notion d'arrondi !!

Voici la demarche a suivre avec un Arduino :
- introduire dans le programme le nombre de pas pour faire 360° (par exemple 40x200 = 8000)
- lancer le programme et introduire le nombre de division a effectuer (je vais y revenir) (par exemple 37)
- l'Arduino calcule l'angle de rotation correspondant a 1 pas (ici 360/8000 = 0.045000)
- il calcule l'angle a effectuer pour le premier deplacement (ici 360/37 = 9.729730)
- il divise par l'angle correspondant pour trouver le nombre de pas a effectuer (ici 9.729730 / 0.045000 = 216.216216)
- il arrondi ce nombre en prenant la partie entiere du nombre de pas auquel on ajoute 0.5 ( int(216.216216 + 0.5) = 216)
- il envoie ces pas sur la sortie (ici 216)
- il memorise cette nouvelle valeur comme etant la "position actuelle"
- il calcule le deuxieme deplacement, en retirant de la "position a atteindre" la "position actuelle" et deplace
- ainsi de suite pour tous les deplacements.

L'erreur maximale pour chaque position est egale au maximum a 1/2 pas et il n'y a pas d'erreur cumulative puisque on recalcule tout a chaque deplacement.

La seule "difficulte" est d'introduire le nombre de division a effectuer.
Plusieures solutions :
- liaison vers un PC, bof bof ce n'est pas le but recherche
- un petit clavier 4x4 boutons
- 3 petits encodeurs rotatifs 10 positions avec sortie BCD pour avoir assez de pins avec un Arduino Uno (si je devais realiser un diviseur, c'est la solution que je choisirais parce que j'ai le materiel de stock)
- 3 commutateurs rotatif 10 sorties mais alors il faut passer a l'Aduino Mega pour avoir assez de pins
- soit un petit module avec un display LCD 2 lignes et les 5 boutons poussoirs (haut, bas, gauche, droite et enter). Cette solution n'est pas tres ergonomique mais faisable et tres bon marche. C'est la solution utilisee dans l'exemple ci-dessous.
- soit le plus classe, un display TFT 240*320 avec touch screen, dispo sur Aliexpress pour 5€, mais demande un travail certain pour dessiner et programmer les differents ecrans

Pour ceux qui voudraient faire un essai, vous trouverez ici ( http://www.liming.org/millindex/ ) toutes le explications, liens de chargement du programme, video de demo, fichier du percage du boitier etc etc. J'ai teste et cela marche mais pas tres ergonomique.

Bon courage a ceux qui voudraient experimenter.

Jacques

N.B. pour Jean-Claude :
- je n'ai pas l'usage d'un diviseur
- j'ai une fraiseuse CNC 4 axes avec Mach3 installe. Si besoin, et je l'ai deja fait, j'ecris un petit programme en Gcode pour faire le taillage desire.
 
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #26
Jacques,

Lorsque quelqu'un souhaite prendre un autre chemin que moi, je respecte son choix et je lui souhaite bon voyage !
La fin justifie les moyens.

Ton "5 lignes" est toujours bienvenu !

Joyeuses Pâques.
 
Dernière édition:
jpbbricole
jpbbricole
Compagnon
26 Mai 2016
2 248
Corsier-sur-Vevey (Vaud)
Salut JCS
Je suis preneur...
Alors, c'est parti!
Ce que je te propose, pour débuter, c'est de se baser d'un exemple déjà fait, Console moteur PAP, qui contient déjà une possibilité de dialogue pour commander un MPAP, via le moniteur de l'IDE de l'Arduino:

PapMove=100 // Déplacements par pas, positif ou negatif
PapRotate=180 // Déplacements degrés, positif ou negatif
PapRevolve=7 // Déplacements par tours, positif ou negatif

Sauf, que dans ce cas, c'est la feuille Excel qui, via le port COM, va envoyer ces ordres avec des données issues de ton tableau.

Une fois que c'est en route, on pourras toujours ajouter de nouveaux ordres voire même créer un programme de gestion du MPAP à ta convenance.

Au niveau de la feuille Excel, je vois les choses ainsi:
upload_2017-4-17_14-14-23.png

A toi de remplir le tableau à ta guise, seul condition, que la cellule marquée (1ère. de la liste) se nomme comme le texte du bouton qui commande, de cette façon:
Bouton Dents 11 Nom de la première cellule Dents_11, et que la liste soit ininterrompue.

Si ça joue pour toi.....

Cordialement
jpbbricole
 
Dernière édition:
J
JMe87
Nouveau
5 Avr 2015
47
Jean-Claude,
Tu veux apprendre a utiliser l'Arduino. OK ?
Tu veux automatiser ton diviseur avec un Arduino par manque de place dans ton atelier. OK ?
Si tu veux commander une "machine" avec un Arduino, le minimum c'est d'avoir un display et un clavier. Dont cout : 2,57€. Supportable ?
Tu as besoin d'un soft. je t'envoie le lien et te confirme, apres l'avoir essaye, que cela fonctionne et que c'est exactement ce dont tu as besoin.
Que veux-tu de plus ?

Jacques
 
JCS
JCS
Compagnon
22 Juin 2007
2 556
Cher
  • Auteur de la discussion
  • #30
Grand merci à Jpbbricole pour toutes ces infos et le partage.
Je vais prendre un peu de recul et me replonger dans l'excellente discussion concernant le dialogue Arduino <=> Excel.
J'attends aussi des nouveaux lecteurs de carte CD
J'espère aussi le génial sketch de JMe87.

Je vous tiendrais au courant de l'avancement des choses.

Hier j'ai encore utilisé mon diviseur à PIC, pour retoucher avec succès une roue de rencontre de comtoise martyrisée par
un horloger de la "dernière heure".

@+
JC.
 
Haut