Détecteur de couleur fonctionne mais pas assez bien

Bonjour à tous

Mon projet est une machine à trier les légos par couleurs.

Mon code ici est fonctionnel et s'appuie sur des conditions de détéctions de fréquences par la sonde.
Le souci c'est que pour détécter les couleurs à tous les coups je finis par élargir les fourchettes de détéction ce qui donne plusieurs conditions vraies en même temps :frowning:
Par exemple les pièces rouges et oranges sont détéctées en même temps sans distinction.

Pour les couleurs à fort contraste ca fonctionne par contre

#include <Servo.h>
int servoPin=11;
int servoPin2=12;
int color=0;

String finalcode;

long finalc;
// Define color sensor pins

#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define SL 2
#define sensorOut 8

// Variables for Color Pulse Width Measurements

int redPW = 0;
int greenPW = 0;
int bluePW = 0;



int servoPos=90;
int servoPos2=0;

//creation objet servo
Servo myServo;
Servo myServo2;
//creation objet servo


void setup() {

myServo.attach(servoPin);
myServo2.attach(servoPin2);

  // Set S0 - S3 as outputs
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
    pinMode(SL, OUTPUT);
  
  // Set Sensor output as input
  pinMode(sensorOut, INPUT);
  
  // Set Pulse Width scaling to 20%
  digitalWrite(S0,HIGH);
  digitalWrite(S1,LOW);
  
  // Setup Serial Monitor
  Serial.begin(9600);

    digitalWrite(SL,LOW);
}

void loop() {
  
  // Read Red Pulse Width
  redPW = getRedPW();
  // Delay to stabilize sensor
  delay(200);
  
  // Read Green Pulse Width
  greenPW = getGreenPW();
  // Delay to stabilize sensor
  delay(200);
  
  // Read Blue Pulse Width
  bluePW = getBluePW();
  // Delay to stabilize sensor
  delay(200);
  
  // Print output to Serial Monitor
  Serial.print("Red PW = ");
  Serial.print(redPW);
 Serial.print(" - Green PW = ");
  Serial.print(greenPW);
 Serial.print(" - Blue PW = ");
 Serial.println(bluePW);

//finalcode=redPW;
//finalcode.concat(greenPW);
//finalcode.concat(bluePW);
//Serial.println(finalcode);
//finalc=finalcode.toInt();


// recherche bleu ciel

if(redPW<100 & redPW>40 & greenPW<100 & greenPW>60 & bluePW<65 & bluePW>30){
    color = 1; // Red
    digitalWrite(SL,HIGH);
    Serial.println("BLEU");
   // myServo2.write(servoPos);
  }

if(redPW<90 & redPW>55 & greenPW<60 & greenPW>30 & bluePW<45 & bluePW>30){
    color = 1; // Red
    digitalWrite(SL,HIGH);
    Serial.println("BLEU CIEL");
  }


if(redPW<55 & redPW>35 & greenPW<135 & greenPW>65 & bluePW<105 & bluePW>55){
    color = 1; // Red
    digitalWrite(SL,HIGH);
    Serial.println("ROUGE");
     //myServo.write(servoPos);
  }




if(redPW<115 & redPW>65 & greenPW<95 & greenPW>55 & bluePW<100 & bluePW>50){
    color = 1; // Red
    digitalWrite(SL,HIGH);
    Serial.println("MARRON");
    // myServo.write(servoPos);
  }


if(redPW<65 & redPW>25 & greenPW<130 & greenPW>85 & bluePW<135 & bluePW>100){
    color = 1; // Red
    digitalWrite(SL,HIGH);
    Serial.println("Orange");
     //myServo.write(servoPos);
  }


if(redPW<65 & redPW>25 & greenPW<130 & greenPW>85 & bluePW<135 & bluePW>100){
    color = 1; // Red
    digitalWrite(SL,HIGH);
    Serial.println("Vert");
     //myServo.write(servoPos);
  }


 
delay(200);
digitalWrite(SL,LOW);
  
color=0;

  

//remise à 0 des servo
     // myServo.write(servoPos2);
     // myServo2.write(servoPos2);





}








// Function to read Red Pulse Widths
int getRedPW() {

  // Set sensor to read Red only
  digitalWrite(S2,LOW);
  digitalWrite(S3,LOW);
  // Define integer to represent Pulse Width
  int PW;
  // Read the output Pulse Width
  PW = pulseIn(sensorOut, LOW);
 //PW = map(PW, 25,70,255,0);
  // Return the value
  return PW;

}

// Function to read Green Pulse Widths
int getGreenPW() {

  // Set sensor to read Green only
  digitalWrite(S2,HIGH);
  digitalWrite(S3,HIGH);
  // Define integer to represent Pulse Width
  int PW;
  // Read the output Pulse Width
  PW = pulseIn(sensorOut, LOW);
   //PW = map(PW, 25,70,255,0);
  // Return the value
  return PW;

}

// Function to read Blue Pulse Widths
int getBluePW() {

  // Set sensor to read Blue only
  digitalWrite(S2,LOW);
  digitalWrite(S3,HIGH);
  // Define integer to represent Pulse Width
  int PW;
  // Read the output Pulse Width
  PW = pulseIn(sensorOut, LOW);
   //PW = map(PW, 25,70,255,0);
  // Return the value
  return PW;






}

Merci pour votre aide

Bonjour,
Il manque des informations:

  • quel capteur de couleur utilises-tu?
  • conditions de mesure de la couleur (éclairage de la zone de mesure, comment est constitué la zone de mesure)?
  • as-tu fait des mesures préalables? Le fait de trouver les mêmes paramètres pour détecter vert et orange semble assez surprenant.

C'est une question d'Intelligence Artificielle (pattern matching plus précisément)
Vaste sujet...

Déjà, le test est pareil pour vert et orange.
Ensuite, voila les gammes de décision des capteurs (sauf erreur) :

On ne connait pas le capteur donc difficile de juger. Mais la détection du rouge se fait si redPW est très inférieure aux autres valeurs. Ca devrait être similaire pour le bleu et le vert.

Ensuite, le bleu ciel correspondrait au cas où redPW est supérieur aux deux autres (qui sont alors proches greenPW ~ bluePW << redPW) et le orange serait le cas où le bleu serait très faible par rapport aux autres bluePW << (redPW, greenPW). Je pense qu'il est difficile de discerner un marron d'un orange.

Pour avoir une idée des composantes RGB d'une couleur : colorpicker

Je pense qu'il faudrait décider non pas sur les valeurs absolues données par le capteur mais sur leurs ratios :

  1. bluePW / redPW
  2. redPW / greenPW
  3. greenPW / bluePW

Tu peux aussi obtenir bluePW / greenPW en calculant 1*2.

Au regard des valeurs, je pense qu'il doit y avoir une mauvaise interprétation du codage des couleurs.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.