运动跟随电动相机底座
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 5 | ||||
| × | 5 | ||||
| × | 5 | ||||
| × | 1 |
关于这个项目
我想出了这个想法来解决我的家庭安全摄像头遇到的问题。我有一个特定的摄像头,它位于两个房间之间的墙上,但是除非您登录摄像头软件手动旋转它,否则一次只能看到一个房间。如果有人走进对面的房间,相机永远不会记录下这个动作。为了解决这个问题,我决定创建一个运动检测/跟踪底座,我可以在上面安装相机,这样它就会自动重新定位到检测到运动的任何地方。
工作原理:
该设备使用 5 个 PIR 运动传感器来检测 180º 半径内的任何运动。一旦检测到运动,伺服电机就会旋转相机底座以指向该方向。底座内部还有 5 个 LED“状态”灯,只要其中一个 PIR 传感器检测到运动,它们就会亮起。
看到它在行动!
接线:
这个项目的接线简单明了,但是,由于除了伺服电机之外,所有东西都有 5 个,因此接线的数量开始增加很多。查看本页底部的电路图和原理图了解更多详细信息,但这里是基础知识。
LED 状态灯...
我使用了一个迷你面包板将 LED 灯与电路的其余部分分开,以便在需要时更容易拆卸。每个 LED 响应不同的 PIR 传感器,并会在检测到运动时点亮。只需将每个 LED 连接到 Arduino 上单独的数字输入 (9-13),并通过 220 欧姆电阻将它们接地。
被动红外运动传感器...
我在这个项目中使用了 HC-SR501 型 PIR 传感器。每个 PIR 传感器都需要连接到 Arduino 上的数字输入 (2-6)、5V 电源和地。如果您使用与我相同的 PIR 传感器,您可以(小心地)打开盖子并在下面标记销钉。您将在稍后上传的代码中将每个 PIR 传感器连接到相应的 LED 灯。
伺服电机...
伺服电机安装在相机所在的支架上,并旋转相机以与主动 PIR 传感器对齐。使用电机的引脚分配,将一个引脚连接到电源,另一个引脚连接到 Arduino 数字输入 7,最后一个引脚接地。在为 Arduino 供电之前,请确保在电机的电源和地之间连接一个 100μF 的电容器,以帮助保护电路板免受电机移动时发生的电涌的影响。
关于伺服电机需要注意的一件事是,并非所有电机都具有完整的 180º 运动范围。经过一些测试,我发现我的只能移动大约 160º,因此如果您的电机不同,请相应地修改代码。当在 PIR 传感器的最后一个位置发出摩擦声时,您就会知道电机试图移动得太远。
施工:
我使用旧的 Memorex cd 贴标机制作伺服外壳和放置相机的表面。我没有拍“之前”的照片,所以下图是我在网上能找到的唯一一张照片。后片是一个扁平的、坚固的塑料圆盘,最终脱落成一体(经过我的螺丝刀的一点说服),因此非常适合放置我的相机。它还配备了 4 个可拆卸橡胶“支脚”,有助于在电机移动时为相机提供更多抓地力。
我把钳子拿到中间的黑色部分把它取下来……我的意思是,在它消失之前,把它分成尽可能多的部分:) 接下来,我用我的 Dremel 在底座上钻了几个洞,然后用几个螺丝固定伺服电机。
最后,我用另一个螺丝将伺服电机连接到相机所在的部件上。我遇到了一个问题,相机的重量导致底座倾斜,所以我通过制作一个足够高的纸板圆柱体来解决这个问题,以便在电机和相机之间松散地安装。现在它仍然可以自由移动,但它的重量分布均匀,有更多的支撑。
这是安装 PIR 传感器并完成所有电路后的样子。您会注意到我使用了几个面包板来完成我的项目。这样做的原因是将它们安装在底座中变得非常容易,并且可以在稍后进行故障排除和扩展时挑选并选择要移除的。
图>为了完成这个项目,我将纸板的所有可见部分都喷成黑色,使其与上面的黑色支架看起来更加无缝。
这是涂装后的成品...
图> 图>
代码
- 主要代码
主要代码Arduino
PIR 传感器将在 Arduino 通电后校准 15 秒。建议您在此过程中离开房间,以便传感器在没有任何运动的情况下获得房间的真实图像。/******************** ******************************** 跟随电动相机底座的运动****** Lindsay Fox *** ****************************************************/ // 伺服电机#includeServo camServo; // 命名控制摄像头的伺服电机 baseint currentPIRposition =0; // 设置舵机当前角度// LED 状态灯int LEDpin[] ={9,10,11,12,13}; // LED 引脚数int currentLEDpin =9; // 当前 LED 引脚;从上面序列中的第一个开始// PIR sensorint PIRpin[] ={2,3,4,5,6}; // PIR 引脚编号int currentPIRpin =2; // 当前 PIR 引脚;从上面序列中的第一个开始int PIRprevState[] ={1,1,1,1,1}; // PIR 的前一个状态 (0 =LOW, 1 =HIGH)int PIRposition[] ={157,117.75,78.5,39.25,0}; // 为伺服电机分配角度(0-157 在 5 个 PIR 传感器之间平均分配)boolean PIRstatus; // 将 PIR 传感器的状态设置为 true 或 false///// SETUP /////////////////////////////// //////void setup() { Serial.begin(9600); camServo.attach(7); // 为 (int p =0; p <5; p++) 分配伺服引脚 { // 将所有 PIR 传感器设置为 INPUTS pinMode(PIRpin[p], INPUT); } // end 'p' for (int l =0; l <5; l++) { // 将所有 LED 设置为 OUTPUTS pinMode(LEDpin[l], OUTPUT); } // end 'l' for /////// CALIBRATE PIR SENSORS /////// Serial.print("Calibrating PIR Sensors "); for(int c =0; c <15; c++){ // 校准 PIR 传感器 15 秒(根据您的传感器从 10-60 秒变化)Serial.print(".");延迟(1000); // 等待 1 秒 } // Serial.println("PIR Sensors Ready"); 结束校准; camServo.write(78.5); // 将舵机移动到中心位置开始 } // 结束设置////// MAIN LOOP /////////////////////////// ///////void loop() { for (int PIR =0; PIR <5; PIR++) { // 为每个 PIR 传感器启动此循环 currentPIRpin =PIRpin[PIR]; // 将当前 PIR 引脚设置为“for”循环中的当前编号 currentLEDpin=LEDpin[PIR]; // 将当前 LED 引脚设置为“for”循环中的当前编号 PIRstatus =digitalRead(currentPIRpin); if (PIRstatus ==HIGH) { // 如果在当前 PIR 传感器上检测到运动 digitalWrite(currentLEDpin, HIGH); // 打开相应的 LED if(PIRprevState[PIR] ==0) { // 如果 PIR 传感器的先前状态为 LOW if (currentPIRposition !=currentPIRpin &&PIRprevState[PIR] ==0) { // 如果高 PIR 不同于当前位置 PIR 然后移动到新位置 camServo.write(PIRposition[PIR]); Serial.print("当前角度:"); Serial.println(PIRposition[PIR]);延迟(50); currentPIRposition =currentPIRpin; // 将当前 PIR 位置重置为活动 [PIR] 引脚 PIRprevState[PIR] =1; // 将之前的 PIR 状态设置为 HIGH } PIRprevState[PIR] =1; // 如果当前位置与当前 PIR 引脚相同,则将先前的 PIR 状态设置为高电平 } // 结束 PIRprevState if } // 结束 PIRstatus if else { // digitalWrite(currentLEDpin, LOW); //LED 可视化传感器输出引脚状态 PIRprevState[PIR] =0; // 将之前的 PIR 状态设置为 LOW } // 结束 else } // 结束 [PIR] for 循环 } // 结束主循环
示意图
制造工艺