Convertisseur USB I2C
Transcription
Convertisseur USB I2C
Convertisseur USB I2C Extrait du PoBot http://www.pobot.org Convertisseur USB I2C - Programmation - Apprendre - Communications - Protocoles de communication - Date de mise en ligne : jeudi 11 décembre 2008 Description : un module de dialogue avec des capteurs sur bus I2C depuis une liaison série USB (PC) PoBot Copyright © PoBot Page 1/5 Convertisseur USB I2C Sommaire • Installation du pilote • Vérification du fonctionnement • Mise en garde • Communications I²C 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. Convertisseur vu du connecteur 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). Copyright © PoBot Page 2/5 Convertisseur USB I2C Installation du pilote Le convertisseur série FTDI utilise des pilotes de port série virtuel (ou VCP drivers en anglais) disponibles ici [http://www.ftdichip.com/Drivers/VCP.htm] 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 Copyright © PoBot Page 3/5 Convertisseur USB I2C 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 [http://robot-electronics.co.uk/acatalog/USB_I2C.html], 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 Copyright © PoBot Page 4/5 Convertisseur USB I2C 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... Copyright © PoBot Page 5/5