当前位置: 移动技术网 > 科技>人工智能>物联网 > Arduino 白平衡系数计算程序与颜色识别程序(五色:黑白蓝绿红)

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

2020年08月14日  | 移动技术网科技  | 我要评论
白平衡系数计算程序:/********************************* 功能:用于白平衡系数的整定和物料颜色检测调试 输出: 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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网