1. 程式人生 > 實用技巧 >樹莓派:燈光,相機,動作,和非現場儲存

樹莓派:燈光,相機,動作,和非現場儲存

還學習

本教程有幾個可以單獨使用的元件,其中一些元件是任何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;和>),以及相應的內容,例如,[email protected]

最小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