"Je tourne dans le sens qui me convient" "Gnagnagna"

Salutations !

Je viens à vous pour une petite question (surement toute bête mais bon..)

Déjà, oui je suis un néophyte, j'ai quelques notions et bases, C#... Et quelques projets sur Arduino.

Le projet :

Une porte automatique pour poulailler ( oui oui encore ! )

Avec un moteur pas à pas pour l'entrainement de la poulie et de la porte ect...

Le moteur s’enclenche grâce à une photo-resistance.

Donc, quand la la valeur du capteur atteint une certaine donnée ( j'ai fais une fourchette avec un if )

Le moteur tourne pour ouvrir ou fermer la porte ( Je vis en ville mais Renard et martres sont de la partie :confused: )

Voila le hic..

Tout se déroule comme prévu, la lumière arrive, le capteur transmet, le moteur tourne (sens Horaire) la porte s’ouvre ( le pas à pas fait le travail ! )

Mais quand la valeur correspond à la tombé de la nuit ( calculé pour que les poulettes soient dedans :grin: )

Le moteur reçois l'information du capteur mais tourne encore une fois dans le sens horaire !

Et rien à faire..

La disposition dans Loop :

void loop() 

{
     int Nbre_tour ;
     int valeur = analogRead(A0); // Photo-resitance 
     Serial.println(valeur);  // valeur obtenu dans le moniteur série  pour aider bibi aux tests 
     delay(5000);   


     
[color=red] if (valeur < 790 && valeur >490)[/color]
             {
   
                   Nbre_tour = 1; 
                   myStepper.step(stepsPerRevolution*Nbre_tour); //Sens horaire 
                   delay(2000);
          
             }
    
[color=red]else if ( valeur > 800 && valeur <1000)[/color] 
           
             {
   
                   Nbre_tour = 1; 
                   myStepper.step(-stepsPerRevolution*Nbre_tour); // Sens Anti-Horaire ?
                   delay(2000);
             }
}

J'ai cherché, testé...

la partie sens de rotation est testé et marche parfaitement ! ( les deux sens ) Mais plus du tout quand il est intégré à ce programme...

Bon, je demande pas la solution tout cui dans le bec, même si bon :fearful:

Mais des pistes ? Une erreur grosse comme moi?
Je suis myope soit dit en passant !

J'espère que j'aurai quelques conseils.

D'ici là, une bonne soirée et journée et bon bricolage !

essaye

myStepper.step(-1*stepsPerRevolution*Nbre_tour);

Salutations jfs !

Merci pour cette réponse rapide !

J'avoue que pendant 12s bha j'y ai cru...

Mais mais, ça ne marche pas... Il me nargue toujours !

Mais merci quand même ! je n'aurais pas trouvé ce test tout seul je pense..

Avez vous l'habitude de ce genre de problème ( instruction comprise mais pas exécuté ) ?

Voyez vous, je me suis demandé si le problème ne venais pas de la structure avec mes if.

Mais le moteur s’exécute ( mauvais sens bien-sur) quand il est dans la bonne plage de valeur ( deuxième IF )

Comme, tout est bien lu !

J'ai même testé d'autres moteurs pas à pas mais rien n'y fait !

Avez vous une autre piste ?

Ha oui, c'est "rigolo", mais voici une autre info.

Quand je voulais paramétrer la rotation du moteur je me suis heurté à pas mal de problèmes.

Il y a beaucoup de façon de procéder mais seul cette dernière ( à ma connaissance et niveau cela va de soit !) marchais.

Ref* moteur pas à pas ( se moque pas ! ) 28BYJ-48 5V DC ( il est commun est cheap...)

Je sais que c'est pas de la haute qualité mais bon... Le problème pourrai venir de ce moteur (série, fabriquant... ?)

Avant d'aller plus oin il faudrait éditer le premier message et mettre le code entre les balises, les explications pour cela sont dans les message épinglé en haut du forum général.

Après dans chaque if il faudrait mettre un serial.print avec la console série pour tester si c'est la bonne condition qui travaille en imprimant dans un condition par exemple "SH" et dans l'autre "SAH"

C'est pas une mauvaise idée, ça éliminerai des problèmes une bonne fois pour toute.

Je vais m'y atteler et je vous tiendrai informé demain.

Encore merci et une bonne soirée/nuit

ps: Autant pour moi concernant les balises :slight_smile:

Autrement il me semble compliquer de mettre deux condition imbriquée qui ne servent pas à grand chose.... si il fait plus noir la porte va pas tomber d'un coup.... si il fait plus jour la porte ne va pas se désintegrer.

 if (valeur <= 790 )
           
else if ( valeur >= 800 )

A mon sens, il manque une sécurité qui empêcherait le moteur de tourner une fois qu'il a ouvert ou fermé la porte sinon tu vas faire chauffer celui-ci et/ou forcer le mécanisme.
La condition sur le seul seuil lumineux n'est pas suffisante, il faut aussi mémoriser que la porte est ouverte ou fermé pour conditionner les actions.

De même, le seuil qui a sans doute été déterminé empiriquement devrait sans doute être adapté en fonction des saisons et de l'heure.

Alors :

jfs, je me rend compte que les valeurs de mes if sont un peu abusé, c'est normal, c'était pour faire des testes.

En vérité ça correspondra plus à :

if( valeur <300 && valeur >280 )

Le problème c'est que si je fais comme ta proposition, le moteur vas tourner encore et encore tant que le capteur renverra une valeur <= 790 ou >= 800. En une journée il me faudrait pas loin du kilomètre de câble :wink:

Du coup, c'est aussi une réponse valable pour fdufnews, Le fait d'avoir une plage de valeur courte le moteur n'aura pas le temps de faire 30 tours, surtout avec un delay... Histoire qu'il n'ai pas le temps d’amorcer un nouveau tour.

J'ai testé ça et le moteur ne chauffe pas avec cette combine. Il attend sagement que la valeur correspondante arrive.

J'ai cherché un plus simple et efficace ( dans l'idée :wink: )

J'aurais juste à paramétrer le bon nombre de pas ( tours ) pour que la porte se referme correctement.
Old school tech' !

pepe- :

j'ai pas me le code dans son intégralité, le voici donc :

#include <Stepper.h>
const int stepsPerRevolution = 2048;
Stepper myStepper(stepsPerRevolution,8,9,10,11);


void setup() {

  myStepper.setSpeed(9);
  Serial.begin(9600);
}

// Fonction loop(), appelée continuellement en boucle tant que la carte Arduino est alimentée
void loop() 

{
      int Nbre_tour ;
      int valeur = analogRead(A0); 
      Serial.println(valeur);  // on écrit la valeur obtenu dans le moniteur série  
      delay(5000);   
      
  if (valeur < 790 && valeur >490)
              {
    
                    Nbre_tour = 1; 
                    myStepper.step(stepsPerRevolution*Nbre_tour);
                    delay(2000);
           
              }
     
else if ( valeur > 800 && valeur <1200) 
            
              {
    
                    Nbre_tour = 1; 
                    myStepper.step(-1*stepsPerRevolution*Nbre_tour); 
                    delay(2000);
              }
}

comme tu peux le constater, const int stepsPerRevolution = 2048 soit un tour complet.

Je me suis couché tôt hier avec une bonne otite qui s'arrange pas ... Du coup un peu la tête dans le mur...

// Je vais essayer ton conseil d'hier jfs histoire d'éclaircir tout ça ! //

Du coup, je modifie le message pour vous indiquer le niveau de frustration élevé !

Dans le moniteur, il me dit bien "SH" pour l'ouverture ( Val <300 ) et bien
"SHA" pour la fermeture (Val>700).

Donc, ça confirme ce que je pensais déjà, il comprend bien ou est sa place et sait dans quel if il doit intervenir mais... "Il me tire la langue" pour la rotation inverse...

J'ai l'impression que c'est une blague. Franchement, ça me dépasse un peu et c'est dur à accepter pour un code aussi simple...

Haroum:
Le fait d'avoir une plage de valeur courte le moteur n'aura pas le temps de faire 30 tours, surtout avec un delay... Histoire qu'il n'ai pas le temps d’amorcer un nouveau tour.

La fourchette de valeurs et les délais cela fonctionne bien pour des conditions particulières. Tu ne peux pas exclure que le capteur te retourne une valeur dans l'une des plages pendant un temps assez long. Pense par exemple à un jour où le ciel est couvert par exemple.
Il suffit juste d'avoir un booléen qui soit positionné lorsque tu fermes et que tu l'introduises dans la condition de fermeture et un booléen positionné lorsque tu ouvres et que tu l'introduises dans la condition d'ouverture ainsi tu ne feras pas 2 fois la même action.

pepe :

Je te suis mais je travail à vide pour le moment..
Donc pas de poids, pas d'effort. De plus, la vitesse de rotation n'est pas rapide (9) sur (14) si je ne dis pas de bêtises.

Le câblage me semble bon après nombreuse vérifications... et en sois impossible de se tromper, le moteur et fournis avec son module et sa connexion fiche.

Encore une fois, c'est bien quand j'intègre le code pour les sens de rotation (moteur) au programme qu'il y a défaut, autrement, le code marche parfaitement ( mais pas quand il doit lire la donnée et exécuter ou alors mes if ). C'est ça qui est vraiment étrange pour moi...

fdufnews :

Oui, je reconnais que c'est pas une mauvaise idée...
Bon dans l'idée après plusieurs tests, je pense que j'aurai trouvé la bonne formule. Un booléen faciliterai la tâche !

Mais sans la rotation du moteur en sens inverse je resterai toujours au même point. Soleil/nuage ou pas :wink:

Je la note malgré tout ! c'est pas bête !

Je n'en doute pas !

Pour palier au problème de la défaillance, j'ai testé le code sur 3 autres moteurs identique et avec in fine le même résultat.

Oui, j'ai déjà fait cette procédure. Et dans ce cas, aucuns problèmes, le moteur ( par exemple) tourne 3X en sens Horaire et 3X en sens anti-horaire et tout marche pour le mieux.

Mais à partir du moment ou j'intègre une valeur et une plage de déclenchement, ça ne marche plus. Enfin que dans un sens.

C'est pour cela que je suis venu ici solliciter votre avis, car ça m'échappe totalement !

A la manière d'une tarte au pomme ( facile) et toi gourmand tu en mets 6 au lieu de 5 et paf quand tu la sors du four c'est de la compote ou ça te sors un crambell ! ça n'a aucun sens !

Enfin, image stupide mais... bon, c'est mon ressentis sur le coup :stuck_out_tongue:

Mets ton code complet.

Et voici !

Merci d'y jeter un œil :wink:

#include <Stepper.h>
const int stepsPerRevolution = 2048;
Stepper myStepper(stepsPerRevolution,8,9,10,11);


void setup() {

  myStepper.setSpeed(9);
  Serial.begin(9600);
}


void loop()

{
      int Nbre_tour ;
      int valeur = analogRead(A0);
      Serial.println(valeur);  // on écrit la valeur obtenu dans le moniteur série 
      delay(5000);   
     
  if (valeur < 300 && valeur >280)
              {
   
                    Nbre_tour = 1;
                    myStepper.step(stepsPerRevolution*Nbre_tour);
                    delay(2000); // j'augmenterai les Delay ici c'est pour tester plus rapidement.
           
              }
     
else if ( valeur > 900 && valeur <950)
           
              {
   
                    Nbre_tour = 1;
                    myStepper.step(-1*stepsPerRevolution*Nbre_tour);
                    delay(2000);
              }
}

Tu n'as pas déclaré "valeur" en dehors du loop().

Nbre_tour non plus ....

Et bien, pour être honnête j'avais déjà déclaré ces deux fonctions en dehors du loop().

Et dans aucuns des cas ça n'a marché...

Et j'ai réessayé au cas ou.. et non.

Que ça soit dans le void setup()

Ou bien juste avant ( perdu le nom de cette zone en haut du programme, en C# de mémoire c'est par là que nous déclarions nos constantes et autres )

Du coup aucun changement, c'est pour cela que in fine pour plus de lisibilité je l'ai laissé quand dans le loop().

Et comme sur le programme test rotation moteur sans capteur il marchait parfaitement comme ça, j'ai pas jugé utile de changer ..

Pardonnez moi pepe j'ai pas vus votre message !

Alors IDE Arduino 1.8.5

GCC ?

Arduio UNO Genuion

Bon, j'y croyais plus trop...

Mais dans un dernier élan, j'ai repris la partie du code qui contrôle que la rotation moteur, ça a marché.
J'ai intégré sur celui-ci le reste, les if, mon capteur ect...

Et devinez quoi !?

C'est fonctionnel !!!!!!!!!!!!!

Pourquoi ? aucune idée, j'ai déjà fait cette procédure auparavant et ça n'avait pas marché...

J'y comprend rien mais bon... sur le coup c'est pas le plus important je crois ! C'est comme dans les Telecom ( je travail en BL ) et nous disons souvent quand ça n'a pas de sens, c'est la magie des telecoms :wink:

voici le code :

#include <Stepper.h>

const int stepsPerRevolution = 2048; 
int Nbre_tour ;
int valeur =analogRead(A0);
Stepper myStepper(stepsPerRevolution, 8,10,9,11);

void setup() {
 
  myStepper.setSpeed(10); 
  Serial.begin(9600);
}

void loop() 

    
{
      
    int Nbre_tour = 1;
    int valeur =analogRead(A0);
    Serial.println(valeur);
    delay(3000);
    
      if (valeur > 400 && valeur <510)
      {
            Nbre_tour = 1; //Faire 10 tours dans un sens:
            Serial.println("clockwise");
            myStepper.step(stepsPerRevolution*Nbre_tour);
            delay(1000);
      }
          
      if (valeur > 980 && valeur <1000)
      {
    
            Nbre_tour = 1; //Faire 5 tours dans l autre sens:
            Serial.println("counterclockwise");
            myStepper.step(-stepsPerRevolution*Nbre_tour);
            delay(1000);
      }
}

Voila, merci de votre aide en tout cas :slight_smile: