aide sur protocole I2C

bonjour a tous,

je vous expose mon probleme.
j'ai en projet de réaliser un ensemble domotique complet dans mon habitation qui mélangera du rf433 et du filaire.
autant pour la liaison radio je m'en sort, autant je galere pour faire communiquer differentes cartes arduino.
je souhaite utilisé le protocole I2C et a terme faire communiquer plusieurs uno, méga et nano entre elles.

voici ou j'en suis, j'arrive a peut pres a me servir de master_writer, c'est a dire que j'arrive a allumer une led sur une autre carte, donc l'envoi d'instructions, on va dire que ça va.
la ou je bloque, c'est que j'aimerai pouvoir demander a un esclave dans quel état est telle ou telle de ses sorties.
en gros, j'aimerai que le master dise "coucou toi N° 7 comment est ta sortie 3" voir meme "coucou toi N°12 comment sont toutes tes sorties" et enfin, pourquoi pas "coucou toi N°2 quelle est la valeur que tu as de stockée en "x" "

quelqu'un peux me mettre sur une piste ?

merci d'avance.

Utiliser ça : Wire - Arduino Reference sur la carte esclave pour qu'elle génère sa réponse.
Dans les exemples livrés avec l'IDE il y a ce programme Fichier/Exemples/Wire/slave_sender

merci bien, oui j'ai déja bidouillé avec les fichiers exemples et j'arrive a faire de tres legeres modifications sur ceux-ci.
mon probleme viens du fait que je souhaite que mon "master" envoi des "ordres" via la commande Wire.write mais également a certains moments qu'il fasse des requetes afin de connaitres certaines valeurs de certaines cartes esclaves.
et la, c'est le drame, je n'arrive pas a "mélanger" 'writer' et 'reader'.

je creuse...

merci de votre aide.

Bonjour,

Une remarque concernant l'I2C, dans mon système de domotique, j'avais utilisé l'I2C pour communiquer entre différents modules, chaque module est composé d'un arduino (nano ou méga). J'ai rapidement constaté que le système était constamment perturbé, comme j'avais mis des watchdog, cela ne posait pas trop de problèmes de fonctionnement, mais les processeurs étaient très régulièrement remis à zéro par les watchdog, le problème venait des liaisons I2C, j'avais notamment un câble qui faisait environ 1m50. J'ai modifié mes liaisons et je suis passé en RS 485.
Cela ne réponds pas directement à tes questions, mais en RS 485, non seulement tu as une liaison différentielle, donc bien moins sensible aux perturbations, mais en plus, tu travailles directement sur la liaison série, et tu peux assez facilement envoyer et recevoir des données. Si cela t'intéresse, je joints un petit tuto que j'avais rédigé sur le sujet.

Transmettre des données entre deux arduinos reliés par RS 485.pdf (249 KB)

bonjour Brisebee, tout d'abord merci de prendre du temps pour m'aider.
ce qui m'embete avec ta solution, c'est l'ajout d'un "shield" (homemade ou non), par contre je crois me souvenir qu'en rs485 on peux tabler sur de "grandes" distances, j'ignore quelle est la longueur max d'un bus I2C.
mon projet va necessité quelques dizaines de mettres de fils (rdc+2 étages avec une "rotonde" le long des murs de chaques étages). je pense utiliser du cable réseau a paires torsadées pour éviter les perturbations.

bref, de "grandes" distances avec uniquement les capacités internes des arduino, voila ce que je charche et je pensais que l'I2C pouvait convenir.

des avis ou des idées ?

I2C est l'acronyme de : Inter Integrated Cicuit.
L'I2C a été mis au point par Philips pour faire dialoguer des circuits intégrés appartenant à une même carte ou des cartes voisines.
L'I2C comme le RS232 mélange la couche physique et la couche logicielle.
Ce n'est effectivement pas étudié pour les "grandes longueurs" contrairement au RS485 qui n'est qu'une norme physique.

Bonjour,

68tjs:
Ce n'est effectivement pas étudié pour les "grandes longueurs" contrairement au RS485 qui n'est qu'une norme physique

En tant que tel pas pour les grandes distances, mais on peu utiliser des expanders.
J'ai des liaisons I2C sur plus de 200 m qui fonctionnent depuis des années.
@+

merci pour ces infos precieuses.

une question sur le bus I2C, est-ce que chaque élément joue un peu le role "d'ampli" ou bien est-ce la longueur totale qui compte, ça peut changer la donne sachant que mes cartes ne seront pas éloignées de plus de 4 ou 5m les unes des autres.

bon, question software, je n'arrive toujours pas a faire du bi-directionnel, j'essaie sans y parvenir de faire un truc du genre :

Master --> slave N°1 ==> allume ta sortie 4
master --> slave N°1 ==> allume ta sortie 7
master --> slave N°1 ==> comment sont tes sorties ?
slave N°1 --> master ==> mes sorties 4 & 7 sont allumées

master --> slave N°2 ==> comment sont tes entrées ?
slave N°2 --> master ==> mes entrées 1,2 et 6 sont actives

une idée ou un debut de sketch ??

L'I²C est un bus les cartes viennent se piquer dessus.
Il n'y a donc aucun effet de répétition/régénération du signal de la part des cartes.
La spécification du bus
Il faut aussi faire la distinction entre bus expander et bus extender.
Les bus expanders ce sont les boîtiers qui assurent l'interface entre l'I²C et le monde extérieur (lecture/écriture de discrets par exemple)
Les bus extenders assurent l'adaptation entre des tronçons de bus I²C. Le découpage du bus en tronçons permet de limiter localement la capacité du bus et autorise ainsi son allongement.

merci pour la doc et les infos.
selon toi mon projet est-il viable via ce type de bus ?

Je vais faire une réponse de Normand.

Personnellement, je ne choisirais pas l'I²C pour un long bus. La techno n'est pas prévue pour ça. Elle est mal protégé contre les perturbations en mode commun.
Maintenant, il y a des exemples de solutions qui fonctionnent comme exposé par d'icare.

L'intérêt de l'I²C c'est que les capteurs sont connectés directement sur le bus et on en trouve facilement dans le commerce.
Le choix du RS485 qui est plus pertinent dans le contexte présente l’inconvénient de nécessiter pour chaque capteur une alimentation locale et un peu d'intelligence pour gérer le bus.

ok, merci.

bon en gros il ne me reste qu'a faire des tests et determiner la longueur max utilisable (oui je suis tétu, I2C me semble vraiment pertinent pour mon projet).

bon la question du bus étant plus ou moins rélgée, partont sur le principe de l'utilisation d'un bus I2C.

quelqu'un aurai une idée de sketch pour faire ça (entre autre) :

Master --> slave N°1 ==> allume ta sortie 4
master --> slave N°1 ==> allume ta sortie 7
master --> slave N°1 ==> comment sont tes sorties ?
slave N°1 --> master ==> mes sorties 4 & 7 sont allumées

master --> slave N°2 ==> comment sont tes entrées ?
slave N°2 --> master ==> mes entrées 1,2 et 6 sont actives

merci de votre aide

que pensez-vous de ce schema et a quoi servent les deux resistances ??

Les deux résistances sont l'essence même de l'I2C.
Il y en a une sur la ligne horloge et une autre sur la ligne Data.
La norme I2C prévoit des collecteurs ou des drains ouverts.

Cela veut dire quoi ?
Cela veut dire que la résistance entre le collecteur (transistor bipolaire) ou le drain (transistor ?Fet) et l'alimentation positive ne fait pas partie du circuit intégré.
Cela veut dire aussi que puisque tous les colecteurs sont reliés à une résistance externe ils sont tous placés en parallèle.

Cette astuce est géniale car elle permet de réaliser une fonction OU très souple.
Avec cette astuce n'importe quel module I2C peut prendre la ligne et poser ses questions.

Mais le fait même que tu ai posé cette question montre que, bien que tu ai une préférence pour l'I2C, tu ne ne comprends pas vraiment comment elle fonctionne.
Je ne peux que te conseiller de lire le lien que t'as donné Fdufnews sur la norme I2C, inventée par Philips et maintenant gérée par NXP.

oui effectuvement je ne comprend pas gros chose a tous ça, je ne suis absolument electronicien, juste un bricoleur qui essai tant bien que mal a réaliser des trucs de ses petits doigts boudinés XD

quoiqu'il en soit, aprés avoir des tests et m'etre pas mal renseigné sur la toile, je doit me rendre a l'évidence, I2C n'est pas pour moi et je vais devoir m'orienter vers le RS485 comme le suggérait certains membre dès le debut.

ce sujet est donc terminé et peux par consequent etre fermé.

je vais regardé le RS485 et je pense ouvrir bientot (tres bientot) un nouveau sujet.

merci a tous pour votre patience et vos explications.