2022年1月9日 星期日

使用繼電器模組切換分享USB外接SSD

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 一次切過來. 


USB接頭總共有四個ping, 第一和第四pin是電源和接地pin, 就是5v直流電的正負極. 而中間兩條 D-, D+ 是資料pin. 仔細觀察四個pin腳, 事實上四個pin是不等長的, 中間兩條資料pin 比較短. 此處隱含的邏輯就是: 插入USB時, 電源接地先通, 再來才接資料pin. 而拔出的時候則相反, data pin 先退出, 再來才斷電.

最早的實作中, 因為沒有遵守這個邏輯, 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 漏接, 無法開始錄影或者停止錄影.