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.
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 (autonome
et extensible)
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.
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).
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
:
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.
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).
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).
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.