Aide pour programme

Bonjour a tous,

Je suis nouveau ici et tout jeune sur Arduino et je rencontre des difficultés à rédiger mon code.

Il s’agit d’un petit volet motorisé grâce a un moteur pas a pas.
Il y a également un fin de course “Ouvert” broche “6” et un fin de course “Fermé” broche “7”
Enfin l’ordre d’ouverture et fermeture et interprété par la présence ou non du 5v sur l’une des broche “8”.

Je souhaite que lorsque le 5v apparait sur la broche 8, que le moteur se mette a tourner jusqu’à ce que l’on appui sur le fin de course ouvert.

Puis dés que la tension sur la broche “8” retombe a zéro, alors on fait tourner le moteur dans l’autre sens jusqu’au fin de course bas.

fin du cycle

Voici le code que j’ai rédigé en pompant différents élément à droite et a gauche.
Mais la je n’ai aucune réaction du moteur et je ne sais plus comment faire.

Merci de votre aide

Charles

Pietri 2.ino (1.3 KB)

// Attribution des numéros de Pin

const int enPin = 2;

const int stepPin = 3;

const int dirPin = 4;

const int OpenEndSwitch = 6;

const int CloseEndSwitch = 7;

const int Start = 8;

void setup() {

Serial.begin(9600);

// Paramétrage des Pin

pinMode(stepPin,OUTPUT);

pinMode(dirPin,OUTPUT);

pinMode(enPin,OUTPUT);

pinMode(OpenEndSwitch , INPUT);

pinMode(CloseEndSwitch , INPUT);

pinMode(Start , INPUT);

digitalWrite(enPin,LOW); // Réglage de la fonction Enable

}

void loop() {

int openSw = digitalRead( OpenEndSwitch);
int closeSw = digitalRead( CloseEndSwitch);
int cycle = digitalRead( Start);

if( cycle == HIGH && openSw == HIGH ){

digitalWrite(dirPin, HIGH);
while(openSw == LOW);
{
motorStep(1);
delay(1);
}
}

else if( cycle == LOW && closeSw == HIGH ){

digitalWrite(dirPin, LOW);
while(closeSw == LOW);
{
motorStep(1);
delay(1);
}
}

}

void motorStep( int MAX){

for(int x = 0; x < MAX; x++) {

digitalWrite(stepPin,HIGH);

delayMicroseconds(500);

digitalWrite(stepPin,LOW);

delayMicroseconds(500);

}

}

while (openSw == LOW);oops

Comment ca oops ?

D’abord, édite ton message pour mettre le code entre balises CODE : ça doit ressembler à la réponse de AWOL.

Ensuite, ce qu’il te dit c’est qu’il ne faut pas de ; après la condition du while, sinon tu as une boucle sans fin.

Mais ce n’est qu’une partie de ton problème : il faut que tu mettes à jour la valeur de la variable testée dans la condition du while, sinon, ce sera encore une boucle sans fin :

       while(openSw == LOW)
       {
         motorStep(1);
         delay(1);
         openSw = digitalRead( OpenEndSwitch);
       }

Bonjour Lesept,

Merci de prendre le temps de me répondre.

Je ne sais pas comment éditer mon message de cette façon, c'est la première fois que je viens sur le site.

Evidement pour les deux ";" j'aurais du le voir.

En revanche, je ne suis pas sure de comprendre ce que tu veut dire par "mettre à jour la valeur de ma variable testée dans la condition du While"

Peux tu être plus précis ?

Charles

Pour éditer, tu vas en bas du message, et à droite tu vois “Quick edit More”. Tu cliques sur More puis Modify et tu arrives dans une fenêtre d’édition.

Là, tu sélectionnes ton code et tu cliques sur le bouton </> qui va mettre les balises.

Pour la mise à jour, c’est les lignes de code que je t’ai données.

Ok voici le code

Pour la mise a jour, j’ai modifier mon code, mais toujours aucunes réaction.

const int enPin = 2;

const int stepPin = 3;

const int dirPin = 4;

const int OpenEndSwitch = 6;

const int CloseEndSwitch = 7;

const int Start = 8;



void setup() {


   Serial.begin(9600);


  // Paramétrage des Pin

  pinMode(stepPin,OUTPUT);

  pinMode(dirPin,OUTPUT);

  pinMode(enPin,OUTPUT);
  
  pinMode(OpenEndSwitch , INPUT);
  
  pinMode(CloseEndSwitch , INPUT);

  pinMode(Start , INPUT);


  digitalWrite(enPin,LOW); // Réglage de la fonction Enable



}

void loop() {


int cycle = digitalRead( Start);
int openSw = digitalRead( OpenEndSwitch);
int closeSw = digitalRead( CloseEndSwitch);

    if( cycle == HIGH && closeSw == HIGH ){
    
        digitalWrite(dirPin, HIGH);
        while(openSw == LOW)
         {
           motorStep(1);
           delay(1);
           openSw = digitalRead( OpenEndSwitch);
         }
    }
    
    else if( cycle == LOW && closeSw == HIGH ){

        digitalWrite(dirPin, LOW);
        while(openSw == LOW)
         {
           motorStep(1);
           delay(1);
           closeSw = digitalRead(CloseEndSwitch);
         }
    }


}


void motorStep( int MAX){


   for(int x = 0; x < MAX; x++) {

        digitalWrite(stepPin,HIGH);

        delayMicroseconds(500);

        digitalWrite(stepPin,LOW);

        delayMicroseconds(500);

      }

}

Ceci n'est pas cohérent :

       while(openSw == LOW)
        {
          motorStep(1);
          delay(1);
          closeSw = digitalRead(CloseEndSwitch);
        }

Tu testes openSw mais tu mets à jour closeSw

Edite ton second message pour mettre les balises.

Si je comprends bien : la pin 8 peut être à un niveau bas ou un niveau haut.

  • Si niveau haut, tu montes le rideau jusqu'à ce que le fin de course 'ouvert' envoie un signal.
  • Si niveau bas, tu descends le rideau jusqu'à ce que le fin de course 'fermé' envoie un signal.

Moi, je ferais le code de manière un peu différente, avec une variable qui conserve l'état du volet : monte, descend, arret.

En pseudo code, ça donnerait quelque chose comme ça (une sorte de machine d'état) :

  • Lire la pin Start
  • Si niveau haut:
  • Si le volet descend : mettre l'état du volet à 'monte'
  • Si l'état du volet est 'monte' : lire le fin de course 'ouvert'. S'il indique que le volet est arrivé, mettre l'état du volet à 'arret'- Si niveau bas:
  • Si le volet monte : mettre l'état du volet à 'descend'
  • Si l'état du volet est 'descend' : lire le fin de course 'fermé'. S'il indique que le volet est arrivé, mettre l'état du volet à 'arret'- Commander le moteur selon l'état du volet (dans un sens si 'monte', dans l'autre si 'descend', arrêté si 'arret')

Oui c’est tout à fait ça.

Pourquoi pas, mais comment je stop un moteur pas a pas ?

Je sais lui dire de parcourir un certain nombre de pas
Je sais le faire avancer de pas en pas
Mais je ne sais pas lui dire, tourne indéfiniment et arrête toit quand …

Sans vouloir abuser, accepterais tu de m’écrire le code ?
Je dois trouver rapidement la solution et ca fait déjà un moment que je tourne en rond autour du sujet.

Sans vouloir abuser, accepterais tu de m'écrire le code ?
Je dois trouver rapidement la solution .....

:slight_smile: :slight_smile: :slight_smile: :slight_smile:

Je suis d'accord : tu dois trouver... ;D
Je te conseille de la lecture : Eskimon, moteur à courant continu

Oui je l'ai déjà bien survoler, mais je n'ai pas trouver la réponse toute faite.

Il faut du temps pour ingurgiter de genre de chose et du temps je n'en ai plus.

Mais j'ai bien conscience que c'est la meilleur façon d'apprendre.

Sauf que je dois terminer ce programme très rapidement, car c'est pour un client.

Ce n'est pas grave, je vais trouver quelqu'un qui me fera le code moyennant finance.

Merci quand même pour les conseils.

A une prochaine

Salut

Ton système est une "machine à états" : tu as 3 états :

  • ARRET (moteur ne tourne pas)
  • MONTEE
  • DESCENTE.

Il exite un excellent tutoriel sur les machines à états par l'excellent J-M-L. Sa compréhension t'aidera beaucoup.

Dans ton cas, il y a donc 3 états (cf. ci-dessus) et il a aussi 4 événements :

  • appui sur le bouton Start,
  • lâcher du bouton Start,
  • fin de course haute atteinte,
  • fin de course basse atteinte.

Donc, tu dessines 3 patates (les 3 états). De chaque états doivent partir 4 flèches : les 4 événements.
Le flèche mène vers le nouvel état, celui que la détection de l'événement impose.
Voici ton cas (si j'ai bien compris, pas bien sûr, à vérifier flèche par flèche !) :

Je n'ai pas écrit les actions coirespondantes : quand on passe de ARRET à MONTEE, il faut commander le moteur, de MONTEE à DESCENTE il faut commander le moteur...

Il n'y a plus qu'à coder maintenant, le plus dur est fait :slight_smile:
On en reparle si as des difficultés, après avoir digéré tout ça.

[Edit] j'avais pas vu que tu jetais lâchement l'éponge. J'ai passé 1h ... pffff ....

Non il ne faut pas jeter l'éponge, le client n'est sûrement pas à un ou deux jours près... On va t'aider, mais montre tes essais avant.

Aidons plutôt le client de @charlie-95.

Laissons-lui la chance de tomber sur un pro.

Merci pour ces explications et pour ton temps Biggil,

J'ai un diplôme en Maintenance des systèmes mécaniques et automatisés, un autre en génie Mécanique et un autre en génie Electronique, ...
Je sais programmer un automate et le GRAFCET tu pense bien que je connais.

Donc la rédaction d'une machine à état, n'est pas une difficulté ni à l'écriture ni a la compréhension pour moi bien au contraire.
D'ailleurs, c'est la première chose que j'ai faite avant de commencer à programmer cette petite carte.

Le problème que j'ai, c'est je ne sais pas toujours traduire mon idée en langage Arduino.
Car d'une part il faut du temps de l'expérience et de la pratique pour découvrir les subtilités de ce langage,
mais aussi parce que la manière dont ca a été créer n'est pas toujours logique et donc on ne peut pas traduire littéralement ou même physiquement notre façon de penser en Arduino ou en C++.

Et le déroulé du programme n'a rien avoir avec une formule Excel ou un GRAFCET.

J'ai pourtant pris le temps de tester fonction après fonction, histoire de maitriser leur fonctionnement.
Mais il arrive souvent, qu'en agissant sur une variable ou même une virgule que plus rien ne fonctionne.
Et on a vite fait d'oublier une virgule :wink:

Bref, ce n'est pas de la mauvaise volonté de ma part, mais il n'y à pas asse d'exemple autour du sujet moteur pas a pas, qui correspond a ce que je recherche ainsi qu'au composant que j'utilise.
J'aurais besoins de quelqu'un à côté de moi pour intervenir ponctuellement et m'expliquer le pourquoi du comment.

Voila.

Mais je vais continuer à chercher.

Bonjour

Donc la rédaction d'une machine à état, n'est pas une difficulté ni à l'écriture ni a la compréhension pour moi bien au contraire.
D'ailleurs, c'est la première chose que j'ai faite avant de commencer à programmer cette petite carte
Le problème que j'ai, c'est je ne sais pas toujours traduire mon idée en langage Arduino.

le tutoriel de J-M-L signalé par biggil en #14 indique de manière détaillée une méthode de codage Arduino d'un quasi GRAFCET... codage des états , des transitions....

Si tu as un problème avec le moteur, commence par faire un petit code dédié pour trouver les niveaux à mettre sur les différentes pins pour le faire avancer, reculer et stopper.
Juste quelques lignes, inspirées des exemples que tu peux trouver sur le site d'eskimon.