Chargement en cours ...

Oxi KSP Controller

Contrôleur de jeu pour Kerbal Space Program

Oxi KSP Controller

Contrôleur de jeu pour Kerbal Space Program

Présentation

Kerbal Space Program (KSP) est un simulateur de vol permettant au joueur de construire sa propre fusée, son propre avion, son propre satellite artificiel, ou même sa propre station spatiale puis de les lancer dans l'espace. (Wiki) (Site officiel)

Oxi KSP Controller

Le boîtier Oxi KSP Controller est un contrôleur dédié au jeu de conquête spatiale KSP.

J'ai travaillé sur ce projet sur une période d'un an pendant mon temps libre ce qui représente plusieurs centaines d'heures de travail. Cela comprend la réflexion, les maquettes, la modélisation, l'impression 3d, le choix des composants, les prototypes, la réalisation graphique, l’électronique et enfin le développement (Plugin + Application IOT)

Les principales caractéristiques sont les suivantes:
  • Un écran LCD de 7 pouces. (Informations sur le carburant restant, statistiques, ...)
  • Un écran LCD de 2*16 caractères (Vitesse et altitude)
  • Un joystick analogique sur 3 axes (Contrôle du vaisseau)
  • Un joystick analogique sur 2 axes (Contrôle du docking)
  • Un mini-joystick analogique sur 2 axes (Caméra)
  • Un joystick 8 positions (Contrôle du personnage)
  • Un curseur vertical (Contrôle de la poussée des moteurs)
  • 24 boutons (Actions diverses)
  • 8 interrupteurs avec affichage de l'état avec un couple de LEDs rouge/verte (Parachute, panneaux solaires, SAS, ...)
Vidéo de démonstration (4 min)
 
Composants & ressources utilisés
Matériel :
  • Raspberry PI 3
  • Contrôleur BU0836A
  • Ecran LCD 7 pouces 1024*600 (HDMI)
  • Ecran LCD 2*16 caractères (BUS I2C)
  • Composants électroniques, (74HC595N, ...)
Outillage :
  • Imprimante 3D Afinibot-A9 + FIL PLA 1.75mm
  • Réalisation des circuits imprimés : bxtronics
Logiciels :
  • Windows 10 IOT (Raspberry)
  • Visual Studio 2015/2017 (Application universelle C#)
  • Visual Studio 2015 (Plugin KSP avec le moteur Unity en C#)
  • Réalisation de circuits, prototypages : Fritzing
  • Modélisation 3D : Tinkercad
  • Impression 3D : Cura
Historique du projet

1) Genèse du projet

Après environ 100h de jeu sur KSP avec le combo clavier/souris j’ai commencé à regarder pour investir dans un joystick de type "Hotas" mais l’investissement, pour quelque chose de correct, était trop important. Mais c’est surtout le résultat inconnu pour ce type jeu qui m’a fait abandonner cette idée. Dans KSP, la gestion des ressources est essentielle au bon déroulement des missions. De fait les réserves de carburant prennent une place très importante et sont au cœur du jeu mais les informations fournies par je jeu de base reste limités. Des plugins existent et proposent des informations supplémentaires avec par exemple le temps restant en fonction de la puissance attribué au moteur avant que les réservoirs soient vides. Dans certains cas l’affichage est trop optimiste, le plugin rassemble certains réservoirs entre eux alors que ça ne doit pas être le cas.

Je voulais me lancer dans un nouveau projet avec un lien aux objets connectés et à l'IOT pour apprendre de nouvelles choses.

Un tout premier schéma est gribouillé, l'aventure est lancée !!

2) Prototype : Raspberry Pi

Ayant eu en cadeau un Raspberry Pi 3 et étant un développeur .NET depuis plus de 10 ans je me suis naturellement orienté vers le développement avec MONO et GTK#. Après quelques essais tout est fonctionnel et le résultat est assez impressionnant, bien qu'un peu plus lent. Voir la même application tourner en version bureau et sur cette petite machine reste impressionnant. Première étape validée.

3) Prototype : Plugin KSP

Pour la réalisation de mon projet il me faut récupérer des informations du jeu afin de déporter l'affichage sur mon contrôleur. Je commence à étudier le fonctionnement des plugins pour KSP qui est développé avec le moteur "Unity" réalisé en C#. C'est une très bonne chose :-)
Je continue avec une phase de R&D qui a pour but la récupération des différentes informations du jeu. Certaines sont très simples à trouver et à traiter mais d'autres sont vraiment beaucoup plus complexes (Consommations instantanées, altitude réelle, …). Après une longue phase de recherche, sur les forums, dans le code source d'autres projets, j'ai une première version. Elle récupère 80% des informations dont j'ai besoin et je sais que je ne serais pas bloqué pour la suite. Deuxième étape validée !

4) Electronique & composants

Je commence par la recherche de composants et je parcours les sites à la recherche d'idées.

a. Ecran LCD

Je commande un écran LCD, tactile, de 7 pouces connectable en HDMI au Raspberry Pi.

J'ai rencontré pas mal de problème avec cet écran. En tout premier lieu, un problème de configuration résolu à l'aide de la communauté Microsoft. Ensuite avec la partie tactile de cet écran : Il est fonctionnel, mais il y a un problème de conception avec la présence d'un seul port micro USB qui est utilisé pour la partie tactile et pour l'alimentation. En théorie cela ne pose pas de problème, sur mon PC cela est fonctionnel mais en pratique, le Raspberry Pi n'arrive pas à envoyer assez de courant via ces ports USB... Même avec des câbles en Y je n'ai jamais réussi à faire marcher le tactile et l'écran en même temps. Pas de solution pour le moment, je le laisse de côté, la partie tactile n'est pas vitale sur mon projet.

b. Controller USB

De nombreux points m'ont fait choisir un composant déjà existant plutôt que de passer par le Raspberry Pi pour la gestion des boutons et joysticks :

  • Il est reconnu comme un joystick classique par Windows et par les jeux. (Pas de plugin à développer pour envoyer les informations)
  • Le Raspberry Pi ne possède pas de connecteurs analogiques, l'utilisation de convertisseur analogique numérique (CAN) est obligatoire.

Je suis parti sur le composant "BU0836", il n'est pas le moins cher de ceux qui existent, mais c'est celui qui offre le plus de fonctionnalités avec :

  • 8 axes analogiques.
  • 32 boutons.
  • Compatibles encodeurs rotatifs.
  • POV de 8 directions.

c. Joysticks

J'ai passé beaucoup de temps à trouver les joysticks de contrôles. Ne trouvant pas de joystick petit format à des prix attractifs j'étais parti sur des joysticks tout simples à 8 positions (type arcade). Mais au cours de mes recherche je suis tombé sur eBay sur de petit joystick analogiques à des prix raisonnables et je passe une commande de deux exemplaires.


d. Autres composants

Les autres composants sont achetés à petit prix mais avec une qualité très variable allant de très mauvaise à juste correcte. Cela me permet d'en perdre plus et de faire le tri après coup, pour voir ce que je garde ou pas.

5) Prototype : Raspberry Pi & Windows IOT

Annoncé depuis quelques temps déjà, Windows 10 IOT est enfin disponible. Je m'empresse de l'essayer sur mon Raspberry Pi avec la réalisation d'un 1er prototype. Cela me permet de "jouer" avec les principaux composants disponibles et de m'essayer aux "applications universelles" en XAML et C#.


Mes premières impressions sont bonnes :

  • Le développement est très classique
  • L'accès aux GPIO du Raspberry est natif.
  • La communauté est déjà active
  • Le déploiement est facile
  • Le débug directement sur le Raspberry, bien que limité, est possible.

Le choix est vite fait, j'abandonne Linux et Mono pour partir avec Windows IOT.


6) Echange de données : Jeu/Contrôleur

Il est maintenant temps de s'attaquer à l'échange de données entre le plugin Unity et l'application installée sur le Raspberry Pi.
Après quelques tests je choisis d'envoyer mes informations en utilisant le protocole UDP. Même si ça n'est pas forcément le choix le plus propre il possède l'avantage d'être compatible avec Unity et avec Windows IOT. La communication par port USB aurait été plus complexe à réaliser et la communication par port série trop lente en échange de données…
Le plugin dans le jeu se charge de la récupération des informations, de la transformation (en JSON) et de l'envoi en UDP. Le Raspberry Pi s'occupe de récupérer le JSON et de restituer les informations sur le contrôleur (Ecrans LCD, LED).

7) Design Graphique

N'étant pas très à l'aise en conception graphique, je commence à parcourir des exemples de design pour avoir une source d'inspiration.
Après mes recherches sur différents sites, je trouve des modèles graphiques que je modifie afin de correspondre à ce que j'ai en tête. J'ai une première version de quelque chose qui me plait (= qui n'est pas trop moche ?). La partie graphique est validée on passe à la suite.

8) Développement : Raspberry Pi & Windows IOT

J'attaque le développement et l'intégration de la partie graphique. Pas de difficulté majeure sur cette partie, je suis quasiment dans ma zone de confort. Je ne connais pas les applications universelles mais j'arrive à trouver les informations qui me manquent, monter en compétence et bien avancer.

Vers la fin du projet, lors de mes tests, j'ai rencontré des problèmes sur l'affichage avec un clignotement important de certaines parties. Cela n'était pas reproductible sur la version PC et j'en ai rapidement déduit, même si le comportement était très étrange, que c'était le Raspberry Pi qui n'était pas aussi puissant que mon i5… S'en est suivi une importante phase d'optimisation du code avec, entre autres, l'élimination du chargement des ressources de la carte µSD mais surtout plus de données mises en cache en mémoire.

9) Modélisation 2d

a. Choix du soft

J'ai trouvé rapidement ce que je cherchais. Ça n'est surement pas un logiciel fait pour cela à la base mais même s'il n'est pas parfait j'ai réussi à faire sans trop de difficulté ce que je voulais. J'ai donc utilisé le logiciel Publisher de Microsoft que j'avais avec ma licence Office.

b. Modélisation

J'ai réalisé de nombreuses disposition, en fonction de l'évolution du boîtier, des composants que j'avais et de l'ergonomie générale.

10) Le boîtier

a. "Proof of concept"

Une toute première version est réalisée … en carton… C'est très simple à travailler et cela me permet d'avoir une première réalisation en main et un ressenti physique. Résultat c'est moche mais bon ça a l'air cool

b. En bois

Cette partie me paraissait assez simple, c'est juste des planches de bois à assembler et à travailler. J'achète des planches de contreplaqués et je commence à faire mes tracés avec précision pour mes guides de coupes.
Je découpe ensuite mes planches à … la scie sauteuse… Je m'aperçois vite que quelque chose ne va pas et que malgré toute ma volonté rien n'est droit… Après avoir donné un coup de scie sauteuse dans la table basse j'arrête le carnage. J'essaye donc la seconde partie avec la réalisation des trous mais avec un résultat tout aussi décevant, le bois fissure et se fend. J'apprendrais (un peu tard) que je n'utilisais pas le bon outillage. Je ne suis pas du tout équipé en conséquence, j'abandonne donc cette solution.
C'est un échec total et une grande déception pour moi. J'abandonne cette idée mais il me faut trouver autre chose…

c. Autres solutions

Je regarde pour trouver d'autres solutions. Après les réalisations de devis, pour des petites séries d'un seul exemplaire, c'est un peu la douche froide : Découpe laser, fraiseuse numérique, en bois ou en plexi, les devis sont tous de plusieurs centaines d'euros par pièce.
Une autre idée me traverse l'esprit : Pourquoi pas l'impression 3D ? Je n'y connais pas grand-chose mais je sais que cela existe. Je commence donc à me renseigner et il est possible de sous-traiter la réalisation avec des coûts acceptables (entre 50 et 100€ par pièce).

11) Modélisation 3d

a. Choix du soft

Commence ici une importante recherche du logiciel idéal, et … il n'existe tout simplement pas … Ils sont soit trop complexes, soit trop limités, soit trop chers (et pas forcément mieux) … Je suis dans une impasse jusqu'à tomber sur le site Tinkercad.com. Seul problème, pour moi, c'est 100% en ligne et si le service s'arrête ou devient hors de prix, tout est perdu. Cela ne me plait pas mais, après d'autres essais, c'est vraiment celui-ci qui répond à 99% de mes besoins.

Je modélise le boîtier en passant par de nombreuses versions pour arriver à cette version :

b. Impression 3d

En passant par la plateforme 3dhubs.com où je confie mon impression à un particulier (Son hub ici). Il est très pro, me conseille sur certains points mais m'indique qu'il ne peut pas imprimer des pièces aussi grandes. Je refais des modifications pour découper ma pièce en deux et gagner quelques centimètres. Ma nouvelle version est cette fois imprimable.

L'impression 3d commence, et après 3 jours d'impression, le fournisseur m'annonce que l'impression à échouée. La pièce est impactée par du wrapping (le plastique à "gondolé") et qu'il va le refaire (à ses frais) en PLA au lieu de l'ABS. Il n'a que du bleu en stock et on est reparti pour 3 jours d'impression.

Cette fois tout se passe bien et je reçois mon boîtier.

12) Montage du boîtier

Je commence par fixer les deux parties entre elles et j'assemble ensuite les composants. Je ne sais pas comment je me suis débrouillé, mais certains trous ne sont pas à la bonne taille, il ne manque pas grand-chose, mais cela m'oblige à utiliser la DREMEL pour corriger cela et faire rentrer les composants dans leurs emplacements.

Une fois tout monté, je commence le branchement des câbles pour en arriver au port HDMI. Je n'ai pas assez de place pour mettre un connecteur HDMI même un coudé ! C'est un peu la panique, lors de ma modification à la hâte pour faire rentrer mon boîtier dans la zone d'impression je n'ai pas fait attention et j'ai perdu la place qui était réservé au connecteur HDMI ! Je cherche des solutions et la seule possible est de commander une nappe HMDI flat, et j'en trouve une à plus de 20€ que je commande. Une fois reçu, je teste la mise en place et cela rentre mais en forçant…

Après avoir mis en place tout le câblage, je me rends compte que j'ai sous-évalué la place prise par celui-ci.

Je commence à prendre conscience que ce boiter n'est pas utilisable :

  • Il n'est pas assez haut, en plus avec les cartes électroniques tout faire rentrer cela commence à être compliqué.
  • Je n'ai qu'une partie du boîtier (il me reste le bas à sous-traiter), donc il me faudra débourser au moins 50€ supplémentaire.
  • Certains interrupteurs sont très durs à enclencher.
  • Le rendu des LED n'est pas bon (elles sont éblouissantes, peu intégrées)
  • Tout le câblage est fait avec du fil premier prix qui est de très mauvaise qualité et donc très cassant. Tout le câblage est à refaire…

Je pense de plus en plus qu'une nouvelle version va être nécessaire. Je prends la décision d'arrêter cette version et de passe à la suivante. Je ne suis plus sûr de moi et je préfère regarder pour m'équiper d'une imprimante 3d et travailler sereinement sans les coûts et les contraintes de la sous-traitance.

13) Impression 3d

a. Recherche d'une imprimante

Je commence à avoir l'habitude de partir dans des recherches :-)
Cette fois c'est pour trouver l'imprimante 3d qui correspond à mes attentes. Difficile de faire un choix dans ce nouveau marché et je dois me renseigner sur ce milieu avant de continuer.
Intéressé en premier par la Dagoma, leur nouvelle version est en retard, les avis sont soit très positifs soit très négatifs, et me font douter. Il existe de très nombreux modèles mais ceux qui proposent des impressions "grand volume" (supérieur à 19cm * 19cm) et qui restent abordables sont assez rare. Mon choix se réduit à 3 modèles : (la WANHAO DUPLICATOR i3, l'Afinibot A9 et la Dagoma).
La Dagoma est sans cesse repoussée et elle est donc éliminée.L'Afinibot est la seule qui est vendue à un prix correct, par une société Française (sans risque de frais de douanes), et avec un SAV local.
L'imprimante est commandée mais celle-ci n'est plus en stock, au moment où je me décide… Le magasin fait transiter un modèle du Canada que je reçois quelques jours plus tard.

b. Tests d'impression

Des tests d'impressions sont réalisés pour éprouver l'imprimante et surtout pour en apprendre plus sur son fonctionnement. Cela n'est pas forcément simple, et pas très grand public à mon gout, mais cela commence à ressembler à quelque chose. Je commence donc imprimer des prototypes qui me permettent de valider la disposition et l'ergonomie du contrôleur.

a. Modélisation 3D (V2)

En parallèle du choix de l'imprimante 3D, je continue à travailler sur la modélisation du boîtier en prenant en compte toutes mes problématiques précédentes.
Et après quelques heures de travail voici le résultat :

b. Impression finale

L'impression des différentes parties commence enfin, pour chacune des pièces il faut entre 6 et 12h, soit plus de 60h d'impression et sans compter les ratés...

c. Mise en peinture

Ayant imprimé en gris, je souhaitais un boîtier plus discret, en noir, j'ai donc peint les parties avec une peinture noire brillante. (Je ne sais pas pourquoi je n'avais pas racheté du fil noir …)

14) Circuits imprimés

Dans la 1ère version, j'avais réalisé une version maison avec des cartes de prototypages et des borniers à vis mais elle n'était pas très fonctionnelle et trop bricolage avec des faux contacts dû à ce câblage de mauvaise qualité.


Je réalise donc un typon et je confie la réalisation (ici) du circuit imprimé.

Le résultat est bien plus propre.


S'en suivra ensuite la réalisation d'un circuit à partir de schéma fonctionnel pour le contrôle des différentes leds afin de limiter l'utilisation des entrées/sorties (GPIO) du Raspberry Pi. Je peux donc gérer jusqu'à 24 leds avec l'utilisation de seulement 3 GPIO au lieu de 24 … sachant que 15 GPIO sont réellement disponibles …


Pour finir je ferais un circuit pour les microswitchs que je découperais ensuite à la DREMEL pour les séparer. La connectique n'est pas complexe mais cela est plus pratique et évite des soudures dans le vide.

15) Interrupteurs personnalisés

N'ayant pas eu une bonne impression des interrupteurs 1er prix ni des supports de LED, je choisi la réalisation d'interrupteurs maison. Comme pour le boîtier, modélisation et réalisation de prototypes sont au programme. Pas mal d'essais sont nécessaires avant de trouver la bonne formule qui comprend le switch, la double led/rouge qui va éclairer par le dessous une étiquette avec le nom du module associé.

16) Montage & Câblage

Viens maintenant le montage des différentes parties du boiter à l'aide d'équerres et de charnière métallique (ça n'est pas elles qui vont lâcher ^^) et de la visserie achetée pour l'occasion. Viens ensuite l'assemblage des composants, et le câblage. Même si cela n'est pas très écologique toutes les parties électriques soudées sont noyées dans la colle pour éviter faux contacts et courts-circuits.
Toutes les connexions se font avec des cavaliers "dupond", bien plus longues à mettre en place mais qui permettent des connexions fiables et modifiables.

17) Problématiques :

a. Joystick défectueux

Un problème très bête mais un des joysticks analogique (à 20€ / pièce quand même) avait un faux contact dans un potentiomètre d'un des axes. C'est uniquement après le démontage que j'ai compris que le problème était dû à défaut matériel et pas un problème de câblage ou une incompréhension …

b. Unity

Lors de la longue vie de ce projet, le jeu KSP a changé de version et cela s'est accompagné d'un changement du moteur d'Unity qui est passé de la version 4 à la version 5. Cette dernière version n'est pas rétro compatible avec notamment la partie interface utilisateur. Des ajustements ont dû être faits pour modifier ce que j'avais déjà fait et avec peu de documentation au moment de ce changement.

c. Problème de parts

Après des tests avec des fusées plus complexes, comportant un plus grand nombre d'étage, j'ai pu constater que certains carburants étaient mélangés entre les différents étages, problème que je retrouvais sur les plugins cités plus haut. J'ai donc développé un algorithme qui est capable de reconnaitre et de séparer correctement les différents carburants. Cela demande encore à être testé mais pour l'instant cela est concluant.

d. Calculs erronés

Pour les calculs de consommation instantanée des moteurs et donc du temps restant en fonction de la poussée, j'ai eu un problème très bête mais qui m'aura pris beaucoup de temps. J'avais fait une petite erreur, lors du parcours de chaque partie ("part") des fusées pour rechercher et additionner la charge de carburant restante, j'additionnais aussi le "tick" au lieu de garder une valeur fixe. Cela m'a fait perdre un temps considérable et beaucoup d'énergie, car je ne comprenais pas pourquoi cela ne marchais pas !

18) Conclusion

Si je dois résumer un mot ce projet je dirais "Ouf" !
C'est le premier projet que je réalise et qui comprends un panel de compétences aussi variées et avec autant d'incertitudes.
Des doutes et quelques moments de découragement, mais je n'ai rien lâché bon pour sortir un produit fonctionnel, avec 95% de ce que j'avais imaginé. J'ai fait des erreurs mais aucune n'a mis en péril le projet et j'ai réussi à rebondir à chaque fois. Ce fut un projet intéressant où j'ai beaucoup appris même s'il aura été plus complexe et plus chronophage que prévu.



Pour ce type de projet les coûts restent relativement importants. Néanmoins la partie la plus importante des frais sont imputable à l'outillage (station de soudure, imprimante 3d, pinces, pied à coulisse, etc).

Pour la réalisation d'un autre boîtier identique il faudrait compter, hors main d'œuvre, un budget d'environ 350€ ...

19) Le futur

Jouer ! Je n'ai pas encore profité de ma réalisation et de mon travail.

Pour la suite j'ai déjà plusieurs évolutions en tête :

  • Impression d'un nouveau boîtier mieux fini (Impression en un seul bloc, …)
  • Changement de certains boutons
  • Ajout de différents styles (Ecran LCD)
  • Retravailler sur la partie tactile...
  • Et peut-être le rendre compatible avec d'autres jeux !
Commentaires : Commenter
Timo S. 03/09/17 17:30
Oh my god, this is absolutely gorgeous. I would totally try and build this myself if there are some instructions and part lists. This is amazing! Thank you for sharing, I really love it!

Commenter