Tout sur le bus Arduino I2C

Bus Arduino I2C

Avec Arduino peut créer un grand nombre de projets comme vous l'avez vu si vous lisez Hwlibre, programmer le microcontrôleur de manière simple. Mais entre les connexions analogiques et numériques de cette carte hardware libre, il y en a qui sont encore quelque peu méconnus de nombreux débutants, comme le véritable potentiel des connexions PWM, du SPI, des broches RX et TX du port série, ou du bus I2C lui-même. Par conséquent, avec cette entrée, vous pourrez au moins savoir tout ce dont vous avez besoin sur I2C.

Avec le bus I2C vous pouvez connecter et utiliser de nombreux périphériques tiers dotés de ce type de protocole pour communiquer avec la carte Arduino. Entre eux, vous pouvez connecter des accéléromètres, des écrans, des compteurs, des boussoles et bien d'autres circuits intégrés grâce à cette invention Philips.

Qu'est-ce que I2C?

I2C fait référence au circuit inter-intégré, c'est-à-dire un circuit inter-intégré. Il s'agit d'un bus de communication de données série développé en 1982 par la société Philips Semiconductors, qui s'appelle aujourd'hui NXP Semiconductors après s'être débarrassée de cette section. Dans un premier temps, il a été créé pour les téléviseurs de cette marque, pour communiquer plusieurs puces internes de manière simple. Mais depuis 1990, l'I2C s'est répandu et est utilisé par de nombreux fabricants.

Actuellement utilisé par des dizaines de fabricants de puces pour plusieurs fonctions. Atmel, le créateur des microcontrôleurs pour cartes Arduino, a introduit la désignation TWI (Two Wired Interface) à des fins de licence, bien qu'elle soit identique à I2C. Mais en 2006, le brevet original a expiré et n'est plus soumis au droit d'auteur, donc le terme I2C a été réutilisé (seul le logo continue d'être protégé, mais sa mise en œuvre ou l'utilisation du terme n'est pas restreinte).

Détails techniques du bus I2C

Bus I2C

El Le bus I2C est devenu un standard de l'industrie et Arduino l'a implémenté pour la communication avec les périphériques qui en ont besoin. Il n'a besoin que de deux lignes ou câbles pour son fonctionnement, l'un pour le signal d'horloge (CLK) et l'autre pour l'envoi de données série (SDA). Ceci est avantageux par rapport à d'autres communications par rapport au bus SPI, bien que son fonctionnement soit un peu plus complexe en raison des circuits supplémentaires requis.

Sur ce bus chaque appareil qui y est connecté a une adresse utilisé pour accéder à ces appareils individuellement. Cette adresse est fixée par le matériel, en modifiant les 3 derniers bits via des cavaliers ou des commutateurs DIP, bien que cela puisse également être fait par logiciel. Chaque appareil aura une adresse unique, bien que plusieurs d'entre eux puissent avoir la même adresse et il peut être nécessaire d'utiliser un bus secondaire pour éviter les conflits ou le changer si possible.

De plus, le bus I2C dispose d'un Architecture de type maître-esclave, c'est-à-dire maître-esclave. Cela signifie que lorsque la communication est démarrée par un appareil maître, il pourra envoyer ou recevoir des données de ses esclaves. Les esclaves ne pourront pas initier la communication, seul le maître peut le faire, et les esclaves ne peuvent pas non plus se parler directement sans l'intervention du maître.

Si vous plusieurs professeurs dans le bus, un seul peut agir simultanément en tant que professeur. Mais cela n'en vaut pas la peine, car le changement d'enseignant demande une grande complexité, il n'est donc pas fréquent.

Gardez à l'esprit que le le maître fournit le signal d'horloge pour synchroniser tous les appareils sur le bus. Cela élimine le besoin pour chaque esclave d'avoir sa propre montre.

Le protocole de bus I2C prévoit également l'utilisation de résistances de rappel dans les lignes de tension d'alimentation (Vcc), bien que ces résistances ne soient généralement pas utilisées avec Arduino pull-up parce que les bibliothèques de programmation comme Wire active les internes avec des valeurs de 20-30 k. Cela peut être trop doux pour certains projets, par conséquent, les fronts montants du signal seront plus lents, de sorte que des vitesses plus faibles et des distances de communication plus courtes peuvent être utilisées. Pour corriger cela, vous devrez peut-être définir des résistances de tirage externes de 1k à 4k7.

signal

Signal I2C

La cadre de communication dont un signal de bus I2C est constitué des bits ou états (ceux utilisés dans Arduino, puisque le standard I2C en autorise d'autres):

  • 8 bits, 7 d'entre eux adresse de l'appareil esclave auquel vous souhaitez accéder pour envoyer ou recevoir des données à partir de celui-ci. Avec 7 bits, jusqu'à 128 adresses différentes peuvent être créées, donc 128 appareils peuvent théoriquement être accessibles, mais seulement 112 peuvent être accédés, puisque 16 sont réservés à des usages spéciaux. Et le bit supplémentaire qui indique si vous voulez envoyer ou recevoir informations sur le périphérique esclave.
  • Il est également un peu de validation, s'il n'est pas actif, la communication ne sera pas valide.
  • Puis le octets de données qu'ils veulent envoyer ou recevoir par les esclaves. Chaque octet, comme vous le savez, est composé de 8 bits. Notez que pour chaque 8 bits ou 1 octet de données envoyées ou reçues, 18 bits supplémentaires de validation, d'adresse, etc. sont nécessaires, ce qui signifie que le bus est très limité en vitesse.
  • Un dernier peu de validation de la communication.

De plus, la fréquence d'horloge pour les transmissions sont de 100 Mhz en standard, bien qu'il existe un mode plus rapide à 400 Mhz.

Avantages et inconvénients du bus I2C

Les avantage sont:

  • La simplicité en n'utilisant que deux lignes.
  • Il dispose de mécanismes pour savoir si le signal est arrivé par rapport à d'autres protocoles de communication.

Les d'inconvénients sont:

  • Vitesse transmission assez faible.
  • Ce n'est pas un duplex intégral, c'est-à-dire que vous ne pouvez pas envoyer et recevoir simultanément.
  • N'utilise pas la parité ni aucun autre type de mécanisme de vérification pour savoir si les bits de données reçus sont corrects.

I2C sur Arduino

Bus Arduino I2C

En Arduino, selon le modèle, les broches qui peuvent être activées pour utiliser ce bus I2C varient. Par exemple:

  • Arduino UNO, Nano, MiniPro: A4 est utilisé pour SDA (données) et A5 pour SCK (horloge).
  • Mega Arduino: broche 20 pour SDA et 21 pour SCK.

N'oubliez pas que pour l'utiliser, vous devez utiliser la bibliothèque Fil.h pour vos codes IDE Arduino, bien qu'il y en ait d'autres comme I2C y i2cdevlib. Vous pouvez lire les documents de ces bibliothèques ou nos articles sur les projets qui vous intéressent pour obtenir des codes de programmation.

Comment connaître l'adresse d'un appareil pour l'utiliser avec I2C?

Juste un dernier avertissement, et c'est que lorsque vous achetez des circuits intégrés de fabricants européens, japonais ou américains, vous indiquer la direction que vous devez utiliser pour l'appareil. Par contre, les chinois ne le détaillent parfois pas ou ce n'est pas correct, donc ça ne fonctionnera pas. Cela peut être facilement résolu avec un scanner d'adresses pour savoir dans quelle direction vous devez vous référer dans votre croquis.

La communauté arduino a créé ceci code pour scanner l'adresse et l'identifier D'une manière simple. Bien que je vous montre le code ici:

#include "Wire.h"
 
extern "C" { 
    #include "utility/twi.h"
}
 
void scanI2CBus(byte from_addr, byte to_addr, void(*callback)(byte address, byte result) ) 
{
  byte rc;
  byte data = 0;
  for( byte addr = from_addr; addr <= to_addr; addr++ ) {
    rc = twi_writeTo(addr, &data, 0, 1, 0);
    callback( addr, rc );
  }
}
 
void scanFunc( byte addr, byte result ) {
  Serial.print("addr: ");
  Serial.print(addr,DEC);
  Serial.print( (result==0) ? " Encontrado!":"       ");
  Serial.print( (addr%4) ? "\t":"\n");
}
 
 
const byte start_address = 8;
const byte end_address = 119;
 
void setup()
{
    Wire.begin();
 
    Serial.begin(9600);
    Serial.print("Escaneando bus I2C...");
    scanI2CBus( start_address, end_address, scanFunc );
    Serial.println("\nTerminado");
}
 
void loop() 
{
    delay(1000);
}


Soyez le premier à commenter

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont marqués avec *

*

*

  1. Responsable des données: Miguel Ángel Gatón
  2. Finalité des données: Contrôle du SPAM, gestion des commentaires.
  3. Légitimation: votre consentement
  4. Communication des données: Les données ne seront pas communiquées à des tiers sauf obligation légale.
  5. Stockage des données: base de données hébergée par Occentus Networks (EU)
  6. Droits: à tout moment, vous pouvez limiter, récupérer et supprimer vos informations.