weixin_53936929
weixin_53936929
2021-01-22 15:59

请问线性ccd镜头返回值共128位,其中后64位数值非常大而且不随镜头所照黑白而变化是什么原因

  • android-studio

用的arduino mega2560板,线性ccd镜头返回值后64位的值都有将近1000

#include <Wire.h>
#define L        55                                     //设定的白线卡死位--左
#define R        75                                     //设定的白线卡死位--右
#define CCD_SI   3
#define CCD_CLK  2
char Re[100];
char temp_val;   
int i=0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  //analogReference(INTERNAL1V1);
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(A0,INPUT);
}
void CCD(int piexl[129])
{
    int exp_time = 5000;
    int i = 0;
     digitalWrite(CCD_SI,HIGH);                         //SI拉高电平
     digitalWrite(CCD_CLK,HIGH);                        //时钟高电平
     digitalWrite(CCD_SI,LOW);                          //SI低电平
     digitalWrite(CCD_CLK,LOW);                         //时钟低电平
    for(i=0;i<128;i++)
     {
         digitalWrite(CCD_CLK,HIGH);
         digitalWrite(CCD_CLK,LOW);
     }                                                  //从这里结束曝光
     delayMicroseconds(exp_time);                       //曝光时间
     digitalWrite(CCD_SI,HIGH);
     digitalWrite(CCD_CLK,HIGH);
     digitalWrite(CCD_SI,LOW);
     digitalWrite(CCD_CLK,LOW);
    for(i=0;i<128;i++)
    {
        digitalWrite(CCD_CLK,HIGH);
        piexl[i]=analogRead(A0);
       if(Serial.available()>0)   //如果串口有接收到数据
  {  
    temp_val=Serial.read();  //将接收到的数据保存到temp_val
  //Serial.println(temp_val);  //在串口监视器显示接收的数据值
  }
  if(temp_val=='o')  //如果接收到了”o"
  {
    Serial.end();
  }
  else
  {
    Serial.print("piexl ");
    Serial.print(i);
    Serial.print("==");
    Serial.println(piexl[i]); 
    delay(50); 
    temp_val=' ';
     digitalWrite(CCD_CLK,LOW);
  }
  
              
      
    digitalWrite(CCD_CLK,HIGH);
    digitalWrite(CCD_CLK,LOW);

}}

void datax(int pixel[128],byte database[129])           //数值处理
{
    int t = 0;
    double k = 4;
    double temp;
    float exda;
    for (t = 0;t <128 ;t++)
    {
        temp = pixel[t];
        exda = temp /k;
        database[t] = exda;
    }
    if (t == 128)
        database[t] =0xFF;
    
//    charge(&database[0]);    
                                                //  可视化程序
  //  for(int i = 0; i<129; i++)
  //  {
  //      if(i<128)
  //          Serial.write(database[i]);
  //      if (i == 128)
  //         Serial.write(0xFF);
  // }

 
}

int charge(byte piexl[129])                             //将数组二值化,分界值 = 50*4(缩小一些余量)
{
    for(int i=0;i<128;i++)
    {
        if(piexl[i]>60)                                //50需要修改阈值!!!!!!!!!!!!!!!!!!!!!!!!!
            piexl[i] = 1;
        else
            piexl[i] = 0;
    }
}

int first_white(byte piexl[128])                        //寻找第一个白色信号
{
    int a = 0;
    for(int i = 0;i<128;i++)
    {
        if(piexl[i]==1&&piexl[i+3]==1)
        {
            a = i;
            return a;
            break;
        }
    }
}

int last_white(byte piexl[128])                         //寻找最后一个白色信号
{
    int a = 0;
    for(int i = 127;i > 0;i--)
    {
        if(piexl[i]==1&&piexl[i-3]==1)
        {
            a = i;
            //Serial.println(a);
            return a;
            break;
        }
    }
}

int backdata(byte backdate[128])                       //中值处理函数
{
  charge(&backdate[0]);
  int first = first_white(&backdate[0]);
  int last = last_white(&backdate[0]);
  int temp;
  temp = (last) - (first);
  //Serial.println(last);
  if(temp<50)
  {                                                     //30为线宽需要修改!!!!!!!!!!!!!!!!!!!!
      temp = temp/2 + first;
      //>0偏右左转
      return 8;
  }
  if(temp>70)
  {
      return 1;
  }
  
  }                                                     //45为直角实测线宽,稍微小一点!!!!!!!!!!!!!!

int ccdinit()
{
    int temp=0;
    int piexl[129];
    byte backdate[129];
    CCD(&piexl[0]);
    datax(&piexl[0],&backdate[0]);
    temp = backdata(&backdate[0]);
    return temp;
}


void loop() {
  // put your main code here, to run repeatedly:
 int actual;                                   //actual为白色区域中点的像素位置,可用来确定运行方向。若actual==907,则判断为遇到直角弯
 actual = ccdinit();
 //char string[100];  
// itoa(actual, string, 100);  
 //Serial.println(actual);
 //Serial.println();
 delay(10);
 
}
  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

0条回答

为你推荐

换一换