Bonjour,
je cherche à créer un convoyeur pour trier des pièces de longueurs différentes.
ARDUINO + LASER + CAPTEUR LASER + RELAIS PNEUMATIQUE
J'obtiens de bon résultat avec ce code pour definir la taille des pièces

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
const byte btnPin = 2;        // Bouton sur pin 2...
const byte btnIrq = 0;       // Bouton sur pin 2, soit INT0 sur arduino UNO.
unsigned long tFall = 0;     // Valeur de millis() lors du front descendant
unsigned long tRise = 0;    // Valeur de millis() lors du front montant
unsigned long tDiff =0;     //Valeur appuie Bp
void onRise(void);
void onFall(void);
void setup(void);
void loop(void);
void onFall() {                                     // Interruption lors d'un front descendant
tFall = millis();                                // On sauvegarde la valeur de millis dans tFall
attachInterrupt(btnIrq, onRise, RISING);        // Puis on passe la détection d'interruption sur front montant
}
void onRise() {                                     // Interruption lors d'un front montant
tRise = millis();                                // On sauvegarde la valeur de millis dans tRise
attachInterrupt(btnIrq, onFall, FALLING);       // Puis on passe la détection d'interruption sur front descendant
}
void setup(void) {                                  // Setup:
attachInterrupt(btnIrq, onFall, FALLING);        // Détection d'interruption sur front descendant au départ
Serial.begin(115200);                           // Serial à 11500 bauds
}
void loop(void) {
if ( ( tRise != 0 ) && ( tFall != 0 ) ) {
tDiff= tRise - tFall;
Serial.println(tDiff);
tFall=0;tRise=0;tDiff=0;
/*Serial.print("tRise=");
Serial.println(tRise);
Serial.print("tFall=");
Serial.println(tFall);                   // Si les 2 fronts ont été détectés, alors on affiche tout
Serial.print("tDiff=");*/
}
}


Cependant je n'arrive pas à donner un déclenchement sur le Pin 8 en fonction de la valeur de tDiff ( compris entre deux valeurs )

Le pin 8 Active un relais ( AIR ).

Pouvez vous m'aider ?

Voici mon script, il fonctionne mais une pièce sur deux ( quelque soit l'intervalle de temps de passage )
A l'oscilloscope, chaque passage de pièce est bien présent ( le capteur OK )

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
 
// DECLARATION DES CAPTEURS
int air = 8; // vers relais AIR
const byte cap = 2; // vers CAPTEUR LASER
const byte btnIrq = 0;
 
// DETECTION DES FRONTS
 
static unsigned long tFall = 0;         // Valeur de millis() lors du front descendant
static unsigned long tRise = 0;        // Valeur de millis() lors du front montant
unsigned long tDiff = 0;       //Valeur appuie Bp
unsigned long mem;            //Variable mémoire
 
//SETUP
void onRise(void);
void onFall(void);
void setup(void);
void loop(void);
 
void onFall()
{                                     // Interruption lors d'un front descendant
  tFall = millis();                                // On sauvegarde la valeur de millis dans tFall
  attachInterrupt(btnIrq, onRise, RISING);        // Puis on passe la détection d'interruption sur front montant
 
}
 
void onRise()
{                                     // Interruption lors d'un front montant
tRise = millis();                                // On sauvegarde la valeur de millis dans tRise
attachInterrupt(btnIrq, onFall, FALLING);       // Puis on passe la détection d'interruption sur front descendant
 
}
 
void setup(void)
{
// PULLUP  
pinMode(cap, INPUT_PULLUP);
 
//
pinMode(air, OUTPUT);
attachInterrupt(btnIrq, onFall, FALLING);         // Détection d'interruption sur front descendant au départ
///////////////////
Serial.begin(115200);                              // Serial à 9600 bauds
}
void loop(void) {
 
digitalWrite(air, LOW);
noInterrupts();
 
///////////////0  
if ( ( tRise != 0 ) && ( tFall != 0 ) )
{
        tDiff = ( tRise - tFall );
        mem = tDiff;        
}
interrupts();
 
if ( mem > 150 && mem < 300  )
{            
Serial.println(tDiff);
//  Serial.println(tDiff);
//Serial.println(tFall);
//Serial.println(tRise);
digitalWrite(air, HIGH);
delay(300); // EXPULSION DE LA PIECE
//   digitalWrite(air, LOW);
mem = 0; tFall = 0; tRise = 0; tDiff = 0; // REMISE A ZERO 
 
 
}}