problème avec la librairie keyboard

Bonjour,
Je suis éleve en 4eme et j'essaie de réaliser un projet qui qui transforme un simple joystick en manette de jeu pc pour cela j'ai utiliser la librairie Keyboard.h tout marche bien sur le bloc-notes mes lettres s'écrivent normalement mais dès que je passe sur un jeu (j'en ai éssayé plusieurs : tuxkart, farming simulator...) il n'y a aucun déplacements ormis quelques accous bref.
Si vous pourriez m'aidez se serai sympa
merci d'avance

il y a un bug ligne 42 et le fil rouge n’est pas bien branché…

codeinfo.png

… postez votre code (avec les balises)

#include <Keyboard.h>
int pinX = 2;
int pinY = 3;
int valeurX;
int valeurY;
void setup()
{
  Serial.begin(9600);
  Keyboard.begin();
}

void loop()
{
  valeurX = analogRead(pinX);
  valeurY = analogRead(pinY);
  //  Serial.print(valeurX);
  //  Serial.print(" ");
  //  Serial.println(valeurY);
  if (valeurY > 700)//en haut
  {
    Keyboard.print('a');
  }
  if (valeurY < 300) //en bas
  {
    Keyboard.print('b');
  }
  if (valeurX > 700) //a droite
  {
    Keyboard.print('z');
  }
  if (valeurX < 300) //a gauche
  {
    Keyboard.print('e');
  }
}

voila le code

et si vous enlevez   Serial.begin(9600);

quel arduino avez vous ?

j'utilise une arduino pro micro (qui a un atmega32u4 comme la leonardo et qui prend bien en compte la librairie Keyboard) meme en enlevant

Serial.begin(9600);

il ya toujours cette effet saccadée

Ben vous balancez les caractères a fond, faudrait peut être essayer de limiter à quelques un par seconde

merci pour votre reponse mais j'ai essayer plusieurs delay apres chaque Keyboard.print(); (1, 2, 10, 20, 200, 500) mais il n'y pas de différence

Le problème peut venir du fait que tu ne testes que sur un seul axe à la fois. Plusieurs de tes conditions peuvent être remplies et ça envoie plusieurs commandes à la suite. D’où les à coups.

Teste plutôt sur les deux axes. Par exemple, en haut à droite:

if (valeurX>700 && valeurY>700)

Effectivement ça peut jouer mais je m'étais dit qu'il est au courant puisqu'il disait

sur le bloc-notes mes lettres s'écrivent normalement

j’ai modifié mon code avec des else if() mais ca e marche toujours pas

#include <Keyboard.h>
int pinX = 2;
int pinY = 3;
int valeurX;
int valeurY;
void setup()
{
  Keyboard.begin();
}

void loop()
{
  valeurX = analogRead(pinX);
  valeurY = analogRead(pinY);
  
  if (valeurY > 700)//en haut
  {
    Keyboard.print('a');
    delay(100);
  }
  else if (valeurY < 300) //en bas
  {
    Keyboard.print('b');
    delay(100);
  }
  else if (valeurX > 700) //a droite
  {
    Keyboard.print('z');
    delay(100);
  }
  else if (valeurX < 300) //a gauche
  {
    Keyboard.print('e');
    delay(100);
  }
}

ça veut dire quoi "ça ne marche pas" ? si vous tapez sur le vrai clavier, ça fonctionne et si vous utilisez votre joystick, ça ne marche pas, c'est ça ?

faut-il déclarer les périphériques dans votre jeu ? (il voit déjà un clavier, va-t-il écouter un second clavier? normalement oui mais tout dépend de ce que le développeur a fait)

sur le bloc notes mes lettres s'écrivent normalement mais dès que je passe sur le jeu il y a des tout petits accous et ca n'avance presque pas

Bonjour,

Qu'est ce qui ne marche pas?

Je vois deux raisons pour que ça ne fonctionne pas:

  1. Les codes envoyés correspondent à un clavier QWERTY.
    Keyboard.print('a'); envoi 'q'
    Keyboard.print('z'); envoi 'w'

  2. Ton jeu n'interprète peut être pas les codes acsii mais les messages d'enfoncement et de relâchement du clavier (sous Windows WM_KEYDOWN et WM_KEYUP si je me souviens bien).

bonjour,
j'ai bien vérifier et les touches envoyés correspondent a un clavier qwerty mais j'ai fais les changements nécéssaires et on voit bien que le jeux prend en compte les touches car il fait des petits accous brefs a chaque fois que j'actionne le joystick

par contre je n'ai pas bien compris ce que vous voulez dire par "enfoncement et relachement du clavier"?

Peut être que le jeu tien compte du temps pendant lequel la touche est enfoncée. La bibliothèque Keyboard envoie peut être les messages d’enfoncement et de relâchement trop vite.
Essaies ça:

#include <Keyboard.h>
int pinX = 2;
int pinY = 3;
int valeurX;
int valeurY;
void setup()
{
  Keyboard.begin();
}

void loop()
{
  valeurX = analogRead(pinX);
  valeurY = analogRead(pinY);

  char codeX=0;
  char codeY=0;
  if (valeurY > 700)//en haut
  {
    codeY='a';
  }
  else if (valeurY < 300) //en bas
  {
    codeY='b';
  }
  else if (valeurX > 700) //a droite
  {
    codeX='z';
  }
  else if (valeurX < 300) //a gauche
  {
    codeX='e';
  }

  if (codeY)
  {
    send(codeY);
    delay(100);
  }
  if (codeX)
  {
    send(codeX);
    delay(100);
  }
}

void send(char code)
{
  Keyboard.press(code);
  delay(50);
  Keyboard.release(code);
}

hello
j'ai du mal à te suivre tu dis:

transforme un simple joystick en manette de jeu pc

un joystick est bien composé de 2 potentiomètres et d'un bouton poussoir ?

donc, en sortie des potentiomètres, tu dois voir avec analogRead() des valeurs de -512 à +512 ?

je n'ai trouvé que le descriptif du "arduino micro" et pas celui du "arduino pro micro"

mais j'y vois que les pins analogiques sont A0 à A5

et dans ton programme, tu scrutes les pin D2 et D3 qui sont des pin digitales, (tout ou rien, 0 ou 5V).

peux tu éclaircir ?

Ce sont bien les pins analogiques qui sont utilisées.
analogRead(A2) et analogRead(2) sont équivalents (au moins sur les cartes UNO et Leonardo …).
Mais je suis d’accord avec toi, il vaut mieux utiliser analogRead(A2)

kamill:
analogRead(A2) et analogRead(2) sont équivalents (au moins sur les cartes UNO et Leonardo ...).

oui même un peu partout, c'est câblé en dur dans le code de la fonction analogRead(), si on passe un grand chiffre (c'est à dire A0 par exemple) le code transforme cette valeur pour revenir à une petite valeur. Si on veut gagner une soustraction, on peut passer 0 au lieu de A0 :slight_smile:

#if defined(analogPinToChannel)
#if defined(__AVR_ATmega32U4__)
	if (pin >= 18) pin -= 18; // allow for channel or pin numbers
#endif
	pin = analogPinToChannel(pin);
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
	if (pin >= 54) pin -= 54; // allow for channel or pin numbers
#elif defined(__AVR_ATmega32U4__)
	if (pin >= 18) pin -= 18; // allow for channel or pin numbers
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__)
	if (pin >= 24) pin -= 24; // allow for channel or pin numbers
#else
	if (pin >= 14) pin -= 14; // allow for channel or pin numbers
#endif

ok
moi je mets
analogRead(A0);... A1...A2.......A5
ou
analogRead(14);...ou 15...16 .......19

J-M-L:
oui même un peu partout, c'est câblé en dur dans le code de la fonction analogRead(), si on passe un grand chiffre (c'est à dire A0 par exemple) le code transforme cette valeur pour revenir à une petite valeur. Si on veut gagner une soustraction, on peut passer 0 au lieu de A0 :slight_smile:

Oui, mais il vaut mieux prendre l'habitude d'utiliser A0 (le temps de la soustraction est négligeable devant le temps d'acquisition ) pour prendre de bonnes habitudes car digitalRead(0) et digitalRead(A0) n'agissent pas sur la même pin.