Aller au contenu


Photo
- - - - -

Processing & Keyevent


10 réponses à ce sujet

#1 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 783 messages

Posté 21 avril 2013 - 04:40

Salut,
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 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 783 messages

Posté 22 avril 2013 - 04:18

Salut, c'est encore moi...
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 . 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	         0x82
dans 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 :
Image IPB
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 ^^ ).

#3 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 783 messages

Posté 23 avril 2013 - 05:44

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. ^^

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 Black Templar

Black Templar

    Membre

  • Membres
  • PipPipPipPipPip
  • 1 430 messages
  • Gender:Male
  • Location:Lille

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 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 7 823 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

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 wink.gif
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  !  :thank_you:

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 !

 

Les réalisations de Mike118  

 

 

 


#6 Melmet

Melmet

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 114 messages
  • Gender:Male
  • Location:Saint-Sozy (46200)

Posté 24 avril 2013 - 05:23

Sisi, c'est très intéressant !
Je ne répond pas car je n'ai rien à t'apporter, mais c'est instructifs, merci.

Idem désoler :black_eye:
Mais bon, continu a nous montrer tes avancements.

Ne demande jamais à un robot de faire ce que tu peux faire toi même. :nono: :laugh1:


#7 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 783 messages

Posté 24 avril 2013 - 02:19

cool, merci.
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 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 783 messages

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 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 290 messages
  • Gender:Male

Posté 09 juin 2015 - 08:05

Salut! Apparement le pin 13 de la puce est un pin reset. D'après ce que j'ai pu comprendre, il faut allumer la carte et laisser le pin 13 a un état bas un certain moment pour effectuer le reste. D'après le datasheet, sous réserve d'avoir bien traduit ^^

#10 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 783 messages

Posté 09 juin 2015 - 08:08

ok, merci. 

je vais tenter ça... je repasserai dire si ça a fonctionné.

:thank_you:

 

-------

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 ashira

ashira

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 1 290 messages
  • Gender:Male

Posté 09 juin 2015 - 08:39

Les seuils du pin sont entre 0.2 et 0.85v apparement! Jette un oeil au pdf tu es peu etre meilleure que moi en anglais^^



Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users