树莓派:灯光,相机,动作,和非现场存储

还学习

本教程有几个可以单独使用的组件,其中一些组件是任何Linux系统上的重要技能。如果您直接跳到这些包,请确保首先安装适用的附加包。从下面的列表快速跳转到这些部分:

  • 将内存当作磁盘空间来使用,减少磁盘访问(任何Linux系统)
  • 公钥认证ssh和隧道VNC(任何Linux系统)
  • 使用PI相机(仅使用PI)
  • 使用简单的bash命令和脚本(仅适用于Pi)控制GPIO引脚
  • 和其他几个人

Finished Project Image yet another

预计完成时间
  • 初学者:几天
  • 经验:几个小时
目标的能力
  • 当检测到运动时,收集电影剪辑
  • 基于PIR,可以在黑暗中进行运动检测
  • 录制电影时打开房间灯
  • 转移电影到一个安全的,异地存储
  • 没有累积磁盘空间使用
  • 轻松访问SDD
  • 长期稳定的服务,无需重新启动
  • 自动恢复后,电源故障
  • 结构紧凑,重量轻,能耗低
  • 简单的编程,低开销
  • 完全用户控制与安全远程管理
  • 定期报告外部IP地址
  • 开放源码,完全透明的硬件和软件,没有黑盒固件更新,可能会使设备陷入瘫痪
  • 如果你厌倦了,100%的可重复任务
  • 有趣的
  • 便宜的

我的第一个构建是在五个月前。这支部队从700英里外一直忠实地为我服务,已经两个多月没有重启了…除了电源故障之外,它从故障中恢复过来。一天两次,它通过发送给我一部电影和它的外部IP地址来友好地提醒我它正在工作。

背景

先决条件

材料

以下是项目中使用的部件:

  • 树莓PI 2,型号B
  • π相机板
  • π电源
  • 8Gb带NOOBS的SDD
  • PIR(运动)传感器
  • 尾部开关二世
  • 猪尾线
  • 一些电阻器,led灯和一个用于初始测试的开关
  • usb鼠标/键盘,仅用于安装
  • 一个仅用于安装的HDMI连接器(我使用:hm -to- vga适配器)

你可以买一个更便宜的PI和SDD,也许可以节省30美元,但是PI 2——它有1gb的内存——是一个健壮的项目……NOOBS设置的简单性是无可比拟的。一旦设置完毕,系统就可以完全由ssh管理,因此键盘、鼠标和HDMI连接器可以在其他地方使用。我更喜欢这个应用程序的硬连接网络接口,因为它在无人值守运行的远程系统(可能一次运行数月)上更加可靠。

这个监控摄像头最好作为一种即发即忘的设备运行:当电影或图片被收集时,它会以某种方式被消耗,并被随后的电影覆盖。(当然,你可以改变这种行为。)如果没有“即发即弃”,SDD可能会在用户干预之间的时间间隔内填满(或被破坏)。为了消费电影,设备被编程为在事件发生时将信息转移到异地。在这个项目中,我将使用FTP将电影传输到另一台计算机。如果你没有FTP账户,你可以在其他电脑上设置一个。或者,修改代码将电影发送到云服务,或者使用scp、电子邮件、网络共享等等。

我将本教程标记为中级,只是因为您必须首先熟悉您的树莓派,Raspian OS,和非常基本的电子产品。安装和使用Raspian操作系统,配置/使用相机,使用终端,等等。在你第一次打呵欠后不久,你就准备好继续打呵欠了。

关于符号的说明:在下面的一些命令中,我使用了符号,如Pi的IP>当你看到这个的时候,它的意思是替换整个东西。(包括& lt;和>),以及相应的内容,例如,pi@192.168.0.17。

最小Raspian操作系统

当PI处于关闭状态时,连接摄像头、SDD、鼠标/键盘和HDMI监视器,然后插上电源。您可能已经有了一个装有包和配置/定制的工作安装,但是我建议您从一个新的SDD开始并重新安装。在设置:

  • 更改密码
  • 启用启动到桌面
  • 语言、键盘、时区的国际化
  • 使相机
  • advanced>使SSH
  • advanced>设置主机名

稍后,在机器重新启动之后,您可以使用sudo raspi-config来进行其他配置更改。你现在有了一个“只需要什么”的系统,从同样的地方开始,采取同样的步骤,我们最终也会在同样的地方结束。我也会在PI上遵循这个过程。当系统文件被编辑时,我们将首先使用sudo cp <thePath/theOriginalFile>& lt; thePath / theBackupFile>。如果你必须恢复,你运行:sudo mv <thePath/theBackupFile>& lt; thePath / theOriginalFile>。最后,除非这里打印出来,否则不要使用sudo。

一旦启动到Rasbian,配置您的网络与一个静态IP。

额外的包

更新操作系统和安装一些需要的软件包:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install wget lynx ffmpeg mplayer x11vnc omxplayer
将内存当作磁盘空间使用

为了减轻SDD卡的负担(可能是多年的服务),并提高电影录制的效率,我们希望使用内存来临时存储电影。为它腾出位置:

mkdir ~/volatile

告诉操作系统将那个位置分配给内存:

sudo cp /etc/fstab /etc/fstab.backUp
gksu leafpad /etc/fstab

仔细地,准确地,在末尾加上下面一行:

tmpfs /home/pi/volatile tmpfs defaults,noatime,nosuid,nodev,noexec,mode=1777,size=20M 0 0

保存、退出和重新启动。现在,您的主文件夹中应该有一个名为volatile的目录,该目录指向内存,最多可以保存20 MB的文件数据。要测试它,运行:

touch ~/volatile/helloMemory

转到文件管理器,查看名为helloMemory的新文件是否在易失性目录中。然后,重新启动并验证它不再存在。如果它消失了,那么一切都很好。我们将把所有的电影写入这个易失性文件夹,一旦它们被消耗就会被删除。

SSH和(可选的)隧道VNC

对于远程管理来说,能够从其他地方通过ssh连接到PI是非常重要的。我更喜欢隧道的VNC连接超过ssh,所以我可以与PI桌面…就好像我坐在那里,带着鼠标、键盘和显示器。

ssh的默认配置在文件/etc/ssh/sshd_config中提供。我们将暂时使用它,但要确保你的PI还没有暴露端口22到互联网(例如通过一个路由器转发端口22到你的PI的IP地址,或由供应商/设备把PI当作非军事区)。在面对互联网之前,我们需要更好地锁定它。

在另一台LAN计算机(您将从它连接)上安装ssh客户机和VNC查看器。我在客户机上使用Linux, ssh连接使用open-ssh, VNC查看器使用remmina。对于许多Linux发行版,open-ssh已经默认安装,所以唯一的命令是:

sudo apt-get install remmina 

还有其他一些方法,包括允许从Windows计算机进行连接的方法,但是带有remmina的x11vnc速度快、重量轻、功能丰富。如果在客户机上使用商业操作系统,则必须进行一些研究(putty是一种优秀的跨平台ssh客户机)。当您没有本地Linux机器在客户机上安装VirtualBox并创建一个带有桥接适配器的Debian Linux VBox机器时,一个更好的选择。

现在(假设是Linux客户端),测试从客户端到PI的连接:

ssh -L 5092:localhost:5900 pi@<Pi's IP> 

这将在PI上创建一个ssh终端会话,该会话通过PI上的5900端口连接到客户机的端口5902。在该终端会话中,启动x11vnc:

x11vnc -ncache -display :0 # must be run on each new session

这将打开PI上的端口5900作为VNC端口。要从客户端获得桌面,在客户端机器上打开remmina并使用以下配置文件连接到会话:协议VNC,服务器127.0.0.1:5092,颜色深度真颜色,质量介质。如果一切顺利,现在你的PI桌面就在客户端机器的一个窗口中,具有复制/粘贴和查看相机的功能。

总是优雅地重新启动/关闭PI。从一个ssh终端会话:

sudo reboot -h && exit

或者:

sudo shutdown -h now && exit

,

在您通过打开路由器上的一个端口将PI暴露给internet之前,创建一个ssh密钥对,配置ssh使用PubkeyAuthentication,并将PasswordAuthentication设置为no。以下是基本步骤:

在PI上,创建一个名为.ssh的隐藏文件夹:

mkdir ~/.ssh

在客户端机器(不是PI)上,创建一个ssh密钥:

ssh-keygen -t rsa -b 4096 -C "$(whoami)@$(hostname)-$(date -I)" #open-ssh required

当请求位置时,输入:/home/<user>/.ssh/piClient_rsa。我设置了一个密码,以防有人访问我的机器(它不是登录密码)。该命令创建一个密钥对和一个单独的文件,该文件包含客户机的~/中密钥的公共部分。ssh文件夹。

然后,从客户端,将密钥的公开部分转移到pi。

ssh-copy-id -i ~/.ssh/piClient_rsa.pub pi@<PI's IP> # PI's password when asked

在PI上,打开隐藏的文件夹~/.ssh。这里应该有一个authorized_keys文件,其中包含客户端的公钥。接下来,编辑/etc/ssh/sshd_config文件:

sudo cp /etc/sshd_config /etc/sshd_config.backUp
gksu leafpad /etc/ssh/sshd_config

下面是我的sshd_config中唯一未注释的行。

Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
UsePrivilegeSeparation yes
KeyRegenerationInterval 1h
ServerKeyBits 2048
LoginGraceTime 1m
PermitRootLogin no
StrictModes yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
PasswordAuthentication no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server

这样,PasswordAuthentication就不再使用了。

最后,在PI上,更改一些权限,否则它将无法工作:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/*

尽管有争议,但您可能还希望将端口从默认值(22)更改为大于1024的非标准数字。以这种方式屏蔽ssh端口将防止没有经验的坏人通过无效的密码尝试攻击您的路由器。(您不会受到简单密码的成功攻击,因为您很聪明并且使用了公钥身份验证。)如果您在一个潜在的敌对的本地网络上,保持端口22。最好的方法是将端口22保持在PI上,并让路由器将WAN请求转发到一个不明确的端口,比如1141,再转发到PI上的端口22。

在PI上重新启动或重新启动ssh:

sudo service ssh restart

请注意:如果您在创建密钥时设置了密码,会话将要求您输入该密码。这是读取密钥所需的密码,而不是系统密码。(可以把它看作是第二层安全。)现在,回到客户端。Ssh到PI使用Ssh密钥进行访问:

ssh -i ~/.ssh/piClient_rsa pi@<PI's IP>

通过密钥认证在ssh上隧道VNC:

ssh -i ~/.ssh/piClient_rsa -L 5092:localhost:5900 pi@<IpForPi> 

(如果更改了默认端口,请包括开关-p <yourPort#>)

要了解有关ssh和ssh密钥的更多信息,请访问以下两个链接。它们是Arch Wiki页面,但除了安装和守护进程内容外,它们也适用于Raspian。Raspian默认启用守护进程,并且ssh已经安装。

  • https://wiki.archlinux.org/index.php/Secure_Shell
  • https://wiki.archlinux.org/index.php/SSH_keys。
强制HDMI分辨率

当HDMI连接断开时,Raspian OS默认为低分辨率。在正常使用情况下,我的HDMI连接是断开的,当使用VNC时,我喜欢更高的分辨率。

sudo cp /boot/config.txt /boot/config.txt.backUp
gksu leafpad /boot/config.txt

在读取NOOBS自动生成的设置之后,让它读取如下:

# NOOBS Auto-generated Settings:
hdmi_force_hotplug=1
config_hdmi_boost=4
start_x=1
gpu_mem=128
#Modified below to enable higher resolution when hdmi is unplugged
disable_overscan=1
hdmi_group=2
hdmi_mode=51

保存,退出,重启。

测试相机

注意:raspivid和omxplayer都不能在VNC上显示视频。要看电影,你需要转换成mp4和显示它与mplayer。

从PI桌面打开终端,运行:

raspivid -t 15000 -o ~/volatile/video.h264 -fps 4 -w 600 -h 400 -rot 180 -p '10,10,600,400'

它将以每秒4帧的速度从cam上收集15秒的视频,并将其保存在~/volatile/video.h264中。-w和-h标志设置图像尺寸。rot标志旋转它,而-p字符串设置一个预览窗口。添加-n标志会抑制录制期间的预览,以节省资源。

如果PI连接到HMDI显示器上,您可以使用:omxplayer /volatile/video来查看影片。h264——fps 4,但是omxplayer不会在VNC客户机中渲染。相反,运行:

ffmpeg -r 4 -i volatile/video.h264 -vcodec copy video.mp4
mplayer video.mp4 -fps 4
rm volatile/video.h264

第一个命令创建了一个4-fps, mp4电影从volatile/视频。h264文件,并将其作为video.mp4存储在主目录中。mplayer命令播放电影。一旦消费,原始电影,挥发/视频。h264文件,已删除。

用其他raspivid帧速率等进行实验。我根据实际应用程序的要求来设置我的持续时间和帧率。我只需要15秒的视频和4fps创建一个小于1mb的电影,可以快速上传。如果你正在记录精力充沛、鬼鬼祟祟的野生动物,提高帧率。(我主要记录的是一种行动缓慢的哺乳动物。)

配置针

首先,加入gpio集团:

sudo gpasswd -a pi gpio

注销,然后再次登录以完成成员资格。

我们将使用两个引脚,GPIO 23和GPIO 24。GPIO 23将是一个输入(一个传感器针),当运动检测器被激活时,它将感应到。GPIO 24将是一个输出(一个信号引脚),它将触发一个房间的灯。我们希望在引导时配置它们。我们将使用简单的bash脚本完成所有操作。首先,我们将为它们创建一个文件夹。

mkdir ~/bashScripts

然后,制作一个脚本来配置大头针:

leafpad ~/bashScripts/configPins

在文件中输入以下内容,保存,退出:

#!/bin/bash
cd /sys/class/gpio/
echo "23" > export
echo "in" > gpio23/direction
echo "24" > export
echo "out" > gpio24/direction
chown root:gpio gpio24/value
chmod 660 gpio24/value

使其可执行:

chmod +x ~/bashScripts/configPins

现在,我们需要让PI在引导时运行configPins脚本:

sudo cp /etc/rc.local /etc/rc.local.backUp
gksu leafpad /etc/rc.local

最后两行如下:

sh /home/pi/bashScripts/configPins
exit 0

保存,退出,重启。在引导时,GPIO 23将始终是一个输入,而24将始终是一个输出,除非您稍后删除在rc.local中添加的行。

电子产品

在我们电线最后的项目,这是最好做一个测试电路,并验证引脚工作预期。首先,让我们看看主板上的引脚的物理位置。以下图片来自http://elinux.org/rpi_lowlevel_peripherals #P2_header。

pin out

注意图片中板子的方向。偶数引脚沿右侧,从上到下依次递增(2,4,6等):

  • 引脚4是+5V
  • 引脚6接地(GND)
  • Pin 16是GPIO 23
  • Pin 18是GPIO 24

最上面,左边的pin是pin 1 (+3V)。

不要让5V引脚(例如引脚4)连接到除GND以外的任何引脚,即使这样,只有在它们之间有一个高值电阻器时。出于我们的目的,我们不会让任何pin直接连接到任何其他pin。我们所有的引脚,无论是在测试电路还是在最终电路中,都将始终连接到一个设备上。在测试电路中,该装置是一个电阻或电阻- led的组合。测试电路示意图如下:

schematic

avconv

我使用了2.2K电阻之间的引脚4和引脚6(红色)电源指示灯LED。(蓝色)pin-18 LED的电阻器为570欧姆。我还把一个47欧姆的电阻在开关电路(其实不需要,除了编辑一致性)。

引脚2的(红色)LED就像一个电源指示灯(它应该是亮的)。

蓝色LED显示pin 18 (GPIO 24)的状态。要打开它,运行:

echo "1" > /sys/class/gpio/gpio24/value

用以下方法关闭:

echo "0" > /sys/class/gpio/gpio24/value

在测试电路中,引脚16 (GPIO 23)检测开关是否闭合。要测试它,运行:

while [ true ]; do cat /sys/class/gpio/gpio23/value; done

终端将流0,直到你关闭开关,在这一点上它将流1。

项目电路是这样的:

project circuit

注意,在测试电路中连接到pin 1 (+3V)的橙色线已经在最后的电路中被移除,因为3伏的信号现在由PIR的黄色引线提供。你希望PIR跳线位于H位置(触发后再释放,而不是触发后再保持)。我让计时螺丝完全逆时针旋转(非常短)……刚好足够触发一个新的运动事件。按你的意愿调整敏感度。我在关闭圆周率的情况下做所有的调整。

运行:

while [ true ]; do cat /sys/class/gpio/gpio23/value; done

如果在一段时间内什么都没有移动,你会看到一个0的流,直到你在PIR上挥舞你的手,在这一点上它流1。

注意在电源开关尾II,地线连接到负端。在我的开关,我跳跃的负极端子到地端子,以及。将弹簧开关插入灯中,运行:

echo "1" > /sys/class/gpio/gpio24/value # on
echo "0" > /sys/class/gpio/gpio24/value # off

最后,代码

PIR触发了灯光和摄像头

创建一个新的名为litesCamera的bash脚本:

leafpad ~/bashscripts/litesCamera

让它读:

#!/bin/bash
echo control c to quit
while [ true ]; do    
   sleep 0.5
   state=$(cat /sys/class/gpio/gpio23/value)
   if [[ $state -eq 1 ]]; then
     if [ -e ~/volatile/video.h264 ]; then
        rm ~/volatile/video.h264
     fi
     echo "1" > /sys/class/gpio/gpio24/value
     raspivid -t 15000 -o ~/volatile/video.h264 -fps 4 -w 600 -h 600 -rot 180 -n
     echo "0" > /sys/class/gpio/gpio24/value
     echo control c to quit
   fi
done

这意味着:如果PIR看到移动,删除

本文转载于:http://www.diyabc.com/frontweb/news13527.html

原文地址:https://www.cnblogs.com/Dincat/p/13477310.html