用 Raspberry Pi 3 從頭自幹電子看板

敝社從以前到現在都是很直覺的用 Windows Solution 來做一些事情。原本我們放在門市,用來播放一些宣傳影片的電子看板,前面的人是用這樣的方式做的:

  1. 用一台 PC,可能是小筆電或是 Atom 等級的機器,安裝 Windows 作業系統
  2. 安裝 KMP
  3. 要播放的影片以及 Playlist 用 Google Drive 同步到各門市的電腦
  4. 把播放清單檔設定成用 KMP 開啟,然後把播放清單檔案拉到「開始」→「啟動」裡面讓他開機自動執行
  5. 如果有新播放清單/影片,重開機後 KMP 才會載入新的檔案並開始播放

這樣的做法有幾個討厭的問題:

  1. 播影片的效率不好,如果丟 MP4、Full HD 格式的影片出去,門市人員常常回報播放起來會掉格,於是就只好再轉一份其他格式的檔案以後再做一次一樣的事情。
  2. 機器和作業系統的成本高了一點。以及到了中國,因為連不到 Google Drive,所以變成得要手動一台一台上傳、手動一台一台編輯播放清單。
  3. 用 Teamviewer 這爛東西 連到中國的速度非常慢,所以每次在做這個的時候都很想砍人
  4. 最討厭的就是 Windows 常常會跳出一些有的沒有的視窗要你更新 blahblahblah 的…

綜合以上,有幾個問題需要解決:

  1. Windows 機器成本較高、難以維護,而且之前的硬體根本播不動 MP4、Full HD 的影片
  2. 加上中國地區的話,維護既不直覺又麻煩

那麼我就拿 Raspberry Pi 3 + Raspbian 來自幹吧

先入手 Raspberry Pi 3

現在 PCHome 24H 都有賣了,入手難度幾乎等於沒有。

記得還要準備 Micro SD、USB 電源線和變壓器、以及 HDMI 線一條。這樣成本大約一台台幣兩千五左右吧

安裝 Raspbian

直接到 Raspbian 官網下載 image,然後在 OSX 下的作法會是

  1. 先把 Micro SD 加上轉接卡接到 Mac 上
  2. 打開 Terminal,執行 diskutil list,確認你 SD 卡的代號,例如 /dev/disk2
  3. unmount SD 卡,執行 diskutil unmountDisk /dev/disk2
  4. 把 Raspbian 映像檔寫入 SD 卡,執行 dd bs=1m if=${你的映像檔位置} of=/dev/rdisk2
  5. 映像檔寫入完記得要再把 SD 卡 unmount 掉:diskutil unmountDisk /dev/disk2

然後就可以把這張 Micro SD 卡插到 Raspberry Pi 上,接上電源開機了

設定 Raspberry Pi 環境

開機以後,用預設帳號 pi ,密碼 raspberry 登入系統(看你要接鍵盤螢幕,還是直接接網路線用 DHCP 取得 IP 後再 ssh 進去)然後做以下的事:

  1. 執行 sudo raspi-config
    1. expand-filesystem
    2. 然後 Change User Password
    3. Boot Options 進去選擇 B1 Console
    4. 然後選擇 Finish 後根據提示重開機
  2. 重開機後設定系統時區
    sudo dpkg-reconfigure tzdata(這邊我用 Asia/Taipei)
  3. 設定鍵盤
    sudo dpkg-reconfigure keyboard-configuration (基本上就都用預設值)
  4. 設定 locales
    sudo dpkg-reconfigure locales (用 en_US.UTF-8)
  5. 更新系統
    sudo apt-get update
  6. 安裝必要軟體
    sudo apt-get install omxplayer vim-nox xutils

自動播放影片設計

第一個遇到的問題是原本想用 VLC Player 加上播放清單來播放影片,但是 VLC player 沒有支援 Raspberry Pi GPU 硬體加速,所以根本播不動 Full HD 的 MP4。Google 了一下發現在 Raspberry Pi 上最多人用的是 omxplayer 這支播放軟體,但 omxplay 沒有播放清單功能。所以這是第一個要解決的問題。

第二個是我想要讓灑在外面各門市的 Raspberry Pi 自己來總部拉檔案,我就只需要維護總部裡某個地方的資料,外面的機器就會自動同步。不要再一台一台去處理了。這個我就用 rsync 來做。

自動播放影片作法

  1. pi 登入 Raspberry Pi,然後執行 ssh-keygen 產生一把 ssh 金鑰。這是因為以後我們要用 rsync over ssh 並用 key 來認證(也就是不要打 login 密碼)

  2. ssh-copy-id 把剛剛產生的公開金鑰複製到總部放檔案的帳號,例如 [email protected] (請依照您自己的環境調整)

    ssh-copy-id -i /home/pi/.ssh/id_rsa.pub [email protected]

  3. 總部的帳號建立一個 pops 資料夾,裡面有一個 play.sh ,這是讓 omxplayer 循環播放檔案的 shell script,資料夾裡面再建一個 videos 資料夾放影片
    所以會有這些東西:

    /home/pops/
    /home/pops/play.sh
    /home/pops/videos/
    

  4. play.sh 內容如下

    #!/bin/sh
    
    # get rid of the cursor so we don't see it when videos are running
    setterm -cursor off
    
    # set here the path to the directory containing your videos
    VIDEOPATH="/home/pi/pops/videos"
    
    # you can normally leave this alone
    SERVICE="omxplayer"
    
    # now for our infinite loop!
    while true; do
           if ps ax | grep -v grep | grep $SERVICE > /dev/null
           then
           sleep 1;
    else
           for entry in $VIDEOPATH/*
           do
                   clear
                   # -r for stretched over the entire screen
                   # omxplayer -r $entry > /dev/null
                   omxplayer -b `find $VIDEOPATH -type f | shuf -n 1` > /dev/null
           done
    fi
    done
    
  5. 然後就可以用下面的指令(在 Raspberry 上執行)從總部的 video 這個 user 目錄下的 pops 子目錄把影片拉下來。當然也可以依照你想要的時間,寫進 crontab 內排程執行
    rsync -avP --progress --delete-after [email protected]:~/pops/ /home/pi pops/

  6. 再來要讓 Raspberry 開機自動執行 play.sh 播放影片,編輯 /etc/rc.local,在預設的 exit 0 前面加上這一行

    /home/pi/pops/play.sh &
    
  7. 關掉 Raspberry 的螢幕保護程式以及自動電源管理,不然播一播畫面就黑了…
    編輯 /etc/xdg/lxsession/LXDE-pi/autostart ,把裡面原本的東西 comment 掉,加上這三行(如果沒有進 X 環境的話,這一步應該可以省略)

    @xset s noblank
    @xset s off
    @xset -dpms
    
  8. 編輯 /etc/kbd/config,找出原本下面這兩項設定,都改為 0
    #BLANK_TIME=30
    BLANK_TIME=0
    #POWERDOWN_TIME=30
    POWERDOWN_TIME=0
    
  9. 如果要預先設定 wifi,請編輯 /etc/wpa_supplicant/wpa_supplicant.conf,格式如下:
    network={
       ssid="my_wifi"
       psk="abcdefghijklmn"
    }
    
  10. 這樣就大概完成了。重新開機看看影片會不會直接開始自動播放吧。

已知缺點

  1. 目前設計的架構不能讓各地區播放不同的影片,到時候遇到再看要怎麼處理
  2. 中國尚未測試,不知道會不會因為連到台灣的速度太慢產生什麼奇怪的問題
  3. 沒辦法輪撥圖片,需要用 ffmpeg 把圖片轉成影片播放,可參考 這裡

常見問題

  • Raspberry Pi 的 HDMI 運作起來怪怪的?
    Raspberry Pi 因為要省電的關係,所以 HDMI 有些行為怪怪的。我是透過修改 /boot/config.txt 內和 HDMI 相關的設定來解決。可以參考 這裡