Rocky Rover:机器人视觉系统 PixyCam 和 Arduino 101
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 4 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
应用和在线服务
| ||||
|
关于这个项目
带有 PixyCam 的基于英特尔 Arduino 101 的 Rover!
Hackster Live 活动很棒!英特尔赞助了我们的 Hackster Dallas 活动,并向我们发送了一些英特尔 Arduino 101 来建造流浪者。感谢英特尔,感谢 Arduino。这是我为这次活动建造的漫游者。
我按照 Johnathan Hottell 的教程构建了这个设备。他制作了一些视频来构建 BLE Rover。而且很容易上手!在这里查看。这是 Johnathan Hottell 的视频。
我的 Rover 有 4 个电机,所以我遵循了这个。
建造漫游者后,将其与 Blynk 连接起来。我决定改进构建并添加一个 PixyCam。我将电池座移到前面,这样我就可以安装云台相机。
PixyCam
PixyCam 让机器人视觉变得简单。 Pixy 是一款用于 DIY 机器人的快速视觉传感器,只需按一下按钮,就可以轻松教 Pixy 一个物体。它能够同时跟踪数百个对象,并且只提供它正在跟踪的数据。
我决定追踪一个橙色南瓜。
我很惊讶让它变得如此容易。这是将 PixyCam 连接到 Arduino 的说明链接。单击此处获取平移/倾斜装置的组装说明。我很高兴它有很多图片,很容易理解。我按照设置和构建说明,如何与 Arduino 集成。我测试了他们的例子。
以下是我对 API 的了解。
PixyCam Arduino API
将 Pixy 与 Arduino 结合使用非常简单。您只需包含 SPI 和 Pixy 标头:
#include #include
并通过将这个小家伙放在你的 setup()
之外来创建一个 Pixy 的全局实例 和 loop()
功能:
小精灵小精灵;
Arduino 库中最重要的方法是 getBlocks()
,返回 Pixy 检测到的对象数量。然后你可以查看 pixy.blocks[]
关于每个检测到的对象的信息的数组(每个检测到的对象一个数组成员。)每个数组成员 (i
) 包含以下字段:
pixy.blocks[i].signature
检测对象的签名编号(正常签名为1-7)
pixy.blocks[i].x
被检测物体中心的x位置(0到319)
pixy.blocks[i].y
被检测物体中心的y位置(0到199)
pixy.blocks[i].width
检测到的物体的宽度(1到320)
pixy.blocks[i].height
检测物体的高度(1到200)
pixy.blocks[i].angle
如果检测到的物体是颜色代码,则物体检测到物体的角度。
pixy.blocks[i].print()
将检测到的对象信息打印到串口的成员函数
所以用你的 Arduino 与 Pixy 交谈很简单!有关 Arduino 库和 API 的更多信息,请转到此处。这是用于 Rover 的代码。我修改了原始 BLE 代码并添加了对象跟踪。设置过程中:
void setup() { ..... pixy.init(); ....}
主循环看起来像这样:
void loop() { ...... // 读取像素数据并获取块 static int i =0;国际 j; uint16_t 块;字符缓冲区[32]; int32_t panError,tiltError;块 =pixy.getBlocks(); //如果有块 if (blocks) { panError =X_CENTER-pixy.blocks[0].x;倾斜错误 =pixy.blocks[0].y-Y_CENTER; panLoop.updatePan(panError);倾斜循环。更新(倾斜错误); pixy.setServos(panLoop.m_pos,tiltLoop.m_pos);我++; // 框架会卡住 Arduino if (i%10==0) { int trackedBlock =0; sprintf(buf, "检测到 %d:\n", 块); Serial.print(buf);长最大尺寸 =0; for (j=0; j maxSize) { trackedBlock =j;最大尺寸 =新尺寸; } } int32_t followError =RCS_CENTER_POS - panLoop.m_pos; // 大小是对象的面积。 // 我们保持最后 8 个的运行平均值。 size +=pixy.blocks[trackedBlock].width * pixy.blocks[trackedBlock].height;尺寸 -=尺寸>> 3; int forwardSpeed =约束(400 - (size/256), -100, 400); int32_t 差分 =(followError + (followError * forwardSpeed))>>8; int leftSpeed =约束(forwardSpeed + 差分,-400, 400); int rightSpeed =约束(forwardSpeed - 差分,-400, 400); motor1->setSpeed(leftSpeed); //左马达3->setSpeed(leftSpeed); motor2->setSpeed(rightSpeed); //左马达4->setSpeed(rightSpeed);双倍宽度 =pixy.blocks[trackedBlock].width; if (width <=5) { } else if (width <20 &&!running) { Serial.println("running");电机1->运行(前进);电机3->运行(前进);电机2->运行(前进);电机4->运行(前进);运行 =真; } else if (width> 80 &&!running) { Serial.println("running");电机1->运行(向后);电机3->运行(向后);电机2->运行(向后);电机4->运行(向后);运行 =真; } else if (width>=20 &&width <=80 &&running) { motor1->setSpeed(128);电机2->设置速度(128); motor3->setSpeed(128); motor4->setSpeed(128);电机2->运行(释放);电机4->运行(释放);电机1->运行(释放);电机3->运行(释放);运行 =假; } } } }
为了在没有 PixyCam 控制的情况下运行 Blynk,请戴上镜头盖。它将确保 PixyCam 不会干扰控制机器人。如果这个项目让你对在Arduino编程或在下一个项目中使用PixyCam感兴趣,请点击“尊重项目”按钮并关注我。
欢迎提问。
代码
岩石漫游者
制造工艺