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


    还学习

    本教程有几个可以单独使用的组件,其中一些组件是任何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

  • 相关阅读:
    读书笔记:你就是极客软件开发人员生存指南
    读书笔记:重来 Rework
    敏捷个人2012.1月份线下活动报道:谈谈职业
    敏捷个人2011.12月份线下活动报道:认识自我
    敏友的【敏捷个人】有感(12): 敏友们自发组织的线上思想的碰撞
    敏捷团队:我尽力先做好本职工作是否正确?
    OpenExpressApp:精通 WPF UI Virtualization
    MDSF:发布图形编辑器源码OpenGraphicEditor
    产品管理:用户访谈之道
    敏捷个人架构图
  • 原文地址:https://www.cnblogs.com/Dincat/p/13477310.html
Copyright © 2020-2023  润新知