發表文章

文章總列表

ESP32做汽車封包紀錄器

圖片
緣起 我手邊的CAN Bus工具很難用,做實驗很痛苦;我想根本解決一些問題 遠端分析:去地下室分析得餵蚊子,我想在家裡幹活兒 容易操作:操作Linux連我都嫌麻煩,我想點web網頁 常駐車上:樹莓派的耗電太高,MCU能達成uA等級待機耗電 萬丈高樓平地起,先用ESP32可以上車紀錄數據,後面還有很多事能做 硬體設計 藍色電路板是ESP32C3開發版,跳線接綠色電路板CAN收發晶片;背面放Micro-SD卡插座,加上OBD2接頭,硬體原型就做好了。電源暫時用USB-C,之後再考慮從OBD2拉電 CAN BUS ESP32的CAN bus 我搞過,CAN封包導入 資料紀錄器 ,很快就能錄數據,以及轉檔。讓樹梅派用極速送出50000個封包,數值遞增,確定沒掉任何封包,紀錄器就搞定了 上車實驗 把ESP32板子上車紀錄,照影片按遙控器,按兩下鎖定,等一下,再按兩下鎖定。我們要在汽車網路上找到關鍵封包 VOLVO車的封包格式長下圖,VOLVO沒公開定義,我也看不懂 逆向工程來找吧,上圖can1 xxx 三個數值是ID,可以看成是資料分類。最早用EXCEL分析 把上圖導入EXCEL,照ID分類,找出unique封包,並且計算出現幾次 我們按遙控器四下,找出所有出現4次的封包 然後用Linux的candump錄下封包,搭配grep肉眼仔細觀察 上述流程後來變成自製工具,把Log塞入網頁,為每個ID繪圖 畫出一堆圖,下面這個圖四個點不就對上遙控器手勢?AI說這招是 資料指紋化 ,不關心意義,只關心 資料變了嗎 ,以及 變成哪種狀態 實際狀態 實際做實驗還是得吃苦的,掙扎一個小時沒錄出來; 先鎖車 再實驗呢?到車外餵蚊子,再掙扎一下才錄到這些信號 效能優化 轉檔有夠慢,10000個封包紀錄檔392KB要22.3秒 修改軟體架構反覆做實驗,這個例子最後優化到1.48秒,大概15倍加速,堪用了 效能基準線是22.3秒 加大檔案讀寫緩衝區,效能變超爛( 217.42s),9.74x 因為呼叫fseek()讓緩衝區作廢,更大緩衝區等於讀更多資料丟掉,傻了 避免呼叫fseek()( 2.33s),0.1x 整併兩次fread(),加速字串處理,調整SD卡參數(1.48s),0.066x 結語 連上網的開發工具,用起來真的爽!後面還能繼續搞事 加一顆電池,常駐在車上 把封包導向遠方,讓我在家裡,...

ESP32做通用資料紀錄器

圖片
緣起 在 ESP32上架網站 , ESP32操作SD卡 ,再來要打造紀錄器,就是開檔把紀錄寫入SD卡 我想錄汽車CAN封包,樹梅派耗電略高,丟車上有疑慮,用MCU會比較省電;這個解完能錄腳踏曲柄的動態,到時候來學神經網路;一魚多吃,做個通用的工具,到處用 主畫面,可以點連結開始記錄 記錄檔管理頁面 錄下的LOG能當場看,下載,或是移除 文字LOG,可以直接顯示 通用資料紀錄器 WIFI晶片加上SD卡,能做各種應用;錄完直接透過WIFI取資料,不用讀卡機 放車上,記錄汽車封包 放單車曲柄上,紀錄加速度感應器,拿來學習神經網路 放機車上,錄製電瓶的電壓 放貓吉身上,看他每天睡多少 ... 不就只是fopen + fprintf()? 起初確實這麼想,然後越來越不單純 通用的格式 存各種資料 紀錄櫃台(task)配備大緩衝區(16KB),資料可以丟了就跑 紀錄櫃台(task)從緩衝區讀出數據寫SD卡;資料不做任何轉換(花時間)直接寫;批次寫入(4KB),避免頻繁寫入掉效能 轉檔(task)把 通用的格式 轉成文字給人看;CAN封包會轉成Linux的candump的格式,串接別的工具 通用的格式 日後可以轉成任何形式 必須簡單易用,網站醜也比破爛的按鈕好;比敲指令舒服 架構圖 AI畫了架構圖,軟體分了不少區塊,多種顏色。不是簡單的fopen() + fprintf() 也許正文現在才開始 AI輔助設計 刻意用Google GEMINI AI進行輔助設計,學習不熟的東西 不熟FreeRTOS 不熟ESP32,包括SDK,開發環境 不熟網站程式設計 有兩種策略做設計,以前我選(1),這次刻意選(2),深思而後行 只管先做出原型設計,欠下大量技術債,之後靠多次迭代整理軟體 假裝自己是架構師,我的決定會影響100人,框架得一次做對(較少的技術債) 開發環境挑選 ,AI的意見好壞參雜,親身測試他的意見,用過去踩坑的經驗判斷好壞 大量的和AI工具進行討論,評估各種開發工具,組合,研究能否維護 研究需要開發那些工具,讓RD能做,也能讓remote debug可行 挑選的工具,在Windows/ Mac/ Linux都要能運作 如果有100人,我會開發模擬器能在PC開發;現實我是1個人,就省著吧 架設網站 ,用AI學不熟的技術,因為基礎範例網路很多,品質不是問題(先評估可靠度)。AI當家教...

微雪電子,PL2303 USB UART Board V2評測

圖片
緣起 上次寫了一篇 USB-TO-UART雜談 ,裡面提到我採購 微雪電子PL2303轉換板 。我也來評測3C用品吧 獨立的序號 Silicon Labs每條線都能單獨設定序號, 工具在網頁上任人下載 ,大氣啊!我手上三條設定1/2/3,在裝置管理員看得到,看起來是16bits 旺玖的PL2303工具,用裝置管理員看上去,每條都有獨立序號;好,有序號確實在windows亂插都不會亂長COM port DYBNB135B02 DBDCB116L16 旺玖的工具找不到 PL2303 datasheet ,PL2303GT OTPROM Writer utility program是存在的,AI工具說得一副可以下載(Google GEMINI),卻沒有。大概只有旺玖的客人有,沒能公開下載。不過如果PL2303真的是OTP(One Time Program),只能寫一次,有工具我也不敢用 這可能也反映實作差異,CP2102是embedded flash,PL2303大概是antifuse(反熔絲),不能反覆寫入 微雪PL2303 UART Board V2評測,機械結構 PCB自帶兩根柱子,插在筆電上能自立自強,是深思熟慮的設計 效能 ESP32-CAM下載,搬545868bytes的效能 460800, 13.6s 921600, 8.8s 2000000, 8s 4000000, 7.2s 首先PL2303可以跑上4Mbps(CP2102只能跑921600),可以用杜邦線;速度拉升並沒有顯著縮短時間,大概ESP32得解壓縮並寫入Flash,所以傳輸速率加快,時間還是差不多 務實的甜蜜點是921600,這個速度也不用擔心信號品質 缺點 PL2303G在Mac/Windows都沒內建driver,還得另外下載。不能無腦用,感覺差了點…… 結語 微雪這條線,有很好的機械支撐,性能穩定。我已經改用他了,非常滿意 他有機械的支撐,站得很穩 PL2303都有獨立序號,不會亂長COM PL2303能跑上4M,可以做高速logging

ESP32的HTTP server

圖片
緣起 ESP32C3有WIFI可以用,他的SDK裡面也自帶HTTP服務器,在裡頭架個網頁,瀏覽器就是單晶片的虛擬儀表。虛擬儀表能任意調整,增減元件,非常好用 顯示資訊,本來要OLED螢幕,現在有大片的瀏覽器 操作按鈕,本來要實體按鍵,在網頁放超連結,或輸入表單就有 HTTP通訊協定 Mozilla Developer Network 介紹HTTP非常清楚。瀏覽器和ESP32主要靠GET/POST兩大命令 GET GET /  抓index page,也就是首頁 GET /?led_op=2 抓index page,同時傳遞led_op=2(代表閃爍) GET /led_toggle 用某個講好的名字GET,連線到這裡就閃爍LED POST POST /led_post 用某個講好的名字,然後再傳遞led_op=2 "telnet"命令能和遠端主機連線,輸入會原封不動送給ESP32,回應也看得到。所以上述所有命令都用telnet實驗一輪,確定會動,換成瀏覽器也會有信心 HTTP通訊協定,標準的GET telnet連接板子的port 80;直接下GET命令,確實看到回應。綠色框框顯示虛擬儀表 HTTP通訊協定,標準的GET帶參數 模擬GET命令後面的路徑,後面接問號加key1=val1&key2=val2額外加上參數 get /? led_op=2  問號後面的代表設定led_op變數為2 我定義led_op=2代表toggle,亮燈變暗燈,暗燈變亮燈,下面範例能讓LED閃爍 因為是GET /,所以照樣顯示原本的頁面 HTTP通訊協定,GET /led_toggle 在ESP32韌體設定/led_toggle這個路徑,連進去韌體讓LED閃爍,並且通知瀏覽器導向回/ GET方式(上面三種)像寄出明信片,基本上都展現在GET後面的字串,可能是指向不同resource,或是加上?led_op=2傳遞額外參數 HTTP通訊協定,POST POST傳輸實況如下圖,大紅框是信封,信封帶上各種meta資料,裡面最重要的紀錄是"content-Length: 8"。然後小紅框才是信件內容把led_op=2八個字元。手敲整個HTTP header不大容易, 黑暗執行緒 的建議,從Chrome的後台直接複製一份來做實驗最快 ESP32收到HT...

ESP32開發環境,雜談

圖片
緣起 因為想學神經網路,做中學最快;我想紀錄曲柄的加速度和角速度,用神經網路判斷坐著或站著踩。這個應用顯然沒商業價值,感受一下神經網路的威力 Arduino NANO BLE 33 是很多EDGE AI都支援的開發版,資料標好丟 Edge Impulse 訓練神經網路,感受一下 不過BLE33插著USB記錄數據,可能線會被扯斷,這樣不行 我需要無線紀錄,ESP32C3我有10片,上頭有WIFI和SD卡,資料採集完存在裡面,再透過WIFI下載不是挺好的?來做吧;怎麼從NANO BLE 33拿到資料,後面再說吧 先前玩過的 ESP32C3我當一般MCU玩了一輪,結果無線傳輸我沒碰(笑) ESP32(10) CAN Logger功能驗收 ESP32(9) Low Power-2 ESP32(8) Low Power ESP32(7) 打通SD Card ESP32(6) CAN Transceiver 挑選心得 ESP32(5) 打通CAN Bus ESP32(4) ESP32-C3搭配Arduino ESP32(3) Visual Studio Code + PlatformIO開發環境 ESP32(2) ESP32-C開發板硬體簡介 ESP32(1) 閒聊 這次要玩的 用酷酷的AI工具輔助,在ESP32 SDK點亮WIFI,跑起HTTP SERVER很簡單(SDK都有) 開發工具閒聊 好,這次我應該用哪套開發工具?選擇不少 Arduino VSCODE + PlatformIO VSCODE + 樂鑫插件 樂鑫 Eclipse ENV Docker build environment Arduino 我打定主意用SDK,先排除Arduino VSCODE + PlatformIO PlatformIO運作正常,用起來很爽;他的Debugger就是該有的樣子 PlatformIO多封裝一層介面,包住SDK,用起來怪怪的反而難除錯,因為得同時看兩層;另外樂鑫並沒有 官方支持 ,我在這個層次有點疑慮 Anyway,因為上次用過,這次就決定不用了(我想試試看別的口味) VSCODE + 樂鑫插件 PlatformIO用起來真的舒服,樂鑫插件還是差了點,不過邏輯也算容易理解 C:\Espressif\SDK (SDK source code) C:\USER\[name...

USB-to-UART 轉換器,雜談

圖片
緣起 嵌入式開發,MCU一般會開UART port和外界打交道。一般會接顆USB-to-UART晶片。這種爛大街的晶片,也有些有趣的事能寫 爛掉的PL2303HXA 我想買幾條能上12Mhz的高速UART線,這個線給了我有趣的驚喜 歷代PL2303晶片集 解決上題的辦法 PL2303是台灣旺玖科技的產品,第一代2000上市應該很紅,人紅就有盜版IC!盜版貨用原廠driver,超不爽啦;這顆IC一共出了六代,初期的IC確定停止供貨後(代表市場上全部都是盜版IC),他們讓新版driver完全廢掉,裝置不能用! 這是很絕望的商業策略,盜版IC當場死一片;我上網查,社會大眾給旺玖的評價是:驅動品質不穩,我只能說這種焦土戰非常少見 WINDOWS COM PORT長不停 這種線在Windows體驗很爛,同一條線,插不同USB孔會長出不同COM PORT;常常得去裝置管理員看COM PORT編號。台灣的 萬平科技 的 說有辦法解決 ,他們有獨門秘方 我問AI工具,COM port為什麼長不停 Windows需要 每顆IC序號不同 ,才能辨識每一條線。在USB剛誕生的年代(1998),IC要儲存序號得外掛一顆EEPROM才作得到,這個會增加成本。如果沒序號,微軟只好用USB孔的位置區分這些線,於是同條線插不同孔長一堆COM port,體驗爛死了 旺玖PL2303GC(第六代)已經內建Embedded Flash,可以出廠後每顆刷不同序號;技術進步也把Crystal包進去,這顆長壽的IC還見證無鉛製程的轉換 台灣萬平科技可以幫客人跑燒錄軟體,幫每條線設定不同序號,讓使用體驗好很多。所以這件事也算是加值服務,給客人好的體驗 PL2303GC at 2026 在2026年要買這種線,我會推微雪 PL2303 USB UART Board V2 ,旺玖第六代IC,可以切換電壓3.3v/ 5v;如果jumper不接,中間的pin給他灌1.8v,UART位準就變成1.8v了!這種自由度簡直是UART-to-USB的神器。因為現在IC的電壓越來越低,外灌邏輯電壓的位準就很重要啦 CP2102 Silicon Labs CP2102也是常見的轉換器,這個IC crystal less比較難做,定價也高(賣得貴),比較沒有仿冒IC(一般挑量大的)。因為它幾乎沒仿冒品,Driver也常穩定,品質很可...

Lenovo T480s 改裝小紅點

圖片
緣起 最近研究Lenovo X1C筆電,發現小紅點竟然有改裝品,這篇介紹我買改裝品的心得 LKY SoftRim(我買這個) Lenovo X1C Gen13 開箱搭配改裝小紅點 三種小紅點介紹:Classic/ soft dome/ soft rim 自製softrim使用心得 LKY Softrim 專案首頁 日本製小紅點(這個之後再來買) 使用心得 購買網站 LKY SoftRim 自製小紅點一顆500元, 作者解釋 ,改裝件大幅提升體驗,不用再帶滑鼠,收費合情合理!我覺得貴,不過我賣 VOLVO+ 也是以用戶價值來定價。既然作者有自信,三個尺寸我都用得上,就各買一顆來體驗 Thinkpad T480s (SLP) Thinkpad X1C GEN7 (3mm) Trackpoint keyboard II  (LP) 改裝件裝上筆電 改裝件 vs. 原裝貨 使用心得 橡膠件用久會塌,施力範圍確實小一點;新的3D列印件非常有韌性;我剛用沒多久,但是應該很耐用。我期待會一次性的購買,不用再買 他的結構是一個凹洞,手指施力的面積大很多,確實更容易施力,移動流暢 用上改裝件後,小紅點使用頻率大幅提升!一句話:好用 結論 如果你也用ThinkPad,花500一次性提升小紅點效能,這個交易不會差,我試的結果也不錯。日本也有玩家做好來賣,價格漂亮許多。我這顆如果沒壞,大概也不會再去買一顆來折騰了 這顆改裝件換掉時,我會更新這篇文章,紀錄他是什麼時候壞

解析Garmin FIT file,計算累計里程和累計高度

圖片
緣起 以 東三塔規劃表 為例,大會有檢錄點,我們有休息點,把他們全部塞入試算表。要估算時間,得猜 平均速度 , 我的方法 簡述如下 距離 :絕對里程相減,簡單 爬升量 :累積爬升量相減, 麻煩 坡度 : 爬升量 / 距離 平均速度 : 平地速度 - 坡度 * K ,騎一趟觀霧可以估算 這篇要解決 累計爬升量 ,我想要有一份軌跡檔(FIT),計算出每公里的資訊 預期的產出 假如弄得到軌跡檔(比如我自己的FIT檔),我就能算出下表,這樣規劃路線就是查表而已 累積里程 海拔高度 累計爬升 經緯度 上表做圖,看得出蘇花公路120~200,爬升1000,可以用來分配體力,安排休息點 解析FIT檔案 Garmin FIT檔可以用 fitfileviewer 閱讀,“record”是單車碼表運作的依據,每一秒的經緯度,心律,功率,踏頻,高度,左右腳平衡,blah blah。這裡只需要 時間 經緯度 高度 不同廠商的碼表,紀錄邏輯也不同,寫軟體處理相容性問題,也是非常有趣 Garmin/ Wahoo:每秒紀錄 Bryton/ iGPSport:有變化才紀錄 假如上面的資訊完全沒誤差,計算每秒之間的移動距離,和爬升量,得到 delta_distance[n] delta_altitude[n] 累加上述參數,就有每秒鐘的絕對里程,累積爬升量。最後再查表,問題就解完了 累計距離=1km,經緯度,累計高度,海拔高度 累計距離=2km,經緯度,累計高度,海拔高度 處理誤差 真實世界感應器都有誤差, GPSVisualizer 提供兩個完美教學,解釋如何修正誤差 修正水平誤差 (Smoothing & Simplifying Tracks) 修正高度誤差 (Calculating elevation gains) 核心概念很簡單,水平和垂直處理的手法,基本上是一樣的 假設第0點是有效參考點pt[0] 計算distance(pt[1], pt[0]),小於5公尺,pt[1]當成雜訊丟掉 計算distance(pt[2], pt[0]),超過5公尺,pt[2]有效並當成新的參考點 計算distance(pt[3], pt[2]),... 得到里程表 所以FIT檔照以下順序處理,就有里程表 水平過濾 垂直過濾 剩下的點,計算累積距離,累計爬升,得到表格 {時間,里程,高度,累計爬升,經緯...

EXCEL好用的函數:LET,在公式裡宣告local variable

圖片
緣起 我覺得EXCEL大概有兩個使用情境,我的體感大概比例約99%:1% 用過即丟,隨便做一做 嚴肅的使用,算的結果得超級可靠 我的同溫層(工程師)普遍不信任EXCEL,需要可靠的情境,大家會問:為什麼不用Python。這代表現代工程師普遍會寫Python;在15年前可能有人想用Perl,當年我自學Python2,現在已經是Python3了 扯遠了,既然EXCEL就裝在那裡,如果稍微 多做一點 ,免費提高可靠度,不香嗎? (正在努力學習的貓吉) EXCEL二維查找 我解過兩次EXCEL二維查找,我們用這個來討論EXCEL維護問題 2021年 2025年 2025年版的最後公式如下,裡面的LET函數只要多做一點,就能大幅提升EXCEL可讀性 第一個版本 二維查找得呼叫5次EXCEL公式才能實作,寫成下面那樣,三個月就沒辦法維護了 INDEX()呼叫3次 XMATCH()呼叫2次 第二個版本 儲存格裡按ALT+ENTER適當把公式排版一下,分得出INDEX()幾個參數就能大幅提高可讀性。過了三個月也許得查一下INDEX()定義,不過這個版本我有信心維護 第三個版本 EXCEL如果能在公式裡加入註解,比如第二版改成下面這樣,可讀性就好很多;像EXCEL這種有悠久歷史(包袱重)的軟體,機率不高啊 INDEX(     /*tbl*/ C17:E19,     /*row_idx*/ XMATCH(...),     /*col_idx*/ XMATCH(...) ) 雖然不能加註解,微軟團隊還是提供了LET()函數,能用容易理解的方式編寫函數!我們能宣告區域變數row_idx/ col_idx,然後在最後的運算,用有意義的方式讓人理解。這樣閱讀時,能一個一個區塊研究,也能在隔壁儲存格實驗每個變數的意義 為了半年後我還記得,我寫這篇BLOG讓我記得LET()做什麼 第四個版本 最後一個版本就是 2025年的二維查找 ,公式放到NAME MANAGER,避免複製貼上 情境是這樣的 整欄儲存格,都要第三版公式,EXCEL拖一下就複製完公式 也許某次改了公式,公式一拉,某個儲存格漏掉了 有些儲存格是舊公式,有些是新公式,然後查問題找得懷疑人生 寫軟體有所謂的DRY原則(Don't Repeat Yourself),避免把某個...

EXCEL表格二維陣列查詢 2025

圖片
緣起 最近又要用 EXCEL表格做二維陣列存取 ,之前用VBA搭建,想試著不要寫CODE。在2025年問問AI有沒有更好的做法 GROK AI給我的回應 GROK AI回答唬爛的傾象嚴重,不過我猜,微軟應該是有收過這個抱怨(起碼我很不爽) GROK回答的第一句我完全認同。我很確定網路上的EXCEL教學都比我聰明,這些範例他們扛得住,我卻受不了... 受不了的人自己找出路 GROK AI給的解法 GROK雖然很會唬爛,但是下面步驟是真的可靠,確實可以用 這段code要貼在NAME MANAGER,我留著當筆記 =LAMBDA(tbl, row_key, col_key,     LET(         row_idx, XMATCH(row_key, INDEX(tbl,,1), 0),         col_idx, XMATCH(col_key, INDEX(tbl,1,), 0),         INDEX(tbl, row_idx, col_idx)     ) ) 測 試看看 先展示結果 用Get2D台積電股價,這個複雜度我受得了 用組合技查中華電信的資本額,嗯... 結語 2025年版比2021年舒服多了,以後我用EXCEL,都會先開這篇文章,加一下公式 這個解法比 2021年 使用VBA更好,開啟VBA經常會遇到安全性問題,這招不會