pretty code

2020年8月27日 星期四

WeMos D1 ESP Wroom 02 開發板 ESP8266+18650 電池座 初次使用記錄

為了 Kobo 硬體翻頁器的設計,最後選擇了這一塊開發版,這個開發版的好處是包含了 18650 電池座,也有供電及燒錄模組,我只要自己焊幾根線,3D 列印設計外殼,剩下的就是純軟體的工作了,應該可以加快開發速度。另外,其電路設計會讓 CHIP RESET 時進入燒錄模式,故不需要按下 FLASH 按鈕,似乎開發板都有內建這個功能。原理似乎是利用 UART 傳輸時,會觸發 RESET 並讓 GPIO0 拉 Low 好讓 CHIP 進入燒錄模式。下面是取自 NodeMCU 的電路圖。

下面是板子示意圖,隨手畫畫,元件相對位置是對的,但可能水平位置不一定有對齊。


相關 IC 概略

AMS1117 - 電源轉換 IC,負責將 5V 轉成 ESP8266 需要的 3.3V。
CP2102 - USB 轉 UART 的 IC,SILABS 網站上有提供驅動程式。
TP5400 - 負責電池充電,也會將電池的 3.7V 轉成 5V 輸出。

前置作業準備

01. 下載 Arduino IDE。
02. Arduino IDE -> 檔案 -> 偏好設定 -> 額外開發板管理員網址,輸入 http://arduino.esp8266.com/stable/package_esp8266com_index.json。
03. Arduino IDE -> 工具 -> 開發板管理員 -> 搜尋 ESP8266 並下載套件。
04. 開發板選擇 LOLIN(WEMOS) D1 R2 & mini,似乎選別的也無妨,重點自己是用那根 GPIO 要搞清楚。


第一個 Hello Word (控制 LED)


#define LED_BUILTIN 16

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

編譯及上傳訊息


Executable segment sizes:
IROM   : 228640          - code in flash         (default or ICACHE_FLASH_ATTR) 
IRAM   : 26756   / 32768 - code in IRAM          (ICACHE_RAM_ATTR, ISRs...) 
DATA   : 1248  )         - initialized variables (global, static) in RAM/HEAP 
RODATA : 688   ) / 81920 - constants             (global, static) in RAM/HEAP 
BSS    : 24880 )         - zeroed variables      (global, static) in RAM/HEAP 
草稿碼使用了 257332 bytes (24%) 的程式儲存空間。上限為 1044464 bytes。
全域變數使用了 26816 bytes (32%) 的動態記憶體,剩餘 55104 bytes 給區域變數。上限為 81920 bytes 。
esptool.py v2.8
Serial port COM6
Connecting....
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 24:62:ab:00:00:00
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 2MB
Flash params set to 0x0230
Compressed 261488 bytes to 193147...
Wrote 261488 bytes (193147 compressed) at 0x00000000 in 4.4 seconds (effective 475.9 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...

實際測試結果,這樣的一個小程式,耗電量約為 40 ~ 80 mA 左右。

2020/08/28 更新

早上趁著上班前,量測了一下腳位,確認板子上的 D1 ~ D8 是對應到那些 GPIO。

2020/08/29 更新

焊接技術真的很糟!看來自己是沒辦法把線焊到開發板上,程式已經大致 OK,雖然是用 polling 的方式,不是用中斷。非常克難的用一根線模擬按鍵的功能,意思到了就好。


2020年8月20日 星期四

ESP8266 翻頁器設計

ESP8266 概述

ESP8266 是物聯網時代興起時很熱門的一顆 Wi-Fi 晶片,除了可以當作外部裝置給 Arduino 使用,由於本身的計算能力還不錯,故也可以單獨使用。 

晶片開發廠商是上海樂鑫信息科技,而外面常見的模組則是由安信可科技(Ai-Thinker)整合販售的,有 ESP-01、ESP-03、ESP-12等等。不同的模組有不同的 GPIO 數量,可以視需求購買。

另外,還有連燒錄電路,供電電路都整合好的開發版,比如說 NodeMCU 之類的,插上 USB 就可以工作,不需要再買一條 USB 轉 TTL 的轉接線即可工作。另外,USB 轉 TTL 的轉接線預設是走 5V 輸出,而 ESP8266 是吃 3.3V,故還需要把轉接線接頭打開,自行將輸出焊接到 3.3V 腳位。

網路上還有看到,USB 因為電流可能不足,故燒錄時如果失敗,建議外接電源。

ESP8266 共有 17 根 GPIO,扣掉 GPIO6 ~ GPIO11 共 6 根讀取 flash 專用,再扣掉 GPIO1、GPIO3 共 2 根 UART 用,故最多能使用 9 根 GPIO。

下面是抄錄自官方 FAQ:「除了 XPD_DCDC,GPIO 可以配置上拉。關於 GPIO 的上電 IO 口預設狀態為:除了 SDIO 6根線 +GPIO4+GPIO5+GPIO16 上電 IO 默認無上拉,其他的 GPIO 口均有上拉。由於是內部配置上拉,所以如需下拉,需外部加下拉方式或者加一個三級管的反相電路。」

ESP8266 使用 3 根 GPIO 決定 Boot Mode 模式,分別是 GPIO15、GPIO0、GPIO2,其模式如下:

燒錄模式 - 0V, 0V, 3.3V
正常模式 - 0V, 3.3V, 3.3V

為了配合 Boot Mode,GPIO15 上電時會讓它保持 Low,故不建議把它設成 PULL_HIGH,故 9 根 GPIO中,建議使用 GPIO12 ~ GPIO14、GPIO16、GPIO4 ~ GPIO5、GPIO0、GPIO2 這 8 根,越前面的越推薦。另外,每根 GPIO 可提供的最大電流為 12 mA。

GPIO0 ~ GPIO15 都有內建的上拉電阻,GPIO16 則是下拉電阻。

ESP8266 大部份都是使用 26 MHz 晶振,故上電時,晶片預設鮑率為 74880,如果不是使用這個設定,上電訊息便會看到亂碼。

關於 ESP8266 的介紹,這篇文章是我看過寫得很棒的,可以參考。

翻頁器設計

01. GPIO - 3 個 Web API,1 個 LED 指示開機狀態,1 個 LED指示自動偵測 Server IP 狀態,1 個 LED 指示 API 狀態。
02. 電路 - 3.3V 
03. 外部燒錄接口

ESP-03 是 7 個 GPIO 接口,ESP-12 則是 9 個 GPIO。

供電電路

01. 鈕扣電池類,容量只有一兩百 mAh,最大容許放電電流也只有 3 mA,看來是不可行。
02. 4 號電池容量有 1250 mAh,放電電流未知?但我想應該是不行,設計目的不同。

穩壓電源簡介

工作目標

01. 先花幾百塊買現成開發版驗證程式功能。
02. 直接買現成模組 + 麵包板測試。
03. 使用 3 D 列印或其他方式製作外殼。

2020/08/24 更新

查了一下,似乎乾電池的供電電流是可以供 ESP8266 使用,也有賣集成 18500 mAh 電池座與 ESP8266 的開發版,就看那一樣最方便。

規格如下:
ESP-WROOM 02 - 20g
Panasonic 3.7V 3350 mAh - 46g

2020/08/25 更新

查了一下,NodeMCU 上面是使用 AMS1117 這顆 IC 來做電壓轉換,所有電路只需要額外 2 組電容,看起來還不錯。不過這種轉換 IC,效率可能不到 8 成,但簡單運用場景下還算不錯。

2020/08/26 更新

之前沒有想到,按鍵偵測應該要使用中斷,趕緊查了一下,幸好 ESP8266 除了 GPIO16,大部份的 GPIO 都可以觸發中斷。另外網路的操作在中斷裡應該會有問題?流程需要好好設計。

2020/08/29 更新

Arduino 也可以寫 ESP8266 程式真的很方便,polling 版的程式馬上就寫好了,實測模擬按鍵的靈敏度也還行,可惜的是自己焊接的功力真的太差,想把線焊到開發板上一直無法成功,看來這個專案只能到這了!幸好該有的概念都已驗證完畢。

影片連結

2020/08/31 更新

查了一下 3D 列印,一個門外漢要把外殼從無到有設計出來,看起來也不是一天兩天的事,目前看起來還堪用的 3D 列印機大概也要一萬多元,如果不是沒有地方可以放置,自己買一台應該是比較好的選擇。

2020年8月19日 星期三

mooInk Pro 傳檔 App 試用

上個星期在討論區發現 Readmoo 發佈了 mooInk Pro 傳檔 App,之前就一直很想在 dpt-rp1 的基礎上開發類似軟體,可惜我不是寫 Java 的,再加上 mooInk Pro 看 PDF 不能點擊翻頁,故後來就一直興趣缺缺。

既然現在已經有官方的 App,還是來玩一下,看看好不好用。

可惜的是,安裝後找不到我的 mooInk Pro!網路上看了一下,此機制是使用 Wi-Fi 傳檔,我猜還是走 Sony 原生那套,理論上應該是沒問題才對?為了怕 Readmoo 白目把 Sony 原生的改掉,我還特地再使用 dpt-rp1 測試,不論是上傳檔案還是執行一些簡單的 command,看起來一切正常,讓我白擔心了。

我猜 App 問題可能是出在自動掃描偵測 IP 身上?網路上有人說只要重置機器即可,雖然我是很懷疑?感覺還是軟體 Bug 居多。為了一個功能,還要重新下載書籍,想想還是不划算,就當做沒有這個 App 的存在好了。

另外,網路上也有 Java 版的實作,理論上可以加速開發,但我沒興趣就是了。mooInk Pro 現在對我來說有點像是雞肋,一個星期用不到幾次。

如果之後暗黑心法真的失效,我就要來改用另外一套暗黑心法了,或是乾脆不看繁體中文書了,阿雜。

2020/08/20 更新

昨天洗澡閃過一個想法,搞不好這是故意的!為了因應加密方式改變,強制使用者重置好讓一切回歸原點?哈,有沒有這麼邪惡?

2020/09/04 更新

更新最新版本 2.1.2 後,mooInk Pro 傳檔 App 認不到裝置的問題,在這版本也可以正常抓到裝置,不需要網友說的重置系統,看來是我想的 Bug 沒錯,故更新版本後也一併解決了此問題。

2021/03/09 更新

雖然我因為讀墨系統更新後就可以正常傳檔,但寧心舍試用時雖然已經是最新版本,依然是無法順利偵測到機器,故這招可能也不是每個人都適用吧。

今天不是寫 Code 天

Bug 相連到天邊,從下午 4 點開始,執行測試時,一個接一個的 Bug 不斷跳出,解 Bug 都解到要懷疑人生,我還是乖乖寫 C 好了,Javascript 真不是我的菜。

01. module name 被 local variable 覆蓋,找了快一個小時,大小寫看來看去看不出所以然。

02. 函數參數改變,測試程式有更新,但上個禮拜寫好的 Code 忘記更改,一直傳錯的參數進去。

03. TypeError: Path must be a string. Received Promise { <pending> },一個不是 promise 的官方模組所在行報出錯誤,在呼叫這個模組前面幾行的地方,呼叫了一個 Promise 的函數,但又沒 await,真是低級錯誤。

下班了,下班了!

Release KoboPageTurner v0.2.0

昨天拿到 Logitech R500,看了快半本的書,試用起來沒什麼問題,雖然 Clara HD 的 Wi-Fi 很不給力,但既然都寫了,也許別人也有這個需求,還是寫個中文文件為這一個月留個紀念。

安裝

下載路徑

01. 運行 "KoboServer/makeKoboRoot.sh" 以獲取 "KoboRoot.tgz",也可以使用發行版。

02. 將 KoboRoot.tgz 放入 Kobo 設備的 ".kobo" 文件夾。

03. 重啟設備。


反安裝

01. 修改 "/mnt/onboard/.koboserver/koboserver.cfg",設定 "uninsall=true"。

02. 開啟 Wi-Fi。

03. 除了  "/mnt/onboard/.koboserver/ " 資料夾外,其他都會被移除。


使用方式

我使用 Kobo Clara HD 測試了這個概念。

系統:4.23.15548

01. 將您的 Kobo 設備連接到 PC。

02. 在 "/mnt/onboard/.kobo/Kobo/Kobo eReader.conf" 中添加以下設置。

[DeveloperSettings]

EnableDebugServices = true

03. 到 "設定" -> "裝置資訊" -> "Developer options" 。

04. 勾選 "ForceWifiOn" 項目。

05. 將您的藍牙設備連接到手機。

06. 在 Kobo 設備上打開 Wi-Fi,Web 服務器將在端口 80 上運行。

07. 使用 Android(HTTPClient) 發送 HTTP 請求。

08. 修改設置。

Key Code:

21 - Left Arrow

22 - Right Arrow

24 - 音量 Up

25 - 音量 Down

您可以單擊 Key Code 的輸入區域,然後按下您想設定的按鍵,它將自動加入 Key Code。

09. 單擊 "LEFT PAGGE" 或 "RIGHT PAGE" 以測試通訊。

10. 關閉 Web 服務器後,取消 "ForceWifiOn" 項目。 然後關閉 Wi-Fi。


翻頁設定

2020年8月11日 星期二

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

上星期老闆請我幫忙評估網路磁碟機使用量的問題,趁著昨天有空趕快寫支小工具依副檔名來計算哪些種類的檔案佔了多數?

原本昨天是輸出至純文字檔再餵進 EXCEL 加工,反正一次性的工具先求有比較重要。

早上實驗完後有一些空檔時間,乾脆把工具改成直接輸出到 EXCEL,後續只要改格式就好。沒想到再 parsing 第二個較佔空間的資料夾時,發生了 out of memory 的問題。

解決之道便是加上啟動參數

node --max-old-space-size=4096 yourFile.js

另外底下是相關的測試數據,留待以後相關工作參考



2020/08/14 更新

上面時間,我有稍微優化過,有減少第二階段的時間。

2020/08/19 更新

上禮拜有看到一套現成的軟體,可惜商業使用要錢。今天剛好又看到了另外一套軟體 WinDirStat,其實就是做了我程式做的功能,試了一下,速度比我未優化的 Node.js 的 Code 還快,如果上禮拜我是用 Golang 來寫,應該跟它有一拼的實力才對,據我用工作管理員觀察的結果,WinDirStat 的工作數據如下:

最高 CPU 使用率 - 6%
最大執行緒數量 - 3
最高記憶體使用量 - 44M

我的 Node.js 未優化 Code 工作數據如下:

最高 CPU 使用率 - 40%
最大執行緒數量 - 11
最高記憶體使用量 - 500M(Third party Excel module)

有這樣的數據其實並不意外,第一我為了保留原始資料,用了好幾組 Array,等於我在後面整理資料時,又把這個數據跑了一遍,如果 N 很大,其實很嚇人。第二這裡是純粹使用遞迴瀏覽檔案資料夾,沒有用到 IO Bound 的優勢,完全是吃 CPU 資源。

另外,這套軟體還是 Open Source,只能給它一個讚。

2020年8月2日 星期日

符合使用者的預期

最近都在開發我的 KoboPageTurner 專案,雖然我很喜歡 Kobo 機器的可 hack 性,但還是有一點我無法接受,那就是 Kobo 機器會在一定的時間內,關掉使用者的 Wi-Fi。

雖然我是因為 KoboPageTurner 才對這個功能這麼感冒!但在使用者開啟 Wi-Fi 的情況下,只要不進入休眠,系統本來就不應該偷偷關閉使用者開啟的 Wi-Fi,即使這個功能會影響電力!

我覺得最好的方式還是讓使用者選擇是否要開啟這項功能!

為了確定其他家的閱讀器行為,我還特地使用了 PW3 來驗證,雖然因為 PW3 預設不回應 ping 封包,但至少在我點開狀態列時,Wi-Fi 訊號依舊是呈現滿格的情形。順帶一提,同樣的地點,我的 Clara HD 只有 1 ~ 2 格的訊號,而 PW3 至少已經是 5 年前的機器!Kobo 真的是要多加油。

我個人認為目前 Kobo 嬴過 Kindle 的只有 2 個地方:
01. 機器可以做一些 hacks。
02. 閱讀時有左右對齊的選項。

PW3 還是我目前覺得最接近完美的機子。

 ~ THE END ~