再見 Typora,你好 MarkText!
話說我自大學開始我就很喜歡用 Typora 來做筆記,但是最近它開始要收費了然後 Beta 版本的 Typora 連啟動都啟動不了。 嘛,軟體要收費我覺得是沒問題,但是像 Typora 這種一點預先通知都沒有,直到前幾天突然急用要啟動它的時候才彈出不能用的通知,真的超級沒良心。由於是急用所以我就先用一個開源的 keygen 來應付一下,連接在下面: https://github.com/taozhiyu/TyProAction 但是,由於按照它的條款,使用這 keygen 產出的授權只能夠使用 24 小時,所以在處理完手上的工作之後我就把用了快 3 年的 Typora 刪除掉正式找替代品了。在幾個小時後我找到了一個完美的代替開源方案: MarkText https://github.com/marktext/marktext 我覺得這個應該就不用多說了,就是一個很好用的開源 Markdown Editor 軟體。 它可以支援自定的字體(這裡我把它預設的換成了 Noto Sans HK Medium),也能夠透過 Ctrl + J 叫出旁邊的 title list。 至於怎樣把它設定到跟 Typora 的 hotkey 一樣,你可以到 File > Preference 那邊,在 Key Bindings 下找到以下功能並把 hotkey 改成 Ctrl + {號碼} 這樣你就可以直接無痛轉用到 MarkText 了!
便宜又好用的 SOP8 IC 清單
這裡收集了一些最近我發現的 SOP-8 IC,如果剛好你在找一些簡單的替代 IC 可能會在這裡找到喔! 型號用途備注 TC118S 單馬達驅動 IC (類 H 橋)1.8A MaxLM386音頻放大器TC4056A鋰電充電管理器,可替代 TP4056AO4496N-Channel MOSFET30V / 10AAO4435P-Channel MOSFET30V / 10ANE555DR就 555 啊,但是在 SOP8 包裝TP4333鋰電池充放同步升壓管理器 4.2V 1A XPT8871 LTK5128音頻功放5WM62429數字電位器(需接 MCU 使用)XL1509降壓3V / 5V/ 12V 版本CN5711LED 驅動(使用 PWM 調光暗)MOC213R2M光電耦合元件TP8485ERS-485 / RS-422 接口
Arduino 用在產品上太貴?有聽過 CH552G 嗎?
話說一個月前我在想到底有甚麼方法可以替 Raspberry Pi 增加一個 Analog Read 的功能,看了網上很多的教學和文章,大致上的方法就只有 用 ADC 透過 SPI 傳到 Raspberry Pi 的 GPIO用 USB 接一片 Arduino UNO 再透過 Serial 傳送讀取的資料 可是 ADC 需要接到 Raspberry Pi 的 3.3V GPIO,用來量 5V 的 Analog 電壓的話總覺得有點危險,要安全的話要加一片 LLC (Logic Level Converter,5V 轉 3.3V 的),需要的空間又會變更多,而且生產上來也不會特別便宜。 另外第二個方法比較安全(畢竟 USB 的 5V 是直接來自電供的,如果有短路電供會先斷開作保護),但是一片 Arduino (ATmega328)價格一點都不便宜,即使用較便宜的 ATtiny 44 也需要快 10 - 12 港幣一片,如果真的要量產起來一點都不比 ADC + LLC 便宜。 然後剛好我在研究 CH340 的各種版本時,在那間公司的網站不但發現到有一種 CH340 有內置晶振(不用外接,省掉焊接和零件的成本)而且還發現了一種新的 MCU 沒錯,這就是今天的主題:CH552G 於是我便隨便買來了一片開發板,來到之後長這樣,真的好小,跟我前女友的現任男友 ㄐㄐ 差不多大小。 CH552G 的好處在於以下幾點 內置 USB HID 控制器,不需要外接 USB to Serial 轉接晶片(如 CH340)5V Logic Level,可測電壓為 0 - 5v (對應 0 - 255,共 8bit 準確度)超級的便宜,大概 5.5 港幣就能買到一片(開發板也只是約 15 港幣一片) 使用 Arduino IDE 對它進行編程 https://github.com/DeqingSun/ch55xduino 上面是這次使用的 Arduino board definition。跟其他的第三方板子一樣,先把它給的 json 檔加入你的 Arduino 設定裡,再在 broad manager 找到 ch5xx 的板子把它加進去。 https://raw.githubusercontent.com/DeqingSun/ch55xduino/ch55xduino/package_ch55xduino_mcs51_index.json 對於全新的開發板,第一件事情就是先安裝 bootloader。詳情教學可以看 Github,但是對於 Windows 用戶在跟著 Github 教學前需要先為 CH552G 安裝 driver,不然在 Windows 內會顯示為不明裝置。其步驟為下: 下載 Zadig ,https://zadig.akeo.ie/按著在沒插電的開發板上的 PROG 按鈕(或「下載」按鈕)把開發板透過 USB 線連到電腦(注:不能鬆開按鈕)等待開發板在「裝置管理員」以「不明裝置」顯示之後才可鬆開打開 Zadig,點選 Unknown Device 1,選擇 Install Driver第 3 - 5 分鐘(可能更慢,看電腦規格)完成之後把開發板拔出,再重新插回去電腦裝置管理員會顯示為 COMX (我的話就是 COM7) 完成後的 Zadig 界面 安裝完 driver 的開發板,COM7 燒錄 Bootloader 在開發板寫程式的時候 bootloader 會順便送進去,所以這裡我們先要選好正確的板子(我這片是 CH552) Pin 的編號就是以開發板上寫的 x10 為準,例如說要控制 P3.0,pin number 則輸入 30,P3.2 則是 32 如此類推。因為我要順便測試 analogRead 跟 USB Serial,所以我把 blink 改成這樣 int val = 0;…
用 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 的部分都可以直接省下就是了(畢竟現在很多電供裡面都有內置電容)
JavaScript 顯示時間的例子
因為間中要用到每次都要去 Stack Overflow 抓有點麻煩所以就直接記下來了: new Date().toLocaleDateString() > 2022/1/30 new Date().toLocaleString(undefined, {year: 'numeric', month: '2-digit', day: '2-digit', weekday:"long", hour: '2-digit', hour12: false, minute:'2-digit', second:'2-digit'}) > 2022年01月30日 星期日 01:05:48 new Date().toLocaleDateString('en-US', {year: 'numeric', month: '2-digit', day: '2-digit'}) > 01/30/2022 new Date().toLocaleDateString('en-ZA') > 2022/01/30 new Date().toLocaleDateString('en-CA') > 2022-01-30 new Date().toLocaleString("en-US", {timeZone: "America/New_York"}) > 1/29/2022, 12:05:48 PM new Date().toLocaleString("en-US", {hour: '2-digit', hour12: false, timeZone: "America/New_York"}) > 12
使用 Apache2 當 Reverse Proxy 伺服器
因為最近房東在沒經我同意之前在房間的網絡上遊加入了一台 NAT 路由器,所以原本架在我的房間裡的 ArozOS 伺服器就沒辦法在外面連線了。想了想,於是我想到了可以透過 zeroTier 和 Reverse Proxy 來使用我房間裡的伺服器,所以便開始研究怎樣可以弄到一台 Reverse Proxy 的伺服器。 網絡上很多人喜歡用 nginx 來當 RP伺服器,可是基於某些原因我並沒有太喜歡它所以我就選擇用 Apache2 了。首先,安裝 apache2 sudo apt-get update sudo apt-get install apache2 -y 然後就是編輯它的設定檔,加入你需要 proxy 的目標 sudo nano /etc/apache2/sites-available/000-default.conf NameVirtualHost *:80 <VirtualHost *:80> ServerName ixtw.hkwtc.com ProxyPass / http://{zerotier 的區網 ip}:8080/ ProxyPassReverse / http://{zerotier 的區網 ip}:8080/ </VirtualHost> <VirtualHost *:80> DocumentRoot /var/www/html </VirtualHost> 然後 Enable Proxy 插件並重啟 apache 2 sudo a2enmod proxy_http sudo systemctl restart apache2 可是,WebSocket 要求過不去欸? 這是因為要 proxy websocket 會需要額外的 module 去處理,首先啟用 wstunnel 跟 rewrite engine sudo a2enmod proxy_wstunnel sudo a2enmod rewrite sudo systemctl restart apache2 然後加入 RewriteCond 跟 RewriteRule <VirtualHost *:80> ServerName ixtw.hkwtc.org RewriteEngine On RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC,OR] RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC] RewriteRule /(.*) ws://192.168.196.15:8082/$1 [P,QSA,L] ProxyPass / http://192.168.196.15:8082/ ProxyPassReverse / http://192.168.196.15:8082/ </VirtualHost> 最後再重啟一次 apache sudo systemctl restart apache2 這樣就完成了!
透過 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 輸入到模擬器)
目前第 2 頁,共有 9 頁