Probleme detection de couleur capteur

Bonjour,

Je suis un étudiant en 2ème année de GEII, et dans le cadre de mon projet, je dois réaliser un programme pour afficher sur le moniteur série le nom de la couleur détectée avec l'aide d'un capteur TSC3200.

J'utilise alors une carte Arduino Mega, et voici le programme que j'essaie de rentrer:

// LCD Keypad Shield

#include <LiquidCrystal.h>

// Création de l'objet lcd (avec les différents ports numériques qu'il utilise)
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Variables
int lcd_key = 0;
int adc_key_in = 0;

// Constantes
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5

//Capteur couleur
#define S0 19
#define S1 18
#define S2 17
#define S3 16
#define sensorOut 15
int frequency = 0;
int ValeurR = 0;
int ValeurG = 0;
int ValeurB = 0;
int ValeurRG = abs(ValeurR - ValeurG);
int ValeurGB = abs(ValeurG - ValeurB);
int ValeurBR = abs(ValeurB - ValeurR);
int ValeurRGB = abs(ValeurRG - ValeurGB - ValeurBR);

void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);

// Setting frequency-scaling to 20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);

Serial.begin(9600);

lcd.begin(16, 2); // Démarrage de l'écran
lcd.setCursor(0,0); // Positionnement du curseur au début
lcd.print("Test:couleur"); // Message
}

void loop() {
{

// Setting red filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// Reading the output frequency
frequency = pulseIn(sensorOut, LOW);
//Remaping the value of the frequency to the RGB Model of 0 to 255
ValeurR = map(frequency, 25,72,255,0);
// Printing the value on the serial monitor
Serial.print("R= ");//printing name
Serial.print(ValeurR);//printing RED color frequency
Serial.print(" ");

// Setting Green filtered photodiodes to be read
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// Reading the output frequency
frequency = pulseIn(sensorOut, LOW);
//Remaping the value of the frequency to the RGB Model of 0 to 255
ValeurG = map(frequency, 30,90,255,0);
// Printing the value on the serial monitor
Serial.print("G= ");//printing name
Serial.print(ValeurG);//printing RED color frequency
Serial.print(" ");
delay(100);

// Setting Blue filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// Reading the output frequency
frequency = pulseIn(sensorOut, LOW);
//Remaping the value of the frequency to the RGB Model of 0 to 255
ValeurB = map(frequency, 25,70,255,0);
// Printing the value on the serial monitor
Serial.print("B= ");//printing name
Serial.print(ValeurB);//printing RED color frequency
Serial.println(" ");
delay(100);

if (ValeurR<=0 && ValeurG<=0 && ValeurB<=0)
{
Serial.print("NOIR ");
delay(100);
}
else if (ValeurRGB<=10)
{
Serial.print("BLANC ");
delay(100);
}
else if (ValeurR>ValeurG && ValeurR>ValeurB && ValeurRGB>10)
{
Serial.print("ROUGE ");
delay(100);
}
else if (ValeurG>ValeurR && ValeurG>ValeurB && ValeurRGB>10)
{
Serial.print("VERTE ");
delay(100);
}
else if (ValeurB>ValeurR && ValeurB>ValeurG && ValeurRGB>10)
{
Serial.print("BLEU ");
delay(100);
}

Ce programme contient alors plusieurs variables:
-ValeurR pour la couleur rouge
-ValeurG pour la couleur verte
-ValeurB pour la couleur bleue
-ValeurRG : valeur absolue de la différence entre ValeurR et ValeurG
-ValeurGB : valeur absolue de la différence entre ValeurG et ValeurB
-ValeurBR : valeur absolue de la différence entre ValeurB et ValeurR
-ValeurRGB : valeur absolue de la différence entre ValeurRG, ValeurGB et ValeurBR

Ce programme a pour but de détecter les 5 couleurs Rouge, Vert, Bleu, Noir et Blanc. A la base, j'étais supposé faire afficher le nom de la couleur sur un écran LCD également connecté avec la carte Arduino, mais je préfere d'abord avancer étape par étape et vérifier si mon algorithme fonctionne.

Cependant, après avoir compilé et téléversé mon programme, lorsque je fait détecter les 5 couleurs par le capteur avec des filtres, le moniteur série n'affiche que "BLANC" peu importe les valeurs de couleurs RGB, ou noir dans le cas où les valeurs RGB sont inférieurs ou égales à 0:

Quelqu'un pourrait-il m'aider à régler ce problème aussi vite que possible ?!

Merci d'avance !

int RGValue = abs (RValue - GValue);
int ValueGB = abs (ValueG - ValueB);
int ValueBR = abs (ValueB - ValueR);
intRGBValue = abs (RGValue - GBValue --BRValue);

This doesn't automagically bind these operations to these variables.

You need to do this stuff in loop()

Please remember to use code tags when posting code

Salut,
Merci pour avoir répondu, mais même après avoir modifié le programme, j’ai toujours le même problème.

// LCD Keypad Shield

#include <LiquidCrystal.h>

// Création de l'objet lcd (avec les différents ports numériques qu'il utilise)
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Variables
int lcd_key     = 0;
int adc_key_in  = 0;

// Constantes
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

//Capteur couleur
#define S0 19
#define S1 18
#define S2 17
#define S3 16
#define sensorOut 15
int frequency = 0;
int ValeurR = 0;
int ValeurG = 0;
int ValeurB = 0;
//int ValeurRG = abs(ValeurR - ValeurG);
//int ValeurGB = abs(ValeurG - ValeurB);
//int ValeurBR = abs(ValeurB - ValeurR);
//int ValeurRGB = abs(ValeurRG - ValeurGB - ValeurBR);

void setup() {
 pinMode(S0, OUTPUT);
 pinMode(S1, OUTPUT);
 pinMode(S2, OUTPUT);
 pinMode(S3, OUTPUT);
 pinMode(sensorOut, INPUT);
 
 // Setting frequency-scaling to 20%
 digitalWrite(S0,HIGH);
 digitalWrite(S1,LOW);
 
 Serial.begin(9600);
 
 lcd.begin(16, 2);              // Démarrage de l'écran
 lcd.setCursor(0,0);            // Positionnement du curseur au début
 lcd.print("Test:couleur"); // Message
}

void loop() {
 {

int ValeurRG = abs(ValeurR - ValeurG);
int ValeurGB = abs(ValeurG - ValeurB);
int ValeurBR = abs(ValeurB - ValeurR);
int ValeurRGB = abs(ValeurRG - ValeurGB - ValeurBR);
   
 // Setting red filtered photodiodes to be read
 digitalWrite(S2,LOW);
 digitalWrite(S3,LOW);
 // Reading the output frequency
 frequency = pulseIn(sensorOut, LOW);
 //Remaping the value of the frequency to the RGB Model of 0 to 255
 ValeurR = map(frequency, 25,72,255,0);
 // Printing the value on the serial monitor
 Serial.print("R= ");//printing name
 Serial.print(ValeurR);//printing RED color frequency
 Serial.print("  ");

 // Setting Green filtered photodiodes to be read
 digitalWrite(S2,HIGH);
 digitalWrite(S3,HIGH);
 // Reading the output frequency
 frequency = pulseIn(sensorOut, LOW);
 //Remaping the value of the frequency to the RGB Model of 0 to 255
 ValeurG = map(frequency, 30,90,255,0);
 // Printing the value on the serial monitor
 Serial.print("G= ");//printing name
 Serial.print(ValeurG);//printing RED color frequency
 Serial.print("  ");
 delay(100);
 
 // Setting Blue filtered photodiodes to be read
 digitalWrite(S2,LOW);
 digitalWrite(S3,HIGH);
 // Reading the output frequency
 frequency = pulseIn(sensorOut, LOW);
 //Remaping the value of the frequency to the RGB Model of 0 to 255
 ValeurB = map(frequency, 25,70,255,0);
 // Printing the value on the serial monitor
 Serial.print("B= ");//printing name
 Serial.print(ValeurB);//printing RED color frequency
 Serial.println("  ");
 delay(100);

 if (ValeurR<=0 && ValeurG<=0 && ValeurB<=0)
    {
       Serial.print("NOIR ");
       delay(100);
    }
 else if (ValeurRGB<=10)
    {
       Serial.print("BLANC ");
       delay(100);
    }
 else if (ValeurR>ValeurG && ValeurR>ValeurB && ValeurRGB>10)
    {
       Serial.print("ROUGE ");
       delay(100);
    }
 else if (ValeurG>ValeurR && ValeurG>ValeurB && ValeurRGB>10)
    {
       Serial.print("VERTE ");
       delay(100);
    }
 else if (ValeurB>ValeurR && ValeurB>ValeurG && ValeurRGB>10)
    {
       Serial.print("BLEU ");
       delay(100);
    }    


 lcd.setCursor(0,1);            // Positionnement du curseur début de ligne 1
   if (ValeurR<=0 && ValeurG<=0 && ValeurB<=0)
    {
     lcd.print("NOIR");
     delay(100);
    }
 else if (ValeurRGB<=10)
    {
     lcd.print("BLANC");
     delay(100);
    }
 else if (ValeurRG<=25)
    {
       lcd.print("JAUNE");
       delay(100);
    }
 else if (ValeurGB<=25)
    {
       lcd.print("CYAN");
       delay(100);
    }
 else if (ValeurBR<=25)
    {
       lcd.print("MAGENTA");
       delay(100);
    }
 else if (ValeurR>ValeurG && ValeurR>ValeurB)
    {
       lcd.print("ROUGE");
       delay(100);
    }
 else if (ValeurG>ValeurR && ValeurG>ValeurB)
    {
       lcd.print("VERTE");
       delay(100);
    }
 else if (ValeurB>ValeurR && ValeurB>ValeurG)
    {
       lcd.print("BLEU");
       delay(100);
    }    
 }
}

Après l’avoir compilé sur ma carte Arduino, j’ai fait détecter les couleurs ROUGE, BLEU, VERT, NOIR et BLANC avec le capteur, puis j’affiche le moniteur série :
Les couleurs BLANC, NOIR et BLANC sont bien détectes puisque le moniteur affiche le nom de la bonne couleur, mais pour ce qui est de ROUGE et VERT, il n’affiche que « BLANC ». Cela représente certes une petite amélioration dans mon programme, mais ce n’est pas encore ça.

Pourriez-vous encore m’aider SVP ?

void loop() {
 {


   
 // Setting red filtered photodiodes to be read
 digitalWrite(S2,LOW);
 digitalWrite(S3,LOW);
 // Reading the output frequency
 frequency = pulseIn(sensorOut, LOW);
 //Remaping the value of the frequency to the RGB Model of 0 to 255
 ValeurR = map(frequency, 25,72,255,0);
 // Printing the value on the serial monitor
 Serial.print("R= ");//printing name
 Serial.print(ValeurR);//printing RED color frequency
 Serial.print("  ");

 // Setting Green filtered photodiodes to be read
 digitalWrite(S2,HIGH);
 digitalWrite(S3,HIGH);
 // Reading the output frequency
 frequency = pulseIn(sensorOut, LOW);
 //Remaping the value of the frequency to the RGB Model of 0 to 255
 ValeurG = map(frequency, 30,90,255,0);
 // Printing the value on the serial monitor
 Serial.print("G= ");//printing name
 Serial.print(ValeurG);//printing RED color frequency
 Serial.print("  ");
 delay(100);
 
 // Setting Blue filtered photodiodes to be read
 digitalWrite(S2,LOW);
 digitalWrite(S3,HIGH);
 // Reading the output frequency
 frequency = pulseIn(sensorOut, LOW);
 //Remaping the value of the frequency to the RGB Model of 0 to 255
 ValeurB = map(frequency, 25,70,255,0);
 // Printing the value on the serial monitor
 Serial.print("B= ");//printing name
 Serial.print(ValeurB);//printing RED color frequency
 Serial.println("  ");
 delay(100);

int ValeurRG = abs(ValeurR - ValeurG);
int ValeurGB = abs(ValeurG - ValeurB);
int ValeurBR = abs(ValeurB - ValeurR);
int ValeurRGB = abs(ValeurRG - ValeurGB - ValeurBR);

 if (ValeurR<=0 && ValeurG<=0 && ValeurB<=0)
    {
       Serial.print("NOIR ");
       delay(100);
    }
 else if (ValeurRGB<=10)
    {
       Serial.print("BLANC ");
       delay(100);
    }
 else if (ValeurR>ValeurG && ValeurR>ValeurB && ValeurRGB>10)
    {
       Serial.print("ROUGE ");
       delay(100);
    }
 else if (ValeurG>ValeurR && ValeurG>ValeurB && ValeurRGB>10)
    {
       Serial.print("VERTE ");
       delay(100);
    }
 else if (ValeurB>ValeurR && ValeurB>ValeurG && ValeurRGB>10)
    {
       Serial.print("BLEU ");
       delay(100);
    }    


 lcd.setCursor(0,1);            // Positionnement du curseur début de ligne 1
   if (ValeurR<=0 && ValeurG<=0 && ValeurB<=0)
    {
     lcd.print("NOIR");
     delay(100);
    }
 else if (ValeurRGB<=10)
    {
     lcd.print("BLANC");
     delay(100);
    }
 else if (ValeurRG<=25)
    {
       lcd.print("JAUNE");
       delay(100);
    }
 else if (ValeurGB<=25)
    {
       lcd.print("CYAN");
       delay(100);
    }
 else if (ValeurBR<=25)
    {
       lcd.print("MAGENTA");
       delay(100);
    }
 else if (ValeurR>ValeurG && ValeurR>ValeurB)
    {
       lcd.print("ROUGE");
       delay(100);
    }
 else if (ValeurG>ValeurR && ValeurG>ValeurB)
    {
       lcd.print("VERTE");
       delay(100);
    }
 else if (ValeurB>ValeurR && ValeurB>ValeurG)
    {
       lcd.print("BLEU");
       delay(100);
    }    
 }
}

J'ai modifié en déplaçant les 4 variables, mais j'ai toujours le même problème.

Même si les conditions sont respectées pour ROUGE et VERT, le moniteur série affiche toujours "BLANC"