AverMedia ER130 具備紅外線遙控, USB接口. 無網路功能
計畫:
讓 Raspberry Pi 3 成為 ER130 網路後端.
在 ER130 與 Raspberry Pi 3 之間分享USB外接SSD, 將 ER130 錄影檔 copy 到 Pi 上. 後續可用小米盒子上的KODI連入Pi觀看.
核心功能:
在兩個設備間以無人職守的方式切換分享同一個USB硬碟(使用外接SSD)
實現:
以 四路單刀雙擲繼電器模組 實作. 工作電壓5V. low-level trigger
每個單刀雙擲繼電器有三個接點:
共接點: USB SSD
Normal Close 接點 (預設接點): AverMedia ER130 (Power Pin 除外)
Normal Open 接點: Raspberry Pi (Power Pin 除外)
接線:
Raspberry Pi 端: GPIO 2, 3, 4 pull-up pin
GPIO 2 -> Relay 1 -> USB Power pin
Relay 1:
共接點 -> USB SSD power pin
Normal close 接點 -> 5v 外接電源
Normal open 接點 -> 空接 (等於斷電)
GPIO 3 -> Relay 2 -> USB D- pin
Relay 2:
共接點 -> USB SSD D- pin
Normal close 接點 -> ER130 USB D- pin
Normal open 接點 -> Raspberry Pi USB D- pin
GPIO 3 -> Relay 3 -> USB D+ pin
Relay 3:
共接點 -> USB SSD D+ pin
Normal close 接點 -> ER130 USB D+ pin
Normal open 接點 -> Raspberry Pi USB D+ pin
GPIO 4 -> Relay 4 -> USB Ground pin
Relay 4:
共接點 -> USB SSD Ground pin
Normal close 接點 -> ER130 USB Ground pin
Normal open 接點 -> Raspberry Pi USB Ground pin
切換邏輯:
USB SSD 由 ER130 USB 口切換至 Rasbperry Pi USB 口:
原則: Power pin 先接, Data pin 後接
- Pi 發送 IR 訊號控制 ER130 錄影, 錄影完成, Pi 發送 IR code 關閉 ER130.
若不關閉 ER130, 則需要八路單刀單擲繼電器才能實作切換.
- GPIO 2 = Relay 1 = Power pin 切至 normal open 端, 此處空接
USB SSD 斷電. 模擬 VBUS 斷電. 否則USB SSD不能reset, 下個設備的host無法enumerate被切換的設備(此處為SSD), 則無法辨識出新設備被hotplug.
- GPIO 4 = Relay 4 = Ground pin 切至 normal open, 連接 Raspberry Pi USB Ground pin
- GPIO 2 = Relay 1 = Power pin 切回 normal close, 連接5v獨立電源
USB SSD 通電. 使用獨立電源原因在於 ER130 供電不穩. Raspberry Pi USB供電有限 (Pi 3 USB總供電 1.2 A, 不須 max_usb_current=1). Pi 拷貝影片時需要同時存取兩個硬碟 1.2A 不足以負荷.
- GPIO 3 = Relay 2 = D- pin 切至 normal open, 連接 Raspberry Pi USB D- pin
- GPIO 3 = Relay 3 = D- pin 切至 normal open, 連接 Raspberry Pi USB D+ pin
Pi Copy 完成後, USB SSD 由 Raspberry Pi USB 口切回 ER130 USB 口:
原則: Data pin 先斷, Power pin 後斷
- GPIO 3 = Relay 2 = D- pin 切至 normal close, 連接 ER130 USB D- pin
- GPIO 3 = Relay 3 = D- pin 切至 normal close, 連接 ER130 USB D+ pin
- GPIO 2 = Relay 1 = Power pin 切至 normal open 端, 此處空接 USB SSD 斷電.
- GPIO 4 = Relay 4 = Ground pin 切至 normal close, 連接 ER130 USB Ground pin
- GPIO 2 = Relay 1 = Power pin 切回 normal close, 連接5v獨立電源
- Pi 發送 IR code 開啟 ER130. ER130 開機辨識出 USB SSD. 可以開始下次綠影.
實現過程中遭遇的問題和處理:
上面的接線和切換邏輯不是一開始就知道的, 而是處理掉一些問題後的結果
- USB SSD 5V pin (VBUS)必須確實斷電 1 秒以上
使用單刀雙擲 relay 實作第一個遇到的問題. 卡關最久. 症狀也最詭異.
症狀: 由 Rasbperry Pi 切換回 ER130 時, ER130 無法辨認 SSD. 此時將 relay 的電源拔除, 瞬間ER130 就能辨認出SSD. 但relay的電源和 SSD 電源應該是隔離的. 至今仍不知為何有這種現象.
解: 初期導入一個MOSFET模組單獨控制SSD的VBUS, 在切換後將SSD特別斷電一秒再復電. ER130就能辨認出SSD. 後期將SSD改為獨立電源後. 拔除MOSFET, 改用四路relay的第一路來單獨控制 SSD 的VBUS pin.
- USB 四個 pin 不能同時切
要模擬人類插拔 USB 一開始最簡單的想法就是 USB 上的四個pin用relay 一次切過來.
最早的實作中, 因為沒有遵守這個邏輯, relay 4 pin 一起切的結果, 在 Raspberry Pi 端會隨機發生EMI錯誤:
[5410843.300270] usb usb1-port1: disabled by hub (EMI?), re-enabling...
雖然 Linux kernel 會自動修復, 但上層的所有服務都會跳掉需要重啟. 例如 NFS. 修改切換邏輯, 插入時先通電後通資料, 拔出時先退資料後斷電. 就沒再出現 EMI 錯誤.
到了這邊會發現, 因為有 A, B 兩台設備要分享同一個 SSD. 此處為 ER130 和 Raspberry Pi 兩設備分享同一個SSD. 所以單刀雙擲的 relay 是沒辦法同時滿足兩台機器的插拔邏輯. 一旦以A設備為主切換, 則B設備就會違反邏輯. 若用兩套單刀單擲 relay 去實作是比較完整的, 但接線會比較複雜而且需要更多機殼空間.
所以我的作法是將 ER130 端在切換前IR遙控它關機. 完全以 Raspberry Pi 為主來撰寫切換邏輯. 整個程序完成後, 再遙控 ER130 開機. 靠 ER130 的韌體開機enumerate, 將SSD掛回來.
- 設備端的USB供電不穩或供電不足
症狀: 外接SSD 的filesystem常常corrupted. 在ER130端會顯示外接SSD無法移除. 另外有時發生錄影到一半無法寫入, 或者在錄影結束最後階段無法完成最後的檔案寫入.
解: 給外接SSD輔助電源, 但有後續後遺症. 如下.
- 輔助電源的電流逆流至設備端
症狀: 移除 ER130 電源後, ER130電源燈仍會亮.
解: 將外接SSD完全改獨立電源. 與 ER130, Raspberry Pi 的 USB VBUS pin 完全分開.
- ER130 變壓器衰退(?)不足瓦
症狀: IR code 漏接, 無法開始錄影或者停止錄影.