Processing & Keyevent
#1
Posté 21 avril 2013 - 04:40
j'aurais souhaité émuler un clavier avec Processing :
Mon arduino envoie des informations par l'USB à mon PC (winXP), maintenant, j'aimerai que mon programme côté PC puisse envoyer des caractères comme si ça venait de mon clavier. (et ce, même si le programme Processing n'est plus au premier plan ; par exemple, écrire dans notepad).
je crois qu'en JAVA ça existe ("Keyevent")
merci d'avance pour votre aide.
edit :
Plus la peine, je viens de trouver un truc qui s’appelle "VUSB for arduino" et qui semble parfaitement répondre à mes attentes.
#2
Posté 22 avril 2013 - 04:18
Je souhaitais vous faire partager mes avancées au cas ou ce sujet intéresse quelqu'un :
Le but de cette bidouille est de connecter un Paddle NES sur mon PC (ou mon Raspberry Pi) via un Arduino afin de jouer à Maze-of-Galious sur PC ou à MAME sur RPi. L'Arduino devra donc simuler l'appuie de touches clavier.
Pour celà, j'ai commencé par récupérer les infos de la manette NES grâce aux informations glanées ici et là. Il ne me restait plus qu'à émuler un clavier USB, j'ai donc trouvé "V-USB for Arduino" qui semble faire l'affaire.
J'ai donc téléchargé VUSB-for-Arduino, j'ai copié les trois dossiers fournis (UsbStream, UsbKeyboard et UsbDevice) dans mon dossier "libraries". Les exemples fournis n'étant pas documentés, je me suis tourné vers cet autre excellent tuto afin de cerner le fonctionnement de la lib.
Il ne me restait plus qu'à mixer tout ça et je pourrai continuer Maze of Galious et les épiques odyssées du chevalier Popolon.. J'ai donc mixé tout ça :
/* INITIALISATION */ // USB #include "UsbKeyboard.h" int lastState = LOW; // LOW is equivalent to 0 // PAD int latch = 10; // set the latch pin int clock = 11; // set the clock pin int datin = 12;// set the data in pin byte controller_data = 0; /* SETUP */ void setup() { // PAD pinMode(latch,OUTPUT); pinMode(clock,OUTPUT); pinMode(datin,INPUT); digitalWrite(latch,HIGH); digitalWrite(clock,HIGH); // USB // Disable timer0 since it can mess with the USB timing. Note that // this means some functions such as delay() will no longer work. TIMSK0 &= !(1<TOIE0); // Clear interrupts while performing time-critical operations cli(); // Force re-enumeration so the host will detect us usbDeviceDisconnect(); delayMs(250); usbDeviceConnect(); // Set interrupts again sei(); } /* CONTROLLER READ */ void controllerRead() { controller_data = 0; digitalWrite(latch,LOW); digitalWrite(clock,LOW); digitalWrite(latch,HIGH); delayMicroseconds(2); digitalWrite(latch,LOW); controller_data = digitalRead(datin); for (int i = 1; i <= 7; i ++) { digitalWrite(clock,HIGH); delayMicroseconds(2); controller_data = controller_data << 1; controller_data = controller_data + digitalRead(datin) ; delayMicroseconds(4); digitalWrite(clock,LOW); } } /* USB KEYBOARD EMUL */ void usbDataLaunch(byte controller_data) { byte mask; int btArray[8]={KEY_RIGHT_ARROW,KEY_LEFT_ARROW,KEY_DOWN_ARROW,KEY_UP_ARROW,KEY_P,KEY_LEFT_ALT,KEY_LEFT_CTRL,KEY_SPACE}; int btpointer=0; for (mask = 0x01; mask; mask <<= 1) { UsbKeyboard.update(); if (controller_data & mask) { UsbKeyboard.sendKeyStroke(btArray[btpointer]); } btpointer = btpointer+1; } } /* PROGRAM */ void loop() { controllerRead(); delay(100); usbDataLaunch(controller_data); } // helper method for V-USB library void delayMs(unsigned int ms) { for( int i=0; i<ms; i++ ) { delayMicroseconds(1000); } }
Malheureusement, je souhaitais simuler les flêches du clavier (entre autres) et ces requêtes me retournent une erreur de compilation.
En farfouillant dans les dossiers ajoutés précédemment, je suis tombé sur "libraries\UsbKeyboard\UsbKeyboard.h" qui contient plein de définitions de touches "#define KEY_xx xx".
J'ai donc ajouté les lignes :
#define KEY_RIGHT_ARROW 0xD7 #define KEY_LEFT_ARROW 0xD8 #define KEY_DOWN_ARROW 0xD9 #define KEY_UP_ARROW 0xDA #define KEY_LEFT_CTRL 0x80 #define KEY_LEFT_SHIFT 0x81 #define KEY_LEFT_ALT 0x82dans le fichier UsbKeyboard.h ce qui semble résoudre les problèmes de compilation.
Il ne me reste plus qu'à acheter quelques composants pour faire la sortie USB (car il semblerait que la lib n'envoie pas les infos par l'USB déjà implanté sur l'arduino) et je teste ça.
J'ai retenu ce montage :
parmi les trois proposés, car ça m'a semblé moins dispendieux et plus simple... mais n'étant pas fort en anglais, je n'ai pas bien saisi les différences entre ces trois méthodes.
Pensez-vous que je devrais faire un autre choix ? Si oui, lequel et pourquoi ?
PS : désolé d'avoir été si long, mais je souhaitais partager tout ça au cas ou ça intéresse quelqu'un. (avec quelques modifs, il devrait être possible de jouer à angry-birds avec un lance-pierres ^^ ).
- Melmet aime ceci
#3
Posté 23 avril 2013 - 05:44
je ne sais pas si ce sujet vous intéresse car il y a peu de réponses ; de plus je me rends compte que je suis un peu hors sujet du fait que cette bidouille ne concerne pas (directement) le domaine de la robotique. De ce fait, si vous jugez que ce retour d’expérience n'a pas sa place ici, dites le moi simplement et je cesserai de vous importuner avec ce hors sujet. ^^
Cela dit, voici les nouvelles concernant ce projet :
J'ai donc acheté les trois résistances, les deux zeners et un USB(B)femelle. (coût : 1.50€).
j'ai soudé les composants, j'ai tout branché, (j'ai aussi viré deux lignes gênantes dans le programme) et j'ai essayé..
Première constatation : les "#define KEY_xx" que j'avais ajouté ne fonctionnent pas (même si je les indique en décimal). Par contre, j'ai modifié les touches directement dans le jeu et là ça fonctionne (presque). Un bon point pour la lib VUSB-for-Arduino car c'est rare que je fasse fonctionner un truc si vite. ^^
Cependant, il y a un gros souci : la fonction "UsbKeyboard.sendKeyStroke(btArray[btpointer]);" simule une pression, mais aussi un relâchement de la touche indiquée en premier attribut. Mais dans le jeu, si je souhaite faire sauter Popolon, j'appuie sur haut et je maintiens la touche du paddle enfoncée alors que l'arduino fait comme si j'appuyais plusieurs fois sur la touche.
Si quelqu'un a une solution, je suis preneur. (.. et je le remercie d'avance)
EDIT :
je suis retourné voir dans "UsbKeyboard.h" et j'ai trouvé la fonction qui me pose problème :
void sendKeyStroke(byte keyStroke) { sendKeyStroke(keyStroke, 0); } void sendKeyStroke(byte keyStroke, byte modifiers) { while (!usbInterruptIsReady()) { // Note: We wait until we can send keystroke // so we know the previous keystroke was // sent. } memset(reportBuffer, 0, sizeof(reportBuffer)); reportBuffer[0] = modifiers; reportBuffer[1] = keyStroke; usbSetInterrupt(reportBuffer, sizeof(reportBuffer)); while (!usbInterruptIsReady()) { // Note: We wait until we can send keystroke // so we know the previous keystroke was // sent. } // This stops endlessly repeating keystrokes: memset(reportBuffer, 0, sizeof(reportBuffer)); usbSetInterrupt(reportBuffer, sizeof(reportBuffer)); }
Je pense que c'est la variable binaire "modifiers" qui doit me permettre de m'en sortir... mais comment ça marche ?...
#4
Posté 23 avril 2013 - 09:24
Me revoici,
je ne sais pas si ce sujet vous intéresse car il y a peu de réponses ; de plus je me rends compte que je suis un peu hors sujet du fait que cette bidouille ne concerne pas (directement) le domaine de la robotique. De ce fait, si vous jugez que ce retour d’expérience n'a pas sa place ici, dites le moi simplement et je cesserai de vous importuner avec ce hors sujet. ^^
Sisi, c'est très intéressant !
Je ne répond pas car je n'ai rien à t'apporter, mais c'est instructifs, merci.
Mon site internet : http://ferdinandpiette.com/
#5
Posté 24 avril 2013 - 02:06
Sisi, c'est très intéressant !
Je ne répond pas car je n'ai rien à t'apporter, mais c'est instructifs, merci.
je trouve cela intéressant aussi
mais par contre de même, je ne répond rien car je n'ai rien a apporter non plus ...
Donc bon courage et bonne continuation !
Si mon commentaire vous a plus laissez nous un avis !
Nouveau sur Robot Maker ?
Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope aux articles, à la boutique et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être !
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!
#6
Posté 24 avril 2013 - 05:23
Idem désolerSisi, c'est très intéressant !
Je ne répond pas car je n'ai rien à t'apporter, mais c'est instructifs, merci.
Mais bon, continu a nous montrer tes avancements.
Ne demande jamais à un robot de faire ce que tu peux faire toi même.
#7
Posté 24 avril 2013 - 02:19
je me suis penché sur la variable "modifiers" en pensant qu'elle gérait la modification d'état des touches, mais en réalité, cette variable est utilisée pour les combinaisons de touches (par exemple si on la met à 1, ça fait CTRL+[la lettre visée en premier argument])... donc ça ne m'aidera pas pour le moment.
j'ai quand même réussi à ajouter à la liste des touches prises en charge (les #define KEY_xx) les flèches de direction.. je posterai la modif un peu plus tard car j'espère encore trouver les ALT, SHIFT, CTRL...
voilà pour le moment, j'épluche toujours la fonction sendKeyStroke().. j'aimerai bien ajouter des fonctions "kbKeyNewPress(), kbKeyPressed() et kbKeyRelease()", mais pour l'instant je n'y parvient pas. ^^
Edit : au passage, j'ai appris que l'Arduino Léonardo aurait été plus indiqué pour ce genre de manip car il dispose d'une fonction simulation de clavier d'origine...
#8
Posté 09 juin 2015 - 07:39
salut a tous,
ayant fait l'acquisition d'un arduino leonardo, j'ai voulu reprendre ce projet ou je l'avais laissé.
j'ai un peu modifié le programme pour remplacer les commandes de VUSB-for-arduino par les commandes de l'arduino, puis j'ai balancé l’algorithme dans le léonardo... malheureusement, il y a quelques petites erreurs dans le programme ce qui fait que ça balance non-stop des "?KPH.Z" dans mon ordi (et oui.. j'avais pas pensé à ce problème).. le gros souci c'est que pour remplacer le programme foireux par un autre (moins foireux j'espère), il faut connecter l'arduino au PC.. et là : "?KPH.Z?KPH.Z?KPH.Z?KPH.Z... etc..." (sans compter que ça émule un appui sur shift, mais pas le relâchement de la touche). Du coup, pas moyen de lancer le telechargement du nouveau prog dans l'arduino.
existe t-il un moyen de supprimer le prog de l'arduino sans le connecter a un ordi ?
merci d'avance.
#9
Posté 09 juin 2015 - 08:05
#10
Posté 09 juin 2015 - 08:08
ok, merci.
je vais tenter ça... je repasserai dire si ça a fonctionné.
-------
edit :
ça n'a pas fonctionné..
par contre j'ai réussi a écraser le prog par un nouveau vide en appuyant sur shift au lancement du transfert. (je pense que c'est la touche shift qui ne se relâchait pas dans mon prog qui bloquait tout).
en tous cas merci, et je vais me prévoir une porte de sortie dans mon prog pour les prochains essais.. ça sera plus simple ^^.
je profite de ce post pour poser une nouvelle question :
ou puis-je trouver une table ascii correcte et complète ?.. on trouve beaucoup de choses sur internet mais une table ascii complète c'est difficile.
(et si vous connaissez le code ASCII de la touche "Alt", je suis preneur, je ne l'ai trouvé nulle part)
merci
#11
Posté 09 juin 2015 - 08:39
0 utilisateur(s) li(sen)t ce sujet
0 members, 0 guests, 0 anonymous users