Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Autres constituants d’un robot > Les circuits spécialisés > Modules de communication filaire > Convertisseur USB I2C

Convertisseur USB I2C

jeudi 11 décembre 2008, par Julien H.


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.

PNG - 912.8 ko
Convertisseur vu du connecteur
PNG - 902 ko
Convertisseur vu de la prise USB

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 !)

PNG - 15 ko
PNG - 4.1 ko

Vous êtes prêts à envoyer vos premiers octets (donnés ici en hexadécimal) :

0x5A0x100x000x00

- 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 :

0x5A0x100x010x00

 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...


Voir en ligne : doc technique sur le site du constructeur

Portfolio

  • Exemple de BlinkM
  • Première phase : écriture de la commande
  • Seconde phase : lecture des 3 octets

Vos commentaires

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