Transmettre des données

Bonjour,

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.

Bonne soirée

:warning:

Post mis dans la mauvaise section, on parle anglais dans les forums généraux. ➜ déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans « Les bonnes pratiques du Forum Francophone”

Faudrait préciser votre besoin.

Bonjour poerdfdqg

C'est étonnant, à quelle vitesse veux-tu travailler?

Quel format accepte la console pour recevoir ces valeurs analogiques?

Quel format la console va envoyer pour allumer les LED?

Cordialement
jpbbricole

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 ?

Bonjour poerdfdqg

Pour résumer, l'Arduino lit un ou des potentiomètres, envoie ces valeurs à Unity qui répond en envoyant des ordres pour allumer des LED sur l'Arduino.

J'ai juste?

Cordialement
jpbbricole

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)

Bonjour biggil

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') ?

Cordialement
jpbbricole

Oui exactement.

Mais avec des subtilités à chaque fois pour régler des problèmes que nous rencontrons.

Bonjour jpbbricole

Qui donne le rythme d'envoi de ces valeurs?

A+
jpbbricole

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).

Bonjour poerdfdqg

Je pense que c'est jouable, mais il faudrait faire un ou deux ajustements à ton protocole,
ajouter un séparateur après l'objet,

prog;500 ;6;255
clign;250;9;126

ça rend le "décorticage" de l'ordre reçu plus facile.

Pour ça, comme il existe déjà clign et prog, créer l'objet led pour cet ordre simple.
LED;3;43

Les ordres envoyés comme les reçus se terminent avec, au moins, un caractère "nouvelle ligne" ou \n.

Si tu le désires, je peux te faire une simulation.

A+
Cordialement
jpbbricole

Bonjour poerdfdqg

Le sujet est déjà mort :woozy_face:?
Dommage, ça promettais d'être intéressant.

Cordialement
jpbbricole