Pilotage moteur pas a pas

Bonjour a tous
je souhaite piloté un moteur pas a pas avec un capteur de lumiere
je souhaite que le moteur effectue 5 tour par exemple lorsque le capteur capte la lumiere
et qu'il fasse 5 tour en contre sens lorsqu'il ne capte plus rien.
je suis parti avec se code mais je n'y arrive pas il tourne temps qu'il a de la lumiere .

le moteur que j'utilise

si quelqu'un a une idée :grin:

Merci

 #include <Stepper.h>
 #define STEPS 100
 
  
  //moteur (fils 1 2 3 4) est branché sur les sorties 8 9 10 11 de l'Arduino ;
  // Sens horaire
 
  
  int  Steps2Take = 0;  //Nombre de pas de rotation demandé au moteur
  long temps =0;          //Durée de rotation pour un tour
  //************************************************************
 
  
//----- VARIABLES ---------------------------------------------
int LDR = A0;   // LDR sur la broche A0
int VALEUR;     // Variable de lecture de la valeur analogique 

//--------------- PROCEDURE D'INITIALISATION --------------------
void setup() {
  Serial.begin(9600);     
}  
//--------------- BOUCLE PRINCIPALE -----------------------------
void loop() {
  VALEUR = digitalRead(LDR);               // Lecture le l'éclairement de la LDR (de 0 à 1023) 
  Serial.print("LUMIERE = "); Serial.println(VALEUR, DEC);  // Affichage de la valeur d'éclairement
  VALEUR = map(VALEUR, 0, 1, 2048, 0);  // Conversion de l'éclairement (0 à 1023) en degrés (0 à 180) 
  small_stepper.setSpeed(250);
  temps = millis();
  small_stepper.step(VALEUR);  //Ca tourne
  temps =  millis()- temps ;  //Chronomètre un rour complet  6.236 sec par tour à vitesse 200
  Serial.println(temps);      //Affiche le temps (en ms) pour un tour complet
  delay(2000);

Pour faire exactement 5 tours il faut indiquer un nombre de pas à effectuer, le chronométrage n'est pas utile (et très imprécis, si on change de moteur il y aura des variations).

Par ailleurs il faut choisir un seuil de la valeur mesurée VALEUR = digitalRead(LDR) et ensuite faire un test avec if (VALEUR>seuil) {...} else {...} pour choisir le sens de rotation.

analogRead non ?

bonjour,
dfgh a raison

  VALEUR = digitalRead(LDR);

donne 0 ou 1 ou LOW ou HIGH
donc, si tu as même un faible éclairage, la valeur sera toujours à 1

  VALEUR = map(VALEUR, 0, 1, 2048, 0);  // Conversion de l'éclairement (0 à 1023) en degrés (0 à 180)

le map a pas grand chose a voir si tu utilise digitalread

si tu mettais tout ton code.
je vois pas de if pour faire tourner le moteur

comme le dis christian, c'est en nombre de pas

 #define STEPS 100

100 pas par tour, donc pour 5 tours==>500 pas
donc le rapport avec VALEUR = 2048 ==> 2048/100 =>2 tours et 4.8 pas

Merci j'vais essaye ça et je tiens au courant

Bonjour,
alors j'ai nettoyé le code
Ajout du IF et voila se qu'il me reste

#include <Stepper.h>
#define STEPS 100

//moteur (fils 1 2 3 4) est branché sur les sorties 8 9 10 11 de l'Arduino (et sur GND, +V)
Stepper small_stepper(STEPS, 8, 10, 9, 11);     // Sens horaire
int  Steps2Take = 0;  //Nombre de pas de rotation demandé au moteur

//----- VARIABLES ---------------------------------------------
int LDR = A0;   // LDR sur la broche A0
int VALEUR;     // lecture de la valeur


void setup() {
  Serial.begin(9600);     // Initialisation du moniteur sur l'ordinateur à 9600 bauds
}

void loop() {
  VALEUR = digitalRead(LDR);               // Lecture le l'éclairement de la LDR (0 ou 1)
  small_stepper.setSpeed(100);
  if (VALEUR < 1)
  {
    small_stepper.step(150);
  }
  else
  {
    small_stepper.step(-150);
  }

}

toujours pareil ca tourne avec la lumiere et s'inverse sans :confused:

pour info le moteur fait 64 pas ...

t'as pas compris le code on dirait

#define STEPS 100

c'est le nb de pas pour un tour, donc dans ton cas 64 et non 100

essaye ca

#include <Stepper.h>
#define STEPS 64

//moteur (fils 1 2 3 4) est branché sur les sorties 8 9 10 11 de l'Arduino (et sur GND, +V)
Stepper small_stepper(STEPS, 8, 10, 9, 11);     // Sens horaire
int  Steps2Take = 0;  //Nombre de pas de rotation demandé au moteur

//----- VARIABLES ---------------------------------------------
int LDR = A0;   // LDR sur la broche A0
int VALEUR;     // lecture de la valeur

int nb_tour = 5; //nb de tour demandé

void setup() {
  Serial.begin(9600);     // Initialisation du moniteur sur l'ordinateur à 9600 bauds
pinMode(LDR, INPUT);
}

void loop() {
  VALEUR = analogRead(LDR);               // Lecture le l'éclairement de la LDR (0 ou 1)
Steps2Take= STEPS * nb_tour;

  if (VALEUR < 100)
  {
  small_stepper.setSpeed(100);
    small_stepper.step(Steps2Take);

  }

  if (VALEUR >300)
  {
  small_stepper.setSpeed(100);
    small_stepper.step(-Steps2Take);

  }

}

Si tu relis ta demande, tu vas trouver qu'il manque une information.

je souhaite que le moteur effectue 5 tour par exemple lorsque le capteur capte la lumiere

Ok d'accord. Mais quelle est la condition qui va redéclencher la prochaine fois.
Parce que de la lumière il y en a souvent. Donc il faut définir une transition d'un état vers un autre pour déclencher un évènement ponctuel.
Il faut définir 2 consignes

  • Si la lumière passe la seconde consigne ==> on fait 5 tours.
  • On mémorise le fait que l'on a tourné.
  • On attend de repasser sous la première consigne pour revenir au pas 1.

Bonj'ai essaye le code

infobarquee:
t'as pas compris le code on dirait

#define STEPS 100

c'est le nb de pas pour un tour, donc dans ton cas 64 et non 100

essaye ca

#include <Stepper.h>

#define STEPS 64

//moteur (fils 1 2 3 4) est branché sur les sorties 8 9 10 11 de l'Arduino (et sur GND, +V)
Stepper small_stepper(STEPS, 8, 10, 9, 11);    // Sens horaire
int  Steps2Take = 0;  //Nombre de pas de rotation demandé au moteur

//----- VARIABLES ---------------------------------------------
int LDR = A0;  // LDR sur la broche A0
int VALEUR;    // lecture de la valeur

int nb_tour = 5; //nb de tour demandé

void setup() {
  Serial.begin(9600);    // Initialisation du moniteur sur l'ordinateur à 9600 bauds
pinMode(LDR, INPUT);
}

void loop() {
  VALEUR = analogRead(LDR);              // Lecture le l'éclairement de la LDR (0 ou 1)
Steps2Take= STEPS * nb_tour;

if (VALEUR < 100)
  {
  small_stepper.setSpeed(100);
    small_stepper.step(Steps2Take);

}

if (VALEUR >300)
  {
  small_stepper.setSpeed(100);
    small_stepper.step(-Steps2Take);

}

}

Pareil il tourne sans arret et change de sens avec le changement de la LDR

fdufnews:
Si tu relis ta demande, tu vas trouver qu'il manque une information.Ok d'accord. Mais quelle est la condition qui va redéclencher la prochaine fois.
Parce que de la lumière il y en a souvent. Donc il faut définir une transition d'un état vers un autre pour déclencher un évènement ponctuel.
Il faut définir 2 consignes

  • Si la lumière passe la seconde consigne ==> on fait 5 tours.
  • On mémorise le fait que l'on a tourné.
  • On attend de repasser sous la première consigne pour revenir au pas 1.

Le moteur tourne a l'apparition de la lumière, tourne 5 tours et s’arrête jusqu’à la disparition de la lumière .....
Tu as une idée pour mémoriser l’état 5 tours effectué

tu crées 1 "flag_soleil" et un "flag_nuage"

lorsque tu entres dans la condition de rotation "soleil", tu mets le "flag_soleil" à "1" et le "flag_nuage" à "0".

lorsque tu entres dans la condition de rotation "nuage", tu mets le "flag_soleil" à "0" et le "flag_nuage" à "1".

et tu modifies tes conditions d'entrée dans les rotations en testant la ldr et le flag==0.

Pareil il tourne sans arret et change de sens avec le changement de la LDR

oui, normal, suaf si ldr comprise entre 100 et 300

donc comme le disent les collègues, il faut un flag.
si ldr<100 et ok==1 =>>>on tourne et ok=0
si ldr>300 et ok==0 ===> on tourne et ok =1

Slt,
bon mes compétences s’arrête là ....... j'y arrive pas

ce ne sont pas des compétences, mais juste de la logique.

on a une consigne TOURNE = 0 au départ
on lit la ldr

si ldr inférieur à 100 et TOURNE = 0, on fait 5 tours, on passe TOURNE à 1
donc maintenant, même si ldr < 100, ca ne tournera plus car TOURNE est à 1

si ldr >300 et TOURNE = 1, on fait 5 tours, on passe TOURNE à 0
donc maintenant, même si ldr > 300, ca ne tournera plus car TOURNE est à 0

voilà, c'est pas plus compliqué que ca

j'ai bien le principe en tête mais j'arrive pas a le retranscrire ......

regarde ça

 if ((valeur <100) and (deplacement_jour_fait == false))
  {
    deplacement_jour_fait = true;
    deplacement_nuit_fait = false;
    small_stepper.step(64 * 5);
    delay(500);
  }
  if ((valeur >300) and (deplacement_nuit_fait == false))
  {
    deplacement_jour_fait = false;
    deplacement_nuit_fait = true;
    small_stepper.step(-64 * 5);
    delay(500);
  }

MERCI dfgh ...... j'y etais presque mais tu ma bien aiguillé j'avais du mal avec le "and" ( je sais c'est con) .
je mets mon code final, reste juste un detail le moteur ne fait que 1/5 de tour mais je m'en vais corriger ca au plus vite

#include <Stepper.h>
#define STEPS 64

//moteur (fils 1 2 3 4) est branché sur les sorties 8 9 10 11 de l'Arduino (et sur GND, +V)
Stepper small_stepper(STEPS, 8, 10, 9, 11);     // Sens horaire
int  Steps2Take = 64;  //Nombre de pas de rotation demandé au moteur

//----- VARIABLES ---------------------------------------------
const int LDR = A0;   // LDR sur la broche A0
int VALEUR;     // lecture de la valeur
int deplacement_jour_fait;
int deplacement_nuit_fait;
int nb_tour = 5; //nb de tour demandé

void setup() {
  Serial.begin(9600);     // Initialisation du moniteur sur l'ordinateur à 9600 bauds
pinMode(LDR, INPUT);
}

void loop() {
  VALEUR = analogRead(LDR);               // Lecture le l'éclairement de la LDR (0 ou 1)

  small_stepper.setSpeed(200);
   if ((VALEUR <100) and (deplacement_jour_fait == false))
  {
    deplacement_jour_fait = true;
    deplacement_nuit_fait = false;
    small_stepper.step(64 * 5);
    delay(500);
  }
  if ((VALEUR >300) and (deplacement_nuit_fait == false))
  {
    deplacement_jour_fait = false;
    deplacement_nuit_fait = true;
    small_stepper.step(-64 * 5);
    delay(500);
  }
  }

and s'écrit aussi &&


int tour_a_faire = Steps2Take * nb_tour;
small_stepper.setSpeed(200);
small_stepper.step(tour_a_faire);

int tour_a_faire = Steps2Take * nb_tour;
small_stepper.setSpeed(200);
small_stepper.step(-tour_a_faire);

hello 68 tjs
dans l'exemple speed motor je n'avais pas fais attention,
il y a : const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution

notre ami devra mettre 64

Slt,
si je souhaite rajouter une condition horaire , je remets un && ????

type if ((VALEUR <100) and (deplacement_jour_fait == false) and (HEURE<xxx))