RPi comme clavier USB HID - Comment envoyer les touches Multimédias et texte?

Bonjour, je cherche un moyen efficace de convertir du texte en format USB HID pour mon projet de clavier USB via un Raspberry Pi.

Actuellement j’utilise ce code que je me suis fait.

NULL_CHAR = chr(0)
CHARS_TEXT={
    "a":4,"b":5,"c":6,"d":7,"e":8,"f":9,"g":10,"h":11,"i":12,"j":13,"k":14,"l":15,"m":16,"n":17,"o":18,"p":19,"q":20,"r":21,"s":22,"t":23,"u":24,"v":25,"w":26,"x":27,"y":28,"z":29,
    "0":39,"1":30,"2":31,"3":32,"4":33,"5":34,"6":35,"7":36,"8":37,"9":38
    }
CHARS_CMD={"t":43,"e":40,"s":44,"f":225}
CHARS_MEDIA={"mute":127,"volup":128,"voldown":129}

def write_report(report):
    try:
        with open('/dev/hidg0', 'rb+') as fd:
            fd.write(report.encode())
    except:
        print("Fail to send the key to HID")
   
def text2hid(txt):    
    for a in txt:
        if(a.lower()==a):
            #is lower
            print("Press "+a+" for CHR: "+str(CHARS_TEXT[a.lower()]))
            write_report(NULL_CHAR*2+chr(int(CHARS_TEXT[a.lower()]))+NULL_CHAR*5)
        else:
            #is upper
            print("Press "+a+" for CHR (with shift): "+str(CHARS_TEXT[a.lower()]))
            write_report(chr(32)+NULL_CHAR+chr(int(CHARS_TEXT[a.lower()]))+NULL_CHAR*5)
        write_report(NULL_CHAR*8)
    
def cmd2hid(cmd):
    for c in cmd:
        print("Press code "+c+" for CHR: "+str(CHARS_CMD[c.lower()]))
        write_report(NULL_CHAR*2+chr(int(CHARS_CMD[c.lower()]))+NULL_CHAR*5)
        write_report(NULL_CHAR*8)

def media2hid(cmd):
    print("Press code "+str(cmd)+" for CHR: "+str(CHARS_MEDIA[cmd.lower()]))
    write_report(NULL_CHAR*2+chr(int(CHARS_MEDIA[cmd.lower()]))+NULL_CHAR*5)
    write_report(NULL_CHAR*8)

Ça marche, mais entrer 220 entrées en plus de certains avec SHIFT, je vois mal comment bien exploiter la mise en place.

il faudrait alors j’ajoute un filtre sur le résultat de mon Array pour détecter la prise en charge du shift, par exemple « a » est 4, le « A » est aussi 4 mais avec Shift, dans mon Array, je devrais alors créer la réponse « s4 » au lieu du « 4 », le s m’indiquerais d’inclure SHIFT.

Pour les lettres en fait, j’ai pas ce problème si ont regarde mon code. cependant, avec les chiffres et les symboles, c’est las que le problème arrive. Par exemple le « 2 » est aussi le « @ », alors pour le @ je dois définir « s31 » pour faire le SHIFT+2. J’ai pas encore codé cette partie, car je veux pas y perdre de temps si il y a moyen de faire mieux.

Je ne sais pas si il existerais un moyen de connaitre le code USB HID conséquent. Mes recherches Google donne pas de bons résultats, car le terme « USB HID » est plus utilisé pour des connexions de claviers au Raspberry, bref je trouve pas vraiment d’aide pour de quoi proche de mon projet.

Alors, il y a t-il un moyen de faire cette conversion de manière plus pratique ?

Pour connaitre les codes que j’ai besoin, c’est la colonne « DEC » (la première) de la liste présent en page 53 de ce PDF: https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf

De plus, je cherche a émuler les touches multimédias, si vous savez comment… :slight_smile:


Pour comprendre le Array CHARS_CMD, chaque lettre est une touche; t pour TAB, s pour ESPACE, e pour ENTER, f pour SHIFT, …

MaJ

J’ai avancé et amélioré plusieurs choses, pour le texte simple j’arrive à faire ce que je veux. Je vais devoir surement ajouter un moyen de changer la sortie clavier, dans mon cas; Français Canada et Canadien Multilangue.

Pour les commandes multimédias, j’ai trouver ceci; https://github.com/DevOps-Nirvana/python-usb-gadget-send-multimedia-hid-commands/blob/master/usb-gadget-multimedia-keys.py

Mais rien de plus, après la première manip, j’ai que des « beep » de type « PC Speaker » (mais qui passe sur la carte sont). Ce n’est pas un son associé à mon thème, c’est un très « basique ».

Je dois débrancher mon RPi du USB pour retrouver ma souris et clavier fonctionnel (je crois que CTRL resterait enfoncé).

Alors personne pouvant m’aider à trouver un moyen de communiquer les touches multimédias ?


Je cherche a reproduire ; MUTE, VOLUME UP, VOLUME DOWN, BACK, NEXT, PLAY, STOP

La lib de Adafruit (CircuitPython HID) n’aide pas, je n’ai pas d’erreur selon le code, mais le PC ne réagis pas.

Après ce problème, ce sera de trouver un moyen d’ouvrir des liens sur demande. Mais c’est vraiment optionnel cette option.

Je continue mes recherches…