Je reçois des données de positions de moteurs encodeurs.
J'ai 2771 ticks par tour.
Les voulant en degrés j'ai appliqué dans la void loop cette formule
Serial.print(int (position_/2771.0*360.0));_ Le problème est que les moteurs allant vite, je n'ai pas mes données qui s'actualisent assez vite pour avoir une resolution complete de la position en degré de mes moteurs. Comme on voit ici * *353 35 84 130 177 4 47 95 141 188 15 58 106 153 199 26 69 117 164 211 37 80 128 175 222 47 91 140 186 234 58 102 151 198 245 69 113 162 209 256 80 124 173 220 268 90 135 185 232 279 101 146 196 243 291 112 157 207 254 302 122 169 218 265 314 133 180 229 277 325 143 191 241 288 337 154 202 252 299 348 165 213 263 311 0 175 224 274 322 11 186 235 285 333 22 196 246 296 345 34 207 258 307 356 45 218 269 318 7 56 228 280 329 19 68 239 291 340 30 79 250 302 351 41 91 260 313 2 53 102 271 324 14 64 113 281 335 25 75 125 292 347 36 87 136 303 358 47 98 148 313 8 58 109 159 324 19 69 120 171 334 30 81 132 182 345 41 92 143 194 356 53 103 154 205 6 63 114 166 217* * Les données "sautent" de 10 à 12 degrés. J'ai augmenté le setup serial begin à 250000. Les données sont un peu plus actualisées. Comme j'aimerai déclencher un événement sonore exactement quand les moteurs font un tour, je me sens bloqué par ce manque de précision. Voici pour l'instant la seule manière que j'ai trouvé pour déclencher des '0'. Quand mes moteurs sont entre 348° et 359°. ```
*void loop {
for(uint8_t i = 0; i < NBMOTEURS; i++) {
degreRotation[i]=int (position[i]/ 2771.0* 359);
}
// Serial.println();
if ((degreRotation(i)>347 && degreRotation(i)<360) {
}* ``` Comment faire pour déclencher un '0' à chaque fois que mes moteurs passent par le degré 0? Comment faire quand la position captée pas de 355 direction à 6° par exemple?
Les moteurs tournent vite, ok, mais quelle vitesse?
Pour optimiser les temps dans "loop", tu peut faire les tests sur position avant conversion en degrés. Ensuite limite le nombre de Serial.print Puis règle le port série sur 115200 bauds. Un code complet serait utile pour essayer d'optimiser.
Les voulant en degrés j'ai appliqué dans la void loop cette formule
Serial.print(int (position_/2771.0*360.0));_
Est-ce bien utile de les afficher tous, si ça va trop vite peut-on lire l'écran ?
Est-ce bien utile de faire le calcul à l'intérieur de la méthode print ?
Est-ce bien utile de faire le calcul en flottant pour ensuite caster le résultat en entier ?
Le calcul se faisant dans la méthode print il n'est utilisé nulle part ailleurs.
bilbo83:
Les moteurs tournent vite, ok, mais quelle vitesse?
Ben oui c'est quand même une information essentielle quand on parle de vitesse insuffisante.
Il faut être pragmatique. Les calculs en flottant sont lents cela ne va pas aider à rendre ton système réactif.
Prend le problème dans l'autre sens. Au lieu de calculer à chaque boucle la position en degrés, calcul en avance le nombre de ticks pour l'angle que tu veux atteindre. comme ça, dans ta boucle tu ne travailleras que sur des entiers.
La solution de fdufnews est certainement la meilleure. Mais si tu veux vraiment tester sur des valeurs d'angles, et si la mémoire de stockage le permet, tu peux construire dans le setup un tableau de 2771 unsigned int qui contient les valeurs de tous les angles pour toutes les valeurs des ticks. Pour plus de précision, tu multiplies ces angles par cent, ils varient entre 0 et 36000 ce qui tient dans un unsigned int.
unsigned int angle[2771] = {0}; // <-- à mettre dans l'en tête
for (int i=0;i<2771;i++) angle[i] = i*36000/2771; // <-- dans le setup
Ensuite la valeur de l'angle correspondant au tick numéro K sera angle[K] /100
Je comprends la démarche de bidouillelec, et je crois qu'on doit incorporer les valeurs du tableau de position[ï] (avec i= NBMOTEURS=5), dans un tableau qui rangent des valeurs pour les 2771 ticks.
Sauf que je ne sais pas incorporer un tableau dans l'autre.
Je mets donc le programme en pièce jointe qui a été fait par un ingénieur.
Ce programme permet de contrôler 5 moteur à la même vitesse et à la même phase (pour qu'ils aient de tourner en même temps).
Merci pour votre aide