I2C est le protocole de bus ou la technologie via laquelle un microcontrôleur peut communiquer avec de nombreux capteurs ou actionneurs. Grâce au bon logiciel, vous pouvez également vous connecter et communiquer avec différents microcontrôleurs. Il n'y a généralement qu'un seul maître par bus I2C qui peut demander des données ou envoyer des données à un esclave via l'adresse appropriée.
Dans l'un de mes projets, je voulais ou je voulais connecter plusieurs microcontrôleurs entre eux. Plusieurs technologies de bus conviennent pour cela. Mais I2C est presque le seul à être directement pris en charge par à peu près tous les microcontrôleurs modernes sans exigences matérielles supplémentaires. Le choix s'est donc rapidement porté sur I2C.
Plusieurs microcontrôleurs étaient ou sont maintenant connectés les uns aux autres au moyen d'I2C. Le maître peut facilement envoyer une commande à chaque esclave individuel. Pour ce faire, l'adresse de l'esclave et la commande souhaitée sont simplement envoyées via le bus. Tous les esclaves écoutent ce qui se passe sur le bus, mais seul l'esclave avec l'adresse correspondante réagit également à la commande envoyée. Jusqu'ici, tout va bien.
Mais que se passe-t-il si le maître veut envoyer une commande à tous les esclaves ? Par exemple pour lancer une commande de façon synchrone sur tous les esclaves ? Avec deux ou trois esclaves, chaque esclave peut être informé individuellement. La vitesse de traitement est généralement si rapide que vous ne remarquez aucun écart de temps majeur entre les exécutions sur les esclaves individuels. Cependant, si vous utilisez cette méthode avec 100 esclaves, vous constaterez rapidement que le dernier esclave notifié démarre bien plus tard que le premier esclave.
La solution à ce problème est l'adresse de diffusion I2C. Il s'agit d'une adresse à laquelle chaque esclave du bus écoute. Pour l'activer, il vous suffit de définir un bit de contrôle. C'est du moins ainsi que cela fonctionne avec les Arduinos basés sur les processeurs Atmel. 🙂
La façon dont vous pouvez définir ce bit est décrite dans l'article suivant.
Activer la diffusion I2C pour les esclaves I2C
L'adresse de diffusion "0" est utilisée pour que tous les participants sur le bus I2C puissent être notifiés en général. Le zéro est donc fermement défini comme l'adresse pour les messages diffusés et ne doit pas être utilisé par un autre esclave.
Par défaut, cependant, un microcontrôleur ne répond pas à cette adresse. Celui-ci doit d'abord être activé en définissant le bit de commande correspondant. Tout ce que vous avez à faire est d'ajouter la ligne suivante à la fonction "setup()" de votre code de programme.
TWAR = (adresse << 1) | 1; // active l'écoute des messages diffusés
Par exemple, dans une fonction d'initialisation I2C complète, cela pourrait ressembler à ceci
void init_i2c() { Wire.begin(adresse); TWAR = (adresse << 1) | 1; // active l'écoute des messages diffusés Wire.onReceive(i2c_receive_event); Serial.print(F("I2C : esclave I2C initialisé à l'adresse : ")); Serial.println(adresse); }
Informations générales sur I2C et les interruptions
Un événement sur le bus I2C appelle toujours une interruption, qui interrompt le processus normal de votre microcontrôleur. L'exécution du programme passe ainsi brièvement du déroulement du programme normal à la routine d'interruption. Cependant, vous devriez garder votre séjour là-bas aussi court que possible. Par conséquent, il est "de pratique courante" de définir un "drapeau" dans la routine d'interruption. Ce "drapeau" n'est en fait qu'une variable booléenne, qui y est définie sur "true". De retour dans le flux de programme principal de votre microcontrôleur, vous pouvez maintenant vérifier régulièrement si cette variable est définie.
Si c'est le cas, vous pouvez maintenant lire les données ou les commandes reçues et réagir en conséquence.
Au fait : vous ne devez pas utiliser de commandes "Serial.print..." ou similaires qui prennent du temps dans les routines d'interruption.
Informations Complémentaires
http://forum.arduino.cc/index.php?topic=183699.0
http://www.gammon.com.au/forum/?id=10896&reply=1#reply1
Amusez-vous avec le projet
J'espère que tout a fonctionné comme décrit. Si ce n'est pas le cas ou si vous avez des questions ou des suggestions, faites-le moi savoir dans les commentaires. Je les ajouterai à l'article si nécessaire.
Les idées de nouveaux projets sont toujours les bienvenues. 🙂
PS Beaucoup de ces projets - en particulier les projets matériels - coûtent beaucoup de temps et d'argent. Bien sûr, je le fais parce que j'aime ça, mais si vous pensez que c'est cool que je partage l'information avec vous, je serais heureux d'un petit don au fonds du café. 🙂