Arduino comme USB HID

25

Est-il possible de construire un appareil HID (comme un clavier) en utilisant un Arduino uno?

À l'heure actuelle, j'ai des entrées de bouton sur l'Arduino donnant des sorties sur la ligne série. Alors, comment puis-je transformer mon firmware actuel en quelque chose qui peut se comporter comme un clavier HID?

  • Dois-je écrire un nouveau pilote de périphérique de fenêtre?
  • Dois-je créer une couche logicielle qui pourrait prendre mes données série et demander à Windows de les lire comme entrée HID?
  • Existe-t-il un meilleur moyen d'y parvenir, si cela est possible?
Anomalie
la source
1
Je me trompe peut-être, mais il ne s'agit pas vraiment d'Arduino. Il s'agit du développement du pilote de périphérique latéral de Windows.
asheeshr
1
Première réponse dans google: mitchtech.net/arduino-usb-hid-keyboard ... mais vous n'avez pas précisé quel Arduino. Sur un Leonardo, il est intégré et le pilote approprié existe déjà (voir arduino.cc/en/Reference/MouseKeyboard ).
FredP
J'utilise un Uno, mais je vais regarder ce que vous avez publié parce que la dernière fois que nous avons envisagé la mise à jour DFU, mais nous avons un peu peur des briques car les composants ne sont pas aussi facilement disponibles et bon marché dans ma région que dans la plupart des autres. des endroits.
Anomalie
3
@AsheeshR Ce problème est sur meta maintenant: meta.arduino.stackexchange.com/q/102/46
Ricardo
1
Eh bien, c'est certainement possible, car l'Arduino Uno dispose d'une puce de pilote USB Atmega16u2, l'utilisateur peut utiliser un flash DFU ou ICSP pour pousser sur l'appareil un micrologiciel proche de celui de Leonardo qui fera en sorte que l'Arduino se comportera comme un clavier HID. Aucun développement Windows n'est impliqué, aucun pilote à construire car les périphériques USB / HID sont reconnus par défaut. c'est-à-dire que cette question devrait être rouverte.
zmo

Réponses:

14

Est-il possible de construire un appareil HID (comme un clavier) en utilisant un Arduino uno?

Oui, ça l'est! Et il y a un excellent tutoriel sur la façon de le faire ici

À l'heure actuelle, j'ai des entrées de bouton sur l'Arduino donnant des sorties sur la ligne série. Alors, comment puis-je transformer mon firmware actuel en quelque chose qui peut se comporter comme un clavier HID?

Comme le didacticiel vous le montre, vous devez transformer votre code de micrologiciel afin qu'au lieu d'imprimer les événements, vous déclenchiez réellement des événements. Ce que vous devez faire, c'est ajouter à votre code:

void triggerKey(uint8_t mod, uint8_t chr) {
    uint8_t buf[8] = {mod, chr, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    // press key
    Serial.write(buf, 8);
    // emulate key press delay
    delay(10);
    buf[1] = 0x00;
    // release key
    Serial.write(buf, 8);
}

Ce que vous faites ici, c'est envoyer de vos principaux événements de microcontrôleur Arduino sur la ligne série au plus petit microcontrôleur qui gère la communication USB. Ce microcontrôleur prendra ces "tampons" de touches et les transférera lorsque les touches du clavier USB HID seront pressées via USB.

Attention, le caractère clé ( chrdans le code ici) est en fait un code clé envoyé via USB qui est interprété par votre pilote HID USB, qui le traduit ensuite en un vrai caractère en utilisant la disposition actuelle que vous avez configurée pour votre clavier.

Le modpersonnage est l'une des touches de modification que vous avez sur le clavier (shift, control, alt ...), 0x00étant aucun modificateur.

  • Dois-je écrire un nouveau pilote de périphérique de fenêtre?

Non, tu n'as pas besoin! Avec la mise à niveau DFU, votre Arduino sera considéré comme un clavier USB par Windows.

  • Dois-je créer une couche logicielle qui pourrait prendre mes données série et demander à Windows de les lire comme entrée HID?

Vous n'avez pas besoin de le faire, et c'est en fait une très mauvaise idée pour plusieurs raisons:

  • votre solution ne serait pas portable, et donc vous auriez besoin de pirater quelque chose pour chaque plate-forme que vous pourriez utiliser,
  • votre solution impliquerait beaucoup de nouveau code; plus il y a de code à écrire, plus il y aura probablement de bogues dans votre système,
  • votre solution serait vraiment piratée, car elle se comporterait comme un pilote de périphérique (c.-à-d. la terre du noyau ) qui prend les données d'un programme utilisateur (c.-à-d. la terre des utilisateurs ) et ne fonctionnera probablement pas, sera un enfer à déboguer et sujet à des problèmes de sécurité. .. Si c'est même possible de le faire!

J'utilise un Uno, mais je vais regarder ce que vous avez publié parce que la dernière fois que nous avons envisagé la mise à jour de DFU, mais nous avons un peu peur des briques

Enfin, vous avez des inquiétudes, dans un commentaire, à propos de la brique de votre arduino. S'il vous plaît, croyez-moi et l'auteur de l' article que vous ne pouvez pas briquer votre arduino en faisant un flash de firmware:

REMARQUE: il n'y a aucune chance de «bricker» l'appareil à l'aide de cette méthode. Le firmware du chargeur de démarrage Arduino peut toujours être mis à jour en utilisant le protocole DFU!

Dans le cas où quelque chose se passe vraiment mal et que vous obtenez une corruption du chargeur de démarrage dans le petit AVR (atmega8u2), vous pouvez toujours le reflasher en utilisant un autre arduino ou un programmeur atmel en utilisant les 6 broches à côté de la prise USB.

Au final, sachez que le seul moyen de briquer un AVR, donc un Arduino également, est de jouer avec les fusibles et de réinitialiser les fusibles de programmation. Et même dans ce cas, vous pouvez utiliser HVSP pour enregistrer votre appareil, bien qu'il soit souvent moins difficile de simplement prendre une nouvelle puce.

zmo
la source
1
Merci pour toutes les informations utiles, nous avons fini par y arriver.
Anomaly
Eh bien, la bonne façon de briquer un AVR est avec une surintensité / une surtension. Ensuite, il sera grillé ...
user2973
Mais alors, cela ne s'appelle pas de la brique, mais la faire frire, ou comme vous le dites griller. Mettez 15 ampères à travers le MCU, et je parie que vous le verrez sauter à travers la pièce ;-)
zmo
Comment libérer une clé spécifique? Je veux émuler une touche HOLD puis relâcher. Et aussi dans le lien, le caractère va au tableau [2] tandis qu'ici va à [1]. Pourquoi?
5argon
eh bien, comme le montre mon exemple, vous le faites en deux étapes, d'abord vous appuyez sur la touche, puis il y a le délai, puis vous le relâchez. Eh bien, alors vous devrez vous expliquer comment fonctionne l'implémentation du clavier matériel, ce n'est pas naturel, et chaque valeur du tableau a une signification. Pardonnez-moi de ne pas avoir de lien pour partager atm, mais chaque fois que vous trouvez quelque chose en train de chercher sur le web, veuillez poster un nouveau commentaire ☺
zmo
6

J'ai créé un projet qui remplace complètement le chargeur de démarrage Arduino. Vous pouvez télécharger des croquis et les utiliser comme HID. Voir Project HID sur Github: https://github.com/NicoHood/HID


la source
4
Bienvenue sur Arduino SE! Pouvez-vous ajouter un peu sur la façon d'utiliser votre bibliothèque? Merci!
Anonymous Penguin
2
Lisez le fichier Lisezmoi et essayez les exemples? Tout est là, pas besoin de tout duper ici. Tout sur Github est à jour :)
Désolé mec, ça ressemble à une bibliothèque sympa, mais votre documentation manque complètement. Il n'y a pas de véritables instructions d'installation pour autant que je sache, et des sujets entiers dans votre wiki disent simplement "TODO" (en particulier le sujet de la manette de jeu est complètement vide comme ça). : - /
BrainSlugs83
1
En fait, il est nécessaire de présenter une description de base ici: les réponses doivent être significatives même sans le lien externe, qui pourrait mourir. Et celui-ci ne l'est pas.
Chris Stratton