2018年3月29日 星期四

網友來信: Raspberry Pi 可以取代工業嵌入式系統嗎?

最近有位網友看了「談 Raspberry Pi:台灣人你又搞錯了!」這篇文章之後,寫信跟筆者說,Mxxx 最小型的嵌入式系統也要 NTD6000 起跳,真是太貴了!但如果樹梅派、香蕉派這些這麼便宜又功能強大,那我是不是可以包成商品來賣?

拜託,Mxxx 不賣你 NT$6000 起跳,他們 6 個月年終怎麼發得出來?哈哈哈~

以筆者跟 Mxxx 的恩怨,看到 Mxxx 被樹梅派搶走訂單真是潮~爽~的。但是如果真的有讀者被筆者說服花錢搞下去,然後結不了案被業主罰錢被業主告,那筆者就罪孽深重了。

所以這邊還是要講一講假如你真的這麼幹了,需要承受哪些風險?

訊號隔離

n 年前有人拿 8051 加上隔離輸出入板拿到工業環境上用,換到今天那 rpi 好像也沒什麼不可以?事實上淘寶可以找到一堆可以用三菱 GX-Developer 編程的山寨 PLC 工控板,上面不少都是 ARM SoC,甚至聽說還有公司山寨三菱山寨到股票上櫃上市,我想日本人應該氣到吐血吧wwwww

不過 rpi 上除了 GPIO 要隔離,Ethernet 也要隔離,USB 也要隔離,搞不好 HDMI 也要隔離?

這樣太花錢了,那只隔離需要的 IO 行不行?當然可以,不過隔離元件有分速度的,越高速的越貴,你要用哪種?光隔離還是磁隔離?...還有你要找誰幫你設計隔離輸出板?找誰 layout?洗板子最少一次要洗幾片?打件的費用怎麼算?客人要求你產品通過 CE FCC 怎麼辦?這些都是純 coding 的人沒想過的問題

所以假如你真的想這樣玩,請先問問你的硬體工程師朋友這樣玩成本要多高,如果沒有硬體工程師朋友,趕快想辦法認識一個...

2018/04/12 Update:
一個 rpi 工業隔離輸出入板(點我進入)
2018/04/14 Update:
如果您想 DIY 隔離輸出入板,可以參考林伸茂先生所著 8051 單晶片實習篇第 12 章

電源

這裡不是要講要怎麼供電給 rpi,而是如果突然把插頭拔了,你的 rpi 會不會跟著 gg?

有經驗的人都知道 rpi 不能隨便把插頭拔掉,要先下 poweroff, halt 等指令或透過 GUI 關閉 rpi,也就是說 rpi 操作上像 PC 而不像一般的嵌入式系統。

一般的 Embedded Linux device,通常 bootloader, OS kernel, root file system...都是 read only。除非更新 firmware、系統設定...否則 NOR/NAND flash  不會有變化,也就是硬體如果允許,突然把插頭拔掉也不會出事。

那像 data logger 之類的東西怎麼處理?很簡單,請客人自己買 SD card 回來插,而且細心點的廠商還會在 SD card socket 上加蓋可以鎖螺絲。

但 rpi 把 boot loader, OS, user app/data 全放在 SD card 裡,系統啟動時成千上百的 daemon/process 在背景執行,你也很難知道哪些 daemon/process 在每次關機前要把資料同步回 SD card,或是這些 daemon/process 在開機時就會往 SD card 裡寫東西進去,而 rpi 開機時如果把插頭拔了會不會 gg?(筆者自己就發生過好幾次不小心把插頭拔了,然後得重灌 SD card 的窘境)

有沒有解法呢,一種是用軟體來解決,例如有一個 rpi OS 分支叫 moebius,移除了 GUI,而且只需要 128MB SD card,開機速度加快,號稱可以給 IoT 設備使用(但把插頭拔掉會不會出事?筆者沒看到相關測試數據)。

還有一種軟體解法,就是在背景定時下 "sync" 指令,筆者真的看過有人在 x86 IPC + Ubuntu Linux 這樣幹過...是沒聽說有發生什麼事,不過這個週期要多久呢?一分鐘?30秒?對某些應用場景來說最後一分鐘的資料不見也是很嚴重的事喔!

第二種就是靠硬體,下面是筆者能想到/找到的一些解決方案:
  1. 電池供電
  2. 製作可安全關機的按鈕
  3. 超級電容
以 rpi 功耗來說方案 1 通常不是拿來做主電源長時間供電,而是當作 UPS 來用,市場上不乏這樣的套件,這些套件會附上範例程式教你如何去偵測現在是靠電池供電還是吃市電。不過這個解法要考慮環境工作溫度與水氣,畢竟大家都看過太多鋰電池爆炸的新聞了。

方案 2 就是模擬 PC 的行為,大家都知道現在的 PC 電源鈕要按住一段時間,然後 Windows 會偵測到接著進行關機。筆者找到了 ATXRaspi 這個產品,簡單來說就是模擬 PC 的行為,按下按鈕時不會馬上關機,先用 GPIO input 通知 rpi,然後 rpi 趕緊把該關的程式關一關 poweroff。這個方案的問題是對比一般市面上的 Embedded Linux device 顯得不倫不類,自己用還可以,如果包成商品賣出去跟客人講你要先按著三秒才能安全關機...人家會覺得你這設計有問題吧?

方案 3. 是筆者找到最厲害的一種,簡單來說就是利用超級電容放電的時間趕緊把資料存一存(當然還是要透過 GPIO 跟 rpi 通知一聲),也沒有鋰電池會爆炸的問題。從視頻來看這個方案的缺點就是會延長開機時間(因為電容要充電),不過筆者之前跟某網路設備公司談過,他們認為網路設備不會常常開開關關,所以可接受較長的開機時間。不過不巧的是筆者看到村田製作所聲稱如果超級電容要用在攝氏 50 度以上的場合要另外跟他們聯絡,筆者也沒在工業嵌入式系統上看過超級電容,不過這可能是最接近完美答案的解決方案。


就算電源問題解決了,但 SD card 在 rpi 上是個該死的可動部件(所以人家才要加蓋阿),對比之下 BeagleBone Black(BBB), LinkIt Smart 7688 的設計就合理多了,把 NOR/NAND Flash Rom 焊在板子上才是王道,要存資料就另外插卡。

下圖是筆者心血來潮做的小實驗,輸入 poweroff 之後 rpi 用電的變化

Before


After


一點補充

既然談到了電源,一般工控產品電源輸入大多是 24VDC-48VDC,要不然就是 110-220VAC,以筆者的印象前者最常見,而且就有經驗的人表示,統一用一台 24VDC 輸出的電源供應器供電,供電發生意外時燒這台電源供應器就好了,可以大幅漸少損失。

那 rpi, BBB, 7688 都是吃 5V,您得自行尋找 DC-DC converter,而且如果要上 din rail,必須要找軌道式的,強者我朋友推薦下面這種,不過筆者發現要找到 rpi 那種電流大到 2.5A 的很稀有,要不就是很貴...


這個有到 3A 帶隔離,不過價格就...


外殼

沒有殼能不能賣呢?其實淘寶上超多這種東西,用個熱縮套管,或是透明壓克力板上下包一包就出貨了,或者如強者我朋友,加個可以上 din rail 的塑膠載具就出貨了(如下圖所示),了不起絕緣漆噴一噴,把 IC 編號用黑膠給他蓋住或磨掉...好像也可以喔!?


(一個 rpi 上導軌(din rail)的例子)

當然上面這種方式,如果是走低價路線,或是包在機箱裡面還可以勉強接受,筆者跑過的工廠裡看過不少這種東西。但如果不想讓產品裸奔,一下子就被人家看出來你是 rpi, BBB, 7688 那該如何是好(不懂軟體價值的客人就會說你這硬體才多少錢包起來賣我那麼貴@#$&^&*...)?

筆者唯一能想到方式,也算是業界公開的祕密,就是去找一般俗稱公模的玩意,其實就是有幾家大廠的 PLC, Remote IO 佔有率超高,乃至於他門的山寨外殼到處流竄(也可能是從原本的模具廠流出)。筆者比較熟的像是研x的 axxm 淘寶上就一堆(搜尋亞當模塊盒),或是x門子小型 PLC S7-200 系列淘寶上可以找到一堆。

下圖是筆者從淘寶買的 USB 隔離器,跟 Remote IO 沒半毛錢關係也拿亞當殼來用



所以說當初要是什麼oo派之流有意攪亂一池春水,就故意把 PCB 設計的跟這些公模相容就好了,哈哈哈...

結論

以筆者來說,比較推薦使用 BBB or 7688,尤其是 7688,不但是國產,價格合理,而且有群登這樣的公司把他做成 SMD/SMT 模組,表示人家是要玩真的(其實間接直接聽到不少人拿來商品化)。

BBB 推薦的原因是因為上頭的 AM335x SoC 台灣很多公司採用,如x達,Mxxx,威x,x曜...一卡車的大廠小廠都使用這顆 SoC 做工控產品,用了不會吃虧,學了對找工作還有幫助呢。

如果有筆者沒注意到的地方,歡迎在下面留言...

4 則留言:

  1. 黃金電容本質上的特性規格的確是有溫度、電壓與ripple current上的限制,
    沒記錯的話,
    低溫時特性劣化也十分嚴重,
    不過這麼多年了,
    應也有改善了吧。

    不過沒關係,
    一個不夠
    就給它用二個
    XD

    只是這時老闆的臉色就......

    回覆刪除
    回覆
    1. 以前參與開發過的產品,就有利用電容放電特性抓緊那幾秒趕緊把 data log存起來,不過那個產品基本上不太耗電,像rpi這麼吃電關機又特久的就有點刺激了XD

      刪除
  2. 用OverlayFS,把系統唯讀化就好啦,掛這些東西不是很累嗎?

    回覆刪除
    回覆
    1. 不行拉,你這樣會害人家年終6個月變成3個月XDDDDDDDDDDDDDDD

      感謝您的資訊!

      刪除