Mouvement aléatoire avec moteur et boucle

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

Bonsoir Hakaan

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.

Cordialement
jpbbricole

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

randomSeed(analogRead(0));

Hakaan:
En toute logique ma boucle for ne peut pas faire plus de 5 tours (4+1),

En toute logique absolument pas. Le problème principal c’est le L majuscule versus l minuscule

for (i=0; i<=1+[color=red]loop[/color];i++)

Relisez#1

ah oui effectivement pourtant j'ai relu 20x sans le voir, ça marche merci

Bonjour Hakaan

Hakaan:
ah oui effectivement pourtant j'ai relu 20x sans le voir, ça marche merci

Ça ne m'est JAMAIS arrivé, tu dois être le seul

Pour satisfaire ma curiosité, quel est le but du montage (si pas indiscret)?

Bonne journée, bon développement.
Cordialement
jpbbricole

Hakaan:
ah oui effectivement pourtant j'ai relu 20x sans le voir, ça marche merci

:slight_smile:
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:
:slight_smile:
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

OK

Au passage loop() n’est pas un mot clé du langage c’est juste un nom de fonction choisi par l’équipe Arduino