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.
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 !
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-
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
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 ] (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
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 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
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
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
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.
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.
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.
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 ?
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()'
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
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.
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 :
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 !
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 ?