Nous sommes sur un projet de borne d'arcade customisée, qui tournerait un jeu de simulateur de vaisseau spatial codé par moi-même.
Le jeu est réalisé sur Unity, et échange des données avec deux cartes Arduino (2 cartes, suite à des problèmes de port série, le type CH340 gère mal les échanges de données dans les deux sens, donc une pour les entrées et une autre pour les sorties).
Malgré une centaine d'heures passées dessus et toute une batterie de tests réalisés, nous n'arrivons pas à un résultat stable (un jour ça marche et l'autre non sans que le code ni l'électronique n'ai bougé).
Nous aimerions trouver une solution pour lire des potentiomètres/boutons et afficher les fluctuations volontaire dans la console. Et envoyer des données à des leds suite à des "readline" envoyer depuis Unity.
Nous ne cherchons pas une vitesse incroyable, idéalement une latence de 200ms maximum nous conviendrait. nous avons essayé avec 9600 bauds et 2000000 bauds, dans toutes nos expérimentations elles ont marché à un moment.
Nous souhaitons juste afficher les valeurs dans le port série. Actuellement nous utilisons le formalisme "P0;1023"
P pour potentiomètre, B pour bouton, S pour levier ou bouton self-lock.
0 pour le numéro du potentiomètre. 1023 pour la valeur du potentiomètre ou du bouton.
" : "
puis la valeur.
Mais si un autre formalisme ou format est plus efficient/stable on peut changer.
Comme les LED peuvent clignoter ou augmenter progressivement jusqu'à une certaine valeur, Unity envoie "prog" ou "clign" en chaîne de caractère, suivi d'une valeur de temps en ms. Ensuite, le pin est envoyé dans le même message et pour finir la valeur voulue. Cela donne ça :
"prog500 ;6;255"
"clign250;9;126"
Lorsque la LED doit juste être allumée, on envoie le pin puis la valeur : "3;43"
Pareil que pour les potentiomètres, s'il existe un meilleur formalisme nous sommes preneurs.
Nous somme retombés au point de départ, donc si il y a une solution pérenne qui n'a rien a voir avec la dernière solution produite nous ne ferons pas les difficiles. Nous souhaitons juste transmettre les informations dans les deux sens entre les commandes/leds et Unity.
Notre besoins est large, étant donnée qu’aucunes de nos solution n'a été pérenne nous ne cherchons pas forcément à réparer notre prototype, mais juste trouver une solution qui fonctionne peut importe si pour cela nous devions refaire entièrement le prototype, apprendre un nouveau langage ou acheter un nouveau matériel (dans la limite de nos budget).
Donc je ne sais pas comment préciser la demande, décrire précisément notre situation actuelle reviendrais à décrire notre dernier cul de sac, sachant que nous n'affectionnons pas plus une solution qu'un autre (hors le prix des composants).
Quel protocole utilises-tu pour discerner le début d'une trame ? Je veux dire : que fais-tu pour être sur qu'un caractère reçu est bien (ou n'est pas) le début d'une nouvelle trame ? Exprimé encore différemment : comment fais-tu pour séparer tes trames reçues ?
Nous utilisons un serial.Println() pour différencier les valeurs.
Dernièrement nous utilisons deux cartes, pour différencier les entrées et les sorties car nous n'avons pas réussi à suffisamment bien synchroniser Unity et Arduino pour faire un échange de données par le même port série. (nous utilisons une communication port série de type CH340)
Dans ce genre de communication, n'est ce pas plus facile de détecter la fin de transmission avec Serial.readStringUntil(), par exemple qui permet de définir que nouvelle ligne (\n) termine une transmission et ça donnerai Serial.readStringUntil('\n') ?
On a essayer avec Arduino qui donne le rythme,
Puis Unity,
et maintenant il n'y a plus de rythme, la carte envoie les données qui sont stocké dans Unity et si il n'a pas le temps de le traiter c'est pas grave. Unity traite les données de façon asynchrone (on lui laisse le temps).