arduino et photo haute vitesse

AOURF...

J'ai l'immense plaisir de vous fournir ci dessous un code qui se compilationne à merveille...
La cacouille sur attachInterrupt(0, updateEncodeur, CHANGE); venait du fait que void updateEncoder() était inclue dans void loop() ... Une connerie de } en somme...

Le nouveau schéma du montage suit, nouveauté:
encodeur C part maintenant directement à la masse, et le BP de l'encodeur reçoit un pull down. Quelques changements de pin en plus pour que ce soit plus clair.

Quote
const int opto_coupl = 13; //définition de la broche 13 de la carte en tant que variable, optocoupl

const int encod_1 = 10; //définition de la broche 10 de la carte en tant que variable, led rouge
const int encod_2 = 9; //définition de la broche 9 de la carte en tant que variable, led verte
const int encod_4 = 8; //définition de la broche 8 de la carte en tant que variable, led bleue

const int led_IR = 7; //définition de la broche 7 de la carte en tant que variable, masse Led IR
const int phototransmass = 6; //définition de la broche 6 de la carte en tant que variable, masse phototrans
const int phototrans = 5; //définition de la broche 5 de la carte en tant que variable, phototrans
int phototransstate = 1; // memorise état du phototrans

int encodeurbouton = 4; //définition de la broche 4 de la carte en tant que variable,BP encodeur
int encodeurboutonstate = 0; // memorise état du BP
int encodeurB = 3; //définition de la broche 3 de la carte en tant que variable, encodeur B
int encodeurA= 2; //définition de la broche 2 de la carte en tant que variable, encodeur A

volatile int lastEncoded = 0; //je sais pas ce que c’est mais ça doit être important
volatile long encoderValue = 0; //je sais pas ce que c’est mais ça doit être important
long lastencoderValue = 0; //je sais pas ce que c’est mais ça doit être important

int lastMSB = 0; //je sais pas ce que c’est mais ça doit être important
int lastLSB = 0; //je sais pas ce que c’est mais ça doit être important

void setup()
{
pinMode(opto_coupl, OUTPUT); //initialisation de la broche 13 comme étant une sortie

pinMode(encod_1, OUTPUT); //initialisation de la broche 10 comme étant une sortie
pinMode(encod_2, OUTPUT); //initialisation de la broche 9 comme étant une sortie
pinMode(encod_4, OUTPUT); //initialisation de la broche 8 comme étant une sortie

pinMode(led_IR, OUTPUT); //initialisation de la broche 7 comme étant une sortie
pinMode(phototransmass, OUTPUT); //initialisation de la broche 6 comme étant une sortie
pinMode(phototrans, INPUT); //initialisation de la broche 5 comme étant une entrée

pinMode(encodeurbouton, INPUT); //initialisation de la broche 4 comme étant une entrée
pinMode(encodeurB, INPUT); //initialisation de la broche 3 comme étant une entrée
digitalWrite(encodeurB, HIGH);
pinMode(encodeurA, INPUT); //initialisation de la broche 2 comme étant une entrée
digitalWrite(encodeurA, HIGH);
digitalWrite(encodeurB, HIGH);

attachInterrupt (0, updateEncoder, CHANGE);
attachInterrupt (1, updateEncoder, CHANGE);
//appelle updateEncodeur() quand un changement Haut ou Bas est détécté sur les broches
//interrupt 0 (broche 2) ou interrupt 1 (broche 3)
}

void loop() //fonction principale, elle se répète à l'infini
{
encodeurboutonstate = digitalRead(encodeurbouton); //lit la valeur de l'état du bouton
if (encodeurboutonstate==0) ; //teste si le bouton est laché
{
noInterrupts(); // désactivation des interruptions
digitalWrite(led_IR, LOW); //allume Led IR
digitalWrite(phototransmass, LOW); //allume phototrans
phototransstate=digitalRead(phototrans); //lit la valeur de l'état du phototrans
if(phototransstate==0); //teste si le faisceau IR est coupé
{
delay(lastEncoded); //fait une pause de la valeur de retard
digitalWrite(led_IR, HIGH); //coupe LED IR
digitalWrite(phototransmass, HIGH); //coupe phototrans
digitalWrite(opto_coupl, HIGH); //déclenche optocoupleur
delay(100); //durée d'impulsion vers flash
digitalWrite(opto_coupl, LOW); //coupe optocoupleur
delay(10000); //fait une pause de 10000 milli-seconde avant reprise du programme
}
}

if(encodeurboutonstate==1) ; //teste si le bouton est poussé
{
interrupts(); // réactivation des interruptions
if(lastEncoded == 500); //si retard = 500 milli-seconde
{
digitalWrite(encod_1, LOW); //allume Led rouge
}
if(lastEncoded >500); //si retard > 500 milli-seconde
{
digitalWrite(encod_2, LOW); //allume Led verte
}
if(lastEncoded <500); //si retard < 500 milli-seconde
{
digitalWrite (encod_4, LOW); //allume Led Bleu
}
}
}
void updateEncoder()
{
int MSB = digitalRead(encodeurA);
int LSB = digitalRead(encodeurB);

int encoded = (MSB << 1) |LSB;
int sum = (lastEncoded << 2) | encoded;

if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;

lastEncoded = encoded;
}

Une petite question tout de même, lastEncoded est bien la valeur retard qui servira à commander la fonction delay dans
Quote
delay(lastEncoded); //fait une pause de la valeur de retard

??

Back to the bread board...