Création d'un Convoyeur de tri avec Arduino
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:
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:
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
}} |