買了個(gè)pixy,才知道原來網(wǎng)上資源那么少,而且開發(fā)者也好像不接著開發(fā)了,真是傷心。
以下代碼是arduino里面寫的,用兩個(gè)舵機(jī)搭了一個(gè)云臺(tái),然后pixy攝像頭設(shè)別一個(gè)顏色的物體,然后跟著那個(gè)物體動(dòng)的程序。
#include <SPI.h>
#include <Pixy.h>
#include <Servo.h> //庫函數(shù)
#define P 0.02 //比例
#define D 0.05 //微分
#define A 10 //定位精度
int X_CENTER=160; //定義屏幕中點(diǎn)
int Y_CENTER=100;
int panError, tiltError,pre_panError, pre_tiltError,dpanError,dtiltError; //水平和垂直誤差
int j;
Servo myservo1; //定義舵機(jī)
Servo myservo2;
Pixy pixy; //調(diào)用pixy
int pre_x=90,pre_y=90; //定義舵機(jī)初始角度
void printall() //輸出各個(gè)參數(shù)
{
Serial.print("x ");
Serial.print("y ");
Serial.print("panError ");
Serial.print("tiltError ");
Serial.print("pre_x ");
Serial.print("pre_y ");
Serial.print("Error ");
Serial.println(" ");
Serial.print(pixy.blocks[0].x);
Serial.print(" ");
Serial.print(pixy.blocks[0].y);
Serial.print(" ");
Serial.print(panError);
Serial.print(" ");
Serial.print(tiltError);
Serial.print(" ");
Serial.print(pre_x);
Serial.print(" ");
Serial.println(pre_y);
}
void setup()
{
myservo1.attach(3);
myservo2.attach(5);
Serial.begin(9600);
Serial.print("Starting...\n"); //初始設(shè)定
}
void loop()
{
static int i = 0;
uint16_t blocks;
char buf[32];
blocks = pixy.getBlocks(); //物體數(shù)量
if(blocks) //有讀取到物體就觸發(fā)
{
panError=X_CENTER-pixy.blocks[0].x;
tiltError=Y_CENTER-pixy.blocks[0].y;
dpanError=panError-pre_panError;
dtiltError=tiltError-pre_tiltError;
if(pre_x>=0&&pre_x<=180&&pre_y>=0&&pre_y<=180) //防止超調(diào)
{
//Serial.println("a");
if(panError>=A||panError<=-A||tiltError>=A||tiltError<=-A) //定位精度
{
//偏差量賦值
pre_x=pre_x+P*panError+D*dpanError;
pre_y=pre_y+P*tiltError+D*dtiltError;
for(i=0;i<1;i++) //對(duì)誤差值做出的動(dòng)作
{
myservo1.write(pre_x);
myservo2.write(pre_y);
}
pre_panError=panError;
pre_tiltError=tiltError;
}
}
else
{
pre_x=90;
pre_y=90;
}
}
j=j+1;
if(j%10000==0)
{
printall();
}
}
|