mardi, avril 13, 2021

Ma borne Arcade Mahjong

 Voici ma borne d'arcade Mahjong

Bon c'est une construction assez classique: un bartop et un piédestal construit en bois MDF. 
Quelques boutons et stick commandés sur aliExpress branché sur une carte encodeur USb, le tout tournant sur un Raspberry 3.

La particularité ici c'est la partie Clavier pour le Mahjong:


Pour Jouer au Mahjong avec l'émulateur Mame, on a besoin des lettres de A à N, Ainsi que de 5 touches pour les commandes "chi", "pon", "kan", "reach", et "ron".
Pour les 5 touches il suffit de modifier les commandes dans Mame pour reconfigurer les touches, mais pour le clavier c'est une autre histoire.

Déjà parce qu'il faut 14 touches supplémentaires, ce qui est supérieur aux entrées restantes sur la carte USB, et le Core Mame de retroarch n'accepte pas de configurer une seconde carte USB pour le joueur 1.

Donc il faut un clavier réel, d'où l'idée d'utiliser une carte Arduino Leonardo, ou un clone comme la Pro micro dispo sur aliExpress pour 3€ environ.


En effet cette carte est doté d'un micro contrôleur Atmega32U4 qui est compatible avec la library Keyboard. Cette carte possède un émetteur-récepteur USB qui va nous permettre de simuler des touches de clavier.

La Seconde idée est d'utiliser un seul port Analog pour toutes les touches, évitant ainsi d'avoir trop de câbles.
l'avantage du port analogue c'est qu'on peut faire varier sa valeur.
En faite l'idée est de séparer chaque touche par une résistance, et ensuite dans le programme Lire la valeur du port Analog pour retrouver la touche pressée.

En branchant les touches comme ceci:


C'est assez simple à comprendre:
Si vous lisez la valeur du port Analog A1 en appuyant sur le Bouton A

int valeur = analogRead(A1);
Serial.println(valeur);
La tension part du port VCC (+5V), passe par le bouton 'A' pressé, et arrive au port analog 'A1' en n'ayant rencontré aucune résistance, alors la valeur retourné est 1023.

Si maintenant vous appuyez sur le bouton 'B', la tension va rencontrer une résistance de 300Homs et la valeur retourné sera de 993. Sur la touche 'C' elle va rencontrer 2 résistances, etc.

Ensuite il suffit d'écrire un programme pour dire simplement que si la valeur du port Analog (A1) est 993 alors on a appuyé sur la touche 'B' du clavier, si la valeur est 964 alors on a appuyé sur la touche 'C' du clavier, etc.

Bon pour être plus exact, et considérant que les résistances ont une marge d'erreur, on va plutôt chercher la touche pressé dans une fourchette de valeur:

Exemple: si la valeur est comprise entre "985" et 995" alors c'est la touche 'B' qui est pressé.

Voici à quoi peut ressembler le programme à insérer dans la carte:

#include <Keyboard.h>

int valeur;

void setup() { 
 Serial.begin(9600);

  //bouton N
  pinMode(6,INPUT);

}

void loop() {
  
//BOUTON N
boolean a=digitalRead(6);
if(a==1){
  Keyboard.begin();
  Keyboard.press('n');
  delay(100);
  Keyboard.releaseAll();
  delay(100);
  Keyboard.end();
}
  
  valeur = analogRead(A1);

if(valeur>5){
  Keyboard.begin();

 if(valeur >1015){
 
    Keyboard.press('a');
  
 }
 else if(valeur > 995 && valeur < 1005){
  
   Keyboard.press('b');
  
 }
  else if(valeur > 975 && valeur < 985){
  
   Keyboard.press('c');
  
 }
  else if(valeur > 955 && valeur < 965){
  
    Keyboard.press('d');
 
 }
  else if(valeur > 935 && valeur < 945){
  
    Keyboard.press('e');
 
 }
  else if(valeur > 915 && valeur < 925){
  
   Keyboard.press('f');
  
 }
  else if(valeur > 900 && valeur < 910){
  
    Keyboard.press('g');
 
 }
  else if(valeur > 880 && valeur < 890){
  
   Keyboard.press('h');
  
 }
  else if(valeur > 865 && valeur < 875){
  
    Keyboard.press('i');
 
 }
  else if(valeur > 850 && valeur < 860){
  
   Keyboard.press('j');
  
 }
  else if(valeur > 835 && valeur < 845){
  
    Keyboard.press('k');
  
 }
  else if(valeur > 820 && valeur < 830){
  
   Keyboard.press('l');
   
 }
  else if(valeur > 805 && valeur < 815){
 
   Keyboard.press('m');
  
 }
 delay(50);
  Keyboard.releaseAll();
    delay(50);
  Keyboard.end();

}

  delay(10);
}

Voila, si vous lisez correctement mon code, vous verrez que j'ai mis la touche 'N' sur un port simple. En effet au mahjong, on appuie facilement 40 fois sur la touche 'N' par manche. j'ai donc préféré le mettre seul, c'est plus rapide pour la lecture du code.
Ensuite les valeurs ne correspondent pas à mon exemple, tout simplement parce que j'ai utilisé des résistances de 220 Ohms.
Et pour finir j'ai enveloppé le code pour n'ouvrir la lecture clavier que si la valeur est supérieur à 5, inutile de lire en boucle si aucune touche n'est pressé (d'où l'utilité de séparer la touche 'N') 

Voila j'espère vous avoir éclairci sur la simulation d'un clavier. pensez y si à l'avenir vous voulez créer un cockpit pour un simulateur de vol, ou tout autre projet qui demande de nombreuse touches.


Aucun commentaire: