这篇文章来源于DevicePlus.com英语网站的翻译稿。
该项目的目标是向您介绍CMUcam5 Pixy,并展示如何在您自己DIY的项目中实现相机功能,您会发现即使对于一个复杂的机电系统(比如轮式自主机器人)来说,这也是非常简单易执行的操作。Pixy是一种灵活、紧凑、可调节且易于设置的相机传感器,能够检测并传递某些类型对象的信息。我们将介绍有关相机的基础知识,并了解在Pixy和Arduino之间进行通信的一般方法。
Arduino Uno (您可以使用任何 Arduino)
CMUcam5 Pixy 相机
伺服电机 (S06NF)
一小块木头(用来将相机安装到伺服上, 我将只使用螺丝安装)
线缆 (用于相机USB MINI 以及Uno USB B)
用于伺服的外接5V电源(警告!如果您将伺服连接到您的Arduino上,并通过USB供电,您的 Arduino将会被烧坏)。
软件
Arduino IDE 1.6.9
PixyMon 软件
用于Arduino的PixyMon库
图1:CMUcam5 Pixy相机
CMUcam5 Pixy是一款小型、易于操作、成本低且开源的相机。它拥有独立的处理器,每秒可对探测到的信息进行50次输出。它还可以与Arduino、Raspberry Pi等连接。CMUcam5 Pixy使用非常常见的接口,例如SPI、12C、UART以及USB,并且具有一个自定义程序,可让您连接到您的设备上,点击此处可以免费下载。
设置Pixy
点击此处下载软件PixyMon并安装。安装时,请通过USB连接Pixy,然后检查RGB Led灯是否亮起。
打开PixyMon,并确保Pixy是通过USB进行连接的。如果所有连接正确,它将输出相机所“看到”的内容。例如,我放置了一个紫色的盖子作为测试对象,来检查Pixy相机的输出。
图2:Pixy Raw输出图像
进入“Action”子菜单,并点击“Set Signature 1”,视频将会停滞,您可以选择想要用相机检测的颜色/对象。
标记好颜色/对象后,视频将会开始播放,并且相机传感器将会对颜色/对象进行检测,如图3所示。在同一时间,您最多可以设置7个想要检测的对象/颜色。如果您进行了正确标记,并且设置了视野范围,就可以实现对多个对象/颜色的检测。
图3:Pixy检测下的视图
如果想要清除预设标记,您可以点击Action -> Clear All Signatures,直接清除所有标记 ,或者选择Clear Signature 来对标记一一清除(在控制页面输入标记编号)。
点击Settings -> Signature 1进行调整,您可以修改Pixy视野尺寸的大小。
其他设置(File -> Configure)
通过更改相机亮度,您可以在黑暗环境中进行信息探测。
在 Camera 选项中,您可以调整白平衡,这非常有用。
使用 Action -> Default 程序,您将只看到所检测到的颜色,没有视频输出。
有一个专用于在您的Arduino上使用Pixy的自定义库。我使用的是Arduino Uno,但是您可以使用任何版本。这个库非常有用,不仅为初学者提供了简单的示例,也为专家提供了绝佳的开发平台。
首先,我们要设置一个检测对象,类似于我们之前在设置相机时所进行的操作。
点击此处下载Arduino库(在“Arduino libraries and examples ”文件夹下)。[https://www.cmucam.org/attachments/download/1157/arduino_pixy-0.1.7.zip]。这将实现您的Arduino和Pixy相机之间的通信。然后,将其添加到Arduino IDE(Sketch -> Include Library -> Add .zip Library)。
点击Example->Pixy->hello_world,打开一个名称为hello_world的简单示例。
将其上传到您的开发板上,并打开终端(Tools -> Serial Monitor)。
此时,您将看到一条信息,显示“Starting… ”,然后将显示有关检测到的对象的信息。
hello_world代码释义
在 setup() 函数中,对编号和pixy进行初始化和相关设置。
loop() 函数包含几个变量,这些变量用于打印以及从pixy获取模块。使用 pixy.getBlocks() 函数,我们可以获取检测到的对象。if (i%50==0) 代码可以用来设置我们想要获取信息的FPS。如果我们想要每秒钟获取一条信息,就要写 %1 而不是 %50。
/* * explaining the (((pixy.blocks[j].x)/2)+10)-60 * with pixy.blocks[j].x we get the x position of the object detected * we divide it because the max value it can read is 320 * I did the + 10 for small adjustments * the -60 is used for rotating away from the object */ #include #include Servo myservo; // create servo object to control a servo Pixy pixy; // create pixy object for controlling the pixy camera // function for testing the servo void test_camera(){ myservo.write(0); delay(1000); myservo.write(90); delay(1000); myservo.write(180); delay(1000); myservo.write(90); // get the camera centered } void setup() { //Serial.begin(9600); // initialize serial myservo.attach(9); // attaches the servo on pin 9 to the servo object test_camera(); // executing testing for the servo pixy.init(); // initing the pixy camera } void loop() { //variables static int i = 0; int j; uint16_t blocks; char buf[32]; int32_t xpos; // grabing the blocks blocks = pixy.getBlocks(); // If there are detect blocks if (blocks) { i++; // we are using 50FPS if (i%50==0) { sprintf(buf, "Detected %d:n", blocks); for (j=0; j180 || ((((pixy.blocks[j].x)/2)+10)-60) < 0 ) { myservo.write(90); // if at min or max go to the middle } else{ // if there is no problem with min and max myservo.write((((pixy.blocks[j].x)/2)+10)-60); } } } } }
sprintf(buf, “Detected %d:n”, blocks); 输出由ID检测到的当前对象,并将必要的数据放入缓冲区。在for循环中,我们将会获得所有类型的信息,包括检测对象、宽度、高度、x、y以及标记信息。
通过伺服进行控制
现在,Pixy已经成功连接到了Arduino,我将做一个简单的实验,将Pixy连接到伺服,并且在相机“看到“某种类型的颜色/对象时让伺服控制离开。
在本实验中,我将把Pixy的检测对象设置为圆形紫色容器,然后进行编程,这样一来,每当这种容器进入相机的视野,伺服就会控制离开这个物体。
装置结构:
图4:已完成的装置结构
我使用的是S06NF伺服,并且用小螺丝钉将伺服连接到相机上,如图5所示。
图5:相机与伺服电机连接
对于硬件部分,仅进行简单的接线。将SPI线缆连接到相机上,将伺服与Arduino连接。我使用引脚9来控制伺服。
图6:接线图
警告!
不要忘记连接GND。如果您没有将电源、伺服和Arduino GND连接在一起,伺服器将会奔溃!
这里,我使用的是用于5V电源的旧型适配器。
总结
在本教程中,我们介绍了PixyMon相机的基础知识,并且开发了一个简单的伺服驱动应用。我们创建了一个会离开检测对象而不是对象追踪的系统。在第二部分中,我们会继续深入拓展这个理念,开发出一种具有多个伺服的交互系统,通过将一个球作为对象,实现对桌子方位的控制。
如果您有任何意见或疑问,请在Google +上留言,并关注我们的动态。
继续阅读本文的第二部分 >
审核编辑黄宇
-
电源
+关注
关注
184文章
17697浏览量
249920 -
传感器
+关注
关注
2550文章
51008浏览量
752972 -
Arduino
+关注
关注
188文章
6468浏览量
186922
发布评论请先 登录
相关推荐
评论