欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

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

程序员文章站 2022-03-27 21:55:11
白平衡系数计算程序:/********************************* 功能:用于白平衡系数的整定和物料颜色检测调试 输出: RED_COE:红色白平衡系数 GREEN_COE:绿色白平衡系数 BLUE_COE:蓝色白平衡系数 r_convert:红色转换值 g_convert:绿色转换值 b_convert:蓝色转换值**********************************///颜色...

白平衡系数计算程序:

/*********************************
  功能:用于白平衡系数的整定和物料颜色检测调试
  输出:
      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()<nowtime); //检测0.2秒
    rcount=rcount+color_count;
    detachInterrupt(2);//关中断
    

    //绿色脉冲
    color_count=0;
    digitalWrite(S2,HIGH);//开启绿色滤波器
    digitalWrite(S3,HIGH);
    attachInterrupt(digitalPinToInterrupt(OUT),Color_Count,RISING); //开中断
    nowtime=millis()+200;
    while(millis()<nowtime); //检测0.2秒
    gcount=gcount+color_count;
    detachInterrupt(2);//关中断


    //蓝色脉冲
    color_count=0;
    digitalWrite(S2,LOW);//开启蓝色滤波器
    digitalWrite(S3,HIGH);
    attachInterrupt(digitalPinToInterrupt(OUT),Color_Count,RISING); //开中断
    nowtime=millis()+200;
    while(millis()<nowtime); //检测0.2秒
    bcount=bcount+color_count;
    detachInterrupt(2);//关中断
  }

    
    //计算白平衡系数
    rcount=rcount/3;//取脉冲平均值
    gcount=gcount/3;
    bcount=bcount/3;
    r_coe=255/rcount;//将白色的三色脉冲压缩到255区间。
    g_coe=255/gcount;
    b_coe=255/bcount;

    //输出白平衡系数
    Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    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()<nowtime); //检测0.2秒
    rcount=rcount+color_count;
    detachInterrupt(digitalPinToInterrupt(OUT));//关中断
    /*
    Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    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()<nowtime); //检测0.2秒
    gcount=gcount+color_count;
    detachInterrupt(digitalPinToInterrupt(OUT));//关中断
    /*
    Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    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()<nowtime); //检测0.2秒
    bcount=bcount+color_count;
    detachInterrupt(digitalPinToInterrupt(OUT));//关中断
    /*
    Serial.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
    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++;
}

本文地址:https://blog.csdn.net/C1664510416/article/details/107966754