Le protocole USB prévoit 127 addresses de périphériques sur le bus USB, et il est tentant d'en déduire que l'on peut brancher jusqu'à 127 périphériques sur un port USB. Pas de chance, ce n'est pas si simple: ce raisonnement naïf ignore toutes les autres contraintes imposées par le standard USB. Pour vous donner une réponse plus réaliste et surtout plus utile, nous avons décidé de tester ce qui marche pour de vrai...
Notre but est de déterminer le nombre maximal de nos modules USB, capteurs ou modules de commande, que l'on peut espérer faire fonctionner correctement sur une machine. Au passage, nous vous indiquerons les conditions idéales pour maximiser cette limite. Pour faire des tests réalistes, nous avons fabriqué une série de modules de test USB se comportant comme des capteurs Yoctopuce. Il s'agit en fait de Yocto-demo avec un firmware custom qui permet de programmer à volonté la fréquence d'envoi de mesures. Ainsi nous pourrons tester un module générant du trafic USB à 1Hz, 10 Hz, 100 Hz ou même 1 KHz, qui est le maximum permis par le standard USB Full Speed, celui qui est utilisé par les modules Yoctopuce.
La première chose à savoir est que la limite du nombre de périphériques que l'on peut brancher en USB dépend autant des hubs USB utilisés que de la puissance du contrôleur hôte. Nous allons donc tester ces deux aspects séparément.
Nous avons testé quelques hubs USB.
Comparaison des hubs USB
Le premier test consiste à voir comment se comportent différents hubs USB avec 4 à 7 modules de test seulement, mais configurés pour envoyer du trafic à haute fréquence, comme le ferait par exemple un capteur inertiel Yocto-3D-V2 ou une interface analogique Yocto-0-10V-Rx sur un signal peu stable. Avec ce test, on distingue immédiatement deux classes de hubs:
- Ceux qui perdent des paquets, essentiellement les hubs bon marchés, vendus en grande surface;
- Ceux qui ne perdent pas de paquets, et qui ont en général coûté un peu plus cher à l'achat
Sur un bus USB, la perte d'un paquet est anormale: USB est sensé fournir une couche de transport sans perte. Contrairement à un réseau Ethernet ou WiFi, où les pertes de paquets sont prévues et gérées, les protocoles USB ne sont pas sensés prévoir de retransmission. Donc un hub qui pert des paquets, ça peut passer inaperçu pour une souris, mais ça pose des problèmes pour les applications de mesure et de contrôle.
Hubs Multi-TT vs Single-TT
Bien entendu, le critère pour savoir si un hub perd des paquets n'est pas son prix, mais le chipset qu'il y a dedans. En particulier, il faut savoir si le chipset est capable de gérer parallèlement des communications Full Speed sur tous les ports à la fois, ou si il n'est capable de traiter qu'un paquet à la fois car il ne dispose que d'un seul Transaction Translator. Dans le premier cas, il s'agit d'un hub Multi-TT (MTT), qui marche en général bien, et dans le second cas, d'un hub Single-TT (STT), qui perdra des paquets lorsqu'ils arrivent trop vite.
Avec un hub Single-TT, en cas de fort traffic Full-Speed on peut constater des pertes de paquets dès le 2e module connecté. Si le trafic est modéré, cela peut fonctionner jusqu'à trois ou quatres modules, mais avec le nombre on risque vite les pertes de paquets et donc les erreurs de communication.
En utilisant exclusivement des hubs multi-TT, nous avons pu connecter jusqu'à 30 modules Full-Speed configurés pour envoyer le trafic USB le plus intensif possible, soit 1000 messages par seconde, sans constater de perte de paquet.
Vous trouverez le récapitulatif des hubs Single-TT et Multi-TT que nous avons testé dans le tableau plus bas. Si le votre n'est pas dans cette liste, vous pouvez essayer de retrouver sur internet son type de chipset. Vous pouvez aussi regarder dans le gestionnaire de devices de l'OS quel est le VendorID et le DeviceID du hub. Le hub de Single-TT de piètre qualité le plus répandu est le Genesys GL850, dont le DeviceID est 0x0608.
Au passage, dans la catégorie trop dommage, on notera les hubs Moxa UPort 207 et 407 qui utilisent un chipset SMSC capable de faire du Multi-TT, mais qui semblent néanmoins perdre des paquets. Le constructeur aurait probablement mieux fait de se soucier de ce problème-là avant de se soucier de mettre son propre VendorID à la place du VendorID SMSC...
Les hubs industriels Moxa semblent sérieux, mais lors de nos tests ils perdent systématiquement des paquets comme les hubs Single-TT bon marché
Topologie de connexion
Un facteur limitant pour la connexion de nombreux périphériques USB est la topologie de connexion des hubs, ou autrement dit, le schéma de connexion. En effet, on ne peut pas chaîner aveuglément un nombre arbitraire de hubs jusqu'à brancher tous les modules désirés: il y a un nombre de maximal de hubs qu'un message peut traverser depuis l'hôte pour atteindre le périphérique. En partant du contrôleur USB et du Root Hub faisant partie de la carte mère de l'hôte, un message ne peut traverser que 5 hubs USB externes au maximum. La méthode permettant de mettre le plus de périphériques possibles consiste donc à les brancher en arbre, plutôt qu'en chaîne: sur le premier hub externe, on ne branche que des hubs, sur lesquels on ne branche encore que des hubs. Celui produit un maximum de ports qui sont tous à la même distance, minimale, du contrôleur USB.
Cela parait simple, mais il y a trois pièges à éviter. D'abord, l'alimentation électrique: le standard USB précise que si vous ne pouvez pas cascader les hubs USB si ils ne sont pas connectés à leur propre alimentation. Certains hubs vont même désactiver leurs ports si ils détectent qu'ils sont en cascade sans être alimentés. En règle générale, si vous voulez brancher beaucoup de modules, pensez dès le départ à alimenter tous les hubs, sans exception. C'est le plus sûr.
Ensuite, si vous avez besoin d'une certaine distance entre vos modules USB et le PC qui les contrôle, attendez-vous à ce que cela vous coûte un niveau de hub. En effet, au delà de 2m, seules les rallonges USB actives sont fiables: les autre causent trop facilement des pertes de paquet en raison de la déformation du signal. Mais une rallonge active n'est rien d'autre qu'un rallonge avec un hub intégré pour ré-amplifier le signal.
Enfin, on pourrait se dire qu'en utilisant des hubs 7 ports ou des hubs 10 ports, on réduit le problème puisqu'on obtient un plus grand nombre de ports en utilisant moins de hubs. Malheureusement, ce n'est souvent pas le cas: la plupart des hubs 7 ports ou 10 ports sont en réalités deux ou trois hubs en cascade dans la même boîte. Ils comptent donc comme plusieurs hubs dans le calcul de la profondeur maximale autorisée. Pour créer une topologie optimale et chaîner les hubs en arbre, il faut alors tester chaque port et vérifier dans le gestionnaire de périphérique quelle est la profondeur du port, ce qui complique un peu la conception.
Du point de vue de la topologie, les meilleurs hubs que nous avons testés sont ceux utilisant le chipset Terminus FE2.1, et qui offrent directement 7 ports USB 2.0 sans cascader deux hubs. Il s'agit du LogiLink UA0148 et du ExSys EX-1177. L'autre option intéressante est le ExSys EX-1116HVMS, qui offre 16 ports USB 3.0, fabriqué à l'aide de 5 hubs organisés en arbre optimal de profondeur 2.
Le hub ExSys EX-1116HVMS offre 16 ports USB 3.1 Gen 1, et est composé de 5 hubs organisés en arbre
A l'inverse, dans la catégorie de hubs 10 ports, le IcyBox IB-AC6110 est le pire puisqu'il chaîne trois hubs sans les mettre en arbre.
USB 1.1, USB 2.0 et USB 3.x
Les modules Yoctopuce travaillent en USB Full-Speed, qui fait partie du standard USB 1.1 et repris dans le standard 2.0. La question se pose donc de savoir si il y a un avantage pour ce genre de trafic à utiliser un hub USB 2.0 par rapport à un hub USB 3.x plus récent.
D'après le standard, USB 3.x reste compatible avec les périphériques 2.0. Si l'on étudie les chipsets USB 3.x, on constate qu'ils incluent tous un hub USB 2.0 d'une manière ou d'une autre.
Dans la pratique, cela se vérifie: nous avons constaté des performances identiques pour le routage de traffic Full-Speed sur les hubs USB 2.0 ou USB 3.x. Seul avantage en faveur des hubs USB 3.x: ils sont généralement dotés de LEDs indicant le status de chaque port, ce qui est rarement le cas pour les hubs USB 2.0. Le seul hub USB 2.0 que nous avons testé et qui incluait une LED de status par port est le LogiLink UA0148.
Le hub USB 2.0 LogiLink UA0148 est Multi-TT et comporte des LEDs de status sur chaque port
Tableau récapitulatif
Pour conclure cette comparaison des hubs USB voici un petit tableau récapitulatif. Notez bien que cette comparaison ne porte que sur les capacités à gérer le trafic de multiples modules Yoctopuce. Nous n'avons testé ni les capacités de transfert de données à haut débit USB3, ni les fonctions de charge rapide de téléphone dont certains de ces hubs sont dotés. Nous avons aussi ajouté en fin de liste à titre de comparaison notre propre Micro-USB-Hub-V2, bien qu'il ne soit pas vraiment dans la même catégorie puisqu'il est conçu comme un hub embarqué.
Modèle | Chipset | Ports | MTT | topologie | forme | prix |
---|---|---|---|---|---|---|
Maxxtro MX-USL | Genesys GL850 | 7xUSB2 | 3+4 | desktop | 15€ | |
Maxxtro MX-UA6 | Genesys GL850 | 10xUSB2 | 2+4+4 | desktop | 30€ | |
Maxxtro MX-U3HU05 | Realtek 5401 | 7xUSB3 | 3+4 | desktop | 34€ | |
D-Link DUB-H7 | Genesys GL850 | 5xUSB2 | 3+2 | desktop | 37€ | |
IcyBox IB-AC618 | VIA VL812 | 7xUSB3 | 3+4 | desktop | 52€ | |
IcyBox IB-AC6110 | VIA VL812 | 10xUSB3 | 3+3+4 | desktop | 74€ | |
LogiLink UA0126 | Moai MA8601 | 13xUSB2 | 1+4+4+4 | desktop | 19€ | |
LogiLink UA0148 | Terminus FE2.1 | 7xUSB2 | 7 | industrial | 19€ | |
Moxa UPort 207 | SMSC USB2507 | 7xUSB2 | 7 | desktop | 181€ | |
Moxa UPort 407 | SMSC USB2507 | 7xUSB2 | 7 | industrial | 255€ | |
ExSys EX-1177HMV | Terminus FE2.1 | 7xUSB2 | 7 | industrial | 48€ | |
ExSys EX-1181 | Genesis GL3520 | 10xUSB3 | 2+4+4 | industrial | 83€ | |
ExSys EX-1187HMVS | Genesis GL3520 | 7xUSB3 | 3+4 | industrial | 86€ | |
ExSys EX-1188HMS | Genesis GL3520 | 7xUSB3 | 3+4 | industrial | 82€ | |
ExSys EX-1189HMVS | Genesis GL3520 | 7xUSB3 | 3+4 | industrial | 89€ | |
ExSys EX-1116HMVS | Genesis GL3520 | 16xUSB3 | 4+4+4+4 | industrial | 225€ | |
Yoctopuce MHUB0002 | SMSC USB2514BI | 4xUSB2 | 4 | embedded | 29€ |
Le meilleurs rapport qualité prix pour un hub de type industriel Multi-TT est clairement le LogiLink UA0148. A ce prix, on espère juste que ceux qui l'ont fabriqué ont reçu de quoi vivre décemment. Sinon, avec l'avantage d'avoir en plus un connecteur d'alimentation industriel 7-24V, les modèles ExSys sont des choix abordables et de qualité.
Test de charge des hubs industriels ExSys
Comparaison des hôtes USB
Une fois que l'on sait comment brancher beaucoup de périphériques USB à travers des hubs, il faut encore être sûr que la machine va arriver à les gérer tous. D'une part, il faut qu'elle ait un processeur assez rapide pour gérer tout le trafic. Mais en plus, il y a parfois des contraintes dans le contrôleur USB lui-même qui limitent le nombre de périphériques utilisables. Voici le résultat de nos expériences.
PC (Windows 7.0 et 10.0)
Sur les machines un peu plus anciennes, qui sont dotées de plusieurs contrôleurs USB 2.0, on peut mettre en général sans problème jusqu'à 16 modules sur le contrôleur "Enhanced" et jusqu'à 7 modules sur chacun des contrôleurs USB standards. Attention à ne pas se faire piéger par le fait que plusieurs ports USB peuvent correspondre au même contrôleur, il faut bien vérifier la répartition des modules à l'aide du gestionnaire de périphériques. Avec un peu de soin, on peut arriver ainsi à faire fonctionner sur une seule machine une cinquantaine de modules, envoyant chacun 1000 messages par seconde.
Sur certaines machines récentes, il n'y a plus qu'un seul contrôleur Intel xHCI USB 3.0, qui gère tous les ports du PC. Le problème est que, par design, ce contrôleur ne peut pas communiquer à plus d'une vingtaine de modules USB 2.0, en tout et pour tout. Donc si vous avez une souris, un clavier et quelques hubs, vous ne pourrez jamais utiliser plus de 13 à 15 modules.
Macs
Sur l'iMac que nous avons testé, nous avons pu brancher sur chacun des deux ports USB 2.0 des arbres de 30 modules envoyant chacun 1000 messages par seconde. Le contrôleur EHCI d'Apple semble robuste.
Raspberry Pi 2
Le Raspberry Pi 2 semble capable de gérer 10 modules envoyant des messages à 100Hz: cela occupe 12% de son CPU. Au delà, le traitement des messages High-Speed semble ralentir de manière quadratique avec le nombre de modules, et il est carrément impossible de faire fonctionner 17 modules simultanément, même si ils n'envoient presque aucun message.
Intel Edison
L'Intel Edison est capable de gérer 12 modules envoyant des messages à 100Hz: cela occupe 9% de son CPU. Impossible d'en mettre plus de 13, le contrôleur USB n'a pas les ressources suffisantes. Par contre, l'Intel Edison est même capable de gérer des modules envoyant des messages à 1 KHz... pour autant qu'on n'en mette pas trop quand même, cela reste une petite machine.
Conclusion
Voici les conseils pratiques à retenir de ces tests:
- Si vous utilisez plus d'un module par port USB, utilisez toujours des hubs Multi-TT. Laissez tomber les hubs bon marché vendus en grande surface, ils ne valent rien pour router du trafic USB Full Speed
- Dès que vous dépassez 4 modules par port, alimentez tous les hubs USB.
- Pour brancher beaucoup de modules, vous devez créer une topologie de connexion en arbre.
- Ne comptez pas utiliser plus de 10 modules sur un mini-PC de type Raspberry Pi ou Intel Edison.
- Pas plus de 13 modules en tout sur un PC moderne avec un contrôleur Intel USB3 xHCI.
- Sinon, sur une machine robuste, vous pouvez aller jusqu'à 50-60 modules USB en tout, si vous choisissez soigneusement vos hubs et la topologie de connexion.
Pour finir, n'oubliez pas que seuls vos tests en situation réelle vous prouveront si votre design est robuste. Nous ne pouvons que vous donner des pistes pour atteindre le meilleurs résultat, mais au final chaque détail d'implémentation à son importance...