Electronique > Réalisations > Interfaces > Interface USB 004

Dernière mise à jour : 03/06/2018

Présentation

Cette interface USB a été conçue uniquement pour des tests "maison" et permet d'activer 256 sorties de façon individuelle, depuis mon logiciel de test USB-HID-TEST-256.

interface_usb_004_pcb_3d_a electronique_interface_usb_004b_pcb_3d_a

Le circuit se base sur un microcontrôleur PIC 18F4550 ou 18F45K50 qui comporte un module USB intégré, épaulé par 16 expandeurs de ports MCP23017, chaque expandeur étant doté de 16 lignes d'E/S. Sans les expandeurs de ports, l'interface met à disposition 16 sorties directes. Un circuit similaire mais doté d'un PIC 18F2550 est également proposé (schéma 004b).

Schéma 004 - avec PIC 18F4550 ou 18F45K50

Le coeur du montage est le PIC 18F4550, qui à lui seul (sans les expandeurs de ports) permet de piloter 16 sorties. Les expandeurs de port MCP23017 ne sont réellement utiles que si on veut utiliser plus de 16 sorties (il faut ajouter un expandeur de port par paquet de 16 sorties supplémentaires).

interface_usb_004
Interface USB (autonome et extensible)

interface_usb_004_outs
Interface 256 sorties

Fonctionnement général
Le PIC 18F4550 reçoit les données qui proviennent du logiciel Windows USB-HID-TEST-256 via une liaison USB.

usbhidtest256_main_001b

Les données envoyées par ce logiciel correspondent aux 256 sorties logiques à activer, regroupées en 32 paquets de 8 bits, ou dit autrement par paquets de 32 octets. Les 16 premières sorties logiques sont directement accessibles sur les broches du PIC, alors que toutes les sorties (1 à 256) le sont à travers les expandeurs de port. Cette approche permet de s'équiper du nombre de sorties désirées et d'en augmenter le nombre si le besoin s'en fait sentir.
Remarque : le logiciel USB-HID-TEST-256 et cette interface USB 004 traitent en fait 512 voies (64 octets), mais seules 256 voies (32 octets) sont réellement exploités.

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 40 broches mais plusieurs sont "réservées" pour un usage noble :
- 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)
- 4 broches pour les deux liaisons I2C (en fait un bus I2C et deux lignes de routage)
Les 16 sorties "directes" se partagent plusieurs ports du microcontrôleur : 6 sorties sur le port A, 2 sorties sur le port B et 8 sur le port D.
Ceci dit, quel type d'appareil pouvons-nous commander avec tout ça ? Les LED c'est bien, mais piloter des machines à laver, c'est bien plus exitant. Le problème majeur des machines à laver est qu'elles refusent de fonctionner sous 5 V / 20 mA (en tout cas à l'écriture de ces lignes). Heureusement que les relais, transistors de puissance et triacs ont été inventés (sans doute pour cette raison) ! 
- Commande en puissance et en très basse tension (5 à 24 V) : je suggère l'emploi de gros transistors, bipolaires ou MOSFET, 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.

Bus I2C
Les 16 expandeurs de port MCP23017 se pilotent via un bus I2C et se retrouvent tous sur les même lignes SCK (Clock) et SDA (Data). Tous les expandeurs sur le même bus ? Hum... presque. Chaque expandeur dispose de 3 lignes d'adresse "hard" (A0 à A2) qui permet en théorie de câbler 8 expandeurs en parallèle sur le même bus, au maximum. Comme j'en voulais 16, il aurait fallu que je crée deux bus I2C distincts. Pas très compliqué à priori, il suffit d'utiliser 4 lignes d'E/S du PIC. Ah oui, mais... il faut que les lignes utilisées puissent être configurées en drain ouvert, ce qui sur le 18F4550 n'est possible qu'avec les lignes RB0 et RB1. Du coup, petite astuce : j'utilise un système de routage pour orienter l'unique bus I2C du PIC (lignes RB0/SDA et RB1/SCL) vers un seul des deux paquets de huit expandeurs, à un instant donné. Ce système de routage est des plus simples qu'on puisse imaginer, il fait appel à des portes analogiques bidirectionnelles de type 74HCT4066 ou MAX4066, elles-même pilotées par les signaux de commande CS1 et CS2. Les huit premiers expandeurs sont ainsi pilotés par un premier "bus" I2C1, et les huits expandeurs suivants sont pilotés par un second "bus" I2C2. L'envoi des données aux expandeurs de ports est réalisé par une routine maison de type "non blocante", je n'ai pas utilisé les routines intégrées de MikroPascal. Si pour une raison ou une autre un des MCP23017 venait à se "verrouiller" (déjà constaté), le bus I2C ne serait pas complètement bloqué et le reste de l'interface continuerait de fonctionner. La mise à jour complète des 256 sorties prend environ 7 ms, pour une vitesse d'horloge du bus I2C fixée à 100 kHz.

Comportement au démarrage
Il dépend de l'état logique appliqué sur la ligne RE0 du PIC (InitMode).
- Si RE0 = 0, toutes les sorties sont désactivées au démarrage.
- Si RE0 = 1, les sorties 1 à 8 de chaque port des expandeurs sont "scannées", puis une seconde plus tard toutes les sorties sont désactivées. Cette fonction permet de s'assurer que le PIC tourne bien et que les interfaces de sorties sont fonctionnelles. En usage normal on ne l'utilisera que pour vérification en cas de soucis.

Limitation à 128 sorties
En appliquant un niveau logique haut sur l'entrée RE1 du PIC 18F4550 (Limit128), le logiciel ne met pas à jour les sorties 129 à 256. Dans ce cas, on peut se passer des commutateurs analogiques 4066 et relier les huit premiers expandeurs de port directement sur les lignes SDA et SCL du PIC (les huits autres n'étant pas câblés).
- Si RE0 = 0, mise à jour des sorties 1 à 256
- Si RE1 = 1,  mise à jour des sorties 1 à 128 seules
Attention : si l'entrée RE1 est laissée à l'état bas et que vous câblez directement les huit premiers expandeurs de port directement sur les lignes SDA et SCL du PIC, les sorties [n] de ceux-ci prendront très brièvement l'état qu'on leur demande [n] et prendront ensuite l'état de la sortie [n+128]. Par exemple, si dans le logiciel USB-HID-TEST-256 vous activez la sortie #2 mais pas la sortie #129, alors la sortie #2 sera activée une fraction de seconde et sera ensuite désactivée, car la sortie #129 partage l'adresse de commande de la sortie #2. Les commutateurs analogiques sont justement là pour éviter ce genre de "conflit".

Horloge PIC et liaison USB
Le quartz externe utilisé ici est impératif, il conditionne la stabilité des horloges internes, surtout celle requise par le module USB (48 MHz). La valeur de ce quartz externe est de 20 MHz, j'aurais pu également en utiliser un de 4 MHz. Le module USB travaille à une fréquence de 48 MHz pour satisfaire le mode full-speed, grâce à un oscillateur interne de 96 MHz 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 nécessaire d'utiliser un facteur de division par cinq au niveau du module "PLL-prescaler". En résumé : horloge (quartz) 20 MHz divisée par 5 pour obtenir le 4 MHz nécessaire à la PLL du module USB. Les routines du logiciel qui ne sont pas liées au dialogue USB sont cadencées à 48 MHz. La résistance R2 de 1,5 kO câblée entre la ligne Data+ (D+) du bus USB et le +3,3V issu du régulateur de tension interne du PIC (sortie sur broche Vbus, pin 18) permet à l'hôte de reconnaître le périphérique en mode full-speed.

Alimentation
L'interface en elle-même (PIC et expandeurs de ports) ne consomme pas un courant élevé, mais l'idée d'utiliser la tension de +5 V ramenée par le bus USB (VBUS) ne serait pas forcément une bonne idée dans le cas présent. Mieux vaut utiliser une alimentation externe dont la capacité en courant dépendra de vos besoins. Attention, car même avec de simples LED ou des optocoupleurs, la consommation peut grimper très vite ! Avec l'hypothèse d'une intensité de courant de 15 mA à 20 mA par LED ou optocoupleur, faite le calcul s'il en faut 256 ! Si vous prévoyez des LED ou optocoupleurs qui réclament chacun 20 mA, alors une simple multiplication vous dira ce qu'il vous faut prévoir côté intensité de courant :
- 8 sorties sous 20 mA -> 160 mA
- 16 sorties sous 20 mA -> 320 mA
- 32 sorties sous 20 mA -> 640 mA
etc. A cette valeur, ajouter 50 mA pour le reste. Une formule ? Si vous voulez :
Courant devant pouvoir être débité par l'alaimentation générale = (20 mA * Nb sorties) + 50 mA

Schéma 004b - avec PIC 18F2550

Le circuit est similaire au précédent et permet également de disposer de 256 sorties. La différence réside dans la taille du PIC (28 broches au lieu de 40) et dans le nombre de sorties directes qui est limité à 8 (contre 16 pour le circuit avec 18F4550).

interface_usb_004b

La commande des expandeurs de port se fait de la même façon, l'interface 256 sorties avec 16 circuits MCP23017 proposée ci-avant reste donc valable.

Prototypes

Plusieurs protos réalisés.

Mon prototype N°1 (18F4550 et 18F2550)
Réalisé sur une plaque sans soudure, sur laquelle j'ai posé le PIC (18F4550 puis ensuite 18F2550), un MCP23017 et deux baregraphes à LED, le tout piloté par le logiciel USB-HID-TEST-256 :

interface_usb_004_proto_001a interface_usb_004b_proto_001a interface_usb_004b_proto_001b

Pour les tests, j'ai utilisé le +5 V du bus USB (+Vusb) pour alimenter le PIC, qui ainsi ne nécessitait pas d'alimentation additionnelle. Cela est un peu contradictoire avec ce que je disais avant mais vous me pardonnerez, ce n'était que pour les tests. Tiens, dit très rapidement et en passant, j'ai grillé le module USB d'un PIC 18F4550, à cause d'une (toujours bête) erreur de câblage. J'avais malencontreusement  relié la broche 24 du PIC (RC5/D+) au +Vusb et le PIC n'a pas du tout aimé - je m'en suis vite rendu compte par l'odeur et la température du PIC. En corrigeant le câblage et en changeant le PIC par un neuf, ça fonctionnait beaucoup mieux. Pour résumer :
- systèmes simulés avec succès (liaison USB comprise) pour les deux PIC 18F4550 et 18F2550
- systèmes réalisés pour de vrai et testés avec succès (avec les 16 premières sorties seulement, mais j'ai confiance pour les autres).

Mon prototype N°2 (18F2550)
Version à 128 sorties avec PIC 18F2550, réalisée sur PCB pro. Là encore, circuit alimenté via le bus USB.

interface_USB_004b_proto_002a interface_USB_004b_proto_002b interface_USB_004b_proto_002c interface_USB_004b_proto_002d

L'oeil attentif aura remarqué que j'ai utilisés deux supports de CI 14 broches pour chaque MCP23017, au lieu d'un seul support 28 broches. Les 128 sorties ont été testées avec mon logiciel USB-HID-TEST-256. Comme je n'avais que trois MCP23017, je ne pouvais tester que 48 sorties en même temps (3 x 16). Pour pouvoir tester toutes les sorties (8 x 16) j'ai du changer de place les MCP23017.

Prototype de Pierre C.
Prototype avec 18F4550 réalisé pour rajeunir une ancienne interface multi-voies pilotée par port parallèle (LPT).

interface_usb_004_proto_pc_001a interface_usb_004_proto_pc_001b

Utilisation des sorties directes du PIC via deux buffers 74HC541. Merci à Pierre pour ses retours positifs !

Logiciel du PIC

Les codes binaires compilés (*.hex) sont disponibles dans l'archive suivante (pas de code source dispo pour ce projet).
Interface USB 004 - 18F2550 et 18F4550 - (23/08/2015)
Si vous souhaitez recevoir par la poste un PIC préprogrammé et prêt à utiliser, merci de consulter la page PIC - Sources.

Circuit imprimé

Réalisé pour la version 004b avec PIC 18F2550 (pour ce dernier, seulement 128 sorties accessibles).

interface_usb_004_pcb_composants   interface_usb_004b_pcb_composants

Historique

03/06/2018
- Ajout photos prototype N°2 (interface 004b avec PIC 18F2550, PCB pro).
03/12/2017
- Désormais, l'interface 004b peut travailler avec un nombre quelconque d'expandeurs de ports MCP23017.
- Désormais, l'interface 004b peut être alimentée par le bus USB (le régulateur 5V d'origine reste en place, cavalier pour choix alim).
11/10/2015
- Correction schémas 004 (avec PIC 18F4550) et 004b (avec PIC 18F2550). Les sorties Q4b et Q5b (sorties directes sur PIC) étaient inversées. Merci à Pierre C. de m'avoir signalé cette petite coquille.
- Ajout photos prototype de xx.
23/08/2015
- Première mise à disposition.