用的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);
}