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...
PoBot
Convertisseur USB I2C







Vos commentaires
# Le 21 janvier 2010 à 01:14, par Thomas
En réponse à : Convertisseur USB I2C
Bonjour Julien et toute l’équipe de Pobot.
Voilà plus d’une semaine qu’en vain j’essaie de piloter mes blinkm.
J’ai fouillé cherché fouiné bidouillé et ... rien !
Je vais essayer de m’expliquer : au branchement la blinkm est correctement alimentée, elle démarre avec sa séquence d’initialisation (random sur les couleurs) je peux discuter avec l’adapteur (firmware, allumage/extinction de la petite led rouge) mais avec la blink IMPOSSIBLE je recois parfois 00 parfois FF et pire parfois 01 à chaque test de commande que ce soit en broadcast adresse 0x00 ou bien adresse 0x09 ou encore 0x12 une fois qu’on a traité le "left-shift".
Que faire pour voir si le protocole de communication est ok ?
A terme j’aimerais brancher cet adapdateur sur un NSLU et piloter 3 blinkm montées en série avec une librairie C. Quelle librairie me conseillerez vous ?
Merci de vos réponses.
Répondre à ce message
# Le 21 mai 2011 à 22:05, par louizette
En réponse à : Convertisseur USB I2C
quelles sont les commandes pour gerer une pcf8583 et une EEprom 24c64 ??
merci
Répondre à ce message
# Le 22 mai 2011 à 23:55, par Julien H.
En réponse à : Convertisseur USB I2C
Bonjour,
Il faut considérer les documentations techniques et y retrouver les adresses de lecture et d’écriture.
Par exemple pour le PCF8583, c’est A0/A1 ou A2/A3 comme adresse selon la configuration, puis différents registres.
Cordialement,
Répondre à ce message
# Le 23 mai 2011 à 14:28, par ?
En réponse à : Convertisseur USB I2C
rebonjour,
j’ai realiser une carte i2c, elle contient plusieurs connecteurs, le premier pour le module i2c usb, le 2eme pour l carte easy pic 4(pic18f458 (portC : rc3 : SDA et rc4 : SCL, portB : RB0 : pour l’interruption du pcf) ,le 3eme pour le module RTC PCF8583 , et 3 eeproms 24c64, le tout relié en i2c.
et le coté usb relié au pc, j’ai installé le driver du module, il le reconnait, je veux configuer la pcf8583, et lire et ecrire dans l’eeprom( c’est des tests).
apres on va faire foncltionner le pic en maitre pour faire l’acqusition et le stockage de la temperature et d’ensoleillemen d’un panneau photovoltaique, puis connecter le pc le convertisseur usbi2c, la carte i2c, et l’easy pic, pour configurer la RTC en gestionnaire de temps et le pic en esclave. voilà en grosso .. merci
Répondre à ce message
# Le 8 juin 2011 à 14:19, par ?
En réponse à : Convertisseur USB I2C
rebonjour, on a reussi a faire eteidre et a rallumer la led, mais on arrive pas a envoyer des octets a notre eeprom via docklight ? si vous pouvez nous aider, merci.
Répondre à ce message
# Le 8 juin 2011 à 21:59, par Julien H.
En réponse à : Convertisseur USB I2C
Bonjour,
Quel est le mode d’accès à l’eeprom et quels sont les séquences d’octets que vous avez testé ?
Répondre à ce message
# Le 9 juin 2011 à 16:00, par ?
En réponse à : Convertisseur USB I2C
bonjour ; on a testé notre eeprom avec nos premiers octets : le mode 0x53(lecture/écriture) 0xa0( pour l’écriture) 0x00 (MSB)0x00(LSB) 0x40( pour 64 byte) 0xnn (pour les octets de donnée)et je veux envoyer une sequence mais j’arrive pas a avoir une idée sur les commandes, aidez moi s’il vous plait
Répondre à ce message
# Le 9 juin 2011 à 22:57, par Julien H.
En réponse à : Convertisseur USB I2C
C’est très simple : il ne faut pas utiliser 0x53 mais 0x56 ("0x56 Read/Write single or multiple bytes for 2 byte addressed devices, eeproms from 32kbit (4kx8) and up").
Répondre à ce message
# Le 10 juin 2011 à 01:17, par ?
En réponse à : Convertisseur USB I2C
ah oui merci ca a marché avec le 0x56, on a envoyé la trame suivante :
56 AA 00 05 03 da af 15
56 : la cmd
AA : adr du de l’eeprom+bit W/R (0 : write)
00 05 : bit msb /lsb du registe interne dont on veut stocker les donnees.
03 : nombre d’octet de donnees a envoyer.
da af 15 : les 3 octets qu’on veut envoyer(donnees).
on a recu : 01 (l’acknowledge d’eeprom)
et qu’on on a lu son contenu, on a envoyé : 56 AB 00 05 03
AB : adr d’eeprom+ bit Read.
on a recu da af 15 :)
ouff, maintennat on veut configurer la pcf 8583, c’est les memes comandes que la pcf 8591 ? on veut ecrire la date et l’heure, et qu’elle affiche le contenu de l’eeprom chaque 5 min par exemble, ca sra horodaté !
Répondre à ce message
# Le 12 juin 2011 à 09:54, par Julien H.
En réponse à : Convertisseur USB I2C
Tant mieux, bravo ! Pour la PCF, oui effectivement je crois qu’il y a un exemple dans la doc anglaise pour un autre de la série. En fait, tout dépend du nombre de registres d’écriture. Il faut donc comprendre dans quel cas utiliser 0x53, 0x54, 0x55 ou 0x56.
Répondre à ce message
# Le 25 juin 2011 à 17:34, par ?
En réponse à : Convertisseur USB I2C
bonjour je veux stocker des données dans mon eeprom, via docklight,la charger comment je peux la faire ?
Répondre à ce message
# Le 25 juin 2011 à 19:18, par Julien H.
En réponse à : Convertisseur USB I2C
Tout simplement en envoyant une séquence d’octets correspondant à une écriture. Je ne comprends pas la question, quel est le problème ?
Répondre à ce message
# Le 26 juin 2011 à 17:43, par ?
En réponse à : Convertisseur USB I2C
bonjour,
je cherche a organiser cette mémoire pour les données suivante
(chaque donnée occupe un octet)
Heure
minutes
jours
mois
années
température partie décimale (-10a 100)°C
température partie entière (1000Watt/m2)
la tension
comment faire ? merci d’avance
Répondre à ce message
# Le 26 juin 2011 à 21:20, par Julien H.
En réponse à : Convertisseur USB I2C
"organiser" cette mémoire ? Je ne comprends pas ce que tu attends de nous. Il s’agit uniquement de conception pour laquelle nous ne pouvons pas aider.
Répondre à ce message