ELM327 OBD-II 心得 (5) ,CAN BUS塞了爛裝置會怎樣
上一篇我描述Pi-WIRE怎麼發動中間人攻擊。這篇我想聊一下製作過程踩到的坑,分析在CANBUS掛上爛東西會怎樣。用這個故事分析OBD-II Dongle(ELM327,HUD抬頭顯示器)究竟能不能用,或著注意事項
我買了4個CANBUS收發模組,每片樹莓派都放WaveShare + Niren混搭。能省則省,所以我去淘寶都找便宜的買
用已經會動的東西(ELM327)驗證不會動的東西(Pi-CAR)是重要的技巧。樹莓派接上貪便宜模組,很快就碰壁了:
上圖是我的Pi-WIRE,在Linux底下顯示的CANBUS狀態。裡面有一些統計的資料可以看,比如RX/TX打多少,packet數目,error有幾發。放一個這種裝置到CANBUS上收集統計數據,可能也是某種有意義的指標吧
我買了4個CANBUS收發模組,每片樹莓派都放WaveShare + Niren混搭。能省則省,所以我去淘寶都找便宜的買
- WaveShare RS485 CAN HAT * 2
- Niren MCP2515 CAN Module * 2
- 貪便宜模組
用已經會動的東西(ELM327)驗證不會動的東西(Pi-CAR)是重要的技巧。樹莓派接上貪便宜模組,很快就碰壁了:
- 長封包必死
- ELM327送0902,其實會送滿8bytes:09 02 00 00 00 00 00 00
- 可以下ATCAF0讓ELM327不要塞滿8byte,變成短封包
- 短封包也不一定活
- 有時候一次OK
- 有時候會重傳
- 有時候就死掉了!
- 第一次傳送,ELM327送出0902
- 具體會送出0x7E8 [2] 0x09 0x02
- 0x7E8是工業規格,ISO 15765制定的要和CANBUS當好朋友都要從這裡開始
- 我手算過CANBUS信號,Bit stuffing是其中的眉角
- Bit stuffing:連續5個0會安插一個1;連續5個1會安插一個0
- 錯誤禎,貪便宜模組自我感覺不良好,要社會大眾等他
- 整個CANBUS停了40us
- ELM327等錯誤幀過了,重送一次,最後貪便宜模組給了回應,完成傳輸
貪便宜模組錯在哪裡?原來是石英震盪器不準,標示8M實際7.77Mhz!真的會吐血!便宜沒好貨,買開發工具回來修理我也是醉了。買新的16Mhz震盪器,修好貪便宜模組順便提升性能
親身體驗爛東西掛上CANBUS觸發錯誤禎與重傳機制也是種學習:
親身體驗爛東西掛上CANBUS觸發錯誤禎與重傳機制也是種學習:
- CANBUS上每個人都要監聽封包,是自己的就收下,不然丟掉
- 貪便宜模組因為clock錯了,自我感覺不好,送出Error Frame
- 整個CANBUS喪失40us
- 如果每次貪便宜模組都靠腰,整個CANBUS就會完全動不了!
貪便宜模組的石英震盪器是爛的,一定還有別的問題讓CANBUS無法運作。廠商一般會小心挑選零件,不過零件終究會老化,比如高溫頻率濾會漂掉。車主只知道車子怪怪的,定位問題點卻很難(修車師傅表示:電腦車很難搞)
CANBUS重傳機制能掩蓋小錯誤,某個東西(比如HUD)放上去看起來正常,但是他搞不好上去在某些場景會狂發Error Frame搞爛CANBUS
CANBUS重傳機制能掩蓋小錯誤,某個東西(比如HUD)放上去看起來正常,但是他搞不好上去在某些場景會狂發Error Frame搞爛CANBUS
所以我的建議是,ELM327拿來看錯誤碼可能還OK,長時間插在車上還是不要,很難保證他完全符合規範運作。車商花很多工夫驗證也不是笨蛋。我自己作完實驗,會盡量避免在OBD-II接口安插元件
話說回來,廠商究竟要怎麼保證他們的CANBUS運作正確?可能的做法是監聽CANBUS上面的Error Frame數目,在各種狀態下,都要保證這個數字是0。比如針對元件運作的溫度,老化分析。搞車用的零件,門檻真的高很多
上圖是我的Pi-WIRE,在Linux底下顯示的CANBUS狀態。裡面有一些統計的資料可以看,比如RX/TX打多少,packet數目,error有幾發。放一個這種裝置到CANBUS上收集統計數據,可能也是某種有意義的指標吧
留言