Compteur millis() Besoin d'aide programmation

Bonjour.

Utilisateur depuis peu d'arduino et processeur atmel, je sèche aujourd'hui sur un programme !

Je monte en ce moment une visu 3 axes pour une fraiseuse, et j'utilise des pieds a coulisses digitaux. il y a 1 data, et 1 clock. pour chaque pied ! J'arrive a faire fonctionner l'ensemble sur un écran lcd, cependant les pieds a coulisse sont aujourd'hui équipé de veille automatique, ce qui me pose un problème de fonctionnement.

Lorsque la veille est active, le pied a coulisse n'envoi plus de data ni de clock, et j'aimerai détecté dans mon programme, cette absence, pour ensuite envoyé un signal de réactivation (output via transistor sur le bouton on/off du pied)

Mon souhait !

  • utilisation d'un compteur
  • si détection du data = remise a zéro du compteur
  • si aucune détection du data pendant 2 secondes = Output de réactivation

Comment puis-je programmer cette détection ?

merci d'Avance Rémy

Si j'ai bien suivi, il suffit plutôt de mémoriser dans l'arduino les 3 dernières mesures x y z reçues et de continuer à les afficher sur le LCD tant qu'il ne se passe rien. En cas de mouvement, le pied à coulisse se réveille de lui même et va transmettre une nouvelle valeur pour rafraîchir l'écran. A moins que le mouvement ne suffise pas à le remettre en route ?

Oui, mais le soucis est que si un des pieds a coulisses s’éteint, les autres ne fonctionnent plus ! (faut bien dire que j’ai fais du bricolage !!)

Voici mon code

  while (digitalRead(clockpinX)==HIGH) {} //if clock is LOW wait until it turns to HIGH
  tempmicrosX=micros();
  while (digitalRead(clockpinX)==LOW) {} //wait for the end of the HIGH pulse
  if ((micros()-tempmicrosX)>500) { //if the HIGH pulse was longer than 500 micros we are at the start of a new bit sequence
    decodeX(); //decode the bit sequence
  }

  while (digitalRead(clockpinY)==HIGH) {} //if clock is LOW wait until it turns to HIGH
  tempmicrosY=micros();
  while (digitalRead(clockpinY)==LOW) {} //wait for the end of the HIGH pulse
  if ((micros()-tempmicrosY)>500) { //if the HIGH pulse was longer than 500 micros we are at the start of a new bit sequence
    decodeY(); //decode the bit sequence
  }
  
  while (digitalRead(clockpinZ)==HIGH) {} //if clock is LOW wait until it turns to HIGH
  tempmicrosZ=micros();
  while (digitalRead(clockpinZ)==LOW) {} //wait for the end of the HIGH pulse
  if ((micros()-tempmicrosZ)>500) { //if the HIGH pulse was longer than 500 micros we are at the start of a new bit sequence
    decodeZ(); //decode the bit sequence
  }
}

//=======================================================================================================//
void decodeX() {
  signX=1;
  valueX=0;
  for (iX=0;iX<23;iX++) {
    while (digitalRead(clockpinX)==HIGH) { } //wait until clock returns to HIGH- the first bit is not needed
    while (digitalRead(clockpinX)==LOW) {} //wait until clock returns to LOW
    if (digitalRead(datapinX)==LOW) {
      if (iX<20) {
        valueX|= 1<<iX;
      }
      if (iX==20) {
        signX=-1;
      }
    }
  }
  
  resultX=(valueX*signX)/100.00;
  
            lcd.setCursor(0, 1);         
            lcd.print ("X:        ");
            lcd.setCursor(2, 1);         
            lcd.print (resultX,2);
            
   delay(5);
            
  }

//==================================================================================================//

void decodeY() {
  signY=1;
  valueY=0;
  for (iY=0;iY<23;iY++) {
    while (digitalRead(clockpinY)==HIGH) { } //wait until clock returns to HIGH- the first bit is not needed
    while (digitalRead(clockpinY)==LOW) {} //wait until clock returns to LOW
    if (digitalRead(datapinY)==LOW) {
      if (iY<20) {
        valueY|= 1<<iY;
      }
      if (iY==20) {
        signY=-1;
      }
    }
  }
 
  resultY=(valueY*signY)/100.00;
  
            lcd.setCursor(0, 2);         
            lcd.print ("Y:        ");
            lcd.setCursor(2, 2);         
            lcd.print (resultY,2);

  delay(5);            
           
 }           

//================================================================================================//

void decodeZ() {
  signZ=1;
  valueZ=0;
  for (iZ=0;iZ<23;iZ++) {
    while (digitalRead(clockpinZ)==HIGH) { } //wait until clock returns to HIGH- the first bit is not needed
    while (digitalRead(clockpinZ)==LOW) {} //wait until clock returns to LOW
    if (digitalRead(datapinZ)==LOW) {
      if (iZ<20) {
        valueZ|= 1<<iZ;
      }
      if (iZ==20) {
        signZ=-1;
      }
    }
  }
  
            resultZ=(valueZ*signZ)/100.00;

            lcd.setCursor(0, 3);         
            lcd.print ("Z:        "); 
            lcd.setCursor(2, 3);         
            lcd.print (resultZ,2);

  delay(5);

}

remycasse: Oui, mais le soucis est que si un des pieds a coulisses s'éteint, les autres ne fonctionnent plus ! (faut bien dire que j'ai fais du bricolage !!)

...

bonsoir Pour que l'on parle de la meme chose , tu evoque là l'interfaçage de pieds à coulisse "cheap" alimentés par une CR2032 ? avec le connecteur sortant clock et data sous 1.5 V ? Si oui Je connais Là je ne suis pas en mesure de regarder en reel avant mardi, mais déjà à l'oeil tu es sur que ton code au dessus compile ? :grin: Intuitivement , je vois un probleme de pull lors de la mise en auto off d'un des axes

Effectivement, j'utilise 3 pieds a coulisse CHEAP de chez Bricoman modifié pour la fraiseuse. (fraiseuse Proxxon utilisé pour l'aéromodélisme). La pile n'est plus présente, j'alimente grâce a un régulateur sur ma carte électro. Le data et le clock en 1.5v passe tous deux par un transistor 2N2222 relié au 5v avant de rentré sur les pin digitaux du Atmel.

Effectivement, si le programme ne me bloque pas les pieds a coulisse lors de la mise en veille, cela terminerai mon projet ! J'ai trouvé le programme sur internet, mais celui ci étais destiné a un seul axe, moi j'ai bricolé pour utiliser les 3 axes !

Le LCD 20X4 se situe dans le couvercle du boitier, avec les 3 switch de mise a Zéro.

[hors-sujet] Personnellement, dans un atelier et près d'une fraiseuse, j'éviterai de placer un boîtier avec une ventilation sans filtre. [/hors-sujet]

Sur les photos, c'est une pré-installation, les filtres ne sont pas installés ! ;)

Bonjour c'est bien ce que je pensais , ton code ne compile pas mets ton code complet. mais , je pense que ton probleme viens du 1er axe qui se met en OFF , tu rentre alors dans une boucle d'attente d'où tu ne sort plus

fdufnews: [hors-sujet] Personnellement, dans un atelier et près d'une fraiseuse, j'éviterai de placer un boîtier avec une ventilation sans filtre. [/hors-sujet]

De plus, j'aurais mis la ventilation en extraction d'air chaud et non l'inverse ;)

Voici le code d’origine trouvé sur ce site internet - Arduino reads digital caliper - martin's useless and useful creations -

Comment modifier ce code pour 3 pieds a coulisse ?

int i;

int sign;

long value;

float result;

int clockpin = 4;  

int datapin = 5;

unsigned long tempmicros;

 

 

void setup() {

  Serial.begin(9600);

  pinMode(clockpin, INPUT);

  pinMode(datapin, INPUT);

}



 void loop () {

  while (digitalRead(clockpin)==HIGH) {} //if clock is LOW wait until it turns to HIGH

  tempmicros=micros();

  while (digitalRead(clockpin)==LOW) {} //wait for the end of the HIGH pulse

  if ((micros()-tempmicros)>500) { //if the HIGH pulse was longer than 500 micros we are at the start of a new bit sequence

    decode(); //decode the bit sequence

  }

}

 

void decode() {

  sign=1;

  value=0;

  for (i=0;i<23;i++) {

    while (digitalRead(clockpin)==HIGH) { } //wait until clock returns to HIGH- the first bit is not needed

    while (digitalRead(clockpin)==LOW) {} //wait until clock returns to LOW

    if (digitalRead(datapin)==LOW) {

      if (i<20) {

        value|= 1<<i;

      }

      if (i==20) {

        sign=-1;

      }

    }

  }

  result=(value*sign)/100.00;    

  Serial.println(result,2); //print result with 2 decimals

  delay(1000);

}

remycasse: Voici le code d'origine trouvé sur ce site internet - https://sites.google.com/site/marthalprojects/home/arduino/arduino-reads-digital-caliper -

Bonjour mets ton code complet à toi que l'on regarde comment sont gérés ou pas) les pull

Mon code au complet !

#include <LiquidCrystal.h>

LiquidCrystal lcd (13,12,11,10,9,8);  


int iX;
int signX;
long valueX;
float resultX;
int clockpinX = 6;  
int datapinX = 7;

int iY;
int signY;
long valueY;
float resultY;
int clockpinY = 4;  
int datapinY = 5;

int iZ;
int signZ;
long valueZ;
float resultZ;
int clockpinZ = 2;  
int datapinZ = 3;

unsigned long tempmicrosX;
unsigned long tempmicrosY;
unsigned long tempmicrosZ;

void setup() {

  lcd.begin (20,4);   // Nature de l'écran LCD
  delay(500);
                    

  pinMode(clockpinX, INPUT);
  pinMode(datapinX, INPUT);
  
  pinMode(clockpinY, INPUT);
  pinMode(datapinY, INPUT);
  
  pinMode(clockpinZ, INPUT);
  pinMode(datapinZ, INPUT);

}
 void loop () {
  
   
  while (digitalRead(clockpinX)==HIGH) {} //if clock is LOW wait until it turns to HIGH
  tempmicrosX=micros();
  while (digitalRead(clockpinX)==LOW) {} //wait for the end of the HIGH pulse
  if ((micros()-tempmicrosX)>500) { //if the HIGH pulse was longer than 500 micros we are at the start of a new bit sequence
    decodeX(); //decode the bit sequence
  }

  while (digitalRead(clockpinY)==HIGH) {} //if clock is LOW wait until it turns to HIGH
  tempmicrosY=micros();
  while (digitalRead(clockpinY)==LOW) {} //wait for the end of the HIGH pulse
  if ((micros()-tempmicrosY)>500) { //if the HIGH pulse was longer than 500 micros we are at the start of a new bit sequence
    decodeY(); //decode the bit sequence
  }
  
  while (digitalRead(clockpinZ)==HIGH) {} //if clock is LOW wait until it turns to HIGH
  tempmicrosZ=micros();
  while (digitalRead(clockpinZ)==LOW) {} //wait for the end of the HIGH pulse
  if ((micros()-tempmicrosZ)>500) { //if the HIGH pulse was longer than 500 micros we are at the start of a new bit sequence
    decodeZ(); //decode the bit sequence
  }
}

//=======================================================================================================//
void decodeX() {
  signX=1;
  valueX=0;
  for (iX=0;iX<23;iX++) {
    while (digitalRead(clockpinX)==HIGH) { } //wait until clock returns to HIGH- the first bit is not needed
    while (digitalRead(clockpinX)==LOW) {} //wait until clock returns to LOW
    if (digitalRead(datapinX)==LOW) {
      if (iX<20) {
        valueX|= 1<<iX;
      }
      if (iX==20) {
        signX=-1;
      }
    }
  }
  
  resultX=(valueX*signX)/100.00;
  
            lcd.setCursor(0, 1);         
            lcd.print ("X:        ");
            lcd.setCursor(2, 1);         
            lcd.print (resultX,2);
            
   delay(5);
            
  }

//==================================================================================================//

void decodeY() {
  signY=1;
  valueY=0;
  for (iY=0;iY<23;iY++) {
    while (digitalRead(clockpinY)==HIGH) { } //wait until clock returns to HIGH- the first bit is not needed
    while (digitalRead(clockpinY)==LOW) {} //wait until clock returns to LOW
    if (digitalRead(datapinY)==LOW) {
      if (iY<20) {
        valueY|= 1<<iY;
      }
      if (iY==20) {
        signY=-1;
      }
    }
  }
 
  resultY=(valueY*signY)/100.00;
  
            lcd.setCursor(0, 2);         
            lcd.print ("Y:        ");
            lcd.setCursor(2, 2);         
            lcd.print (resultY,2);

  delay(5);            
           
 }           

//================================================================================================//

void decodeZ() {
  signZ=1;
  valueZ=0;
  for (iZ=0;iZ<23;iZ++) {
    while (digitalRead(clockpinZ)==HIGH) { } //wait until clock returns to HIGH- the first bit is not needed
    while (digitalRead(clockpinZ)==LOW) {} //wait until clock returns to LOW
    if (digitalRead(datapinZ)==LOW) {
      if (iZ<20) {
        valueZ|= 1<<iZ;
      }
      if (iZ==20) {
        signZ=-1;
      }
    }
  }
  
            resultZ=(valueZ*signZ)/100.00;

            lcd.setCursor(0, 3);         
            lcd.print ("Z:        "); 
            lcd.setCursor(2, 3);         
            lcd.print (resultZ,2);

  delay(5);

}

remycasse: Mon code au complet !

...

OK Je n'ai pas vraiment le temps là pour bien regarder le déroulé, mais essaye de remplacer tes pinmode input avec INPUT_PULLUP en cas de OFF sur temps les niveaux logiques devraient se retrouver à high .

Artouste:

remycasse: Mon code au complet !

...

OK Je n'ai pas vraiment le temps là pour bien regarder le déroulé, mais essaye de remplacer tes pinmode input avec INPUT_PULLUP en cas de OFF sur temps les niveaux logiques devraient se retrouver à high .

Malheureusement cela ne change rien. Mes 3 axes fonctionnent bien, sauf si un des trois se met en veille. Comme tu dis, le programme doit ce bloquer dans une boucle while.

remycasse:

Artouste:

remycasse: Mon code au complet !

...

OK Je n'ai pas vraiment le temps là pour bien regarder le déroulé, mais essaye de remplacer tes pinmode input avec INPUT_PULLUP en cas de OFF sur temps les niveaux logiques devraient se retrouver à high .

Malheureusement cela ne change rien. Mes 3 axes fonctionnent bien, sauf si un des trois se met en veille. Comme tu dis, le programme doit ce bloquer dans une boucle while.

ça aurait été trop facile :grin: il faut retracer les chronogrammes sur papier et voir les situations de blocages. mais là et meme si ça m'interesse je n'ai pas trop le temps pour mettre ça sur paillase. mais intuitivement je vois bien un probleme de pull up ou down le niveau des signaux utiles lorsque le pied est off est bien à zero ? ça déjà je pourrais verifier demain

Bonjour,

Je suis intéressé par ton montage, as tu réussi à solutionner, voudrais tu partager, j'ai moi même une fraiseuse classique, un tour et une fraiseuse cnc?

serge