Audiyofan
Audiyofan




Poster un nouveau sujet Répondre au sujet  [ 319 messages ]  Aller à la page Précédente  1 ... 6, 7, 8, 9, 10, 11, 12 ... 22  Suivante
Auteur Message
 Sujet du message: Re: Bobineuse
MessagePosté: Mer 12 Fév 2014, 17:08 
Hors ligne
Site Admin
Avatar de l’utilisateur

Inscription: Mer 15 Juin 2005, 17:23
Messages: 7306
Localisation: Ardeche
J'ai oublié de préciser que les "contacts" doivent se recouvrir, càd qu'il doit toujours y avoir un moment ou les deux sont fermés simultanément.

_________________
Seules les choses que l'on refuse de comprendre en leur attribuant des propriétés magiques semblent compliquées.


Haut
 Profil  
 
 Sujet du message: Re: Bobineuse
MessagePosté: Mer 12 Fév 2014, 19:14 
Hors ligne
Site Admin
Avatar de l’utilisateur

Inscription: Mer 01 Oct 2003, 22:47
Messages: 9093
Localisation: St Mathieu de Tréviers près de Montpellier
Re

oui les 2 signaux issu des capteurs doivent se recouvrir

Voici une version qui est basée sur une interruption nommé rotation
les tests sont concluant à savoir que sa compte et décompte tout seul
et si j'ai bien compris le rôle d'une interruption même si mon µc fait autre chose
il prendra en compte le changement car l'interruption est prioritaire et reprendra
le cour de la boucle après :oops: :oops:

un bout du code
Code:
// Fonction
void rotAxe()
{
  rotating=true; // If motion is detected
  // set the flag to true
}

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  ....
  lcd.print(compteur);
  // Initialise les entrées A et B
  pinMode(ILS_A, INPUT);
  pinMode(ILS_B, INPUT);
  // Attach Interrupts
  attachInterrupt(0, rotAxe, CHANGE);  // ISR for mouvement
}

void loop() {

  while(rotating){
    // Lecture des sorties A et B de l'encodeur.
   
    StateA = digitalRead(ILS_A);

    StateB = digitalRead(ILS_B);

    if (StateA == HIGH) {
      if (StateB == LOW){
        compteur = compteur+1;     
      }
    }


    if (StateA == HIGH) {
      if (StateB == HIGH){
        compteur = compteur-1;     
      }
    }

    // set the cursor to column 12, line 0
    // (note: line 1 is the second row, since counting begins with 0):
    lcd.setCursor(12,0);
    // reset the screen:
    lcd.print("    ");
    // set the cursor to column 12, line 0
    lcd.setCursor(12,0);
    lcd.print(compteur);

    rotating=false; // Reset the flag
  }
  Dfil = 0.215;
  // set the cursor to column 0, line 1
....
  lcd.print(Dfil,4);
}


et le code complet pour les curieux

Fichier(s) joint(s):
Compteur_decompteur_V2.ino.tar.bz2 [1.6 Kio]
Téléchargé 271 fois


je continue donc par l'adaptation en 3 fils de ma carte de commande moteur

A+

_________________
Ce qui est pris n'est plus a prendre


Haut
 Profil  
 
 Sujet du message: Re: Bobineuse
MessagePosté: Mer 12 Fév 2014, 20:42 
Hors ligne
Site Admin
Avatar de l’utilisateur

Inscription: Mer 15 Juin 2005, 17:23
Messages: 7306
Localisation: Ardeche
Je ne comprends pas ce qui provoque l'interruption ? CHANGE ? Kesaco ?
Ce devrait être le changement d'état d'une des deux entrées StateA ou StateB.
Ensuite le test de l'autre se fait simplement et directement dans la routine d'interruption, pas dans la boucle.
Tu peux tout aussi bien en profiter pour mettre à jour l'afficheur, envoyer des pulses au pas à pas en fonction du compteur, etc ...
A l'extreme, la boucle ne sert à rien 8) Elle peut se limiter à:

(. . . initialisations diverses, y compris le attachInterrupt . . .) puis :
While (1) {}

Et tout se fait dans l'interruption, j'ai souvent fait ça.
Le code devient clair et tu n'as plus besoin de manipuler des flags ce qui est piégeux quand plusieurs risquent de se contrarier.
Le seul risque est de prendre une nouvelle interruption avant que le traitement de la précédente ne soit terminé ce qui provoque rapidement un "stack overflow".
Mais la plupart des processeurs l'empèchent (masquage automatique des interruptions pendant une interruption), sinon c'est facile à faire.

Yves.

_________________
Seules les choses que l'on refuse de comprendre en leur attribuant des propriétés magiques semblent compliquées.


Haut
 Profil  
 
 Sujet du message: Re: Bobineuse
MessagePosté: Mer 12 Fév 2014, 21:19 
Hors ligne
Site Admin
Avatar de l’utilisateur

Inscription: Mer 01 Oct 2003, 22:47
Messages: 9093
Localisation: St Mathieu de Tréviers près de Montpellier
Bonsoir Yves

Le mode change est justement le changement d'état sur l'entrée connectée à la pinoche de l'interruption 0
on peut choisir RISING, FALLING, etc, voir ici http://arduino.cc/en/Reference/attachInterrupt

L'IDE Arduino étant un langage "précompiler" c'est bien pratique et bien plus simple que de tout écrire en C++ ou autre

J'ai essayer de créer une interruption avec toute la "logique de comptage " dedans et juste l'affichage dans la boucle principale
mais j'arrive pas à avoir une utilisation sans "bug" ou plantage dans le déroulement des opérations :oops: :oops:
Ca marche bien dans le sens comptage mais dès que je change de sens ou que je rechange de sens ça foire

Alors que la version que j'ai posté du code , ne "bugue" pas :oops:

A+

_________________
Ce qui est pris n'est plus a prendre


Haut
 Profil  
 
 Sujet du message: Re: Bobineuse
MessagePosté: Jeu 13 Fév 2014, 17:56 
Hors ligne
Site Admin
Avatar de l’utilisateur

Inscription: Mer 15 Juin 2005, 17:23
Messages: 7306
Localisation: Ardeche
Tous les capteurs mécaniques, y compris les ILS, ont des rebonds et ça déclenche des interruptions en rafale !
Peut être et même certainement la source de tes problèmes.

Pour combiner les traitements dans les interruptions et dans une boucle, fais gaffe que les deux ne tentent pas de modifier la même variable, ou flag, ou n'importe quoi d'autre sinon les résultats sont imprévisibles !

Dans ton cas, tu pourrais traiter dans la boucle ce que tu dois faire quand ça "ne tourne pas" et dans l'interruption ce qu'il faut faire quand "ça tourne" 8)

Yves.

_________________
Seules les choses que l'on refuse de comprendre en leur attribuant des propriétés magiques semblent compliquées.


Haut
 Profil  
 
 Sujet du message: Re: Bobineuse
MessagePosté: Jeu 13 Fév 2014, 18:14 
Hors ligne
Site Admin
Avatar de l’utilisateur

Inscription: Mer 01 Oct 2003, 22:47
Messages: 9093
Localisation: St Mathieu de Tréviers près de Montpellier
Bonjour Yves

Je vais encore essayer ce soir de faire un bout de code en ce sens , donc déclenchement de l'interruption avec
le traitement du comptage entre les accolades et dans la boucle ce qui peut se faire quand l'interruption est "passée"
Je finalise mon bout de PCB pour connecter les annexes et passer au test avec la gestion du pàp

Hier soir j'ai tester longuement et le comptage décomptage fonctionne bien , donc on verra bien :mrgreen: tub18

A+

_________________
Ce qui est pris n'est plus a prendre


Haut
 Profil  
 
 Sujet du message: Re: Bobineuse
MessagePosté: Dim 16 Fév 2014, 19:04 
Hors ligne
Site Admin
Avatar de l’utilisateur

Inscription: Mer 01 Oct 2003, 22:47
Messages: 9093
Localisation: St Mathieu de Tréviers près de Montpellier
Bonsoir à tous

J'ai profité de cet après midi pour graver le PCB qui commandera le moteur

Fichier(s) joint(s):
PCB_Mot_pàp.JPG
PCB_Mot_pàp.JPG [ 413.09 Kio | Vu 5988 fois ]


Restera le perçage et câblage avant les prochains tests, soit de quoi bricoler le soir :mrgreen:

A+

_________________
Ce qui est pris n'est plus a prendre


Haut
 Profil  
 
 Sujet du message: Re: Bobineuse
MessagePosté: Ven 21 Fév 2014, 21:37 
Hors ligne
Site Admin
Avatar de l’utilisateur

Inscription: Mer 01 Oct 2003, 22:47
Messages: 9093
Localisation: St Mathieu de Tréviers près de Montpellier
Bonsoir à tous

j'ai bossé un peu sur le code et la manière avec mes 2 ILS et la fonction comptage-décomptage automatique

Pour les rebonds des ILS , j'ai soudé aux bornes un condo de 100 nf et mis un délai au niveau soft de 10 millisec

Après quelques essais j'ai une version avec "interruption" qui fonctionne bien

La partie "setup" donne ceci
Code:
void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("Compteur");
  // (note: line 1 is the second line, since counting begins with 0):
  lcd.setCursor(12,0);
  lcd.print(Compteur);
  // Initialise les entrées A et B
  pinMode(ILS_A, INPUT);
  pinMode(ILS_B, INPUT);
  attachInterrupt(1, GestionInterruptionILS_A, HIGH);

}


La partie "loop" ceci
Code:
void loop() {
 
      while(CountUp==1) // CW motion
      {
       CountUp=0; // Reset the flag
       Compteur++;
      }

      while(CountDown==1) // CCW
      {
       CountDown=0; // clear the flag
       Compteur--;
      }
     
    // set the cursor to column 12, line 0
    // (note: line 1 is the second row, since counting begins with 0):
    lcd.setCursor(12,0);
    // reset the screen:
    lcd.print("    ");
    // set the cursor to column 12, line 0
    lcd.setCursor(12,0);
    lcd.print(Compteur/2);
   
   
    Dfil = 0.215;
    // set the cursor to column 0, line 1
    // (note: line 1 is the second row, since counting begins with 0):
    lcd.setCursor(0,1);
    // print the number of seconds since reset:
    lcd.print("Diam fil");
    // set the cursor to column 0, line 1
    // (note: line 1 is the second row, since counting begins with 0):
    lcd.setCursor(11,1);
    lcd.print(Dfil,4);
}


Ey enfin la partie interruption comme ceci
Code:
// Routine de service d'interruption attachée à la voie A de la bobineuse
void GestionInterruptionILS_A()
{
  delay(10);
  if (digitalRead(ILS_B) == digitalRead(ILS_A)) {
    CountDown=1;
  }
  else {
   CountUp=1;
  }
}


Le code complet dans l'archive
Fichier(s) joint(s):
Compteur_decompteur_V2.tar.bz2 [1.59 Kio]
Téléchargé 278 fois


Les différent essai du mode de déclenchement me laisse dans le doute
Avec "RISING" le fonctionnement dérape quelques fois
visible par l'incrément ou décrément de 2 unités
Avec "HIGH" chaque incrément et décrément comptabilise 2 unités
d'ou la ligne Compteur/2 , mais ça fonctionne sans erreur
lorsque je fait tourner l'axe principal de la bobineuse

Vos commentaires seront instructif :mrgreen: tub18

Je continue par le câblage du PCB et la gestion moteur

Bonne soirée

_________________
Ce qui est pris n'est plus a prendre


Haut
 Profil  
 
 Sujet du message: Re: Bobineuse
MessagePosté: Sam 22 Fév 2014, 12:05 
Hors ligne
Site Admin
Avatar de l’utilisateur

Inscription: Mer 15 Juin 2005, 17:23
Messages: 7306
Localisation: Ardeche
Totof a écrit:
Bonsoir à tous

j'ai bossé un peu sur le code et la manière avec mes 2 ILS et la fonction comptage-décomptage automatique

Pour les rebonds des ILS , j'ai soudé aux bornes un condo de 100 nf et mis un délai au niveau soft de 10 millisec

Les ILS n'aiment pas trop, parfois le courant de décharge du condensateur suffit à les "coller" !
Citation:
Après quelques essais j'ai une version avec "interruption" qui fonctionne bien

Ey enfin la partie interruption comme ceci
Code:
// Routine de service d'interruption attachée à la voie A de la bobineuse
void GestionInterruptionILS_A()
{
  delay(10);
  if (digitalRead(ILS_B) == digitalRead(ILS_A)) {
    CountDown=1;
  }
  else {
   CountUp=1;
  }
}



Pourquoi ces deux flags ?
Directement:
Code:
// Routine de service d'interruption attachée à la voie A de la bobineuse
void GestionInterruptionILS_A()
{
  delay(10);
  if (digitalRead(ILS_B) == digitalRead(ILS_A)) { // Astucieux !
    Compteur --;
  }
  else {
   Compteur ++;
  }
}


Le "delay(10)" est mieux que rien mais tu pourrais lire plusieurs fois les entrée ILS (dans une boucle avec un plus petit delai) jusqu'à ce que 4 ou 5 lectures successives retournent la même valeur . . .
Par exemple (sauf erreur de syntaxe, pas fait de C depuis des années :oops: ) :
Code:
void GestionInterruptionILS_A(){

int stable; // 3 variables locales
int A;
int B;
// On y va !
stable = 0;
While stable < 5 {  // Attendre 5 lectures identiques
If (A != digitalRead(ILS_A) or B != digitalRead(ILS_B)){   // différents: pas stable !
   stable = 0; // On reprend du début.
    A = digitalRead(ILS_A);  // relire les deux
    B = digitalRead(iLS_B);
    delai(1);  // attendre un peu avant de relire
}   // Fin si
else{
   stable++;  // Bon "une fois" !
} // Fin else
} // Fin While, on boucle tant que "stable" est < à 5 (ou autre !)
// Et maintenant on fait bouger le compteur dans le bon sens
If ( A == B) {Compteur--;} else {Compteur++;}
} // retour d'interruption.

Les valeurs de delai et du nombre de relectures selon la qualité des capteurs 8)

Et tu vires les deux boucles "While" en tête de "Loop".

Yves.

_________________
Seules les choses que l'on refuse de comprendre en leur attribuant des propriétés magiques semblent compliquées.


Haut
 Profil  
 
 Sujet du message: Re: Bobineuse
MessagePosté: Sam 22 Fév 2014, 13:25 
Hors ligne
Site Admin
Avatar de l’utilisateur

Inscription: Mer 01 Oct 2003, 22:47
Messages: 9093
Localisation: St Mathieu de Tréviers près de Montpellier
Bonjour Yves

J'essaye ça cet après midi et te tiens au courant

Du coup l'interruption gère le compteur et la boucle ne sert qu'a afficher :mrgreen: tub18

La partie "stable" est une manière logiciel de gérer les rebonds , du coup je ferais des essais
aussi sans les condos de 100nf

Ca avance et ça me plaît comme logique

Du coup comme tu l'avais suggéré dans mon "loop" j'aurai la gestion de tout ce qui peut se faire
quand ça tourne pas :mrgreen: tub18 tub18 tub18 tub18

Bon appétit

_________________
Ce qui est pris n'est plus a prendre


Haut
 Profil  
 
 Sujet du message: Re: Bobineuse
MessagePosté: Sam 22 Fév 2014, 13:49 
Hors ligne
Site Admin
Avatar de l’utilisateur

Inscription: Mer 15 Juin 2005, 17:23
Messages: 7306
Localisation: Ardeche
Totof a écrit:
Bonjour Yves

J'essaye ça cet après midi et te tiens au courant

Du coup l'interruption gère le compteur et la boucle ne sert qu'a afficher :mrgreen: tub18

Plus ou moins !
Ecris toi une fonction (Ex. void AfficheCompteur() )qui transfère le contenu de "Compteur" vers l'afficheur, tu pourras l'appeler indifféremment depuis l'interruption ou depuis la "boucle" si tu dois modifier le compteur "à la main" (préchargement, RAZ, etc...)
Citation:
La partie "stable" est une manière logiciel de gérer les rebonds , du coup je ferais des essais
aussi sans les condos de 100nf

Ca avance et ça me plaît comme logique

Du coup comme tu l'avais suggéré dans mon "loop" j'aurai la gestion de tout ce qui peut se faire
quand ça tourne pas :mrgreen: tub18 tub18 tub18 tub18


T'as tout compris !

Yves.

_________________
Seules les choses que l'on refuse de comprendre en leur attribuant des propriétés magiques semblent compliquées.


Haut
 Profil  
 
 Sujet du message: Re: Bobineuse
MessagePosté: Sam 22 Fév 2014, 16:55 
Hors ligne
Site Admin
Avatar de l’utilisateur

Inscription: Mer 01 Oct 2003, 22:47
Messages: 9093
Localisation: St Mathieu de Tréviers près de Montpellier
Re

Ca fonctionne avec le compteur dans la boucle d'interruption
J'ai créer un e fonction AfficheCompteur et c'est bon aussi

Le code actuel est donc
Code:
void loop() {
     
    AfficheCompteur(); 
 
    Dfil = 0.215;
    // set the cursor to column 0, line 1
    // (note: line 1 is the second row, since counting begins with 0):
    lcd.setCursor(0,1);
    // print the number of seconds since reset:
    lcd.print("Diam fil");
    // set the cursor to column 0, line 1
    // (note: line 1 is the second row, since counting begins with 0):
    lcd.setCursor(11,1);
    lcd.print(Dfil,4);
}

// Routine de service d'interruption attachée à la voie A de la bobineuse
void GestionInterruptionILS_A()
{
  int stable; // 3 variables locales
  int A;
  int B;
  // On y va !
  stable = 0;
  while (stable < 5) {  // Attendre 5 lectures identiques
  if (A != digitalRead(ILS_A) or B != digitalRead(ILS_B)){   // différents: pas stable !
     stable = 0; // On reprend du début.
      A = digitalRead(ILS_A);  // relire les deux
      B = digitalRead(ILS_B);
      delay(1);  // attendre un peu avant de relire
  }   // Fin si
  else{
     stable++;  // Bon "une fois" !
  } // Fin else
  } // Fin While, on boucle tant que "stable" est < à 5 (ou autre !)
  // Et maintenant on fait bouger le compteur dans le bon sens
  if ( A == B) {Compteur--;} else {Compteur++;}
   
} // retour d'interruption.

// Fonction d'affichage du compteur
void AfficheCompteur()
{
  // set the cursor to column 12, line 0
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(12,0);
  // reset the screen:
  lcd.print("    ");
  // set the cursor to column 12, line 0
  lcd.setCursor(12,0);
  lcd.print(Compteur/2);
}


Je poursuis mes tests en pratique pour vérifier la robustesse du code
pour l'instant RAS , je vais enlever les 100 nf et je continue :mrgreen:

A+

_________________
Ce qui est pris n'est plus a prendre


Haut
 Profil  
 
 Sujet du message: Re: Bobineuse
MessagePosté: Sam 22 Fév 2014, 17:10 
Hors ligne
Site Admin
Avatar de l’utilisateur

Inscription: Mer 15 Juin 2005, 17:23
Messages: 7306
Localisation: Ardeche
Content :lol:
Mais pourquoi "Compteur/2" ? Ca cache un piège tub13

_________________
Seules les choses que l'on refuse de comprendre en leur attribuant des propriétés magiques semblent compliquées.


Haut
 Profil  
 
 Sujet du message: Re: Bobineuse
MessagePosté: Sam 22 Fév 2014, 17:22 
Hors ligne
Site Admin
Avatar de l’utilisateur

Inscription: Mer 01 Oct 2003, 22:47
Messages: 9093
Localisation: St Mathieu de Tréviers près de Montpellier
Oui je suis entrain de regarder mais c'est peut être la présence des condos
je les déssoude à l'instant et continue , je te tiens au courant :wink:

A+

_________________
Ce qui est pris n'est plus a prendre


Haut
 Profil  
 
 Sujet du message: Re: Bobineuse
MessagePosté: Sam 22 Fév 2014, 17:37 
Hors ligne
Site Admin
Avatar de l’utilisateur

Inscription: Mer 15 Juin 2005, 17:23
Messages: 7306
Localisation: Ardeche
Je crois que j'ai compris !
On prend une rafale d'interruptions quand l'aimant arrive et une autre quand il s'en va curse curse
Je suppose que le µC masque de lui même les interruptions pendant qu'il en traite une (ça doit être écrit dans la doc), sinon ce serait encore plus dramatique :roll:
Une solution serait d'attendre la fin de la deuxième rafale avant de mettre le compteur à jour . . .
Je cherche comment on pourrait faire ça !

_________________
Seules les choses que l'on refuse de comprendre en leur attribuant des propriétés magiques semblent compliquées.


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 319 messages ]  Aller à la page Précédente  1 ... 6, 7, 8, 9, 10, 11, 12 ... 22  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 4 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Aller à:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traduction par: phpBB-fr.com