顯示具有 USB 標籤的文章。 顯示所有文章
顯示具有 USB 標籤的文章。 顯示所有文章

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 漏接, 無法開始錄影或者停止錄影.

2014年6月14日 星期六

[汽車] 福斯 VW POLO安裝USB充電器與繼電器


上次幫POLO安裝了延時繼電器, 可以讓行車紀錄器在15秒內引擎發動後再啟動, 這樣可以讓電瓶的壽命延長一些. 今天我要繼續幫音響安裝繼電器, 而且利用之前裝的延時繼電器一樣控制鑰匙插入15秒後啟動音響電源. 另外還要安裝USB充電線, 兩個功能一次搞定.

首先把音響主機拆出來觀察一下後面的線路:


很多線, 當時是音響店接的, 這次施工主要是電源線, 找到電源線就ok了, 想必下面圖上的紅線就是電源線, 黑線想當然爾就是接地線(接車體搭鐵)囉:

這裡要說明一件事情, 當時裝音響的時候有發現POLO車的音響電源是常通的, 也就是就算熄火仍是通電, 但是我新裝的音響沒有手動斷電開關, 所以就捨棄原本的音響電源而從我從保險絲盒裝的取電器接電過來(參考這篇), 而這個從原本座椅暖氣拉過來的電源就是鑰匙啟動才通電.

由於音響店的接法造成音響和行車器紀錄器共用電源, 雖然有用大一點的保險絲, 但是我仍然想把音響接到原本的的音響電源, 只要再加上繼電器, 並且利用之前裝的延時繼電器的輸出當作繼電器的控制端就可以了.

所以, 先找回之前音響店棄用電源, 有很多線被包起來, 猜想也是紅色的就是電源:

要確定這件事情, 就要用電表量一下紅線, 看是否是12V輸出, 想要量測就要先找到車體來做搭鐵接地, 找到在音響下方有搭鐵處:

OK, 找到接地之後, 接下來很簡單, 把被音響店包起來的紅線剝開來, 電表紅棒接到電線上去量:

歐夜! 猜對了, 12V輸出:

先show一下整體的狀況, 拆了音響, 音響下面的置物盒, 還有左邊的卡片夾, 拆出卡片夾之後發現後面是很大的空間, 決定將繼電器和USB充電變壓器(12V to 5V)放到左邊卡片夾後面的空間:

試試看將USB變壓器的火線和地線穿到左邊卡片夾拆後的空間, 看來OK:

接下來就是這次施工最失敗的一個部分, 我原本的計畫就是要在中控台上面的製物盒打洞把USB接口安裝到這裡, 這樣平板電腦就可以直接接電使用.

很不幸的是, 置物盒比想像中安裝得緊, 而且我沒有特規的拆裝工具, 所以只能用機殼檔板加上蠻力勉強拉起. 置物盒並沒有壞掉, 但是由於我的POLO已經有一段時日, 所以環保漆已經是稍微摳一下就會脫落. 我這樣的舉動刮掉不少的環保漆, 心痛啊:

拆開來像這樣, 可以看到兩個六角螺絲, 這次的搭鐵接地就是接到這個螺絲:

右邊的狀況:

左邊的狀況:

由於USB充電變壓器打算裝在左邊的卡片夾空間, 所以觀察左邊的狀況, 發現並不是完全空的, 中控台有塑料用來讓剛才拆掉的置物盒卡住. 這讓我原本想直接將USB接口鎖到置物盒的計畫受阻, 因為我不想除了將置物盒開孔以外, 把這個中控台上的塑料也開孔, 所以改變計畫, 打算直接將USB線穿出到置物盒上:

手指頭從音響空間那邊可以伸到置物盒空間附近, 屆時就是將USB線 和接地線從這邊穿過去:

置物盒拆下來, 並且擬定作戰計畫之後, 回到工作室進行開孔加工:

後面:

側面:

前面:

這次的主角, 露天買的USB變壓充電器, 可以將汽車電瓶輸出的直流12V轉5V, 並且由USB接口輸出給USB設備充電:

變壓器上面的貼紙, 12V轉5V, 而且"號稱"有瞬間最大3A輸出的能力:

下面是這次的配角, 一樣是露天買到, 汽車/機車用繼電器, 用來將原本常通的汽車音響電源改成鑰匙啟動通電:

上面的印刷說明這個繼電器導通時可以承受流過12V/40A的能力:

一併買了接頭:

指揮挺組合, 將接頭插上繼電器. 這裡有個重點, 就是四個pin接出來的四條線, 到底哪條是電源, 哪條是地線. 控制端呢? 我查了很多網路上的訊息, 發現答案並不一致, 不過用電表量過確定. 重點把握:

 - 基本上左邊兩條(下圖的紅線和黑線)是"被控制"的電源端, 右邊兩條(藍線和白線)是"控制端".
    在我這次的應用上. "被控制端"是音響電源, "控制端"是從上次裝的延時繼電器來的12V電.

 - 至於究竟電源線和地線是接上面還是下面, 其實答案是: 無所謂.
    因為繼電器內部是靠"控制端"的電去讓電磁鐵吸住, 而讓"被控制端"的電通電. 所以"被控制
    端"無論是電源線在上還是地線在上, 電磁鐵導通後都可以通電. 而"控制端"也是一樣, 無論地
    線在上還是在下, 只要有壓差有電能夠讓電磁鐵吸住, 就可以讓電磁鐵作用:

接下來先做一條地線, 這條地線屆時會接到之前看到的製物盒下面的兩個六角螺絲其中一個, 作為搭鐵接地:

壓起來:

用熱縮套管保護起來:
 


接下來置物盒開孔, 先畫好USB接頭能通過的大小:

用小電鑽鑽孔:

多開幾個:

努力用銼刀擴孔之後, 開成這樣的大小, 讓USB接頭可以通過:

回到車上比對一下, 我特別從置物盒上開好的孔穿過來做一些記號, 可以看到如果要將USB接口直接鎖到置物盒上, 則中控台上的塑料也要開孔, 而且可能會影響置物盒安裝卡入. 所以決定中控台不開孔, 而是將USB線穿到置物盒上:

把剛才作的接地線鎖到六角螺絲上, 當然需要動用合適的六角板手:

這裡可以看到接地線(黑線)從上面穿下來的樣子:

USB變壓器上場, USB接口已經先用絕緣膠布包起來:

將平板電腦的充電線穿過置物盒, 我這裡剪了一塊熱縮套管用來貼在置物盒上的口擋住空洞:

USB線穿到下面音響和置物盒的空洞:

接下來剝開音響線接好的音響電源, 這條線源頭是保險絲盒, 通過上次裝的延時繼電器, 到達音響:

用筆刀剝掉熱縮套管:

露出電線:

接下來把繼電器放進左邊空洞, 並且把四條線穿到音響這邊, 這個舉動是讓我們先測測看, 確定OK之後再將四條線移回左邊的空間:

把原本POLO車上的音響電源(被音響電封印那條)接到繼電器的"被控制端", 而從音響上拆下來的那條有延時的線則接到繼電器的"控制端". 至於地線可以都拉到同一條接地線(從六角螺絲下來那條)上:

繼電器接好後先別急著用熱縮套管封上, 先用電表測測看, 把車子啟動後看看15秒後繼電器電磁鐵會不會導通:

電表測試影片, 注意在啟動前是0V, 鑰匙啟動後15秒可以量到12V, 證明安裝的繼電器是OK的:



測過之後, 正式將地線和延時繼電器那條電源從後面穿到左邊的空間:

原本繼電器的"被控制端"線不太夠長, 接長一點才能從後面穿到音響那邊:

OK, 一樣從後面的孔穿過去:


穿到音響那邊, 準備和音響的電源線接起來:

拉出來看更仔細:

和上方置物盒的相對位置:

OK,  接下來把USB電源也接上來, USB電源的輸入端12V也用同一條從延時繼電器(源頭是保險絲盒的取電器)來的電, 所以和繼電器的"控制端"是共用同一個電源, 當然接地也可以共用從六角螺絲接出來那條. 所以成為下圖, Y字型接法, 將"延時繼電器", "USB變壓充電器", "繼電器控制端"三條線接在一起:

大致OK了, 將繼電器和USB變壓器塞到左邊的空間中, 再用卡片夾蓋起來, 有些擁擠, 但是放進去蓋上沒問題:

OK, 剩下的接地線或者其他線不想用, 就像這樣彎起來:

然後用熱縮套管封起來避免短路:

大體完成了, 可已將之前從上面置物盒穿下來的USB線接到USB變壓充電器上:

終於差不多了, 把音響開始推回去:

把下方置物盒插回去對對看, 發現無法推到最底卡住, 應該是電線沒整好:

重新觀察一下, 發現原來底部有一個圓形的卡孔, 置物盒後方的卡筍應該卡到這個孔中, 孔被電線擋住了, 將電線排除到旁邊:

OK, 這次順利壓到底了:

把面板裝上去, 左邊的卡夾也裝回去, 至於環保漆也沒辦法管了, 既然都掉漆了那就更要成功達成原本要的成果: 音響接回原本電源以及USB充電:

把Fonepad接上去, 車子發動後USB通電看來正常, 出現充電圖示:

把Fonepad開機, 安裝耗電程式觀察, "初步"看起來OK:


但是出車跑一陣之後, 發現有點怪怪的, Fonepad開機搭配GPS以及螢幕耗電, 發現我裝的USB充電器沒辦法供給足夠的電讓Fonepad邊充電邊用.
看下圖的耗電量是還沒啟動USB充電時的照片, 當然耗電是負的, 代表是從電池吃電:

車鑰匙啟動後打開USB充電開一陣子, 發現勉強可以邊用邊充, 但是充進電池的電很少, 幾乎打平, 而這時候GPS和Google導航都還沒開勒 :-(

上網一查, 發現有人說有些平板的USB充電器中間兩條Data pin 是導通的(PS: USB接口的四條pin: 5V電, D+, D-, 地線), 平板藉此得知是否是從他們提供的充電器充電, 如果平板是發現兩條Data pin導通, 這時候才會拉超過0.5A以上的電來給平板充電. 這個機制是用來保護: 如果充電源是從電腦的USB口, 則依據USB規範不應該消耗超過0.5(500mA).

為了證明, 我剝了一條不用的USB線:

把中間兩條Data線剪掉, 讓電表可以量是否導通:

插到Fonepad原廠的USB充電器一量, 發現果然中間兩條Data導通, 證明Fonepad確實是靠Data線導通來決定是否拉超過 500mA的電來充電:

回到車上再測, 沒有插充電器時Fonepad開啟GPS和Google導航, 耗電大約是這樣:

兩條Data線沒有short的時候, 可以看到大約是拉500mA的電去充, 甚至不到:

用了簡易型的USB電表, 發現只拉了 420A, 這當然就沒辦法讓Fonepad邊用邊充, 而且也沒有使用到原本我安裝的USB車用充電器的2A到3A極限:

關掉GPS和Google導航後, 螢幕開啟時勉強充一點電進電池:

再看一下USB電表, 依舊420mA, 可見光是待機螢幕開啟就耗掉不少電:

輸出電壓是 4.998V, 正常, 在露天上買了已經有人做好的Data線short轉接頭, 就是下圖白色的那個, 很便宜, 如果不想自己剝USB線加工把兩條Data焊起來, 可以用這種轉接頭:

看! 簡易USB電表已經顯示Fonepad拉超過0.5A的電, 已經用 1.13A 在充電:

回到Android耗電軟體, 可以看到沒開GPS和Google導航, 已經可以充 972mA到電池:

開了一些功能, 下降一些, 後續開了Google導航, 仍然可以順利充電, 抱歉沒有照片, 不過加上白色轉接器讓Data線接起來之後, Fonepad平板就可以順利邊導航邊充電了:

下面補一下USB電表和Data線short轉接器的照片. 價格都不貴. USB電表的用法很簡單, 往需要測量的USB孔一插就可以了, 電表的另一端就串接任何你想量測的USB設備作為loading, 它會輪流show出電壓和電流:


下面這個影片是整個安裝之後的狀況, 音響, 行車紀錄器, Fonepad平板三個設備的供電都是在鑰匙啟動後15秒開始供電. 音響和行車紀錄器開啟, 而Fonepad也開始充電:

終於最後有達到預想的功能: 音響接回POLO原廠的電源而且有15秒延遲, 接了USB充電線在上置物盒給Fonepad作導航時充電. 一切看來完美. 

至於環保漆, 唉~~~ 不管了!!!