pretty code

顯示具有 KoboPageTurner 標籤的文章。 顯示所有文章
顯示具有 KoboPageTurner 標籤的文章。 顯示所有文章

2021年7月6日 星期二

KoboPageTurner v0.4.0 改版記錄

Kobo Elipsa 已經內建體驗版的藍牙功能,經實測與我的 Logitech R500 翻頁器搭配良好,也有其他網友測試過其他廠牌的翻頁器,看來也有幾款可以使用,故我認為 Elipsa 支援更多的藍牙翻頁器只是早晚的事。

既然 Elipsa 已經內建藍牙,理論上可以不用出動我的 KoboPageTurner 專案。但既然是自己生的孩子,總是想知道用在 Kobo 其他機器上的相容性好不好?於是便有了此篇文章的誕生XD

最早以為只是 event 號碼不同,據我使用 cat /proc/bus/input/devices 檢查的結果,Elipsa 的 Event Handler 應該是 event2。


在設定檔中修改了 eventFile 的設定後,原本以為可以從此一帆風順?沒想到會變成選取的效果,除了翻頁無效外,螢幕需要手動多點幾下後才可以恢復正常功能,這很明顯的就是我拿之前在 Clara HD 存取的封包傳給 Elipsa 的觸控螢幕後,一定是那邊的格式不符預期,Elipsa 才無法正常工作。

解決的方式也很簡單,再抓一次 Elipsa 的封包資料即可,但第一次用 Linux 內建指令抓的資料太多又斷在不正常的地方,二來因為年代久遠,一時無法理解觸控封包的正確格式,只好先回頭再看一次之前 Clara HD 的封包再來解析 Elipsa 的封包。


Clara HD 之前的封包感覺簡單多了,不像 Elipsa 光 X, Y 的小封包層就有 6 個,嘗試用我理解的方式去送,沒想到結果依舊?

後來排列組合多次還是不能如我所願,最後只好再寫一支程式來幫忙記錄及印出封包,雖然小程式沒有如我預期的正常結束,但還是幫助我看出端倪,原來是 code 0x39 的 ID 要送出一個 value 為 0xFFFFFFFF 的封包,這個就是我之前無法成功的關鍵!


有了完整的 raw data 就好辦了,雖然有 6 個小封包,但我覺得應該不用那麼多?應該只要按下及放開的封包再加上結尾的 0x14A 即可?試著簡化過後,下面就是我最後送出的封包格式。


為了因應此次改版,config file 也增加了 rawData 欄位,舊版的就會自動套用 ClaraHD。

下面則是實際翻頁的結果:


自己生的孩子果然還是最帥XD

2021/07/07 更新

昨天睡覺前,又修改了一下我的 debug 小工具,改用 Go channel 來完美結束程式,真的越來越喜歡 Go 語言了,只可惜目前還不太能用 Go 寫出跑在機器上的 GUI App,可能是我還太菜吧XD

2021/07/12 更新

0x39 那個 ID event 應該跟最後一個 0x14A 是一組的比較合理?不過這種東西可能會隨著觸控螢幕不同而有所不同,沒必要糾結在這個地方,反正遇到新機器就是重抓一次封包即可,只要有一次的封包,所有細節都能一目了然。

當然可以再做一些加強,把 gEvent 的 hard code 變成一個檔案,這樣當遇到新機器就不需要重新編譯,只要新增 gEvent 檔案即可。

這個專案的缺點就是 Wi-Fi,會導致機器較耗電,但這也是 SW 最方便處理的方式,如果改成有線的 patch,一般人實在是不容易 DIY。

另外,我發現我新做的 debug 工具,如果沒有按下觸控,程式會停在 Read 的地方,無法像我想的讓 Timer 去觸發結束程式,我想 Go 底層可能是用同步的方式,故在沒有資料可以讀的情況下會卡在 Read 那一行,知道有這個情況即可,反正是多按一下就可以解決的事,暫時先這樣處理即可。

2021年6月30日 星期三

Kobo Elipsa 入手初體驗

我是第一批預購的讀者,結帳時間差不多在 PM 7:00 左右,昨天快傍晚時終於等到我期待已久的機器,開門一看到此包裹,立馬上網打下班卡好盡情的體驗此機器。



整體包裝果然有精品的感覺,每樣東西都有獨立的包裝盒,其中手寫筆附贈的電池、筆芯以及拆換筆芯的工具則是隱藏在筆盒內盒泡棉盒的背面,如果有沒看說明書的讀者,別忘了還有這三樣小東西XD

拿在手上果然是有點重,尤其我前一台 10 吋機器是 mooInk Pro,就算跟我前前一台不到半年就掛掉的 Onyx Boox Note Lite 比,感覺 Elipsa 確實是有比較重,但我當初就只想要定點使用,我想應該可以接受,另外,Elipsa 有自動感應螢幕翻轉的功能,故可以隨時換手閱讀,早上稍微用右手拿著看一下書,會感覺到右邊手拿處背面有溫溫的感覺。為了有螢幕閱讀燈,重量真的是必要之惡,有了螢幕閱讀燈,在光線不足時也比較容易閱讀。

昨天拿到時本想來安裝自己開發的 KoboPageTurner,雖然一些網友分享手邊翻頁器無法使用,但還是不死心的試看看體驗功能裡的藍牙連線,沒想到一試之下,居然可以成功翻頁!就連自己的 PDF 書籍也可以順利翻頁。


可能是體驗版的緣故,雖然昨天睡覺前已充飽電,但今早起來,電量已不到 30 %,難怪這個功能會放在體驗版中,想要使用的網友,不用時記得要關閉藍牙,目前藍牙功能在通知列是沒有任何圖示提醒的。

稍微試用了一下筆,感覺還可以,不過我本來就很少用筆記功能,故不太介意功能完整度,由於我螢幕的塑膠膜仍未撕下,手寫感覺是有點滑,但速度我覺得沒問題。

我另外一個重視的點是 PDF,這也是我當初購買的原因之一,試讀了 Google 圖書購買的資訊書籍,配合我用 Acrobat Pro 加上的目錄功能,Elipsa 也可以正常處理,最主要是它可以點選翻頁,我個人是比較喜歡點選翻頁的方式,但據網友分享,搭配手寫似乎會有誤翻頁的情況,如果有網友遇到同一問題,也許可以考慮只設定滑動翻頁。


另外,我試用的 PDF 約 6.38 MB 大小,總共有 416 頁,感覺是比 Kobo 內建書籍翻頁還來得慢,平均翻頁速度約 1.84 秒,以我購買的《萬能店員:我的便利、你的過勞,超商的社會代價》一書來對比,平均翻頁速度則約 1.03 秒。

整體來說,此台機器有達到我當初購買的目標,沒有意外的話,在家應該都只會使用它,雖然我的最愛還是 Kindle Paperwhite 3,但在肩膀受傷的情況下,為了正常看書,還是只能用翻頁器來閱讀,這也是為什麼這台封閉式系統的機器有內建藍牙是多麼棒的優點了。

2021/07/05 更新

看來這台機器的硬傷是閱讀 PDF 及固定版面書籍,據我用碼錶實測的結果,平均都至少要 2 秒左右,單純以這個速度來看,mooInk Pro 10 吋似乎也沒多慢?

2021/07/06 更新

昨天晚上終於把 Elipsa 的觸控封包搞懂,讓我的 KoboPageTurner 專案也可以用在 Elipsa 上。當初想得還是太簡單了,覺得觸控面板應該都大同小異,同樣的 raw data 應該可以共用?目前只知道 ClaraHD 和 H2O 可以共用,就不知道另外一台 8 吋的 Forma 是否可以延用目前已搞定的兩種封包格式?

2021/11/17 更新

強力推薦安裝第三方軟體,我安裝了 KOReader 和 Plato 兩套軟體,PDF 閱讀體驗果然提升不只一個檔次。

2020年10月3日 星期六

Kobo 翻頁器 DIY 最終回

將 ESP8266 (ESP-12S) 裝進 3 x AAA 電池盒中,只使用 2 x AAA 共 3V 當做輸入,原本預計要加一顆 DC-DC 0.8V ~ 3.3V to 3.3V Converter,但因賣家送錯,故直接使用 3V 的電壓驅動 ESP8266 (ESP-12S),希望可以撐到 2.7V 的最低工作電壓為止。

原則上還是要讓 ESP8266  (ESP-12S) 工作在 3.3V 才對!我這是沒辦法中的辦法,在沒有任何外加電路下,工作電壓應該也不穩定,如果還能拿到 DC Converter 再說吧。

工作影片


2020/10/05 更新

無意間在 YouTube 看到,有一種 LiFePO4 電池,其工作電壓為 3.2V,在到低電量前,都維持一個很穩定的電壓,如果可以買到 AAA 規格的電池,應該就可以省略 DC Converter,還可以用並聯增加電池容量,可惜的是,不容易買到 AAA 規格的電池,選擇還不多,目前市面上看到的都是大陸製的產品,且容量在 280 ~ 350 mAh。

另外,昨天實測的結果,使用兩顆新的乾電池看了一個多小時的書,翻頁都還正常。但我猜應該是沒辦法撐過 3 小時,因為乾電池的放電電壓下降的很快。

2020/10/07 更新

根據 Kobo 閱讀器自己的閱讀統計,累計閱讀了約 2 小時又 24 分鐘後,翻頁器已經無法工作,斷電再開也無法開機,兩顆全新的乾電池使用電表量測的結果,電壓都約在 1.24V 左右,離最低 2.7V 的工作電壓已有一段距離。不過,這兩顆電池只是無法再提供 ESP-12S 需要的工作電壓,拿去裝在手電筒上還是可以用的。

2020/10/08 更新

還有一種鎳鋅充電電池,其電壓為 1.6V,其放電電壓也很穩定,故也是一種替代方案,但跟 LiFePO4 一樣,沒有大廠的產品可購買。

另外,今天又跟另外一個賣家購入了 DC Converter,這個東西在市面上不太好找,希望這次賣家不要再標示錯誤了。

好奇統計了一下,截至目前為止,為了這個硬體翻頁器共花了 NT $8,592 元,都可以再買一台電子書閱讀器了!但是跟學習到的東西比起來,還是很划算。

烙鐵及排風扇等:約 3,300 元。
硬體開發板相關:約 1,200 元。
其他零件及收納:約 4,100 元。

2020/10/12 更新

新的賣家出貨速度很快,給個讚!這次學乖了,焊接前,先量測一下電壓,2.86V 左右的電壓轉完後約為 3.44V,比號稱的 3.3V 高出了些許,使用電表看不出是否真的恆定在 3.44V?但應該是有符合我的需求,等到原本用過的電池沒電後,再拿全新的電池記錄數據。

另外,這次的 Converter 比上次賣家送錯的還大了些,雖然只是公釐的差異,放進電池盒就得喬一下位置。還有這次的焊接技術又更差了,不小心傷到外盒好幾處,焊好的線我也覺得搖搖欲墜,哪一天線突然斷掉我也不意外XD

2020/10/15 更新

事情果然沒有那麼順利,反正我也習慣了XD

使用新的乾電池測試時,約 40 分後翻頁器便無法工作,比不使用 DC Converter 的 2 小時半還差?量測輸入電壓約 1.6V,輸出電壓約 2.5V,而我的 Convert 規格為 DC - DC 0.8 ~ 3.3V To 3.3V。

懷疑是下面幾個原因:

01. ESP-12S 使用了第一個賣家標示錯的 5V Converter 造成的內傷。
02. 被第一個賣家標示誤導,使用 4.3V 測試第二個賣家的真 3.3V Converter,導致 3.3V Converter 內傷。
03. 焊接技術差,沒有完全接好,電流過不去,造成異常耗電。
04. 要如原廠建議,供電電流 > 500 mA。
05. GPIO 當輸入時,還是要接個電阻限流?CHIP 內部電阻阻值不夠,導致 CHIP 內傷。

後續待我好好想想 ~

2020/10/16 更新

從官方討論區看到的討論,看起來 internal pull-up resistor 應該不是問題。


2020/10/19 更新

除了在按鍵上的焊點貼上絕緣膠帶外,並未做其他改進。由於家裡只剩鹼性電池,故改用鹼性電池測試,陸續分別使用了 4 次,資料如下:

21:40 ~ 23:40 (120)
10:40 ~ 11:20 (040)
11:30 ~ 12:20 (050)
17:40 ~ 18:35 (055)

總共看了 265 分鐘,第 5 次想要繼續使用,翻頁器便無法開機,拿去手電筒仍然可以使用。

好像在 Youtube 上曾看過,鹼性電池的使用時間約略是普通乾電池的 2 倍?如果是這樣我會認為,雖然電池應該也還有電,但因為 DC Converter 會隨著輸入電壓的下降,提供的電流也隨之下降,故這時候的工作電流已經無法讓 ESP8266 正常開機。假設我調整使用時間,也許可以得到更漂亮的數據。

另外,Kobo Clara HD 在搭配我的自製翻頁器時,1 個小時約掉 5% 電。

如果想要讓翻頁器更持久,也許還可以朝下面幾點改進:

01. 按鍵從 polling 改 interrupt。
02. 使用官方 SDK 寫程式,減少不必要的執行程式碼。

這篇文章描述了一些關於啟動時的注意事項,還提到如果因為電源的關係導致 ESP8266 進入了故障模式,則有可能因為溫度一直上升而讓 ESP8266 死掉。

2020/10/22 更新

昨天趁休假時,又試了一次鹼性電池,總共看了 3 次,分別是 01:30、01:00、0200,累積看到 270 分鐘後,翻頁器便無法作用,關掉電源再開也無法正常開機。一樣把電池拿去手電筒還是可以使用。

看來在接了 DC Converter 後,使用鹼性電池就是可以使用約 4 小時半,暫時就先這樣吧。

2020/10/30 更新

上個星期買了Energizer Max AAA battery,測試看看是否可以撐比較久?陸續使用了 5 ~ 6 次,每次至少 30 分鐘以上,最後共可看 5 小時又 20 分鐘,好像也沒有比原本的鹼性電池好多少?此電池一顆價錢為 NT $12.4。

2020年9月26日 星期六

有時候放棄也是一種選擇

又是個不用補班日的週六,加上家裡的事終於告一段落,準備開開心心的來實作翻頁器成品。

早上先把 TX、RX、VCC、GND、GPIO0,焊到 ESP-12S 上,雖然焊的很醜,但也能順利燒錄程式,改了一下 Code 讓它連續翻頁好測試線路是否正常,實測半個小時,看起來沒有什麼問題。於是快中午時就殺去特力屋買齊我需要的東西,在等待 DC Converter  來的同時,準備下午先把能做的事做好。

好不容易自製焊台做好了,放置 ESP-12S 的洞挖了,兩個按鈕也鑽好洞放進電池盒內,這時悲劇發生了,原本配給向左翻頁的 GPIO14 在我喬線的時候,整個 PAD 被我扯掉,已經無法再把線焊上去,雖然還有其他 GPIO 可用,但我程式就需要改寫並重新燒錄,只好再比照早上把該焊的線焊一焊,不過這一次就沒有這麼順利了,沒有一根線可以順利焊上,偏偏屋漏又逢連夜雨,連 GPIO0 也被我扯掉,看看新買的 GOOT 烙鐵頭,似乎整個都氧化的很嚴重,連錫都無法順利吃上去。為了怕把我的 ESP-12S 整個報銷,果斷地放棄繼續下去。

到底是發生什麼事我也搞不清楚,究竟是我的大賣場錫條太差,還是我的使用方式不對才導致失敗?

想想軟體工程師還真是幸福,只要一台電腦就可以做事!不像硬體工程師,有準備不完的機斯。想不到我的 Kobo 翻頁器成品,竟然就這樣胎死腹中!

為了完成這個東西,目前為止花的錢大概又可以買一台五千元左右的翻頁器,這就是人生呀!

拍張照片為這個偽完成品留下記錄。


2020/10/02 更新

趁著連假前的晚上,用新買的一些機斯,一股作氣把所有要焊的線一起焊一焊,開開心心的翻了幾頁書之後,ESP8266 (ESP-12S) 就一直重開機,使用電表量測才發現我的工作電壓居然高達 5V?


重覆量測了好幾次結果還是一樣,為了怕是我焊接的問題,移除 ESP8266 (ESP-12S) 後重新量測,情況還是依舊!在確認了我露天拍賣購買物無誤後,發個訊息通知賣家這個情況。

等待的時間閒著也是閒著,拿出放大鏡仔細端詳,發現上面的型號是 HW-626,Google 了一下,確定是轉出 5V 的 DC Converter 沒錯!這告訴我們一件事,以後在焊接前要先確認好電壓才不會白做工,幸好 ESP8266 (ESP-12S) 用 3.3V 開機還算正常 ,但有沒有內傷我就不知道了?


如果賣家沒有給我正確的 Converter,我應該也懶得再找料重焊了,對於焊接苦手的我來說,可能也辦法再焊那麼順利了!我總不能缺什麼就買什麼工具吧?家裡的書櫃已經快放不下這些東西了。

2020/10/03 更新

既然 ESP8266 (ESP-12S) 最低工作電壓可到 2.7V,乾脆放棄使用 DC Converter,反正我也只是要驗證概念,順便測試在 5V 的摧殘下,我的 ESP8266 (ESP-12S) 是否還活著?終於我還是完成了這個產品,為這幾個月來的工作劃下句點。

2020年9月23日 星期三

買新不買舊的最好範例 ESP-12S

一直提不起勁去研究 3D 列印,尤其在得知列印時產生出來的微粒對身體不好後就更是興趣缺缺,雖然網路上有幫忙 3D 列印的店家,收費也不貴,但就是少了一股衝勁。

偶然看到網路上有人實做 Kindle 翻頁器,其設計原理跟我一模一樣,巧的是他也是使用 ESP8266 來實現,又可以將相關元件放入一個 3 x AAA 的電池盒中,於是便想依樣畫葫蘆的做出我的版本。

由於是 5 年前的文章,對方使用的是 ESP-03,目前網路上已經找不太到。故我就直接選了一個比較新的型號 ESP-12S。

雖然知道 Boot Mode 的差別,但我一直以為安信可公司的模組已經處理完畢,預設就是正常開機模式,後來才發現,如果我是購買舊一點的版本,例如 ESP-12F,很多腳位都要自己處理上拉或下拉,對高手來說這些不是問題,但對焊接低手的我來說,能少焊幾根線就是舒服。

原來買新不買舊的意義就在這裡!只要商家的產品真的是越出越好就好。


2020/09/24 更新

想不到也是一樣的 ESP8266 系列卻出現反例,NodeMCU 目前最新的是 V3,但網路上說雖然較新又較便宜,但因板子較大,故插在麵包板後已無空位容納其他排線,還好我之前買的是 V2。

2020年9月19日 星期六

Kobo 翻頁器 DIY 開發順序顛倒了

雖然這個專案已經告一段落,如果不做 3D 列印的話,其實也算是結束了!

但跟我當初預設的開發順序一點都不一樣?

為了回歸初心,還是花了一千塊錢,把當初想買的機斯備齊,也算是為這段時間留個記錄。

看似簡單的線路,如果沒有將 ESP8266 整個插進麵包板,完全沒有辦法工作,如果手邊有個三用電表,就能快速的排除問題。

其實任何學問都是相通的,雖然我還是個硬體菜鳥,但與程式解 Bug 的思路完全沒有兩樣,能夠細心思考問題並排除問題,這應該也算是工程師的浪漫一天吧。



另外,因為懶得一樣一樣購買,我使用的按鈕是直接從 Arduino 通用實驗零件包來的,價錢約略 100 出頭,內容如下:

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月19日 星期三

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年7月17日 星期五

Kobo Clara HD 翻頁器 DIY

自從知道 KoboCloud 這個專案後,我就一直在想能不能套用這個概念,自己寫一個 Client/Server 架構的專案來實現翻頁器的功能?由於 porting 一個藍芽 driver 沒那麼簡單,可能還需要 OTG 等,故我這個專案的概念很簡單:

01. Run a Web-Server on Clara, accept two API, /left and /right。
02. Another Client, send two API to Clara.
03. Web-Server clicks screen to simulate to turn page when receiving two API.

看起來應該沒有什麼大問題,目前第一個問題是要選擇哪一種語言來寫 Web-Server?有了 KoboCloud 的信心後,我決定使用 Golang,因為 Golang 本身就內建 Cross-Compiler 的功能,不用像 C 一樣,要準備編譯環境。

底下是我陸續嘗試的過程,留下記錄以供日後參考。

Web-Server

目標:
01. 仿造 KoboCloud,寫一個 KoboServer 機制 - Done
02. 快速寫一個 Server,在 Clara 上驗證可行性,看是否能收到 API - Done
03. Google Linux Mouse Event 之用法 - Done
04. 研究 Linux udev 機制,確定 rule 之行為 - Done
05. 根據 04,寫出一個穩定的 Server,避免 udev rule 一直觸發,運行太多的 Server 實體,導致 Clara 當機 - Done

Client

目標:
01. 當 Server Ready 後,先使用 PC 打 API 即可 - Done
02. Write an Android App to send two API to Server - Done
03. Write another Android App to receive Bluetooth event, then send two API to Server - Done

2020/07/17 日記

由於工作環境都是 Windows,所有的 Script 換行字元都要改成 Linux 下的,否則 Shell 會不開心,另外不論是 Script 或是 Server 的執行檔,移到 Linux 下包裝成 KoboRoot.tgz 時,記得先給執行權限,不然不確定會不會有問題?故最好的方式是直接在 Linux 下 開發,反正我的 UltraEdit 26 也有 Linux 版的授權。

Golang Cross-Compile 方式 on Windows

SET PATH=%PATH%;C:\Go\bin
SET GOPATH=%CD%

SET GOOS=linux
SET GOARCH=arm
SET GOARM=7

2020/07/20 更新

原本以為觸發 Linux Mouse Event 是一件很簡單的事,沒想到 Event Structure 會跟 Kernel 版本有關,如果是用到不對的 Structure,不論我 Event 怎麼組,一定什麼事都不會發生!結果還是需要花點時間整理消化資料。

幸好之前就有想到一招,就是在組 KoboRoot.tgz 時,裡面預留一道指令,把相關程式搬到 Kobo 顯示的電腦磁碟機內,則不論我是要抽換 HTTPServer 程式,或是要測試一些指令都會很方便,之後也可以如法泡製 udev 的 Script ,目前先留一個測試 Script 方便我除錯就好。


2020/07/21 更新

Google 一個 ParseDir 的 Script 函數,想要看看 Kobo 系統裡面有什麼,結果印了 10 萬多行後,後面全部是亂碼,我猜是因為 Stack 爆掉了,因為 ParseDir 是使用遞迴,而印象中 Clara 記憶體只有 512 MB,晚點最好是只 Parse /etc or /usr/local 等等的資料夾,或者也可以直接下 cp 指令把整個 root 複製一份到 /mnt/onboard 上,我認為 udev 執行時應該是 root 的權限。

至少目前可以看出一些資訊了:(From dmesg command)

01. Linux version 4.1.15-00089-ga2737fc02713 (gallen@gallen-M51AC) 
02. gcc version 5.3.0 (GCC)
03. tps6518x 1-0068: PMIC TPS6518x for eInk display
04. mousedev: PS/2 mouse device common for all mice
05. Battery Table (Open Circuit Voltage)
PMU: ricoh61x_set_OCV_table : 00% voltage = 3590900 uV
PMU: ricoh61x_set_OCV_table : 10% voltage = 3687400 uV
PMU: ricoh61x_set_OCV_table : 20% voltage = 3742300 uV
PMU: ricoh61x_set_OCV_table : 30% voltage = 3774100 uV
PMU: ricoh61x_set_OCV_table : 40% voltage = 3788700 uV
PMU: ricoh61x_set_OCV_table : 50% voltage = 3814400 uV
PMU: ricoh61x_set_OCV_table : 60% voltage = 3874200 uV
PMU: ricoh61x_set_OCV_table : 70% voltage = 3927900 uV
PMU: ricoh61x_set_OCV_table : 80% voltage = 3982900 uV
PMU: ricoh61x_set_OCV_table : 90% voltage = 4057300 uV
PMU: ricoh61x_set_OCV_table : 100% voltage = 4141600 uV
06. PMU: ricoh61x_init_fgsoca : * Rbat = 233 mOhm   n_cap = 1385 mAH (1500 ?)
07. SD Card
mmc0: new ultra high speed DDR50 SDHC card at address aaaa
mmcblk0: mmc0:aaaa SS08G 7.40 GiB 
mmcblk0: p1 p2 p3
VFS: Mounted root (ext4 filesystem) on device 179:1.
08. PMU:_config_ricoh619_charger_params set SDP 500mA charging.
09. Event Information.
/dev/input/by-path/platform-1-0024-event
/dev/input/by-path/platform-ntx_event0-event
/dev/input/event0
/dev/input/event1
/dev/input/mice

晚上試著使用 cp 指令複製 /,一直無法成功,不知道是為什麼?
目的地要寫絕對路徑,不能用相對路徑。

ls -al / 結果
ls -al /usr/local 結果
cat /proc/bus/input/devices 結果

2020/07/22 更新

從 /proc/bus/input/devices 來看並搭配 Google 結果,/dev/input/event1 應該是 TouchPanel,所以我們應該從這下手,而不是找跟 Mouse Event 有關的。

先用手機來抓 Event Raw Data,我的手機是 /dev/input/event4(一個一個試出來的),使用 cat 記錄按下時的 data,結果如下圖。


struct input_event {
    struct timeval time;
    unsigned short type;
    unsigned short code;
    unsigned int value;
};


下班再來試試 Kobo 的 Raw Data 是否有不一樣的地方。

回家依樣畫葫蘆抓取 Raw Data,不抓不知道,看起來 Clara HD 是 32 位元 OS?


針對翻頁這件事終於開始有點曙光了,現在只剩是否能用寫檔方式模擬點擊 Touch Panel 動作?

2020/07/25 更新

終於把概念實做出來了,早上就已經完成了向右翻頁,但一整天都搞不定向左翻頁,現在雖然搞定了,但還需要花時間整理資料。

影片連結

程式碼

Event

參考資料

2020/07/26 更新


2020/07/27 更新

執行 Web Server 後,記憶體增加了 380 KB,佔總記憶體 0.07 %,我想應該還算可以吧?


2020/07/28 更新

看了一堆 Kobo hacks 的相關資料,貌似在閱讀界面時,Wi-Fi 是被 Kobo 關起來的?可能是為了省電!也許我可以在 HTTPServer 裡跑一個 goruntime,只要偵測到 Wi-Fi 關閉,就再把它打開,就看對耗電量的影響如何。

晚上實測的結果,即使一直使用我的 KoboPageTurner 翻頁,約莫 2 分 10 秒後,Wi-Fi 便會自己關閉,有空再用 ping command 來確認更精確的時間。

2020/07/29 更新

這是從 Clara HD 說明書看到的,看起來是被系統自己關掉 Wi-Fi 沒錯,但是沒有活動是如何判斷?我猜可能是判斷是否有在做同步,或是有進 Kobo Store,亦或是有開瀏覽器,而不是真正的判斷是否有使用中的 TCP/IP 封包。


晚上實測的結果,在不動作的情況下,不論是在首頁還是 Kobo Store,也是約 2 分鐘多一點,Wi-Fi 便會自動關閉。另外,也試了不要休眠,關掉自動喚醒功能,還是無法解決問題,看來是像說明書說的是由系統自動關閉。

2020/07/31 更新

早上突然想到,也許 Kobo 檢查的是外網的封包,而 Web Server 是屬於內網的封包,故會被認為 inactive?雖然我個人是覺得不合理就是!最簡單的方式就是在 Web Server 內開一個 goruntime,定時一分鐘便去連 Kobo Store,應該就可以避免 Wi-Fi 被關閉,待驗證?測試的結果,沒用。

哈,知道方向就好搞,在我多方 Google 之下,終於發現一個設定可以避免 Wi-Fi 被關閉,但是網路上說沒有效?晚上測試的結果,果然不會再自動斷線了,但是 Wi-Fi 也無法再手動關閉,故這個方式也不是正解。

[DeveloperSettings]
ForceWifiOn=true

另外,從 cyttsp5_mt_process_touch (kernel/drivers/input/touchscreen/cyttsp5_mt_common.c) 這支 function,看起來有解釋如何計算 ABS_X 和 ABS_Y,但我心算似乎不符合我從 raw data 抓到的?

2020/08/01 更新

忙了幾天,唯一的收獲是知道 Clara HD 的原點是在右上角,且設值時 X, Y 要互換。

2020/08/02 更新

改了一版程式,Web Server 開啟時,會去設定 "ForceWifiOn=true",離開 Web Server 時再把設定設成 false,實測的結果並沒有幫助,我確定設定檔都有更改成功!唯一可能的解釋是當我們在程式中動態改變設定檔時,對 Kobo System 來說,那些值可能已經在它的 memory 裡,故它並不知道要強制開啟 Wi-Fi,如果有方法可以強制它重讀設定檔,也許這個解決方式就能生效?

我不確定插上 USB 生成磁碟機,接著退出磁碟機的那個時間點,Kobo 系統是否會重新載入設定檔,如果這個流程是確定的,也許有機會解決?

另外,我發現這個動態更改設定檔的方式,似乎有機會讓 Wi-Fi 在開開關關幾次後就無法使用,可能是 Kobo 比對 memory 和 file 後,因為未同步而導致錯亂?

2020/08/15 更新

忙了兩個禮拜,終於有時間再來搞一下這個專案,Google 了一下,寫了一個簡單的 Android App,終於實現完我當初所有想做的事。



下一個新目標:使用 ESP8266 實做硬體翻頁器。

1. 如何實做 3.3 V 供電電路?
2. 供電電路是否需要穩壓?
3. 外殼使用 3 D 列印?