IoT|硬體|樹莓派|實作|感測器|自製智慧型監視器

這裡介紹如何使用樹莓派與網路攝影機,自己打造一個物聯網監視器,發現異常狀況時自動以 Email 通報。

使用樹莓派打造具有物聯網功能的監視器的方法與之前介紹過的自製縮時攝影設備類似,主要的技術就是應用 motion 這個工具來處理網路攝影機的畫面,偵測畫面中變動的物體,再配合自己撰寫的通報指令稿,組合成完整的物聯網監視系統。


事前準備


[材料]

Raspberry Pi 3 Model B 開發板
羅技 Logitech  C270 網路攝影機
作業系統是使用樹莓派官方的 Raspbian


[檢查]

確認硬體設備型號:Logitech  C270:
lsusb

再看看 /dev/ 下是否有video0裝置
ls /dev/video0

安裝 fswebcam
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install fswebcam

測試 fswebcam
fswebcam -d /dev/video0 ~/test.jpg


建立基本監視系統


motion 是最主要的核心工具,使用 apt 即可安裝。安專之前新更新系統套件資訊:
sudo apt-get update

安裝 motion 套件:
sudo apt-get install motion

motion 在安裝完成之後,預設是不會自動啟動的,要讓它能夠開機自動啟動,就要修改 /etc/default/motion 設定檔,啟用 motion 的 daemon:
start_motion_daemon=yes

接著修改 /etc/motion/motion.conf 設定檔,調整各種 motion 的參數,這裡的參數非常多,這裡只是列出一些我個人感覺比較需要調整的部份。
sudo nano /etc/motion/motion.conf

內容如下:
# 開啟串流與網頁管理功能
stream_localhost off # 設定 off 後,將不限定只能 127.0.0.1 ip 連線
webcontrol_localhost off # 設定 off 後,將不限定只能 127.0.0.1 ip 連線

daemon on # 允許背景執行
stream_port 8082
webcontrol_port 8081

# 照片解析度
width 320
height 200

# jpeg 品質
quality 90

# 每秒最高的 frame 數
framerate 4

# 雜訊門檻值
noise_level 64

# 偵測變動像素門檻值
threshold 3000

# 關閉影片輸出
ffmpeg_output_movies off

# 關閉輸出變動照片
output_pictures off   # 關閉此功能,會影響設置自動通報系統,若要測試自動通報則需將此功能開啟
# 標示畫面中有變動的部份
locate_motion_mode on

# 設定右下方文字
text_right "K.L.Chu"

# 用紅色方框標示
locate_motion_style redbox

有些參數必須依照現場的狀況來調整,例如雜訊門檻值(noise_level)與偵測變動像素門檻值(threshold),雜訊門檻值是指單一像素值變動多少以上才視為像素變動,而偵測變動像素門檻值是指多少個像素以上的變動才視為有偵測到物體移動,這個會跟鏡頭的好壞、安裝的角度、光線、現場的各種物體有關,要自己去調整。

簡單來說,如果鏡頭品質不好、畫質很差、雜訊很高,那可能就要把雜訊門檻值調高一些,如果是很高級的鏡頭,沒有什麼雜訊的話,就可以把雜訊門檻值降低;如果鏡頭剛好是面對樹葉、窗簾等會飄動的物體,那可能就要把偵測變動像素門檻值調高一些,避免小小的風吹草動就出現警訊,反之若是畫面中的物體都是固定的建築物、道路等,就可以降低偵測變動像素門檻值,讓微小的變動也可以精準偵測出來。

motion 預設也會將變化的畫面以影片檔輸出,但是我怕樹莓派的處理器速度太慢了,所以先把它關掉,只看照片就好。
通常這些數值都要等到實際裝好之後,經過很多次的測試才能得到比較恰當的設定值,所以安裝初期先大約設定一下就可以了。

設定好之後,重新啟動 motion 系統服務:
sudo service motion restart

檢查 motion 系統服務的狀態:
service motion status

由於 motion 預設會將圖片與影片的輸出儲存於 /var/lib/motion 中,但是 motion 帳號這個沒有該目錄的寫入權限,我們要自行將這個目錄的擁有者改為 motion:
sudo chown motion:motion /var/lib/motion


如果權限沒有設定好,會造成 motion 中止執行。
 motion 中止執行

motion 正常執行之後,只要畫面出現變動,就會將變動的畫面儲存下來,下面這張是我拿一顆籃球從鏡頭前滾過去的測試照片,motion 會自動將畫面中有變動的部份用紅色方框標示出來。

開啟電腦上的瀏覽器,輸入 http://<IP>:8081/看到畫面就算成功囉!


設置自動通報系統
(安裝及設置 SSMTP 請參考本篇 研究-SSMTP 與 GMail 配合指令或程式自動寄信


motion 可以在各種事件發生時,執行對應的指令稿,最常見的使用狀況就是當發現變動的畫面時,主動發送 Email 或手機即時訊息,通知系統管理員。我們可以在 /etc/motion/motion.conf 設定檔中指定各種事件所對應的指令稿。

圖片儲存事件 on_picture_save 功能可以指定當圖片存檔後,要呼叫的指令,而這個指令通常會配合 %f參數一起使用,這個參數代表圖片的絕對路徑,透過這樣的方式即可將圖片傳遞給程式做進一步的處理:
on_picture_save /opt/motion/picture_save.sh %f

這裡我讓 motion 在圖片儲存之後,呼叫我自己寫的 /opt/motion/picture_save.sh 指令稿,並將圖片路徑一起傳過去,而這個指令稿的內容如下:
#!/bin/bash
# 名稱:picture_save.sh
# 說明:將儲存的照片以 Email 發送
filename=$1
mpack -s "發現變動畫面" $filename ntausr4@gmail.com

更改權限
sudo chown motion:motion /opt/motion/picture_save.sh
sudo chmod +x picture_save.sh



設置攝影機故障事件(請注意相關參數,以避免系統資源被吃光)


監視系統的攝影機必須要維持正常運作,這樣整個系統才有作用,on_camera_lost 可以指定當攝影機出問題時所要呼叫的指令。如果一台樹莓派接了好幾台攝影機,可以配合 %t 參數,將出問題的攝影機編號傳遞出來:
on_camera_lost /opt/motion/camera_lost.sh %t

以下是 /opt/motion/camera_lost.sh 指令稿的內容:
#!/bin/bash
# 名稱:camera_lost.sh
# 說明:攝影機故障通報
camera_number=$1;
echo "攝影機 $camera_number 故障" | \
  mail -s "攝影機 $camera_number 故障" ntausr4@gmail.com


motion 還有支援其他幾種事件,設定的方式也都類似,請查看 /etc/motion/motion.conf的註解說明,另外也還有非常多種參數可以使用,其註解中也有詳細的說明。

這封郵件來自 Evernote。Evernote 是您專屬的工作空間,免費下載 Evernote

留言

這個網誌中的熱門文章

IoT|硬體|樹莓派|外接麥克風及喇叭設置

成長|語文|學習-英文 持續更新!

IoT|硬體|通訊|Arduino 使用 SoftwareSerial Library 與電腦通訊