还学习
本教程有几个可以单独使用的组件,其中一些组件是任何Linux系统上的重要技能。如果您直接跳到这些包,请确保首先安装适用的附加包。从下面的列表快速跳转到这些部分:
- 将内存当作磁盘空间来使用,减少磁盘访问(任何Linux系统)
- 公钥认证ssh和隧道VNC(任何Linux系统)
- 使用PI相机(仅使用PI)
- 使用简单的bash命令和脚本(仅适用于Pi)控制GPIO引脚
- 和其他几个人
预计完成时间
- 初学者:几天
- 经验:几个小时
目标的能力
- 当检测到运动时,收集电影剪辑
- 基于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。
注意图片中板子的方向。偶数引脚沿右侧,从上到下依次递增(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的组合。测试电路示意图如下:
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。
项目电路是这样的:
注意,在测试电路中连接到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