Lire/Ecrire sur carte SD à partir de plusieurs cartes Arduino

Bonjour à tous,

Je voudrais savoir s'il est possible d'utiliser une carte Arduino Uno avec un module SD Libelium pour écrire sur une Carte SD et d'utiliser une seconde carte Arduino pour lire ce qu'on a écrit sur cette même carte SD?

J'ai commencé à tester en branchant le module SD sur la première carte arduino Uno entre les pin 8 et 13 + GND, et sur ma seconde carte arduino je ne branche pas ni la clock (13) et ni l'alimentation du module SD (8) mais je relie bien les masses ensemble. Pour effectuer mon test j'utilise la librairie SD et arduino 1.0.3 sous Mac. Je téléverse sur mes deux cartes l'exemple CardInfo.

Résultat : Il ne détecte pas ma carte SD sur la 2nd carte Arduino. Est-ce une erreur de branchement ou est-ce impossible de brancher deux cartes arduino à un même module SD?

Merci pour vos réponses :wink:

Ce n'est pas impossible a priori (pas testé) mais

  • Il faut que chaque arduino puisse fournir SCK, DI, DO et CS. Chaque Arduino va discuter avec la carte SD avec sa propre clock, ses propres date et son propre CS.
    ==> Implique une gestion d'isolation : soit avec des buffers externes, soit en "retournant" les broches en entrée pour faire un équivalent de haute-impédance
  • Et surtout il faut une communication entre les 2 Arduino pour savoir qui accède à la carte SD : gestion de jeton, demande/réponse

D'accord merci pour cette réponse.

Par contre je viens de voir le poste suivant : Arduino Forum
C'est peut-être une solution pour moi : Effectuer une connexion entre mes deux cartes par échange de données Tx et Rx
Ensuite je branche mon module SD sur la carte "Transmission" et je peux surement récupérer des données sur la carte "réception"?

Bonjour,

C'est un cas typique de gestion d'une ressource partagée.

Tu as deux solutions :

  • utiliser une troisième carte arduino ayant l'accès exclusif à la carte sd et servant de tampon pour les demandes de lecture/écriture (principe d'un serveur sql par exemple)
  • utiliser 2 buffers logique "tri-state" pour couper physiquement la connexion d'une carte pendant que l'autre parle + système de mutex (hardware) pour éviter les conflits

Quitte à passer par plusieurs cartes pourquoi ne pas faire un truc dans le style:

Shield SD <-> Carte 1 (I2C) <-> Carte 1 à Carte x

A ce moment la tu partage le même bus entre cartes et tu en a une exclusivement sur la SD. C'est comme ça que je ferais moi.
Sinon t'a les liaisons type série mais la pour gérer les priorités et les colisions c'est moins facile qu'en I2C.

Geeks:
Quitte à passer par plusieurs cartes pourquoi ne pas faire un truc dans le style:
Shield SD <-> Carte 1 (I2C) <-> Carte 1 à Carte x
A ce moment la tu partage le même bus entre cartes et tu en a une exclusivement sur la SD. C'est comme ça que je ferais moi.

Ça reviens à faire comme dans ma première solution, avec de l'i2c pour communiquer entre arduino :wink:

Geeks:
Sinon t'a les liaisons type série mais la pour gérer les priorités et les colisions c'est moins facile qu'en I2C.

Pour éviter les collisions il existe un moyen simple, tu gardes deux broches libre, une en INPUT et une en OUTPUT.
-> [in carte 1 out] -> [in carte 2 out] -> [in carte 3 out] ---

Si INPUT = LOW tu attends, sinon tu peut (pas obligé) passer ton output à LOW et travailler, quand tu as finit tu la repasse à HIGH pour que le module suivant puisse travailler si besoin.
Ça reviens à faire une sorte de "token ring" hardware.

Merci pour votre aide du coup je me suis rabattu sur un simple échange de données TX/RX.

Oui, mais je ne sait pas si tu peux combinés plusieurs "TX/RX", soit une liaison GPIO Série classique, sur plusieurs cartes. En radio, par interface, oui car la gestion de collision est incluse.

Mais pour ce cas particulier, l'I2C reste tout à fait indiqué.

Sinon, effectivement si tu chaîne avec une pin et un fil suiveur... Ça me rappel les cartes de pilotage de train miniature avec le fil noir "feeder". Il suivais le train, comme tu le fait là. Si ça te convien, c'est parfait. Mais c'est dommage de pas utilisé la technologie approprié. En plus tu y gagnerais en fiabilité et en simplicité de code. Mais c'est mon point de vue.

Bon et bien, bonne continuation.

Un port série ce n'est pas un bus à collecteur ouvert (LOW = 0v, HIGH = haute impédance).
Si tu relies tel quel plusieurs modules série sur un même port et que les deux parlent en même temps, si ils envoient LOW et HIGH = court-circuit = cramage des deux cartes.

cf How to Add Multiple Serial Connections to your Custom Arduino Board or What Those 1k Resistors Do « The Mind of Bill Porter