Go Down

Topic: Mouvement aléatoire avec moteur et boucle  (Read 271 times) previous topic - next topic

Hakaan

Nov 21, 2018, 02:58 am Last Edit: Nov 21, 2018, 03:02 am by Hakaan
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 :
Code: [Select]
#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 ?

J-M-L

#1
Nov 21, 2018, 03:53 am Last Edit: Nov 21, 2018, 03:59 am by J-M-L
Loop et loop 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é...
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

Hakaan

#2
Nov 21, 2018, 06:47 pm Last Edit: Nov 21, 2018, 06:48 pm by Hakaan
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

jpbbricole

Bonsoir 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

L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

Hakaan

#4
Nov 21, 2018, 09:25 pm Last Edit: Nov 22, 2018, 12:34 am by 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 variation,
pourtant entre 1 et 10 ça doit être absolument flagrant

Artouste

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


Code: [Select]
randomSeed(analogRead(0));



J-M-L

#6
Nov 22, 2018, 12:05 am Last Edit: Nov 22, 2018, 12:08 am by J-M-L
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+loop;i++)
Relisez#1
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

Hakaan

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

jpbbricole

#8
Nov 22, 2018, 08:44 am Last Edit: Nov 22, 2018, 08:46 am by jpbbricole
Bonjour 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
L'expérience est la seule chose qu'il ne faut acheter que d'occasion!

J-M-L

#9
Nov 22, 2018, 08:57 am Last Edit: Nov 22, 2018, 08:59 am by J-M-L
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 !
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

Hakaan

#10
Nov 22, 2018, 11:33 pm Last Edit: Nov 22, 2018, 11:34 pm by Hakaan
Bonjour HakaanÇa ne m'est JAMAIS arrivé, tu dois être le seul
quoi donc de ne pas voir une erreur ?

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

J-M-L

OK

Au passage loop() n'est pas un mot clé du langage c'est juste un nom de fonction choisi par l'équipe Arduino
Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums
Pas de messages privés SVP

Go Up