Je suis actuellement en train de développer un programme permettant de commander deux moteurs en utilisant l'accéléromètre d'un Nunchunk.
Mon code est à peu près fonctionnel mais il reste quelques petits bogues que je ne parviens pas à corriger.
Je pense que le code est parlant et qu'il n'a pas besoin d'être commenter plus que ça.
J'envoie une valeur de PWM sur le port série fonction de la position dans laquelle se trouve le Nunchunk.
J'ai numéroté les Zones (ou plages) dans lesquelles peuvent se trouver le Nunchunk. Chaque condition correspond à une zone.
Mon premier problème intervient lorsque je suis en Z5 aucun problème je visualise bien mes 7 octets qui se baladent. Mais dès que je tourne un peu le Nunchunk vers la gauche pour rentrer en Z13... j'obtiens une instabilité (comme si une condition n'avait pas été prévu... pourtant je pense ne pas en avoir oublié), c'est à dire que j'ai 5 octets qui ne sont donc pas interprétable et qui me font retombé en Z0.
Mon deuxième problème est le problème de l'arrondi. J'ai fait des petites régression linéaires pour calculer des rampes d'accélération dans les zones 1, 2, 6 et 9. J'ai donc l'impression que y a un "castage" que je ne vois pas et qui me génère des erreurs aux valeurs extrêmes.
Je vous joins mon code si quelqu'un peu jeter un coup d'oeil
EDIT : Si vous pensez qu'il y a moyen d'améliorer l'efficacité de mon code n'hésitez pas à me faire part de vos remarques.
Je pense que le code est parlant et qu'il n'a pas besoin d'être commenter plus que ça.
Oui, enfin en même temps il y a 0 commentaire dans le code. Donc on peut difficilement comprendre la finalité.
Cela dit à mon sens il y a des incohérence. Tu déclares des variable en int (PWM1 à 4) mais tu y mets des uint_8.
Concernant F1,F2,G1,G2:
Tu multiplies des int par des int et on ne connais pas la dynamique des valeurs manipulées. Potentiellement le produit de 2 int peut donner un long.
Tu divises deux int et tu fais ensuite une multiplication avec un int. Personnellement j'évite les opérations dans cet ordre. La division en premier est source d'une perte de précision. Il est de loin préférable de faire les produits d'abord (en faisant un cast sur les variables pour faire le calcul intermédiaire en long) puis la division ensuite.
La finalité c'est de commander les PWM de deux moteurs de manière suffisamment fluide avec l'accéléromètre du Nunchuk. Je n'ai pas trouver la solution idéale je pense dans le sens où ça fait beaucoup de conditions... il y a certainement une manière plus efficace mais je ne vois que celle que j'ai utilisé.
J'ai changé les :
(uint_8)0x00;
par des
(int)0;
pour être plus cohérent
mais ça ne résout pas mon problème que j'ai décrit dans mon précédent post.
En pièce jointe vous trouverez l'illustration de ce problème observer sous XCTU
J'ai trouvé la solution à mon premier problème : la zone 13 (ça aurait du me faire Tilt !!!) 13 c'est aussi le retour chariot... c'est pour ça que je perdais 2 octets dans la nature...
Je suis en train de bosser sur mes erreurs d'arrondies mais c'est vraiment pas évident.