找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2136|回复: 0
打印 上一主题 下一主题
收起左侧

用pixy摄像头搭个自动跟踪的云台(转贴)

[复制链接]
跳转到指定楼层
楼主
ID:836574 发表于 2020-10-30 11:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
买了个pixy,才知道原来网上资源那么少,而且开发者也好像不接着开发了,真是伤心。
以下代码是arduino里面写的,用两个舵机搭了一个云台,然后pixy摄像头设别一个颜色的物体,然后跟着那个物体动的程序。
#include <SPI.h>  
#include <Pixy.h>
#include <Servo.h>         //库函数
#define P 0.02             //比例
#define D 0.05                //微分
#define A 10                //定位精度
int X_CENTER=160;   //定义屏幕中点
int Y_CENTER=100;
int panError, tiltError,pre_panError, pre_tiltError,dpanError,dtiltError;  //水平和垂直误差
int j;
Servo myservo1;   //定义舵机
Servo myservo2;

Pixy pixy;    //调用pixy        
int pre_x=90,pre_y=90;  //定义舵机初始角度

void printall()  //输出各个参数
{
           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");  //初始设定
}

void loop()
{  
   static int i = 0;
   uint16_t blocks;
   char buf[32];
   blocks = pixy.getBlocks(); //物体数量
  if(blocks) //有读取到物体就触发
  {
            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)        //防止超调
  {
            //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++)               //对误差值做出的动作
       {   
       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();
}


}








分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表