Bonjour, j'aurais voulu générer des mouvements aller-retour aléatoire avec un stepper,
dans les paramètres aléatoires j'inclus : une vitesse v aléatoire, un nombre de pas s aléatoires, et un nombre de répétitions de la boucle aléatoire,
mais le problème c'est que au final la boucle fait toujours la même chose, alors que je voudrais qu'à chaque redémarrage de la boucle principale "void loop" les paramètres changent automatiquement :
voici mon programme :
#include <AFMotor.h>
AF_Stepper motor(200, 1);
void setup() {
Serial.begin(9600);
motor.step(50, BACKWARD, INTERLEAVE);
}
void loop() {
int v;
int i;
int s;
int Loop;
Loop = random (1,4);
s = random (1,10);
v = random (1,7);
for (i=0; i<=1+loop;i++)
{
motor.setSpeed(v);
motor.step(s, BACKWARD, INTERLEAVE);
motor.setSpeed(v*2);
motor.step(s*2, BACKWARD, INTERLEAVE);
motor.setSpeed(v);
motor.step(s, BACKWARD, INTERLEAVE);
if (1==random(1,2))
{
delay(random(1,3000));
}
motor.setSpeed(v);
motor.step(s, FORWARD, INTERLEAVE);
motor.setSpeed(2*v);
motor.step(3*s, FORWARD, INTERLEAVE);
}
}
Donc logiquement à la fin de la boucle For cela devrait relancer la boucle "void loop" et me relancer une initiation randomisée de mes variables,
alors pourquoi ça marche pas ?
[b]L[/b]oop et [b]l[/b]oop ce n’est pas la même chose. Votre boucle for dure peut être plus longtemps que vous ne le pensez...
Et si s et v étaient initialisés au sein la boucle for ce ne serait bien sûr un autre comportement
Sinon un randomSeed() dans le setup() vous apportera entre 2 reboot aussi de la variation et c’est sans doute pas mal de prendre l’habitude de compiler avec le niveau Max de warnings à la compilation et de bien faire attention à ce qui est rapporté...
En toute logique ma boucle for ne peut pas faire plus de 5 tours (4+1), et une boucle ne met pas longtemps à s'exécuter, j'ai attendu longtemps et non il ne se passe rien, aucun variation,
Si j'initialisais s et v dans le for cela modifierait mes valeurs à chaque tour, or ce n'est pas ce que je veux,
je veux que les valeurs soient randomisées, puis que la boucle tourne un certain nombre de fois avec ces valeurs, puis qu'elles soient à nouveau randomisées quand le for a fini de faire son compteur, etc
Dans un de mes programmes sans le for cela fonctionne pourtant
Hakaan:
une vitesse v aléatoire, un nombre de pas s aléatoires, et un nombre de répétitions de la boucle aléatoire,
mais le problème c'est que au final la boucle fait toujours la même chose, alors que je voudrais qu'à chaque redémarrage de la boucle principale "void loop" les paramètres changent automatiquement :
Je suis étonné par le manque d'amplitude S et P que tu demandes au générateur aléatoire
s = random (1,10);
v = random (1,7);
Les changements doivent êtres faibles?
pour s tu pourrais monter à 200 vu que ton moteur est un 200 pas/tour
pour v, si c'est un Nema17 ou similaire par ex. tu peux aussi monter à 200 rpm.
En augmentant l'amplitude tu augmente les chances d'avoir des changement de position et de vitesse plus conséquents.
Oui les changements doivent être faible, et je connais assez bien ce moteur que j'ai fait tourner avec beaucoup d'autres programmes et ces changements de valeurs sont très visibles, donc il y a bien un problème avec mon programme car là il n'y a absolument aucune variation,
pourtant entre 1 et 10 ça doit être absolument flagrant
Hakaan:
Oui les changements doivent être faible, et je connais assez bien ce moteur que j'ai fait tourner avec beaucoup d'autres programmes et ces changements de valeurs sont très visibles, donc il y a bien un problème avec mon programme car là il n'y a absolument aucune variable,
pourtant entre 1 et 10 ça doit être absolument flagrant
Bonsoir
comme évoqué par J-M-L çà donne quoi avec un randomseed en début de loop ?
la solution la plus courante est d'initialiser le randomseed avec une lecture analogique "en l'air pour récupérer du (pseudo) bruit
Hakaan:
ah oui effectivement pourtant j'ai relu 20x sans le voir, ça marche merci
Vous utilisiez donc la valeur du pointeur en mémoire sur la fonction loop() comme borne Max
Je suis sur mon mobile donc peut pas tester mais je me demande si le compilo,ne vous a pas averti... faut l’écouter il a souvent raison dans ces warnings !
jpbbricole:
Bonjour HakaanÇa ne m'est JAMAIS arrivé, tu dois être le seul
quoi donc de ne pas voir une erreur ?
J-M-L:
Vous utilisiez donc la valeur du pointeur en mémoire sur la fonction loop() comme borne Max
Je suis sur mon mobile donc peut pas tester mais je me demande si le compilo,ne vous a pas averti... faut l’écouter il a souvent raison dans ces warnings !
Non le compilateur ne me disais rien et le programme se lançait, c'est ce qui arrive quand on tente le diable à nommer des variables comme des mots clefs