[RESOLU]Ajouter un port USB pour clavier

Bonjour,
j'aimerais ajouter un nouveau port à ma UNO R3 et l'utiliser en clavier.
Pour cela, je propose un protoshield avec port USB.

Déjà :

  • Qu'est-ce qui différencie un port série d'un port "clavier" ?
  • Si possible utiliser seulement ce port pour envoyer les deux types de données ci-dessus
  • Pour utiliser les deux avec le même programme, passer de l'un à l'autre avec un interrupteur ou une broche sortie

Bref, je pars de rien, j'avais vu des discutions à ce sujet il y a longtemps et je les ai relues !
Ce lien m'a l'air utile.

Merci au moins d'avoir lu et peut-être de répondre !

Bonjour,

numero_744:
j'aimerais ajouter un nouveau port à ma UNO R3 et l'utiliser en clavier.

En clavier device ou host ?
Suivant la réponse le matériel a utiliser est radicalement différent.

numero_744:
Qu'est-ce qui différencie un port série d'un port "clavier" ?

Le protocole et la phase d'énumération USB : Serial CDC pour un port série virtuel, Keyboard HID pour un clavier.
Pour le reste tout passe par le bus USB de la même manière.

numero_744:
Si possible utiliser seulement ce port pour envoyer les deux types de données ci-dessus

J'ai rien compris, quelle types de données, quel port ?

numero_744:
Pour utiliser les deux avec le même programme, passer de l'un à l'autre avec un interrupteur ou une broche sortie

C'est quoi le but final, parce que là c'est vraiment pas trés clair tout ça ...

numero_744:
Bref, je pars de rien, j'avais vu des discutions à ce sujet il y a longtemps et je les ai relues !
Ce lien m'a l'air utile.

Si le but est de faire un port USB device émulant un clavier usb la librairie Vusb + surcouche arduino est effectivement la bonne solution.

Salut et merci pour ta réponse.

skywodd:
En clavier device ou host ?

:astonished: ?

Si possible utiliser seulement ce port pour envoyer les données CDC et HID sur la prise USB ajoutée.

skywodd:

numero_744:
Pour utiliser les deux avec le même programme, passer de l'un à l'autre avec un interrupteur ou une broche sortie

comme (je suppose) qu'on ne peut envoyer les deux en même temps, un interrupteur choisira un mode "direct" (CDC) et un mode en passant par un montage (HID), ou alors, une broche digitale et je-ne-sais-quoi pour basculer de l'un à l'autre (HIGH=HID et LOW=CDC).

skywodd:
C'est quoi le but final, parce que là c'est vraiment pas trés clair tout ça ...

Créer un "KeyboardShield"

Sur le schéma de Ce lien, il y a trois broches pour deux câbles !

J'ai téléchargé la librairie vusb-20120109, mais l'IDE dit qu'il ne peut pas l'utiliser car caractères non-ASCII... =(
Les circuits ont l'air compliqués... Au départ, je pensais faire ma propre librairie, avec juste :

  • blabla.begin(); //Met la broche pour passer en HID sur HIGH + met une valeur sur 1
  • blabla.stop(); //Met la même broche en LOW et revenir en + met une valeur sur 0
  • blabla.write("quelque chose"); //si une valeur est sur 1, serial.print("quelque chose");

Si nécessaire, remplacer serial.print("quelque chose"); par serial.print(un_numero_de_caractere);
Bref, un truc simple ! Et tant pis pour Commande (pomme); Contrôle; Option(alt ou casserole); F1<...>F15; esc et autres !
Par contre, les touches directionnelles seront souvent indispensables...

Je ne compte aller sur les bibliothèques préfabriquées qu'en dernière solution ou si l'on n'a pas le choix de faire simple.
Merci pour votre aide !

numero_744:
:astonished: ?

Device = émission, host = réception (pour faire simple)

numero_744:
comme (je suppose) qu'on ne peut envoyer les deux en même temps, un interrupteur choisira un mode "direct" (CDC) et un mode en passant par un montage (HID), ou alors, une broche digitale et je-ne-sais-quoi pour basculer de l'un à l'autre (HIGH=HID et LOW=CDC).

On peut émuler bien plus qu'un périphérique usb (en émulant un switch), faire du HID et CDC en même temps est tout à fait possible.
Par contre niveau utilisation CPU / mémoire ça va pomper pas mal.
(sur le forum tu doit pouvoir retrouver un code émulant 6 joystick usb HID en même temps)

numero_744:
Créer un "KeyboardShield"

L'intérêt est plutôt limité depuis l'arduino leonardo et son port usb natif ...
Si tu veut faire une shield compatible vusb il faudra respecter le schéma officiel fourni par www.obdev.at/vusb/

numero_744:
Sur le schéma de Ce lien, il y a trois broches pour deux câbles !

Data+, Data- et la résistance de pull-up sur Data- :wink:

numero_744:
J'ai téléchargé la librairie vusb-20120109, mais l'IDE dit qu'il ne peut pas l'utiliser car caractères non-ASCII... =(

Si tu veut utiliser la librairie vusb il faut (au choix) :

  • faire un dossier ne contenant pas de tiret, truc spéciaux, etc ...
  • utiliser l'adaptation de vusb pour arduino (recommandé)

numero_744:
Les circuits ont l'air compliqués... Au départ, je pensais faire ma propre librairie, avec juste :
(...)

Le circuit en lui même est très simple, trois résistances, deux diodes zener et un connecteur usb.
Le code lui est bien plus compliqué (et écris en grande partie en assembleur par soucis de timings).

numero_744:
Je ne compte aller sur les bibliothèques préfabriquées qu'en dernière solution ou si l'on n'a pas le choix de faire simple.

Si tu souhaite faire ta propre librairie vusb c'est même pas la peine d'y penser :wink:
Pour l'adaptation arduino de vusb c'est juste un dossier avec 3 fichiers en plus pour simplifier le code côté utilisateur.

Si l'on compare v-usb avec l'autre, on remarque une (légère) différence de complexité !

skywodd:

numero_744:
Les circuits ont l'air compliqués... Au départ, je pensais faire ma propre librairie, avec juste :
(...)

Le circuit en lui même est très simple, trois résistances, deux diodes zener et un connecteur usb.
Le code lui est bien plus compliqué (et écris en grande partie en assembleur par soucis de timings).

Je pensais au v-usb et non à l'autre, désolé de parler de deux choses en même temps.

skywodd:
L'intérêt est plutôt limité depuis l'arduino leonardo et son port usb natif ...

La leonardo a une 20aine de broches. Un shield peut être utile pour être ajouté sur une MEGA ou une UNO (il me semble que la UNO a plus de mémoire que la leonardo).
Placer un interrupteur de sécurité du HID peut être utile si erreur code ]:smiley: (flemme d'appuyer sur reset...).
Mais je vais peut être céder cette discussion à un intéressé et acheter une leonardo.

P. S. : J'avais pensé à du CDC + Java (que je ne connais pas encore...) mais je n'ai pas trouvé d'applications pour 10.4... =(

numero_744:
Si l'on compare v-usb avec l'autre, on remarque une (légère) différence de complexité !

Oui mais non :wink:
En fait il y a juste une différence de logique.
V-usb part du principe que le microcontrôleur travaille en 3v3 (d'où les deux diodes en série qui abaisse le 5v de l'usb à du ~3v3) = pas de zener sur D+ / D-.
L'autre montage lui part du principe que l'arduino travaille en 5v (ce qui est le cas) et donc ajoute deux zener sur D+ / D- pour limiter la tension à 3v3.

numero_744:
La leonardo a une 20aine de broches. Un shield peut être utile pour être ajouté sur une MEGA ou une UNO

Au niveau du code il faudrait faire un système de #if defined(AVR__ATMEGAxxx) ... #else ... #endif.
Les ports / broches ne seront pas les même entre une mega et une UNO.

numero_744:
(il me semble que la UNO a plus de mémoire que la leonardo).

C'est l'inverse, mais vraiment de peu (2Ko vs 2.5Ko de RAM pour la leonardo)

numero_744:
P. S. : J'avais pensé à du CDC + Java (que je ne connais pas encore...) mais je n'ai pas trouvé d'applications pour 10.4... =(

Pourquoi java ? CDC c'est une classe usb générique pour faire des communications série (ou autre).
Pour 10.4 ? Ubuntu ?

C'est lequel, le bon montage, le simple ou le compliqué ?

Quel est l'idiot qui a eu l'idée de changer les broches ? :0

Je pensais à la mémoire morte (et encore, je ne suis pas sûr...).
Sinon, pourquoi la UNO est-elle plus chère alors qu'elle n'a pas de HID et qu'elle a moins de mémoire vive ?

Java pour utiliser le port série comme clavier (j'ai vu ça sur le net).
J'ai un vieux Mac OSX 10.4.11, alors que la plupart sont en 10.5 / 10.6, donc les applications de notre époque ne sont plus compatibles avec mon Mac.

numero_744:
C'est lequel, le bon montage, le simple ou le compliqué ?

Dans ton cas le schéma du tutoriel, pas celui du site officiel (tu travaille en 5v).

numero_744:
Quel est l'idiot qui a eu l'idée de changer les broches ? :0

Les deux schémas sont identique :wink:
Ce qui diffère c'est la partie alimentation.

numero_744:
Je pensais à la mémoire morte (et encore, je ne suis pas sûr...).

Même taille, que ce soit une UNO ou une leonardo.

numero_744:
Sinon, pourquoi la UNO est-elle plus chère alors qu'elle n'a pas de HID et qu'elle a moins de mémoire vive ?

La UNO à plus de composants sur la carte (partie chipset usb, ...).
/!\ Ne pas uniquement ce baser sur l'aspect prix ! La UNO et la leonardo ne sont physiquement pas compatible (shields et autre).
Prendre une leonardo par soucis de prix sans penser au coté hardware nécessaire au projet c'est faire une grosse bêtise :wink:

numero_744:
Java pour utiliser le port série comme clavier (j'ai vu ça sur le net).
J'ai un vieux Mac OSX 10.4.11, alors que la plupart sont en 10.5 / 10.6, donc les applications de notre époque ne sont plus compatibles avec mon Mac.

Je connais pas du tout OSX, j'aime bien mon linux moi :stuck_out_tongue:

Cool, un montage simple !

La leonardo est incompatible avec tous les shields ou quelques-uns seulement ?
L'Ethernet, par exemple ?

Je laisse tomber le Java, pas besoin.

Juste, c'est bien vusb pour mon montage ? :smiley:

Merci !

Salut, j'essaye et réessaye de faire fonctionner différentes versions de la librairie v-usb mais ça ne compile pas !
Une infinité d'erreurs sont renvoyées, mais là, c'est pas ma faute : les exemples fournis ne fonctionnent pas non-plus.

S.V.P. revoir Reply précédente :

numero_744:
La leonardo est incompatible avec tous les shields ou quelques-uns seulement ?
L'Ethernet, par exemple ?

Merci !

numero_744:
Salut, j'essaye et réessaye de faire fonctionner différentes versions de la librairie v-usb mais ça ne compile pas !
Une infinité d'erreurs sont renvoyées, mais là, c'est pas ma faute : les exemples fournis ne fonctionnent pas non-plus.

Les exemples de v-usb compilent, pas de toute là dessus ... tu doit avoir une (grosse) erreur de configuration dans usbconfig.h :wink:
Et normalement avec Google Code Archive - Long-term storage for Google Code Project Hosting. tu ne devrais rien avoir à configurer.

numero_744:
La leonardo est incompatible avec tous les shields ou quelques-uns seulement ?
L'Ethernet, par exemple ?

L'ethernet shield officielle devrait marcher car elle utilise le port ICSP pour communiquer avec l'arduino.
Mais toutes les autres shields qui utilisent le spi, i2c, ... ne fonctionnerons pas avec la leonardo.

Merci skywodd,
Bon, on est d'accord :
Je clique sur le lien affiché et j'atterris sur cette page.
Ensuite, je clique sur "arduinousb_release_004.tar.gz", j'ouvre le *.zip et je met le dossier dans "librairies".
J'ouvre l'IDE Arduino.

Fichier
->Exemples
-->arduinousb_release_004
--->UsbKeyboardDemo1
Je clique sur "Vérifier"... Il me renvoie son infinité d'erreurs :

UsbKeyboardDemo1.cpp:1:25: error: UsbKeyboard.h: No such file or directory
UsbKeyboardDemo1.cpp: In function 'void loop()':
UsbKeyboardDemo1.pde:-1: error: 'UsbKeyboard' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_H' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_E' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_L' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_O' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_SPACE' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_W' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_R' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_D' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_ENTER' was not declared in this scope

Je remplace les "" de #include par des <>, je re-clique sur "Vérifier" et... Il continue à me renvoyer des erreurs, sauf la première :

UsbKeyboardDemo1.cpp: In function 'void loop()':
UsbKeyboardDemo1.pde:-1: error: 'UsbKeyboard' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_H' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_E' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_L' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_O' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_SPACE' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_W' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_R' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_D' was not declared in this scope
UsbKeyboardDemo1.pde:-1: error: 'KEY_ENTER' was not declared in this scope

Il faut copier les 3 sous dossiers du dossier "libraries" de l'archive dans le dossier "libraries" de ton installation arduino.
Tu as du copier le dossier "libraries" entier, du coup l'ide ne cherchant pas dans les sous dossier il ne trouve pas la librairie.

Je viens de tester à l'instant :

Binary sketch size: 2 826 bytes (of a 32 256 byte maximum)

Merci, j'ai corrigé et il me renvoie

UsbKeyboardDemo1.cpp.o: In function `UsbKeyboardDevice':
/Applications/Arduino.app/Contents/Resources/Java/libraries/UsbKeyboard/UsbKeyboard.h:139: undefined reference to `usbInit()'
UsbKeyboardDemo1.cpp.o: In function `UsbKeyboardDevice::update()':
/Applications/Arduino.app/Contents/Resources/Java/libraries/UsbKeyboard/UsbKeyboard.h:150: undefined reference to `usbPoll()'

Au fait, sendKeyStroke() va juste envoyer des signaux comme quoi des touches ont été pressées, comme Keyboard.print() pour une leonardo. Quels sont les équivalents de Keyboard.press() et de Keyboard.release() ?

Au fait2, à quoi sert UsbKeyboard.update() ?

Au fait3, à partir du document ci-joint, p.53 à début 59, puis-je modifier les #define KEY_TOUCHE NUMERO et en rajouter ?

Merci !

Hut1_11.pdf (880 KB)

numero_744:
Merci, j'ai corrigé et il me renvoie

UsbKeyboardDemo1.cpp.o: In function `UsbKeyboardDevice':

/Applications/Arduino.app/Contents/Resources/Java/libraries/UsbKeyboard/UsbKeyboard.h:139: undefined reference to usbInit()' UsbKeyboardDemo1.cpp.o: In function UsbKeyboardDevice::update()':
/Applications/Arduino.app/Contents/Resources/Java/libraries/UsbKeyboard/UsbKeyboard.h:150: undefined reference to `usbPoll()'

Il faut utiliser la dernière version de la librairie :
http://code.google.com/p/vusb-for-arduino/downloads/detail?name=vusb-for-arduino-005.zip&can=2&q=

La version de vusb utilisait par la lib. étant assez vieille j'ai fait un zip avec la dernière version de vusb et de usbKeyboard.h (voir pièce jointe).

numero_744:
Au fait, sendKeyStroke() va juste envoyer des signaux comme quoi des touches ont été pressées, comme Keyboard.print()pour une leonardo.

Oui mais une touche à la fois (avec la possibilité d'ajout un modificateur (ALT, CTRL, ...)), alors que la version leonardo envoi toute une série de touches d'un seul coup.

numero_744:
Quels sont les équivalents de Keyboard.press() et de Keyboard.release() ?

Ils n'y en a pas.
La librairie envoi un appui puis un relâchement de touche à chaque sendKeyStroke().
Si tu veut faire un clavier usb virtuel "à la sauce leonardo" ouvre usbKeyboard.h (garde de côté usbconfig.h) et fait ton propre code en partant de vusb directement :wink:
La fonction de setup de l'usb fait une dizaine de lignes et la partie envoi d'une touche ce résume en deux lignes.

numero_744:
Au fait2, à quoi sert UsbKeyboard.update() ?

A lancer un "pool" du bus usb, c'est ce qui fait que l'usb marche.

numero_744:
Au fait3, à partir du document ci-joint, p.53 à début 59, puis-je modifier les #define KEY_TOUCHE NUMERO et en rajouter ?

Tu peut en rajouter mais les valeurs que tu ajoutes doivent être dans la norme HID sinon l'ordinateur ne verra pas la bonne touche.

UsbKeyboard.zip (109 KB)

Merci. Ça compile, maintenant.

Quand j'appuie sur la touche 'a', comment l'ordinateur sait si j'envoie

a a a a a a a a a a a a a a a

très rapidement ou si j'envoie

a______________________

(une pression continue) ?

Mon but est de faire une manette de jeux vidéos qui envoie à l'ordinateur des commandes clavier, et j'aimerais éviter les saccades qui peuvent êtres dérangeantes...
Je peux même en faire une manette multi-jeux : je connecte à l'ordi en USB série, j'envoie un caractère à la carte selon le jeux auquel je vais jouer, je coupe, je débranche (alim. jack) et je rebranche à la prise v-usb.

Mon shield proto arrive, avant d'acheter les composants, merci de me confirmer que c'est bien ce circuit :

Le *.pdf est téléchargé depuis usb.org, je pense que les références sont bonnes.

numero_744:
Quand j'appuie sur la touche 'a', comment l'ordinateur sait si j'envoie

a a a a a a a a a a a a a a a

très rapidement ou si j'envoie

a______________________

(une pression continue) ?

Plusieurs appuis = plusieurs événements USB appui / relâche.
Un appui continu = un événements USB appui seul.

numero_744:
Mon but est de faire une manette de jeux vidéos qui envoie à l'ordinateur des commandes clavier, et j'aimerais éviter les saccades qui peuvent êtres dérangeantes...
Je peux même en faire une manette multi-jeux : je connecte à l'ordi en USB série, j'envoie un caractère à la carte selon le jeux auquel je vais jouer, je coupe, je débranche (alim. jack) et je rebranche à la prise v-usb.

Tu devras faire ta propre version de la librairie usbKeyboard en enlevant la partie relâchement "auto" de la touche.

numero_744:
Mon shield proto arrive, avant d'acheter les composants, merci de me confirmer que c'est bien ce circuit :

C'est bon.

Mille mercis Skywodd !
Je vais sauter sur le code source de usbKeyboard et modifier la fonction sendKeyStroke façon leonardo et changer les #define des touches pour avoir un clavier plus complet.
Je suis vraiment soulagé !

J'ai fait les modifications de "UsbKeyboard.h" (document ci-joint)
Est-ce bien ?
Je sais que l'exemple ne fonctionnera plus avec.
Je crains plutôt que mes if dans le sendKeyStroke soient mal placés ou que mes #define dysfonctionnent.
Encore merci !

UsbKeyboard.h (7.11 KB)

S'cusez-moi, y'a erreur, je remets la bonne version. Enfin, je ne sais pas si elle marche. Mais elle devrait. Elle compile (aussi avec l'exemple) mais je ne peux pas l'essayer. Donc celle qui devrait marcher, quoi !
Pouvez vous me dire si elle fonctionne correctement s'il vous plaît ?

UsbKeyboard.h (7.61 KB)