Electronique > Réalisations > Interfaces > Interface USB 003

Dernière mise à jour : 20/01/2013

Présentation

Cette interface USB a été conçue pour être pilotée par mon logiciel freeware ProgSeq, pour étendre ses possibilités hardware qui comptaient déjà le port parallèle (bien obsolète) et le port série (obsolète aussi mais utilisable sans problème avec un convertisseur USB/RS232).

interface_usb_003_pcb_3d_a

Cette nouvelle interface s'articule autour d'un PIC 18F4550 (microcontrôleur qui comporte un module USB intégré) et deux expandeurs de ports (PCF8574 dotés de 8 ports chacun). Elle dispose en tout de 32 sorties logiques :
- 16 sorties en accès direct sur le PIC;
- 16 sorties supplémentaires via des expandeurs de ports PCF8574.
Si 16 sorties suffisent, les expandeurs de port peuvent être omis. Une version "allegée" (12 voir 16 sorties) et architecturée sur un PIC 18F2550 pourrait aussi voir le jour, mais ce n'est pas dans mes priorités. Une version plus élaborée avec 256 sorties est décrite à la page Interface USB 004.

Avertissements

Pour l'heure, et comme plusieurs broches du PIC 18F4550 ne servaient pas, j'ai décidé de dupliquer certaines sorties "étendues" (normalement accessibles via les expandeurs de ports) sur les broches libres. Ce qui nous donne ceci :
Il n'est pas exclu que dans une future version ces broches "libres" des ports C et E servent à autre chose, aussi je conseille d'utiliser l'expandeur de ports N°1 pour les sorties 17 à 24.
L'interface fonctionne bien dans le monde réel, les 16 sorties directes et les 16 sorties étendues sont toutes fonctionnelles. Il est possible de tester cette interface USB avec mes logiciels ProgSeq et UsbHidTest. Pour ce qui est de la recopie des sorties 17 à 24 sur les broches libres du PIC, seules 6 sur les 8 fonctionnent à ce jour (lignes RC6 et RC7 du PIC pas encore fonctionnelles).

Schéma

Le coeur du montage est le PIC 18F4550, qui à lui seul permet de piloter 16 sorties (ou 24 sorties, voir avertissement ci avant). Les deux expandeurs de port PCF8574 ne servent que pour un usage 24 ou 32 sorties (un seul expandeur de port ajoute 8 sorties supplémentaires).

interface_usb_003

Fonctionnement général
Le PIC 18F4550 reçoit les données provenant du logiciel ProgSeq via une liaison USB. Les données envoyées par ProgSeq correspondent aux 32 sorties logiques à activer, regroupées en quatre paquets de 8 bits. Les 16 premières sorties logiques sont directement accessibles sur les broches du PIC, alors que les 16 dernières sorties le sont au travers d'expandeurs de port de type PCF8574. Cette approche permet de s'équiper de 16 sorties et d'en augmenter le nombre seulement si le besoin s'en fait sentir. Telle que l'interface est conçue, on pourrait même sans difficulté porter le nombre de sorties à 64 voire 128 ou 256, par le simple ajout d'expandeurs de ports supplémentaires. Exemple d'interface à 256 sorties à la page Interface USB 004.

Sorties
Toutes les sorties sont disponibles sous la même forme, à savoir 20 mA max par sortie, ce qui permet d'attaquer directement des LED, des optocoupleurs ou des optotriacs (à travers une résistance de limitation de courant, ne l'oubliez pas). Le PIC 18F4550 possède plein de broches il est vrai (40 si mon compte est bon) et on pourrait penser qu'on peut disposer des 32 sorties d'un simple claquement de doigts (je ne sais pas d'où vient cette expression, c'est sûrement lié à une histoire de surtension, il faudra que je pose la question à Jean Echenoz). Sur les 40 broches du PIC, certaines sont réservées pour l'application en elle-même :
- 4 broches pour l'aimentation
- 3 broches pour la partie USB (VBUS, D- et D+)
- 3 broches pour le connecteur ICSP (MCLR/VPP, PGD et PGC)
- 2 broches pour "extension" SPI ou I2C
Bref, vous voyez bien que c'est mal barré pour disposer de 32 sorties directes. De toute façon c'est toujours pareil, plus on en a et plus on en veut. Je serais parti d'un composant à 18 broches, j'aurais dit qu'il m'en fallait un à 40 broches. Et une fois ce dernier entre les mains, il m'en faudrait un de 144 broches. Restons sérieux. Sans aucun composant additionnel, on dispose déjà de 16 sorties directes. déjà pas mal, non ? Les 16 sorties directes se partagent plusieurs ports du microcontrôleur : 5 sorties sur le port A, 3 sur le port B et 8 sur le port D (en plus des 5 sur le port C et des 3 sur le port E dont je parlais précédement : les sorties sur les ports C et E sont des recopies de ce qu'on trouve en sortie du premier expandeur de port - ça aurait tout aussi bien pu être une copie des données fournies par le second expandeur). Pour résumer, point besoin d'ajouter d'expandeur de port si 16 sorties vous suffisent. Les PCF8574 peuvent dans ce cas rester chez votre fournisseur de composants et les piecettes dans votre porte-monnaie. Ceci dit, quoi commander avec tout ça ? Les LED c'est bien mais de grosses lampes ou je ne sais quelle autre machinerie de votre invention, ce serait mieux. Le problème est toujours le même avec ces interfaces logiques qui débitent un petit 5 V sous quelques mA. Impossible d'allumer un convecteur électrique ou une lampe de 300 W. Heureusement que quelqu'un a inventé les relais, transistors de puissance et les triacs, sinon je ne vous dis pas dans quelle galère on se trouverait aujourd'hui.
- Commande en puissance et en très basse tension (5 à 24 V): je vous suggère l'emploi de gros transistors, bipolaires ou MOSFET, selon la valeur des courants à commuter et selon votre humeur.
- Commande en puissance et en 230 V : je vous suggère l'emploi de triacs ou de relais (via transistors 2N2222 ou ULN2xxx). Exemple pour 8 sorties.
Avertissement : les sorties des PCF8574 sont de type "drain ouvert", ce qui signifie qu'une sortie active présente un état bas (proche de 0 V). Utilisez les sorties de ces expandeurs comme vous le feriez avec des ULN2803 (exemple).

Bus I2C
Il n'est mis en oeuvre que pour permettre l'utilisation des deux expandeurs de port. On aurait pu s'en passer totalement si on s'était limité à 16 sorties. Mais je tenais tellement à disposer de ces 32 voies qui me faisaient déjà rêver quand j'étais dans le ventre de ma maman (ceci dit il s'agit d'un vague souvenir, je rêvais peut-être à d'autres choses). Pour les accès I2C, j'ai utilisé une routine maison pour me faire la main (il me fallait le faire une fois au moins), mais j'aurais bien sûr pu utiliser les routines intégrées à MikroPascal.

Horloge PIC
Le quartz externe utilisé ici est impératif, il conditionne la stabilité des horloges internes, surtout celle requise par le module USB (48 MHz) et qui doit être très stable. La valeur de ce quartz externe est de 20 MHz mais si vous êtes prêt à mettre les mains dans le code logiciel (partie configuration PIC avec les diviseurs et tout le tintouin), vous pourrez utiliser d'autres valeurs (par exemple 4 MHz, 8 MHz, 12 MHz ou 16 MHz). Juste pour info, le module USB travaille à une fréquence de 48 MHz pour satisfaire le mode full-speed, grâce à un oscillateur interne de 96 MHz qui est couplé à une PLL (boucle à verrouillage de phase) dont la fréquence d'entrée attendue est de 4 MHz. Avec un quartz 20 MHz, il est donc nécessaire d'utiliser un facteur de division par cinq au niveau du module "PLL-prescaler".

Alimentation
L'interface en elle-même (PIC et expandeurs de ports) ne consomme pas un courant élevé, et je comprend que l'idée d'utiliser la tension de +5 V ramenée par le bus USB (VBUS) vous chatouille les doigts. Mais comme j'ai prévu de piloter des optocoupleurs, la consommation grimpe vite. Il faut en effet compter 15 mA à 20 mA par optocoupleur ! Avec huit optocoupleurs, les 100 mA du bus USB sont déjà insuffisants. On pourrait bien sûr demander à l'ordinateur de fournir 500 mA au lieu de 100 mA, mais je ne trouve pas cette solution raisonnable. Le courant que doit fournir votre alimentation dépend du nombre de sorties que vous allez réellement utiliser de façon simultanée et du courant fourni par chacune d'elle. Si comme moi vous prévoyez des optocoupleurs qui réclament 20 mA, alors une simple multiplication vous dira ce qu'il vous faut :
- 8 sorties sous 20 mA -> 160 mA
- 16 sorties sous 20 mA -> 320 mA
- 32 sorties sous 20 mA -> 640 mA
A cette valeur, ajouter 50 mA pour le reste. Bien entendu, si l'interface sert de déco avec des LED haute luminosité qui se contentent de 1 mA chacune, alors dans ce cas il est possible de se repiquer sur l'alim +5 V du bus USB.

Prototype

Deux prototypes ont été réalisés avec ma platine EasyPic7 et une petite plaque sans soudure :
- un premier pour tests rapides avec les deux expandeurs de port (16 LED câblées sur les 20 disponibles);
- un second avec toutes les LED déportées sur la plaque sans soudure, pour les besoins de la vidéo de démonstration avec ProgSeq en action.

interface_usb_003_proto_001a interface_usb_003_proto_001b interface_usb_003_proto_001c

Vidéo de démonstration
Vite faite, pour montrer l'interaction entre l'interface USB 003 et le séquenceur logiciel ProgSeq.

video_electronique_interface_usb_003_proto_001_tn

Les plus attentifs auront surement noté une curiosité sur la vidéo, au niveau des quatre baregraphes à LED. Deux de ces baregraphes sont inversés : deux sont "référencés" à la masse via les résistances de limitation de courant, les deux autres le sont au +5 V. Normal, les sorties du PIC sont actives en délivrant un +5 V alors que les sorties des PCF8574 sont en drain ouvert.

Logiciel du PIC

Le code binaire compilé (*.hex) est disponible dans l'archive suivante (pas de code source dispo pour ce projet).
Interface USB 003 - 18F4550 - (20/01/2013)
Si vous souhaitez recevoir par la poste un PIC préprogrammé et prêt à utiliser, merci de consulter la page PIC - Sources.
Pour la programmation du PIC, deux choix possibles :
- soit sur platine de programmation avec support 40 broches (et bien sûr compatible 18F4550);
- soit en mode ICSP, programmation avec un PicKit2 ou autre du genre. Pour ce mode, utiliser le connecteur ICSP (J2 sur le schéma), sans y fournir d'alimentation (l'interface doit être alimentée par sa propre alimentation de +5 V, aussi bien pour son utilisation courante que pour la phase de programmation).

Circuit imprimé

Non réalisé.

Historique

20/01/2013
- Première mise à disposition.