2018年12月10日 星期一

控制電子紙 2.7inch e-Paper HAT (B)


此為三色電子紙, 白底黑字和紅字, 透過 SPI 傳輸
它的解析度為 176x264, 對 MCU 來說蠻大的
一張單色圖要佔用 5.6K 的空間, 雙色則是 11.3K, 低價的 MCU 裝不了幾張
我們將從 PC 透過 UART 設定 NUC131 控制它, 所有圖從電腦傳
用本實驗室第 18 號板 WT-18 進行操作

模組背面的樣子:


若要拆解後應用, 可用紅外線拆焊台的預熱功能加熱到 100~150 度即可軟化背膠:

熱風槍應該也行, 只是我手邊有更好的工具所以就用了

拆下後面板背面的樣子:


由於需要大量資料傳輸, 買回來後沒東西測, 於是就這樣丟著, 一放就是五個月
結果五個月後拿起來看:

邊緣好像有點掉漆, 不知道為什麼, 總之, 還是用看看

官方資料:2.7inch e-Paper HAT (B)

這是 B 版, 原先的版本只有黑白
這些應該都是第二代產品了, 我有買過第一代:


背面:


背面角落:


相近型號:em027as011 em027as012 em027bs013

How to Drive an Electronic Paper Display (EPD) with EFM32

這裡有篇介紹應該是第一代:

How to Use an E-Paper Display in Embedded Applications

注意他固定電子紙的電路板, 上面密密麻麻的一堆料
第一代的外部元件很多, 要一堆電容和好幾顆 FET 開關某些腳, 很麻煩
第二代雖然還是需要不少電容, 但至少控制線只需要六條
所以第一代我就留著做紀念了, 太麻煩根本不想用, 當初印象中那片還要破千的
我是有備料, 但要動手時猶豫了...我真的要為它付出這麼多代價嗎?
現在第二代連板子一起出只要 700 元有找, 差真多

接著是我們的控制板 WT-18:


電路圖:wt-18.pdf

韌體源碼:wt-18-src.zip

ubuntu 用 B 版電子紙控制程式:wt-18-epaper.zip


韌體編譯燒錄同前篇: 在 ubuntu 上開發 nuvoton m051 實驗板

只是 openocd 要小改, NUC131 這顆 MCU 並不在 openocd 列表中, 燒 flash 時會有問題:

> flash write_image erase test.bin 0                
auto erase enabled
Device ID: 0x10013110
NuMicro flash driver: Failed to detect a known part

auto_probe failed

無法燒錄, 認不到 flash, 改這個只要把標紅色的 ID 複製下來然後新增到列表中
修改:openocd-code/src/flash/nor/numicro.c

static const struct numicro_cpu_type NuMicroParts[] = {
    /*PART NO*/     /*PART ID*/ /*Banks*/
    /* NUC100 Version B */
    {"NUC100LD2BN", 0x10010004, NUMICRO_BANKS_NUC100(64*1024)},
...
    /* NUC131 */
    {"NUC131SD2AE" , 0x10013110, NUMICRO_BANKS_NUC100(64*1024)},


    {"UNKNOWN"     , 0x00000000, NUMICRO_BANKS_NUC100(128*1024)},
};

加一筆資料到 NuMicroParts 這陣列中, 加在 "UNKNOWN" 項目之前任意地方都可
然後重新編譯即可使用

新唐 1xx 系列 Cortex-M0 MCU 的 UART 似乎有使用上的限制, 這次實驗才發現
由於用 UART 多所以買了片 FTDI 的 4-port USB to UART:

這片買回來沒幾小時就被我玩壞XD
想改 micro usb, 結果接反, 把穩壓燒了, 一開始以為晶片掛了
但我沒有長時間反接, 我認為 FTDI 那顆不會那麼容易壞, 查了一下發現穩壓開路
換一顆就 OK 了, 接上新唐 MCU 發現 FTDI 發出的資料 MCU 可以正確解讀
但是 MCU 返回回應時 FTDI 收到亂碼, 可是同樣韌體沒改換成 PC 內建 UART 就正常
新唐 1xx MCU UART 收發每個 byte 間都要有一點 delay, 可能是這造成, 有相容性議題
FTDI 那顆確定沒燒, 不是我玩壞才不通的, 我用 STM32 去收發是正常的, 它沒壞

不過現在新電腦幾乎沒有 UART 了, 晶片有也不會引出, 除非特殊市場用
所以我們還是要面對這事實, 實驗手邊的產品有一顆可以:PL2303
這顆 USB serial 是以前 Linux 很早就內建驅動的產品, 所以以前我都認這顆
這顆的線材現在還買得到, 而我有買晶片回來做板子:


WT-06 線路圖:


WT-07 線路圖:


有需要的用戶也可以自己搞, 這板子的原型還在, 2011 年製:

還能用, 而且還是用單面板製做
只是可惜他們沒有一對多的產品, 要 4-port 的話只能裝 hub + 4 顆晶片, 麻煩

另外還有, ubuntu 約 17.10 左右開始似乎 UART 開始啟用 DMA
意思就是就算寫程式時是一個一個 byte 塞, 間隔太短的話還是會 DMA 發送
DMA 發送的意思就是每個 byte 會緊接在一起出去......看看上面的議題應該就知道...
對, 新唐 MCU 一樣是收不到, 所以發送每個 byte 之間還要 delay, usleep(100) 即可
唉, 就便宜貨嘛, 湊合著用XD 不知道他們家 4xx 系列有沒有改進
各家 MCU 多少都有點 bug, 只是看影響程度, 雖然對我們這應用影響蠻大的...
但板子都做了, 用唄!這板子算是過渡期產品, 因為要快速對傳資料應該用 USB
但考慮到 USB 韌體很花時間, 換成 ARM 系列的 USB 學習至少要一個月
時程太長, 只好先用這個 UART 方案頂一下

接著回到電子紙, 用 WT-18 這樣接:


我沒有接 BUSY 線, WT-18 韌體目前沒有做 GPIO input 功能
雖然不難但是懶!反正 sleep 等一下就行了XD 如果是 MCU 直接控制, 這隻腳必須接上
接好線後用 wt-18-epaper.zip 裡的工具, 先編譯:

gcc epaper-b-img.c -o epaper

然後執行

./epaper /dev/ttyUSB0 img.bmp

ttyUSB 是連接的 serial port, bmp 檔則是顯示的影像
顯示影像是一張 176x264 的 24-bit BMP 檔案, 用 gimp 輸出時務必這樣選:


我的程式只是很簡單的從 BMP header 標記的圖檔起始位址去撈資料
判斷紅色的就丟紅色圖檔緩衝, 判斷黑色的就丟黑色圖檔緩衝
處理後就直接丟出去了, 因此檔案格式不能複雜, 影像尺寸和解析度也必須相符
可參考源碼的 img_read() 內容, 很簡單, 所以不容錯!
從影像尺寸應該可以發現這是一張原生直的電子紙, 雖然示範時我們都是橫著放
文字顏色判斷有做寬範圍, 但如果要顯示清晰, 建議還是在繪製文字時選不要反鋸齒
gimp 輸入文字時請選這樣:


程式初始化寫在 epd_init(), 一開始抄錯範例, 用到不是 B 版的範例程式
結果寫進去變這樣:

紅色變淡, 無法蓋過黑色, 後來程式修正後還是有殘影, 然後斷電放個兩三個小時後才恢復
看來不當操作有可能會損壞面板, 以前的 LCD 螢幕也是如此, 所以發現異常馬上斷電
不要電一直送一直盯著看, 拍照下來慢慢想就是了, 錯誤狀態一直送電可能會損壞面板

epd_init() 裡塞了很多數據, 用戶就乖乖照抄就是了
那應該是模組商找控制器供應商支援的, 我們不需要知道內容
程式完成初始化後開始發送影像, 發送後觸發控制器更新面板, 等待完成, 然後休眠
面板更新畫面時的過程請見影片: MAH02151.mp4
它需要 16 秒的時間更新畫面!有夠久!
我看過黑白的電子紙大概一秒內就能完成, 這三色要 16 秒也太久!
這看來應用範圍大概就是貨架標籤而已了, 這拿來當電子書的話用戶會靠杯的

紅色字細看:


黑色字細看:


看起來黑色顯示比較銳利, 紅色邊緣比較糊, 但顏色還算鮮艷
真的是貨架標籤適用, 特價時可標紅字
只是雖然這電子紙和舊版相對較便宜, 但報價仍然算高, 如果是用在一般賣場
標籤電子紙比貨架上的飲料還貴上 10 倍好像怪怪的喔?XD
如果說自動更新可以節省人力, 但是放貨到架上還是要人力啊, 感覺沒有賺
如果是工廠貨架應該會偏好 NFC, 貼上就能用, 靠近就能掃, 不需要光線
所以......這個做完還是就放著吧, 不知道能幹麻
有空再找個更新比較快的黑白電子紙來玩


更新完成後放著就會一直維持畫面, 不用插電, 這是電子紙的特色, 而且可以維持非常久
圖中文字是某站的廚文, 別小看一句詢問大家看法的問句, 它可以輕易的激怒某些人XD
效果就像在蘋果車禍新聞下留言 "重機不該上國道" 一樣, 會怎樣? 自己試試就知道!XD
該站是我最後一個持續快速 F5 (重新載入網頁) 的網站, 但是 2017 年初開始實行言論管制
發罵菜桶的, 罵吸獨的, 罵甲甲的言論會遭刪除, 亮 IP, 或是鎖 IP, 罵中國和 KMT 的就沒事
管理員深綠, 所以我就撤除快速 F5, 目前我沒有快速 F5 的網站, 可謂 F5-free
現在都是想到才點開網站, 看到那種言論管制我還以為兩岸已經統一了

扯遠了, 這張 WT-18 目前所有功能都驗過了, 雖然那個 UART 有點問題, 但其他的就都能用
測過 485:

不過這只是實驗用, 因為 485 就是 UART 改差動傳輸而已
這原本是要接工控設備, 但計畫 GG 了, 留著測試用
因為是 UART 轉的, 所以......那個連續傳輸的議題會完美繼承XD
既然是 UART 轉的如果有需要 485 買個轉接頭就是了, 除非遇到單工問題
485 的收發器會靠一隻腳來判斷是收還是發, 買轉接頭就是讓它自動判斷
如果用戶遭遇這隻腳判斷失誤的問題解不了, 那就需要透過 MCU 轉發
或是訊息夾上 CRC, 錯了重發就是了


CAN 也能用, 這板子電路沒問題, 韌體功能也都有做

11 則留言:

  1. 不是有支援QSPI Flash XIP模式的MCU, 新唐今年力推。直接用QSPI Flash做為程式及資料區。QSPI Flash是華邦出的。
    MCU已不在是小容量了。
    只是又回去外掛。

    回覆刪除
    回覆
    1. 48x 系列, 有打算用, 不過空間需求通常是放資料
      有沒有 XIP 其實不是那麼重要
      最低規的 mini51 加上 SPI flash 一個一個 byte 讀也是能用
      但就是板子要預留元件接線就是了, 目前我的都沒做

      刪除
  2. 為了應付未來IOT應用或是圖形需求。我是利用MCU可以自寫Flash能力,直接在上面加裝直譯器。直譯器收到字就直接寫回Flash內。
    主要寫回的都是function pointer位址。於是完成在Flash上編程的語言。這個功能在STM32F系列上有成功。但還要做一些調整。
    目前有看到人利用Flash做參數儲存,但未看到有人寫出可用的語言出來。
    一樣的做法,也可以用在SPI Flash上,變成是一種外部執行擴充,用來寫圖型執行,或是操作方法,應是可行。
    本來還想將pico C移上去,但RAM的需求不穩定。還是先穩定一下現在用的方法。

    回覆刪除
    回覆
    1. 直譯器讀取的是腳本, 腳本放設定區本質上也是一種參數資料, 應該一樣吧?
      如果說是要通用型直譯器我認為不可能, MCU 應用變化太大, 性能落差也大, 很難通用
      pico C ? 釀啤酒機? 應該不是XD

      刪除
    2. 果然要找對的人才會懂。不過,以前我是認為將程序(以function pointer)放在參數區,是可以設定參數及功能行為。但少了一點什麼。
      後來找到方法加入IF ELSE指令成功後,又加入其他控制指令如WHILE進去,變成可以判定執行條件。這個大幅度延伸腳本的適用性。最近又想到加入多工程序的方法。已近似電腦語言功能。
      另一個重點是,目前程式執行功能佔用Flash約7KB,RAM使用4KB,使用者用的指令字典(人類輸入文字)8KB放在未使用的Flash上,字典可以動態加入新的指令,可以做到線上新增功能(含有取用未使用的RAM做新變數來使用)。
      使用者是輸入文字,字典則直譯成可以執行的對應函式指標寫入。所以並不是儲存原始文字。

      刪除
    3. 放 function pointer 蠻危險的, 因為程式更新時不一定會刷掉參數區
      程式本體動了指標位置有可能會跟著動, 除非都不更新
      改動後跳以前存的指標有可能出錯 (應該說很難不出錯XD)
      我不認為存文字會有什麼問題, 若 CPU 有數十 MHz 跑起來不會有瓶頸
      只要選短一點的字串即可, 只是回到最根本的需求:是否有必要做
      因為 if-else, loop 等功能, 若放到 MCU 上通常是為了達到某些目的
      而這些目的功能, 也就是字典裡的東西, 要有足夠的價值, 要值得我們做動態運作
      如果只是修改燈號, 改變圖形, 其實......整包韌體直接發 OTA 不就好了?
      才數十 KB, 做個 bootloader 還更省事, 非動態不可的就做成參數
      除非有特殊要求, 不然至我會選這方案

      刪除
    4. 厲害確實function pointer有這些問題。所以我採用VM的方式設計。基礎指令和執行相關函式,使用執行代碼,這樣就脫開依賴性,在firmware更新後也不會影響腳本。其他高階定義(IF ELSE ...)都是對VM內的位址,還可以移去另一個機器上運行(想利用emscripten在Browser上給使用者做模擬及開發)。
      使用function pointer的原因是,使用者送文字指令來之後,除了直譯查找字典去找出對應的pointer位址外,寫回flash要時間,轉成pointer後碼比較少,使用者會以為在compile。但執行時,回去XIP模式下,可以快速取得下一個指令的位址,直到遇到op code才會真正回internal flash去執行。

      會有這種應用方式,主要是在圖型式UI上。會有修改不完這件事,使用者會想要移位置,改字,自己放圖。若沒有做一個UI editor事情會做不完,但公司不大的話,誰去做UI editor。所以我才會想到用VM,同時C又可以轉成javascript,所以C可以執行下,直譯器小改,就可以轉去Browser下運行,再貼入網站,給使用者自己去改,改好後自己將VM image載回。我只要燒入VM image就可以了。

      刪除
    5. 你需要的不只是 XIP, 應該是需要 memory mapped flash + SRAM
      這樣的設計不只需要大儲存空間和大記憶體 (是相對於 MCU 較大, 其實也就幾個 M)
      而且這樣做下去可能會比大公司做的那種還累喔, 因為你選了一個大坑:javascript
      瀏覽器上的 javascript 已經是公認的無底洞, 一直在改, 各家都不同
      自己做自己用看起來沒問題, 當你灑給客戶的時候就知道, 等一下說手機跑了不正常
      等一下又說平板跑了不正常, 客戶會用各種可以上網的設備測試(整)你, 然後報問題
      所以 UI editor 才是小公司該選的, 能維護網頁編輯的才是大公司, 或是免洗(?)的新創公司XD
      這裡有個類似的應用:台達的 dop-100 (delta dop-100)
      Google 可以找到使用手冊, 展覽有 demo 過:
      https://photos.google.com/share/AF1QipNiN9qzwoNJrQjcldOjJqtfZlAqS-JBgiJOXsuyGMJQlhHHdpuNx0dTb82yX6PnaA/photo/AF1QipO0xIdqi2oB9rbzXEN5UNmdYrVH1qkE6zIwFf1w?key=ak5GVndaUFVySW93N0dLcTBNQ05TWlVNZmlfTzdn
      他們是用 Cortex-A8 處理器, 可以做的功能非常多
      如果你需要這種等級的 UI 規劃, 又要低開發成本, 可考慮找 Android
      有便宜的板子可買, 有豐富的既有元件, UI 編輯器去找 Google 要即可XD
      用 MCU 不是做不到, 只是如果後續規格一直加上去, 最後用了 STM32F4 等級繪圖加速
      全部做完不見得比 Android 的板子便宜, 不論是軟體還是硬體成本

      刪除
    6. 我不是在開玩笑,已實作出原型,真的只有7KB internal Flash。相同的C碼,用emscripten轉出asm.js在node.js中已可以執行。
      故我以為這個idea已實作差不多了才提出來。但很難找到人說明。
      怎知你理解後要用Cortex-A系列才能做。

      刪除
    7. 不然你有興趣看原始碼? 我直接寄給你!

      刪除
    8. 別誤會, 不是懷疑你作不到, 而是考慮應用後的空間
      引用別家的產品是讓你看看別人家做動態是為了什麼需求
      不然這樣吧, 先不要這麼複雜, 你評估看看在你平台上做這樣:

      在 160x120 的 16-bit 彩色 LCD 上顯示一張全螢幕的彩色圖做背景
      然後在中間以中文顯示當前時間, 例:2018年12月19日 上午11時50分30秒
      每秒更新一次時間, 即是電子錶應用, 典型的 IoT

      這樣會佔用你多少儲存空間? 顯示繪出圖形需要多少時間?

      刪除