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 }}
Partager