Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Programmation > Snippets > Communications et protocoles > Communication entre deux cartes

Communication entre deux cartes

mercredi 25 novembre 2009, par Julien H.

Pour les besoins d’un nouveau projet, je dois faire communiquer deux cartes [1] entre elles.

Il y a plusieurs raisons qui peuvent vous amener à faire ce choix :
- pas assez de puissance ou de place dans votre carte principale
- pas assez d’entrées/sorties (surtout le port série par exemple)
- communication à distance

Dans mon cas, il s’agit de la troisième possibilité mais le problème reste le même.

 Connexion matérielle

Pour faire communiquer deux circuits électronique, il faut les relier avec un moyen identique de chaque côté, donc il est nécessaire que les cartes soient compatibles.

Si on prend les deux mêmes cartes, ça peut simplifier le problème, mais il faut vérifier que la ressource n’est pas déjà utilisée. Exemple simple : prendre une seconde carte pour avoir le port série qui est utilisé sur la première... et vouloir les relier avec une liaison série (si si je l’ai déjà vu..).

Si on ne prend pas les mêmes cartes, il faut vérifier non seulement que le protocole de communication est le même (série UART, I2C, one-wire, SPI, ...) mais que les niveaux électriques sont les mêmes (5 volts contre 3,3 volts par exemple) et que les possibilités sont les mêmes (Bluetooth série contre Bluetooth HID par exemple).

Dans mon cas, je vais utiliser deux cartes Arduino avec une liaison série entre les deux (sans fil avec des XBee) car je n’ai pas besoin de communiquer avec un PC. Sinon, j’aurais utilisé de l’I2C, et si vous me le demandez je ferai aussi un exemple avec l’I2C.

 Modes d’échange

Il existe plusieurs façons d’échanger de l’information.

Mémoire partagée

La plus simple consiste à avoir une mémoire commune : l’écriture et la lecture dans cette mémoire se font de manière asynchrone par les programmes exécutés, et la communication est invisible du point de vue du code principal.

Cette mémoire peut être réellement partagée, comme dans le cas de deux microcontrôleurs sur la même carte, ou dans la même puce (Propeller à 8 coeurs par exemple) mais quand les deux cartes sont séparées, il faut reproduire ce mécanisme avec le moyen de communication choisi.

La communication est donc toujours bien présente et il faut la coder proprement, car elle va influer sur la fraicheur de l’information disponible et sur les droits d’accès en écriture/lecture.

Par contre l’avantage est que chaque carte est indépendante quant aux actions qu’elle exécute : à tout moment une information peut être consommée pour une action associée.

Exemple : pour afficher un message envoyé par la première carte, la seconde n’a pas à se synchroniser et peut décider d’afficher le message en cours dans sa mémoire au moment où elle le souhaite (selon la fréquence de rafraichissement nécessaire et suffisante pour le lecteur du message).

Maitre/esclave

On peut également échanger des informations entre les cartes en donnant des rôles différents : une carte maître qui décide quand la transmission a lieu et une carte esclave qui est à l’écoute du maître.

L’intérêt principal est qu’on peut mettre plusieurs esclaves (si la connexion matérielle le permet). Et l’inconvénient majeur (mais il est intrinsèque au choix d’un tel mode) est que la carte esclave doit attendre que le maitre lui parle. Si de l’information est prête à envoyée, l’esclave doit attendre que son maître la lui demande.

Ce mode peut également servir pour piloter (choisir & synchroniser) des actions, et pas seulement pour communiquer de l’information.

Exemple : la première carte contient l’intelligence artificielle dite "de haut niveau" qui décide ce qu’il faut faire et quand il faut faire, et s’adresse à la seconde carte, esclave, qui ne fait rien d’autre que d’attendre les consignes et de les traiter dès qu’elles arrivent.

Communication bidirectionnelle

Enfin, on peut également décider d’avoir une communication équivalente sur chacune des cartes : les deux cartes émettent quand elles le veulent et en contre-partie se mettent à l’écoute de l’autre. Bien entendu la contrainte matérielle est ici très forte, et il faut tenir compte de la perte possible d’information (si le matériel n’est pas adapté à la fréquence de communication, en l’absence d’un dispositif de contrôle).

Exemple : la première carte fait des mesures et contrôle des moteurs. Elle envoie ses informations de mesure en permanence à la seconde carte qui traite cette information afin d’en déduire des actions sur les moteurs qu’elle renvoie à la première qui les exécute au fur et à mesure.

 Comment choisir

Tout d’abord, il faut se persuader que ces trois modes ne sont pas vraiment différents et qu’ils ne dépendent pas autant qu’on peut le croire du matériel. Bien sûr dans la communication électronique entre composants, l’I2C va être en mode master/slave et l’UART en mode bidirectionnel (..RT = receive & transmit), mais ce n’est pas pour ça que dans votre code vous devez poursuivre ce mode. Il est tout à fait possible de reproduire une mémoire partagée avec une communication maitre/esclave, avec un pooling permanent du maitre sur l’esclave pour recopier dans la première carte ce que la seconde a mis à disposition, sans que votre code principal ne s’aperçoive de ce fonctionnement.


Si vous devez choisir, c’est en fonction de votre objectif fonctionnel et des contraintes techniques (temps de calcul, fréquence de transmission, risques d’intégrité des données).

Si vous avez une connexion I2C et peu de ressources, restez en mode maitre/esclave. Si vous avez une connexion UART mais que vous devez contrôler le moment précis de réception d’une information, reproduisez le mode maitre/esclave en envoyant d’abord une demande de la carte 1 vers la carte 2 qui répondra aussitôt à la manière d’un esclave. Il s’agit d’une communication dite "de scrutation" ou polling.

Un cas particulier se présente quand vous n’êtes pas sûr de savoir ce que vous allez connecter comme seconde carte, notamment si vous voulez pouvoir connecter des équipements de contrôle dont vous ne maîtrisez pas le fonctionnement. Dans ce cas, il est fréquent (et en plus très simple) d’envoyer de l’information en continu.

Mais ce n’est pas forcément la panacée. Si vous ne souhaitez pas synchroniser vos deux cartes, reproduire une mémoire partagée est possible même avec une communication I2C ou UART (série), en choisissant la méthode d’échange (polling ou envoi continu).


[1le mot carte désigne une carte électronique programmable, pour désigner pas seulement un microcontrôleur ou un microprocesseur mais l’ensemble du circuit électronique. Arduino, Wiring, ICmega8, Pobot CNP, MR-163, AVR Butterfly sont des exemples de telles cartes.

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici
  • Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document