Pico et hôte HID (clavier / souris)

Bonjour à tous,

Le projet Picoterm (terminal VGA avec interface clavier USB) m'a appris de très nombreuses choses relatives au support de périphériques HID sur le Pico.

Support HID hôte sur Raspberry-Pi Pico

Le support HID hôte permet au Pico de détecter des périphériques USB tels que clavier USB et/ou souris USB.

Pour commencer, afin bénéficier du support  HID, il faut travailler en C (pas en MicroPython). Perso, je déteste la programmation en C... mais quand il faut, il faut.

Le support HID est pris en charge par la bibliothèque TinyUSB mais cela implique aussi de désactiver la redirection des messages printf sur stdio_usb (car cela entre en conflit avec TinyUSB).

voir pico_enable_stdio_usb dans le CMakeLists de PicoTerm.

Si ce sujet vous intéresse, je vous invite a compiler PicoTerm sur votre ordinateur en suivant le document How to compile the Firmware. Puis fouiller et tester le code.
Mais le sujet de cet article ne tourne pas autour de la programmation mais plutôt des contraintes techniques autour des développements HID.

Brancher le clavier

Le Pico disposant d'un connecteur Micro-USB, il faut un adaptateur/câble OTG pour  brancher le clavier (qui est généralement équipé d'un USB-A).

Câble OTG (On the go) @ MCHobby

Lorsque le projet est terminé ce n'est pas un problème..

Par contre, en cours de développement, ce très gênant.  Il faut débrancher le câble OTG pour brancher l'ordinateur sur le Pico et y téléverser un nouveau firmware puis débrancher l'ordinateur et rebrancher le clavier avec le câble OTG.

A la longue, cela donne un peu de jeu dans le connecteur micro-USB du Pico.

Non détection du clavier USB

Avec le temps nous avons remarqué que le clavier était bien détecté lorsque le software fonctionnait déjà sur le Pico.

Par contre, lors d'un démarrage à froid, le clavier n'était pas toujours détecté mais tout rentrait dans l'ordre lorsque le clavier était déconnecté puis reconnecté!

Pourquoi?

Il se fait qu'à sa mise sous tension, un périphérique USB envoi des paquets de données pour se faire connaître, paquets incluant les détails techniques du périphérique. Si TinyUSB n'est pas prêt alors le périphérique n'est pas détecté!

Ce dont je ne suis pas certain pour l'instant, c'est si la mise-sous-tension qui la condition d'initialisation ou les signaux D+ & D- (car c'est un signal différentiel).

Solution

Activer le périphérique USB uniquement après l'initialisation complète de TinyUSB.

J'ai donc créer un petit câble OTG maison où l'alimentation 5V du connecteur USA-B (pour le clavier) est contrôlé à l'aide d'un MosFet.

Source: RC2014Z80/Picoterm

Dans le projet Picoterm, le connecteur USB-A est mis sous-tension après 5 secondes après le démarrage du firmware et la détection du clavier se passe sans encombre.

Clavier USB et programmation

Reste que développer une solution Pico en étant obligé de retirer le câble OTG pour recharger un nouveau firmware c'est contraignant.

Il faudra pouvoir basculer de USB-A vers micro-USB facilement sans devoir débrancher le clavier.

Il paraît simple, en apparence, de brancher un connecteur micro-USB femelle en parallèle avec l'USB-A... mais il y a un MAIS!

Si TinyUSB est initialisé, le clavier alimenté sur USB-A et un micro-USB femelle branché sur un PC... c'est le PC qui détectera/interagira avec le clavier. C'est normal puisque le PC a accès au lignes Data+ et Data- du clavier USB.

Solution: contrôler les lignes D+ & D-

Avec un composant comme le MAX4717 de Maxim integrated, il est possible de connecter les lignes D+ & D- du pico soit avec le clavier (USB-A), soit avec l'ordinateur (connecteur micro-USB femelle).

Basculer les signaux USB entre clavier et ordinateur

La résistance pull-down maintien les broches de sélection logique IN1 & IN2 à la masse. Dans cette position, le Pico est mis en relation avec le port USB-A.

Lorsque l'interrupteur est fermé, les broches IN1 & IN2 passent au niveau logique HAUT et le Pico est mis en relation avec le port Micro USB destiné à l'ordinateur.

Souder un Maxim MAX4717 !

Le composant MAX4717 est disponible en composant CMS (SMD). Même s'il existe une référence DIP, il est impossible de mettre la main dessus.

 mais n'utilise .

L'empattement utilisé est nommé µMax, propre à MAXIM, qui n'est pas l'un des nombreux package standard de l'électronique! Une chance pour nous l'empattement correspond malgré tout au format QFN!

En utilisant un breakout QFN-32 d'Adafruit, du flux et un peu de patience, il est possible de positionner correctement le MAX4717 au dessus du plan de masse QFN (sans court-circuit).

Les premier essais permettent en tout cas de valider cette solution.

Bouton Boot0

Lors du développement dans un projet enfoui, activer le bootloader du Pico peut être aussi fastidieux que de manipuler le connecteur MicroUSB (comme déjà décris dans cet article).


Pour me faciliter la vie, j'ai récupérer le signal Boot0 pour le raccorder sur un bouton poussoir distant.

Faire un breakout du signal boot0

Par chance, le bouton boot0 expose ses 4 pattes de soudure avec un peu d'étain accessible.


La broche entourée permet d'y souder un fil silicone 30 AWG (que l'on aura pré-étamé) avec la pointe d'un fer à souder.

Il suffira ensuite de placer ce signal boot0 à la masse (et redémarrer le Pico) pour activer le bootloader.

Voilà, cela fait de nombreuses informations d'ordre technique... mais sacrément intéressant.

A tout bientôt,
Dominique


Aucun commentaire