Le module USB-I2C de Devantech est un convertisseur de protocole I2C pour un usage USB. Il permet de communiquer avec des circuits situés sur un bus I2C par l’intermédiaire d’une liaison série (notre usage principal) ou servir à récupérer des valeurs numériques pour 2 entrées analogiques.
Contrairement aux convertisseurs USB-RS232 qui permettent de construire une "vraie" liaison série de manière transparente du point de vue de votre programme, il s’agit ici de transformer des octets envoyés au module connecté sur un port USB en des trames I2C selon un protocole propre à ce module.
Il y a donc derrière le connecteur USB un convertisseur série classique (FTDI) qui va fournir vos octets via l’UART d’un microcontrôleur (en l’occurence un PIC Microchip 16F587) qui va lui même assurer la communication avec le bus I2C et les circuits que vous aurez connecté sur les broches.
C’est donc une mini-carte à µC intégrant tout ce qu’on a d’habitude, mais sans le superflu. D’ailleurs les ingénieurs de Devantech ont profité des seulement 5 broches de connexion pour rajouter une entrée/sortie numérique et deux entrées analogiques (que nous avons déjà utilisé lors du test de l’ADXL311).
Installation du pilote
Le convertisseur série FTDI utilise des pilotes de port série virtuel (ou VCP drivers en anglais) disponibles ici pour les différents Windows ou Mac. Pour Linux, ils sont également disponibles mais vérifiez d’abord si votre distribution ne gère pas nativement la puce de conversion : c’est le cas du noyau 3 pour la Ubuntu 11.10 et supérieures.
Vérification du fonctionnement
Pour éviter tout doute (est-ce que mon driver usb est correctement installé - c’est un simple FTDI), on va commencer par faire allumer et éteindre la led située sur la carte. Vous n’avez donc pas besoin de matériel supplémentaire pour faire ce test. Lorsque vous branchez le module, une led rouge s’éclaire indiquant la mise sous tension. On va l’éteindre.
1) Connectez le module à votre ordinateur, installez le driver si nécessaire
2) Ouvrez un logiciel de communication série (Hyperterminal, Terminal, Docklight...)
3) Paramétrez la communication : 19200 / 8 bits de data / pas de parité / 2 bits de stop (oui 2 !)
Vous êtes prêts à envoyer vos premiers octets (donnés ici en hexadécimal) :
0x5A | 0x10 | 0x00 | 0x00 |
– Le premier octet est le mode souhaité (ici, 5A = programmes spécifiques par opposition à I2C)
– Le second octet est le programme souhaité (0x10 est justement la sélection des entrées/sorties)
– Le troisième octet donne les valeurs : xxxx xxx0 (on se moque des 7 dernières, c’est le bit 0 qui gère la led
– Le quatrième n’a pas de signification mais est obligatoire
Pour la rallumer, très simple on passe le bit 0 du troisième octet à 1 :
0x5A | 0x10 | 0x01 | 0x00 |
Mise en garde
Attention, c’est désormais officiel, le module USB-I2C de Devantech ne permet pas de communiquer avec tous les circuits I2C.
Par exemple la led RGB "BlinkM" qui pourtant utilise le protocole I2C de manière standard n’est pas accessible : le mode "multi caractères sans registres" n’est pas supporté par ce module (actuellement en version 6).
Merci aux étudiants de Polytech’Nice qui ont continué nos tests (cet article présentait auparavant nos différentes tentatives de connexion) et ont obtenu une confirmation du créateur de la BlinkM lui-même, Tod E. Kurt.
Communications I²C
Les bases de l’I2C
Pour faire court, l’I2C est un protocole de communication utilisant deux fils (Atmel l’appelle d’ailleurs Two Wire Interface pour faire plus "roots"... ou pas payer de droits sur le nom I²C ?) transportant les données (ligne ’data’) à lire en fonction d’une horloge partagée (ligne ’clock’). Philips l’a créé pour faire communiquer ses circuits à l’intérieur d’un magnétoscope, donc son utilisation en robotique est fidèle à ses origines : moteurs, capteurs, circuit de contrôle. On le trouve aussi dans les PC (Intel l’appelle SMBus pour System Management Bus, histoire de pas laisser penser qu’un ordinateur est aussi bête qu’un magnétoscope).
Ce qui fait surtout la différence, pour nous qui connaissons surtout la liaison série en double sens réception/émission, tient en deux points :
– c’est un bus, donc plusieurs circuits connectés (chouette !)
– pas d’égalité entre les circuits : il y a un maître et des esclaves (zut, va falloir gérer ça).
Forcément on va donc devoir gérer :
– des adresses pour chacun des circuits
– des temps de parole pour attendre les réponses des esclaves
Le bus I2C fonctionne sur des lignes à collecteur ouvert, on utilise des résistances de tirage pour donner un niveau haut, la masse commune servant de niveau bas.
Selon la doc du module USB-I2C disponible (en anglais) sur le site Robot-Electronics, tout est déjà prêt pour connecter sur les broches un circuit gérant l’I2C sans plus d’électronique :
– alimentation 5v (70 mA) fournie par la liaison USB
– résistances de pull-up 4,7 kOhms déjà présentes sur la carte
– la carte gère les séquences start/restart/stop et les acknowledges
Principes du module
On apprend dans la documentation du module qu’il y a différents modes de communication I2C :
– écriture/lecture d’un octet pour un équipement non enregistré
– lecture de plusieurs octets sans utiliser de registre
– écriture/lecture d’octets pour un équipement avec adresse d’1 octet
– écriture/lecture d’octets pour un équipement avec adresse de 2 octets
Cette information est surprenante, car on avait bien intégré cette notion d’adresse mais pas de plusieurs octets. En fait, il s’agit de l’adresse des registres internes de certains circuits (exemple typique, une mémoire). Quand aux équipements "non-enregistré", il s’agit de l’assignation d’une adresse universellement associée à un circuit, mis en place par Philips pour tous les circuits bénéficiant de l’appellation I²C. Ce n’est pas le cas de la BlinkM.
Les trames série à envoyer au module prennent donc la forme suivante :
– un octet de commande indiquant le mode de communication
– l’adresse I2C de l’équipement
– 0, 1 ou 2 octets selon la présence et le type de registre interne
– 0 ou 1 octet indiquant le nombre d’octets de données
– les octets de données en cas d’écriture
Utilisation du module
SCL et SDA sont les noms des lignes d’horloge (CLock) et de données (DAta) du bus.
A suivre...
Vos commentaires
# Le 22 septembre 2022 à 05:50, par assidu En réponse à : Convertisseur USB I2C
Article super intéressant, merci
Répondre à ce message
# Le 4 juillet 2013 à 14:28, par Julien H. En réponse à : Convertisseur USB I2C
Un nouveau convertisseur USB-I2C est disponible mais cette fois distribué en France par Génération Robots, ce qui le rend accessible aux établissements scolaires ayant une contrainte de fournisseurs.
Convertisseur Humarobotics par Génération Robots
Répondre à ce message