Arduino 白平衡系数计算程序与颜色识别程序(五色:黑白蓝绿红)

白平衡系数计算程序:

/*********************************
  功能:用于白平衡系数的整定和物料颜色检测调试
  输出:
      RED_COE:红色白平衡系数
      GREEN_COE:绿色白平衡系数
      BLUE_COE:蓝色白平衡系数
      r_convert:红色转换值
      g_convert:绿色转换值
      b_convert:蓝色转换值

**********************************/

//颜色识别传感器
#define S0 14
#define S1 15
#define S2 16
#define S3 17
#define OUT 21
//#define OE 3

volatile float color_count=0; //脉冲计数器 (中断函数变量声明为volatile型)

//颜色返回值定义
#define GREEN_COLOR 1
#define WHITE_COLOR 2
#define RED_COLOR   3
#define BLACK_COLOR 4
#define BLUE_COLOR  5

//初始化函数
void setup() {
  // put your setup code here, to run once:
  //颜色传感器初始化
  pinMode(S0,OUTPUT);
  pinMode(S1,OUTPUT);
  pinMode(S2,OUTPUT);
  pinMode(S3,OUTPUT);
  pinMode(OUT,INPUT);
  //缩放输出率为20%
  digitalWrite(S0,HIGH);
  digitalWrite(S1,LOW);
  //不选择滤波器
  digitalWrite(S2,HIGH);
  digitalWrite(S3,LOW),
  
  Serial.begin(9600);//串口输出初始化
}

void loop(){
    Color_Test();
    delay(2000);//等待串口输出

}




/**************************************************************************
  函数功能:白平衡系数计算
  入口参数:无
  返回类型:int
  输出:串口输出白平衡系数
***************************************************************************/
int Color_Test(){
  float rcount=0,gcount=0,bcount=0;  //脉冲计数
  float r_coe=0,g_coe=0,b_coe=0; //白平衡系数
  unsigned long nowtime=0;
  
  for(int i=0;i<3;i++){  //检测三次降低偶然误差
    
    //红色脉冲
    color_count=0;
    /***************************************
      LOW:低电平触发;
      CHANGE:电平变化触发;
      RISING :上升沿触发(由LOW变为HIGH);
      FALLING:下降沿触发(由HIGH变为LOW); 
      HIGH:高电平触发(该中断模式仅适用于Arduino due);
     *****************************************/
    digitalWrite(S2,LOW);//开启红色滤波器
    digitalWrite(S3,LOW);
    attachInterrupt(digitalPinToInterrupt(OUT),Color_Count,RISING); //开中断
    nowtime=millis()+200;
    while(millis()>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    Serial.print("RED_COE:");
    Serial.println(r_coe);
    Serial.print("GREEN_COE:");
    Serial.println(g_coe);
    Serial.print("BLUE_COE:");
    Serial.println(b_coe);
    Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    
}


/**************************************************************************
  函数功能:脉冲计数(中断函数)
  入口参数:无
  返回类型:void
  返回  值:无
**************************************************************************/
void Color_Count(){
  color_count++;
}

 

颜色识别程序:

/*********************************
  功能:用于白平衡系数的整定和物料颜色检测调试
  输出:
      RED_COE:红色白平衡系数
      GREEN_COE:绿色白平衡系数
      BLUE_COE:蓝色白平衡系数
      r_convert:红色转换值
      g_convert:绿色转换值
      b_convert:蓝色转换值

**********************************/

//颜色识别传感器
#define S0 14
#define S1 15
#define S2 16
#define S3 17
#define OUT 21
//#define OE 3

volatile float color_count=0; //脉冲计数器 (中断函数变量声明为volatile型)
float r_coe=0.11,g_coe=0.11,b_coe=0.08; //白平衡系数(需要用白平衡系数计算小程序事先计算后填入)

//颜色返回值定义
#define GREEN_COLOR 1
#define WHITE_COLOR 2
#define RED_COLOR   3
#define BLACK_COLOR 4
#define BLUE_COLOR  5

//初始化函数
void setup() {
  // put your setup code here, to run once:
  //颜色传感器初始化
  pinMode(S0,OUTPUT);
  pinMode(S1,OUTPUT);
  pinMode(S2,OUTPUT);
  pinMode(S3,OUTPUT);
  pinMode(OUT,INPUT);
  //缩放输出率为20%
  digitalWrite(S0,HIGH);
  digitalWrite(S1,LOW);
  //不选择滤波器
  digitalWrite(S2,HIGH);
  digitalWrite(S3,LOW),
  
  Serial.begin(9600);//串口输出初始化
}


void loop(){
    switch(Color_Test()){
    case GREEN_COLOR:
                    Serial.println("GREEN");
                    break;
    case WHITE_COLOR:
                    Serial.println("WHITE");
                    break;
    case RED_COLOR:
                    Serial.println("RED");
                    break;
    case BLACK_COLOR:
                    Serial.println("BLACK");
                    break;
    case BLUE_COLOR:
                    Serial.println("BLUE");
                    break;
    default:break;
    }
}




/***********************************(调试完成)
  函数功能:物料颜色检测
  入口参数:无
  返回类型:int
  返回  值:物料颜色检测值
  注意点:
       需要事先用白平衡系数计算程序计算出白平衡系数,填入上方的白平衡系数变量中。
************************************/
int Color_Test(){
  float rcount=0,gcount=0,bcount=0;  //脉冲计数
  float r_convert=0,g_convert=0,b_convert=0; //校准结果
  unsigned long nowtime=0;
  for(int i=0;i<3;i++){
    
    //红色脉冲
    color_count=0;
    digitalWrite(S2,LOW);//开启红色滤波器
    digitalWrite(S3,LOW);
    /*******************************
      LOW:低电平触发;
      CHANGE:电平变化触发;
      RISING :上升沿触发(由LOW变为HIGH);
      FALLING:下降沿触发(由HIGH变为LOW); 
      HIGH:高电平触发(该中断模式仅适用于Arduino due);
     ********************************/
    attachInterrupt(digitalPinToInterrupt(OUT),Color_Count,RISING); //开中断
    nowtime=millis()+200;
    while(millis()>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    Serial.print("RED:");
    Serial.println(color_count);
    */
    
    //绿色脉冲
    color_count=0;
    digitalWrite(S2,HIGH);//开启绿色滤波器
    digitalWrite(S3,HIGH);
    attachInterrupt(digitalPinToInterrupt(OUT),Color_Count,RISING); //开中断
    nowtime=millis()+200;
    while(millis()>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    Serial.print("GREEN:");
    Serial.println(color_count);
    */
    
    //蓝色脉冲
    color_count=0;
    digitalWrite(S2,LOW);//开启蓝色滤波器
    digitalWrite(S3,HIGH);
    attachInterrupt(digitalPinToInterrupt(OUT),Color_Count,RISING); //开中断
    nowtime=millis()+200;
    while(millis()>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    Serial.print("BLUE:");
    Serial.println(color_count);
    */
  }

    //用白平衡系数转换脉冲值
    r_convert=r_coe*(rcount/3);
    g_convert=g_coe*(gcount/3);
    b_convert=b_coe*(bcount/3);
    /*
    //输出物料颜色检测值
    Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    Serial.print("RED:");
    Serial.println(r_convert);
    Serial.print("GREEN:");
    Serial.println(g_convert);
    Serial.print("BLUE:");
    Serial.println(b_convert);
    Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    */

    

    //这部分的判断要自己实验找出白色和黑色的分界点

    if((r_convert>180)&&(g_convert>180)&&(b_convert>180)){
      
      //三个值都大于180是白色
      return WHITE_COLOR;
      
    }else if((r_convert<80)&&(g_convert<80)&&(b_convert<80)){

      //三个值都小于80是黑色
      return BLACK_COLOR;
      
    }else if((r_convert > g_convert)&&(r_convert > b_convert)){
      
      //红色值最大就是红色
      return RED_COLOR;
      
    }else if((b_convert > r_convert)&&(b_convert > g_convert)){

      //蓝色值最大就是蓝色
      return BLUE_COLOR;
      
    }else{
      
      //一共五种,剩下就是绿色
      return GREEN_COLOR;
      
    }
}





/**************************************************************************
  函数功能:脉冲计数(中断函数)
  入口参数:无
  返回类型:void
  返回  值:无
**************************************************************************/
void Color_Count(){
  color_count++;
}

 

你可能感兴趣的:(机器人,经验分享)