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.


lundi, avril 12, 2021

GamelistCreate Version 1.5 pour recalbox

 Voici la dernière version de GamelistCreate avec toutes les corrections (enfin j'espère qu'il n'y en a plus)

gamelistcreate.zip





Mise à jour 1.5:
-Correction balise <video>
-Correction Dossier "images" prioritaire
-Ajout la balise <thumbnails> se rempli si vous possédez un dossier thumbnails
-Ajout Dossier déclaré dans Gamelist.xml (sauf media)
-N'écrit plus que les balises remplis dans le Gamelist
-Priorité au Gamelist.xml existant pour les infos de la rom.


    Alors tout d'abord j'ai corrigé la balise <video> qui ne pouvait pas fonctionner car j'avais mis une majuscule à "Video", du coup recalbox supprimait la balise à chaque mise à jour de la liste des jeux. Je suis étonné que personne ne m'ai remonté l'erreur. Il a fallu que je décide de mettre des Videosnaps dans ma borne pour m'en rendre compte.

    J'ai corrigé aussi le dossier images (avec un 'S') qui est prioritaire pour la recherche de l'image de la rom. Comme quoi Une petite majuscule par ci, et un petit 'S' manquant par là, fait d'énorme dégâts sur un programme.

    Si vous avez un dossier thumbnails, alors maintenant recalbox cherche une correspondance, et l'ajoute à la rom dans le Gamelist.

    Comme Recalbox déclare les sous-dossiers (sauf media) dans le Gamelist. maintenant GamelistCreate le fait aussi, évitant à recalbox de corriger le Gamelist.

    Seul les balises remplis sont écrites, ceci vous aide à retrouver les Bios dans le Gamelist.xml

    Et enfin, Le gamelist.xml existant dans le dossier de roms est prioritaire sur les infos de la rom (nom, description, genre, etc). Ainsi si vous avez modifié le nom d'une rom, il ne changera plus si vous relancez la création d'un nouveau gamelist.

Voilà si il n'y a pas d'erreurs flagrantes, je pense que c'est la dernière version que je publie avant la création de GamelistCreate 2.
En effet j'aimerai changer de moteur avec une vrai correction de fichier XML, sans devoir en écrire un nouveau à chaque fois, changer l'interface avec un vrai explorateur du fichier permettant notamment de corriger à la volé le fichier, ajouter des description etc. J'aimerai aussi ajouter des options pour déclarer les dossiers, et des cases à cocher pour choisir ce que l'on veut modifier.

Bon jeu à tous

mercredi, mars 17, 2021

GameListCreate version 1.4

 bon c'est assez inhabituel, mais la version 1.3 a été mal compilé. Tout du moins pour les utilisateurs windows.

donc la version 1.4 est disponible, j'en ai profité pour apporter quelques ajout (merci à Acris de openConsole pour ses suggestions)




mardi, mars 16, 2021

Mise à jour GameListCreate V1.3

 Vu que je suis entrain de construire une borne d'arcade sous recalbox, j'ai fait face à un problème pour créer un Gamelist.xml lorsqu'on a plusieurs dossiers dans un seul système.

En Vrai, ma borne d'arcade permet de jouer au MahJong, et je ne voulais pas mélanger mes jeux de mahjong avec le reste des jeux d'arcades.

Donc le plus simple c'est d'avoir deux dossiers différents dans le dossier Mame de recalbox.

J'ai donc mis GamelistCreate pour qu'il prenne en compte les roms dans les sous dossiers.


Mise à Jour V1.3:

-Scan possible des roms dans un sous dossier.

Sélectionnez simplement le dossier Mame avec GamelistCreate, il se chargera de créer les chemins des roms automatiquement pour chaque dossier dans un seul fichier Gamelist.xml.




vendredi, mars 06, 2020

Dreams du rêve à la réalité


Je ne pensais pas qu'on puisse prendre autant de plaisir à faire un jeu dans un autre. Et pourtant bien loin d'un simple éditeur de niveau, Dreams offre un moteur de jeu très complet équivalent à ceux qu'on trouve sur PC, comme Unity.
Jeux de plateforme, jeux de course, rpg, fps, jeux de sport, 2D ou 3D tout est possible.
Au départ, l'idée de concevoir un jeu à la manette, sans souris, ni clavier n'est pas séduisante. Et pourtant ça fonctionne à merveille, sans doute grâce à la barre d’icônes très simple s'affichant d'un simple bouton, et regroupant tout les outils dont on a besoins. Ainsi on peut passer d'un séquenceur audio, à un modeleur d'objet 3D, puis d'un placement de caméra ou d'éclairage sans ressentir la moindre gène.

J'ai écrit un petit jeu de plateforme, avec une intro et une fin en moins de 4 jours, Voici le résultat:



j'ai qu'une hâte maintenant c'est que le mode VR arrive, et qu'on puisse cloner des jeux comme Pistol whip, beat saber,  super hot, ou voir ce que la communauté puisse créer de nouveau.

mercredi, janvier 22, 2020

GameListCreate version 1.2 disponible

Voici la mise à jour de GamelistCreate.

Nouveautées :

- Prise en compte des vidéos
- Scan possible des dossiers dans les sous-dossiers (exemple: rom/media/image/ est scanné)
- correction : seules les roms à la racine du dossier sont prises en comptes pour l'écriture du gamelist.xml

>Pour rappel, GamelistCreate est un logiciel qui permet de créer un fichier gamelist.xml compatible avec recalbox de façon hors ligne.





lundi, octobre 14, 2019

Nos tests et Autres

Cette semaine je publierai sur ce blog, tous les tests que j'ai écrit sur Open consoles (entre autre).

Cela va me permettre d'avoir une trace de ce que je produit à l'extérieur de ce site.

Ils seront tous regroupés sous la rubrique "nos productions".

Je prépare actuellement un long article [DIY] sur la fabrication d'un joystick un peu spécial. Une fois terminé, vous le retrouverez ici, et très certainement sur Open Console.