WebStick – 基於 ESP8266 的網頁伺服器棒棒
自從我看了 ESP8266 的 SD Web Server Youtube 教學之後,我一直都很想要自己做一個來玩玩看。你想想看,有一根可以隨身攜帶(?)、足夠便宜到可以送人而且能夠把虛擬的東西(網站)實體化,不是一件很有趣的事情嗎? 可是之前一直都沒有時間研究這個東西,其中一個原因是以前的焊接技術還沒足夠讓我可以直的完成這個 project,另外就是因為那個時候我對燒錄器設計還是沒有甚麼概念,導致到當我要做到跟一片 Wemos D1 mini 同等效能的 ESP8266 的時候,完全沒辦法好好的設計和焊接成成品出來。 開坑 早在 2018 年,我就已經買來了一片 Wemos D1 mini 跟超級難買的 SD shield 來當小型網頁伺服器。當時的我對網頁編程和嵌入式開發還是非常的入門,結果做出來的東西就是長這樣 Wemos D1 + SD Shield + 小容量 SD 卡 雖然是能用,而且我也把它用 USB 供電吊在我的桌面旁邊當作實驗品開發了一段時間,但是由於用的是別人的 code 加上當時我並不是太熟悉 Arduino C++ (和當時還沒有 ChatGPT),導致最後開發出來的東西不但不好看而且很難用 設計嘗試,失敗收場 之後一年我試著把這個設計弄成一片真正的電路板。由於當時我還沒有開發燒錄器的能力(特別是要想辦燒焊那兩個超小的 BC817 transistor),因此我的想法是先把 ESP8266 焊到板子上,再透過現成的燒錄器對它進行開發(見下面那一排燒錄用排針),然而後來我弄著弄著就覺得不對勁,而且這種每次都要插燒錄器才能寫東西的系統感覺開發起來就很麻煩,應該不會有人想用,所以最後還是沒拿來生產。 第一代的 ESP8266 網頁伺服器,最後沒做生產真是一個明智的決定 5 年之後,我終於做出了 WebStick 原型機 WebStick 這東西其實在我腦海中已經卡住很多年了。但是一直就軟硬體技術原因無法開坑。直到最近開始學會了 drag soldering 跟找到了一款可以讓我進行超精密焊接(但是缺點是一次性)的烙鐵頭後,我終於把這個封塵多年的 project 重新抓出來做。 首先:燒錄器 網上有很多不同的設計,有自動的也有半自動(燒錄的時候要按 FLASH 按鈕)。半自動的能省下兩顆 transistor 跟兩顆電阻,但是由於編程的時候每次都要按 FLASH 和 RESET 有夠麻煩,所以我在設計的時候便選擇了自動燒錄器。以下是我參考的設計圖: 燒錄器設計圖 但是這設計圖差了點東西,就是圖裡沒有標注到 GPIO15 應該要 PULL LOW。在設計電路板的時候記得把 GPIO15 經電阻(如 10k)接地,這樣 SPI CS 才能正常使用。 為甚麼我會知道? 這真是個他媽的好問題(被坑) 這顆電阻雖然不加也可以,但是會無法使用 SPI 另外這兩顆 BC817 的 routing 也弄得我懷疑人生,不過後來還是在板上 route 好了。 我都不知道自己當晚是怎樣發神經想到可以這樣 route 的,嘛總之能動就好了。 其次:SD 卡 ESP8266 有內置的 SPI 針腳可以用來讀取 SD 卡。很多人以為 SD 卡模組上面有特別 IC 去把 SD 卡轉換成 ESP8266 可以讀取的信號,然而實際上的讀取方法聽上去有點奇妙,就是直接把 SD 卡當成 SPI Slave Device 來讀取。 那你會好奇,如果 SD 卡可以直接接 ESP8266,那外面在賣的 SD 卡模組上面那顆 IC 是幹甚麼用的?這是個好問題,那是防呆用的(不對) 你看,不是所有 MCU 都是在用 3.3V Logic Level 的說。例如說 Arduino UNO 在用的 Atmega328 就是支援 3.3v - 5v 輸入。SD 卡只能用 3.3V 讀取,過高的通訊電壓會把它弄壞,因此很多模組為了相容更多的開發板,只好加上一顆用來轉換信號線電壓的 IC,通稱 LLC (Logic Level Converter ,大陸好像叫 「電平轉換器」)。但是由於我在用的 ESP12E 只支援 3.3V,所以剛好與 SD 卡需要的電壓一樣,所以就不用轉直接接 MCU 就好啦。 不說不知道,如果你走去翻 Wemos D1 SD shield 的設計電路圖,它基本上就只有一個 SD 卡插槽,跟一顆差不多看不見大小的電容來做 ripple filter。真的有夠簡單欸 把兩個東西整合理起 當兩個電路都有了,剩下的部分就是把電路給整合到同一片板子上。我本來是打算用名片大小的設計,這樣做不但能有一種「這是送你的見面禮」感覺,而且也有更多的空間來寫使用教學,有點像國外嵌入式工程師大神做的能跑 Linux 的名片一樣 國外工程師做的,能跑 Linux…
用 CH552G 做一個數字機械鍵盤
在先前的文章中,我簡單的用之前的 macropad 零件做出來了一個數字鍵盤的原型機,但是因為那個只是功能測試的原型機,沒有進行使用者體驗測試,所以在成為最終設計之前,我還要修整一點東西。 首先:白色! 作為一個機械鍵盤,沒甚麼特色的話很難去吸引到人去注目它。因此在這次的設計裡,我決定做我一直以來都很想試試看的設計:全白! 除了鍵帽以外,連電路板都是白白的,超級好看的。 另外這片電路板設計還有一個特色,就是如果你是喜歡用 macro-pad 的人,你也可以用 macro-numpad 的 layout 來組裝這個鍵盤,讓同一個電路板設計有兩種不同的使用方法。 左:數字鍵盤;右:macro numpad 但是,這樣組裝起來按一下就發現了一點體感上的問題,就是比較長的按鈕在按下的時候會連帶下面的機械鍵一起偏斜。我猜是因為本身機械軸的高度問題,讓很多外面的機械鍵盤都會特別在按鍵跟 PCB 之間加入一層金屬板作為固定層。 不過作為一個超便宜的 DIY 方案,要是 CNC 一片這樣的金屬片就太貴了;作為替代方案,我這裡只當按鈕面積比較大的 2U 鍵進行加固,使用原先預留給 macropad 的按鈕固定孔為固定點,加入了一片特別的 3D 列印件以做到跟金融板同樣的功能。 完成 這樣簡單的搞一搞之後,我的 DIY 機械數字鍵盤就做好了。不知道是因為我還沒習慣機械鍵盤還是甚麼的原因,用這個鍵盤很容易打錯(?),或許下一次我可以用更薄的按鍵和鍵帽來多做一個試試看。
在不更改電路板 BOM 表下把 Macropad 變成 Numpad
話說幾個月之前,我設計並開源了一個四鍵的 macropad (快速鍵鍵盤)方案。電路板上使用 WCH 制的 CH552G 晶片,配合機械鍵與幾顆電阻電容就做成了一個超簡易的四鍵機械 macropad 後來在 hackaday 上分享後不知道為甚麼突然爆紅,收到很多留言,所以我就在想,說不定我可以用同一套零件的方案改用 grid layout 來做到數字鍵盤欸?所以我就來試試看了。 甚麼是 Grid Layout? 以 Arduino 的基本電路為例,通常要抓一個按鈕是不是被按下,一般都會對一個針腳進行讀取(e.g. digitalRead),但是在這樣的情況下,每一個按鈕就會需要用到一個 GPIO 針腳。如果我要做一個標準的 4 x 5 鍵數字鍵盤的話,我不就是需要用上 Arduino Mega 才行了嗎?所以這當然是不可行的。 但是如果你有留意到,外面很多 Arduino 按鈕的範例都是使用 Pull Low (下拉)和檢測針腳是不是 high (高電平)的方法來實現的。因此如果我們有辮法在需要讀到某個按鈕的時候的狀態的時候才對它提供高電平,而沒在讀取的時候提供低電平(即使按下也不會產生高電平狀態)的話,那樣我們就能用一只 GPIO 來選擇讀取哪個按鈕,另一只 GPIO 來讀取選擇了的按鈕來增加總讀取的按鈕數量。 於是就出現了 grid layout 跟 line scanning 的方法了。簡單來說就是對於一個 4 x 5 的 grid 而言,我們只需要控制 5 個針腳以選擇哪一行 (row),然後 4 個針腳來讀取哪一列 (column) 就好。以這樣的方法,原本會需要用到 20 個針腳的電路,現在用 4 + 5 = 9 個針腳就能讀完了。 可是,這樣會出現一個問題。在小量生產 PCBA 的情況下,每一顆零件和焊接費用都是滿貴的。而這個 layout 會讓 10K 電阻比原先的 BOM (四顆)多了一顆!? 不過解決方法也很簡單,只要把電路反過來,使用 pull HIGH + LOW activate 的設計(即是說按鈕按下的時候 MCU 是讀取到 LOW / 0 而不是 HIGH /1 ),那電路的設計就變成下面的樣子,把電阻搬到 INPUT line 上面,從而省下一顆電阻( 設計好了之後就是電路板設計了。這裡用的是 EasyEDA,根據上面的原理大致畫一畫之後電路板就出來了。 正面(預留了 numpad + macropad 兩者的插孔) 背面 組裝的部分也是沒甚麼特別的,先把 micro USB 和 CH552G 焊上去之後,再焊一些比較大的零部件,最後就是燒錄程序作測試。 背面電路板,原型機板本背面甚麼都沒有印 正面裝上 keycap 後的效果,由於是開發軟體用的原型機所以用上了最便宜的量產通用型鍵帽 測試用的 Arduino 寫的 Ch552 numpad firmware,需要先灌 CH55X Arduino 燒錄器 外殼設計與打印 由於這片電路板背面也有零件,因此沒辦法馬上使用,必須要先把外殼生出來才能安心放桌面上使用(不然把零件撞掉就麻煩了),這裡使用 Aprint Editor 簡單的為這台東西設計個外殼 因為不知道要傾斜角度多少會比較舒適,因此設計成可以拆卸的結構以方便測試 原型機成品 由於這是原型機,主要作為軟體開發和測試用,因此外殼甚麼的都是拿手邊剛好有的材料來印(黑色 PLA)。但是外型差不多就是這樣。 正面 底部,兩則的是防滑膠條;用戶可以在那個洞黏上金屬板以增加重量 Micro USB 與 firmware program 的按鈕有一個凹位方便開發者使用 後方的 IO 就只有 micro USB 口與兩顆 LED 最終(小)量(生)產的版本應該會好看很多,但是功能上這東西的確比我想像中的要好(這篇文章就是用這個鍵盤寫的),如果加上配重塊與專用鍵帽的話我猜真的可以取代現在我在用的數字鍵盤的樣子(?
CH552G 怎樣直接輸入中文到 Windows 上的應用程式?
CH552G 作為一款便宜好用的 USB HID 模擬晶片,我當然是想辦法讓他做到各種神奇功能的東西。而其中一個我很有興趣做的就是能直接輸出中文的鍵盤。 可是這樣問題又來了。到底要怎樣才能讓 CH552G 直接輸出中文呢?作為只有 8bit 的 E8051 處理器,根本沒辦法輸出中文不是嗎? 黑魔法:ALT + BIG5 碼 如果有一定年紀的 Windows 使用者,有玩過一些很早期的網絡遊戲的話應該都知道,早期的中文輸入法對各種遊戲和應用程式的支援很差,有時候即使是輸入法能抓到被遊戲 handle 的鍵盤輸入,也不一定能夠輸出字元到遊戲內的輸入框。這個時候就出現了一個神奇的輸入方法,就是在鍵盤上長按 ALT 然後在 keypad 上輸入該中文字對應的 big-5 碼,之後放開 ALT,中文字就出來了!? 然後我又花了幾天把所有 utf-8 跟 big-5 交雜的中文字轉成其對應的輸入用 DEC 碼 當然,在 Windows 10 之後,有不少應用程式(例如 wordpad)都開始轉用萬國碼 UTF-8,但是只要能夠背下兩邊的碼表的話理論上就能夠不透過任何中文輸入法輸入中文了喔? 那麼,我們讓 CH552G 代替我們按鍵盤不就行了嗎? 理論上是這樣沒錯,但是這裡又有一個問題了,就是 Keyboard_press 沒辦法按數字鍵盤啊??? 假設我們要輸入 「你」 好了。它對應的 big-5 和 utf-8 碼分別為 20320 ( 4F60 HEX) 跟 42817 ( A741 HEX),可是當你想著:這很簡單啊,只要 Keyboard_press(KEY_LEFT_CTRL); Keyboard_write("2"); Keyboard_write("0"); Keyboard_write("3"); Keyboard_write("2"); Keyboard_write("0"); Keyboard_release(KEY_LEFT_CTRL); 的時候,它卻輸出了 "20320" 到電腦上。 嗯?為甚麼會這樣? 原來是因為在 USB HID Keyboard 的定義裡面,數字鍵盤的數字跟你英文字上面那排的 hex code 是不一樣的原因。這個時候為了要轉換這堆數字,我寫了這樣的一個轉換 function,把數字的 char 轉換成 keypad 的 hex code (為了找這個我快花了 3 個晚上,累死) char PressNumericAsKeypad(char in){ int delayTime = 1; switch (in) { case '0': Keyboard_press('\352'); delay(delayTime); Keyboard_release('\352'); break; case '1': Keyboard_press('\341'); delay(delayTime); Keyboard_release('\341'); break; case '2': Keyboard_press('\342'); delay(delayTime); Keyboard_release('\342'); break; case '3': Keyboard_press('\343'); delay(delayTime); Keyboard_release('\343'); break; case '4': Keyboard_press('\344'); delay(delayTime); Keyboard_release('\344'); break; case '5': Keyboard_press('\345'); delay(delayTime); Keyboard_release('\345'); break; case '6': Keyboard_press('\346'); delay(delayTime); Keyboard_release('\346'); break; case '7': Keyboard_press('\347'); delay(delayTime); Keyboard_release('\347'); break; case '8': Keyboard_press('\350'); delay(delayTime); Keyboard_release('\350'); break; case '9': Keyboard_press('\351'); delay(delayTime); Keyboard_release('\351'); break; default: return in; break; } } 這樣我們就順利的把數字 char 換成 keypad 輸出的 hex code 了。之後就是再寫一個 wrapper function 把整個輸入中文字的流程更容易開發: //Pass…
初嘗 CH552G 與 Macro-pad 鍵盤
在一段時間之前,我無意中發現了 CH552g 這一片超便宜的 Arduino IDE 相容開發板。由於它實在太冷門了,冷門到幾乎沒有用它的 DIY Project,所以我就來自己做一個當實驗了。 可是如果只把 CH552G 做成一個類似 arduino 這樣的開發板,我猜應該也不能引起甚麼 Makers 圈的關注,作為一個喜歡 reinvent the wheel 的開發者,我就想到一個能盡用這顆 IC 的功能的小 project -- 4 key macopads keyboard 甚麼是 Macropad Keyboard? Macro-pad (我也不知道中文是甚麼),簡單來說就是一堆快捷鍵,讓你在按下去的時候它幫你自動對電腦輸入一連串的按鍵動作。目標不一定是電腦,例如說也有可以控制 IoT 裝置的 macro-pad,也有可以配合 auto hotkey 控制軟體界面的 macro-pad 等等。但是我這裡做的是最基本的款式:hot-key type macropad 外面有很多類似的東西啊,你設計的有甚麼特別? 講到這個就有趣了。因為 customize mechanical keyboard 這東西是一個很特別的領域,就如迷你版的「HiFi 音響隨便看都上千上萬元一套」領域一樣,市場上有類似的東西價格都是一兩百港幣起跳的,貴的到幾千都有。不過他們貴的原因有很多,有的是用鋁合金電鍍外殼、有的是用上最貴的機械開關(軸)、有的有訂做的鍵帽、螢幕與 RGB 等等。可是作為一個 macropad,這些東西本來就只是 value-added 的附加品,不知道為甚麼弄著弄著就變成了成本最貴的東西(? 在移除了這些附加的東西之後,剩下來的就是鍵盤最基本的部分: 按鍵電路板MCU / Keyboard IC輸出接口 而這個 project 最特別的地方就是: 低成本 我做的這個 macropad 用了以下一大堆神奇的方法來節省成本: 使用更便宜的機械按鍵使用最便宜的 PCB 生產方案(3 HKD / pcs)使用 Mini USB 取代較常見的 type C 接口,省去兩顆 5.1K 電阻盡量減少零件種類(RLC 部件只使用了 10k 電阻跟 0.1uF 電容)以 CH552G 替代常用的 32u4 大部分外面的 DIY 鍵盤都是在用 32u4 作為控制器。這顆 MCU 畢竟是 Atmel 的,說貴不貴但是也不便宜。這顆 4 港幣左右的 CH552G 跟 32u4 一樣內置有 USB HID 裝置,所以能被電腦識別為鍵盤,同時間又因為它需要的外圍零件真的超級少,所以我們只要很簡單的這樣那樣就設計好板子了。 看著這個板子這麼空的時候我都懷疑自己是不是畫漏了零件 背面一樣零件都沒有,只有走線 如果你是不需要 MODE A / B 切換的話連那個物理開關也能省下,但是因為我打算平用來音樂控制器,在做 Youtube 影片時來當 Adobe PR 的 hotkey keyboard,在只有四個按鈕的設計下只好做 multiplex 了。 軟體方面使用了 CH55X Arduino 的 library 與一些 C code 來做到鍵盤機能 https://pastebin.com/Hb0AQzpY 底座 然後因為都做這麼完整了,那就順便幫它做一個鍵盤底座吧? 這軟體是我自家公司開發的 Aprint Editor 成品
用 PD 要求電壓的最簡單電路!
最近我在 twitter 看外國的 Makers 在發掘一些不知名的中國產 IC 的時候找到了 CHxxx 系列(通常是用來做 USB 轉 Serial ),可是它那間生產商還有其他不同的晶片,其中一個最能夠引起我興趣的應該就是這一片了 CH224K 了。 CH224K 是一片 ESSOP10 的 IC ,最基本的使用方法只需要接 1uF 電容、1K 加 10K 電阻各一個就可以拉出 20V 了。如果需要的話還可以拉出 9, 12, 15V 之類的。 另外這片晶片也可以透過如 Arduino 的 MCU 控制輸出電壓,例如說這樣: 至於如果你好奇為甚麼透過改變電阻而更改電壓的方法並不支持 5V,那是因為本來從 PD 供電口拉出 5V 就不用協議,只要兩顆 5.1K 電阻透過 CC1 跟 CC2 接地就可以了。 所以如果你只是需要 5V 的話連這一片 IC 都不用。 注:ESSOP 跟 SSOP 的針腳間距是一樣的,比起常見的 SOP(例如 CH340)更小,如果 SOP 的 IC 你已經焊不到的話建議你還是直接買模塊回來用會比較好
USB 與各種接口的轉換晶片
話說我一直都在研究一片叫 ArOZ Portable 的 Raspberry Pi Zero W (或 2W)用的主板,用作架設口袋雲端而使用的。它基本上就是一個 IoT Hub,引出三個 USB A port 用作連接其他裝置(如 USB 鏡頭、外接硬碟或隨身碟等等)。 而很多 ARM 開發板上因為處理器限制就只有 USB 2.0 / 3.0 接口,因此要把不同的裝置接上去 ARM 開發板的話就會需要不同的轉接器了。然而在 production 環境中,你不可以直接把轉接器包含在產品裡面(這樣看上去有夠不專業的),因此你就很會需要以下的一些晶片了。 所以以下列表總結出幾種我近幾年發現的晶片。我都把人手沒辦法焊接的包裝(如 QFN 等)都跳過了,剩下的都是人手可焊接的晶片包裝。 把萬用的 USB 接口轉換成其他的接口吧! USB Hub 說到 USB Hub 晶片第一個跳出來的應該就是 FE1.1S,畢竟他是現時市場上最便宜(和發熱量最高)的選擇,然而它是 SSOP 針腳,對創客並不友好,所以這裡我提供另外兩款 USB Hub 晶片選擇給大家參考: SL2.1A (SOP16) 只要外接 2 顆 10uF 加一塊 12Mhz 晶振就能動的 USB hub HS8836A (SOP16) 如果你連晶振都不想用的話,可以考慮用這片 HS8836A。它只需要兩顆 4.7uF 電容就好了(0.1UF),看樣子 4.7R 跟 0.1uF 的部分可以省略,但是如果你不是為了省空間的話還是加上去比較穩。 SD 轉 USB - HS8826 (SOP16) 這個我還沒用過,但看起來是可以支援 MS 跟 SD 卡的讀取的 SOP16 IC 單晶片 USB 編程微控制器 - CH552 看起來是一片內置 USB HID 的 MCU,還在研究中(以為下網絡找到的 CH552 鍵盤電路圖) 其他還在研究中 如果你發現了甚麼神奇蹦蹦的 SOP 針腳的 USB 轉換 IC 記得留言給我加上去喔!
神奇蹦蹦的 IC 與他們的用法
最近我在世界上其中一個最大的電子零件零售商的網站隨便看的時候,發現了一批不錯的 IC,於是順便把這些新發現記錄下來,之後需要用的時候就方便很多了! 基本中的基本 首先,最基本中的基本就是一些大家都在用,到處可見的 IC。由於這些 IC 的線路圖和模組設計教學整個網絡上都是,這裡就直接省略跳過詳細解釋它們的用途。通常在創客的 DIY 中最常見的就是: TP4056 - 單節 3.7V 鋰電池 1A 充電晶片XL6009 - 直流到直流升壓晶片LM2596(s) - 直流到直流降壓晶片 一些比較少見但是還是整個網絡上都是的晶片: MP1584(EN) - DC 可調降壓晶片 (小型 DIY 降壓用)D0505S-1W (D0505S-2W) - 5V DC 到 5V DC 直流隔離器(用於藍牙接收器與喇叭驅動電源隔離用)AMS1117-x (x 可以是 3.0, 3.3, 5.0 等) - 12V DC 到 x 的 LDO8205A + DW01 - 鋰電池保護板 很多時候 Maker 為了做帶電池的裝置就是用 TP4056 + XL6009 / MP1584 這樣配合著用,可是這樣做很浪費空間,所以我就開始找不少關於電源管理的方案,以下的應該就已經踏進沒甚麼人知道的領域了。 5V 0.8A 充放控制器 - HT4928(s) HT4928 是一片用起來很方便的鋰電池充電和升壓輸出的晶片。通常你很容易在那些便宜的單節 18650 行動充電器 (充電寶)裡面找到它。雖然用它來充手機是超級的慢,但是作為一些低功率裝置的供電(例如 Pi zero w)來說是不錯的選項。 5V 1A 充放控制器 - TP4333 如果 0.8A 差了一點點才夠,你可以考慮使用 TP4333。它也是一個用於行充的電源方案,但是用的外接零件會多幾個(R1,S1 跟 D5 如不需要手電筒功能可省略)。 5V 2A 充放控制器 - IP5306 / IP5307 這是一片大功率的鋰電充電和升壓晶片。能夠在 SOP8 package 裡做到 10W 的同時充放電,還帶 4 顆 LED 作電量顯示。(注:這東西發熱滿厲害的,記得底部的銅要鋪好鋪滿) 順帶一提,如果 IP5306 太貴,你可以試試看用替代用 IC FM5324 鎘鎳氫電池充電器 - CJC5122 / ASC0304B 這是一片 NiMH 充電器 IC,支援 1 到 4 顆的 NiMH 電池充電,預設是以 300mA 的充電速度來充。以下為 3.6V NiMH (3 顆串流)時的電路圖(R1 R2 及 R3 在不同配置下需要變更其電阻值) 單節鋰電池保護晶片 - XB8887A 通常的保護板需要使用兩塊晶片來做保護功能,可是這一片就能做到單片保證的功能。對於需要用到 18650 同時對空間要求很高的 project 很有用。 Charger 的部分可以配合 TP4056 晶片使用,這樣兩塊 SOP8 的晶片就能做到原本要一整片指甲大小的 PCB 的功能。 更小的單節鋰電池保護晶片 - XB5306A 如果 SOP8 還是太大,你可以考慮用這一片 XB5306A 。 使用 SOT23-6 包裝,真的打個噴嚏就不見了。電路圖跟上面的相近,Over current cutoff 電流量則降至 3A 使用 SOP8 Package 的升降壓晶片 - XL6007 對於一些對厚度很有要求的 project,要放進 XL6009 可能會有一點難度。這個時候就可以考慮使用 XL6007 了。這一片 SOP8 的晶片與 XL6009…
長按開關的超簡單電路
這是一個基於 EC190708 方案的,可以做到長按三秒輸出 HIGH、再長按三秒輸出 LOW 的神奇功能。以下是出處所提及的電路圖: 出自: https://www.youtube.com/watch?v=Ppm9qWKcTe8 我是覺得連 0.1uF 的部分都可以直接省下就是了(畢竟現在很多電供裡面都有內置電容)
透過 Arduino 取得 UART HMI 螢幕頁面 ID 然後按需求轉頁
最近因為我在弄一個 60W 的 PD 充電器,然後想弄一個迷你的螢幕來顯示電池的資訊,所以我便選用了一個 2.2寸的 UART HMI 了。 2.2 寸的 UART HMI,比想像中要小一點 選 UART HMI 的原因有很多,網上也有很多文章教你怎樣選合適的螢幕,所以我就不細說了。簡單來說, UART HMI 是一種可以透過 Serial 來控制螢幕載入預先設計好的界面的一種人機界面。 發送指令到螢幕 HMISerial 是 Software Serial。以下 function 把 cmd 內的內容發到螢幕,如果 debugMode 被啟用,側會同步輸出到 hardware serial 上。 SoftwareSerial HMISerial(2, 3); // RX, TX //... void sendCommand(String cmd){ if (debugMode){ //Mirror output to serial Serial.print(cmd); Serial.write(0XFF); Serial.write(0XFF); Serial.write(0XFF); } HMISerial.print(cmd); HMISerial.write(0XFF); HMISerial.write(0XFF); HMISerial.write(0XFF); delay(50); } 使用例子: sendCommand("t0.txt=\"[info] MCU Connected\""); 取得現在 HMI 屏幕正在顯示的 Page ID 如果你把 sendme 指令發到屏幕,屏幕會回傳現在的 page ID 給你,它的回傳信號大約長這樣 66 01 FF FF FF 66 是這個指令的回傳碼,01 是現在的 page ID (即是 page 1),FF FF FF 側是傳送完成的意思,所以我們只需要在 Serial.read() 的時候抓到 0x66 就知道下一個一定是 page ID 了。 int getPageNumber(){ sendCommand("sendme"); bool nextReadIsPageNumber = false; while (HMISerial.available() > 0) { // read the incoming byte: incomingByte = HMISerial.read(); if (nextReadIsPageNumber){ //這是 page ID nextReadIsPageNumber = false; return incomingByte; } if (incomingByte == 0x66){ //下一個出現的 byte 就是 page ID 了 nextReadIsPageNumber = true; } } } 使用例子(檢查現在是否在 page 0(hex: 0x00)) currentPageNumber = getPageNumber(); if (currentPageNumber == 0x00){ //Do something } 成果(Arduino 透過 COM port 輸入到模擬器)
目前第 1 頁,共有 2 頁