/* 自定義代碼塊樣式 */

2025年2月11日 星期二

定義Arduino Flash Partition

在Arduino 的工程目錄中,增加一個 partitions.csv 文字檔案,內容範例如下

  1. # Name, Type, SubType, Offset, Size, Flags
  2. nvs, data, nvs, 0x9000, 0x5000,
  3. otadata, data, ota, 0xe000, 0x2000,
  4. app0, app, ota_0, 0x10000, 0x140000,
  5. font_hs20,data, , 0x150000,0x2250ac,
  6. spiffs, data, spiffs, 0x3C0000,0x30000,
  7. coredump, data, coredump,0x3F0000,0x10000,

2025年2月7日 星期五

獨立編譯 LVGL 中文字庫並放置於Flash中並使用Arduino讀取

透過LVGL官方網站字體轉換網頁,轉換出需要的UNICODE字庫

Font converter

這邊取用 HarmonyOS_Sans_SC_Regular.ttf 作為TTF字體測試範例,可於此處下載字體 
因為要轉換字體大小為20,在Name欄位填寫 font_harmony_sans_20
TTF字體範圍: 0x20-0xBF,0x3000-0x301F,0x4E00-0x9FAF,0xFF00-0xFF64


按下Submit後開始進行轉換,完成後,會下載一個 font_harmony_sans_20.c 的檔案,裡面即為字型檔案,接著要將此檔案複製一份,將此檔案分別為兩個檔案,font_harmony_sans_20.c與font_harmony_sans_20_font.c
font_harmony_sans_20.c 是將 glyph_bitmap[] 與 glyph_dsc[] 兩個陣列移除後的檔案,font_harmony_sans_20_font.c 則相反,是將 glyph_bitmap[] 與 glyph_dsc[] 兩個陣列的所有資料及檔頭資訊保留下來的檔案,如下圖  (已將兩陣列資料摺疊收起)


將font_harmony_sans_20.c與font_harmony_sans_20_font.c 複製到 Arduino\libraries\lvgl\src\font 目錄下
修改 font_harmony_sans_20.c 檔案
1.修改引入檔案路徑 修改前
  1. #include "lvgl/lvgl.h"
修改後
  1. #include "../../lvgl.h"
2.增加ESP相關函數
  1. #include <‍esp_partition.h‍>
  2. #include <‍esp_err.h‍>
  3. #include <‍esp_log.h‍>
  4. #include <‍nvs_flash.h‍>
  5.  
  6. static const char *TAG = "lv_font_harmony_sans_20";
3.在font_harmony_sans_20.c 增加讀取MMU記憶體位址的函數,最後的 font_dsc.glyph_dsc 偏移量會在後面透過命令得到
  1. lv_port_font_harmony_sans_20_load(const char *partition_label)
  2. {
  3. const esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, partition_label);
  4. if(partition == NULL) {
  5. ESP_LOGE(TAG, "Can't find %s partition!", partition_label);
  6. abort();
  7. }
  8.  
  9. ESP_LOGE(TAG, "Find %s partition!", partition_label);
  10.  
  11. const void *flash_offset;
  12. esp_partition_mmap_handle_t map_handle;
  13.  
  14. // Map the partition to data memory
  15. ESP_ERROR_CHECK(esp_partition_mmap(partition, 0, partition->size, ESP_PARTITION_MMAP_DATA, &flash_offset, &map_handle));
  16. ESP_LOGE(TAG, "Mapped partition to data memory address %p\n", flash_offset);
  17. ESP_LOGE(TAG, "mapped %s@%1p", partition->label, flash_offset);
  18.  
  19. font_dsc.glyph_bitmap = flash_offset;
  20. font_dsc.glyph_dsc = flash_offset+0x1d26dc; //2bpp
  21. }
並在 lv_font.h中增加
  1. extern const lv_font_t font_harmony_sans_20;
  2. void lv_port_font_harmony_sans_20_load(const char *partition_label);

增加一個 rodatagenbin.ld 腳本檔案,確保 .rodata是從0x00的位置開始

  1. SECTIONS {
  2. . = 0x0;
  3. .text : {
  4. *(.rodata)
  5. } = 0
  6. }
  7.  
開始編譯 font_harmony_sans_20_font.c 檔案,路徑會因安裝Arduino在不同位置而有所差異


1. 編譯 font_harmony_sans_20_font.c 產生.o 檔案
  1. C:\Users\yyli\AppData\Local\Arduino15\packages\esp32\tools\esp-x32\2405\bin\xtensa-esp32-elf-gcc -c -D LV_CONF_SKIP -D LV_FONT_FMT_TXT_LARGE -I d:\Users\yyli\Documents\Arduino\\libraries\lvgl font_harmony_sans_20_font.c
2. 編譯 .o code
  1. C:\Users\yyli\AppData\Local\Arduino15\packages\esp32\tools\esp-x32\2405\bin\xtensa-esp32-elf-ld -T rodata_gen_bin.ld .\font_harmony_sans_20_font.o -o font_harmony_sans_20_font.out
3. 生成 .bin code
  1. C:\Users\yyli\AppData\Local\Arduino15\packages\esp32\tools\esp-x32\2405\bin\xtensa-esp32-elf-objcopy --output-target elf-xtensa-le -O binary -S font_harmony_sans_20_font.out font_harmony_sans_20_font.bin
4. 查看字型陣列資料的偏移值
  1. C:\Users\yyli\AppData\Local\Arduino15\packages\esp32\tools\esp-x32\2405\bin\xtensa-esp32-elf-objdump -t font_harmony_sans_20_font.out
Dump偏移量的結果,把結果回填到 font_harmony_sans_20.c 的 font_dsc.glyph_dsc 偏移值,在此例為 0x1d26dc
  1. font_harmony_sans_20_font.out: file format elf32-xtensa-le
  2.  
  3. SYMBOL TABLE:
  4. 00000000 l d .text 00000000 .text
  5. 00000000 l d .comment 00000000 .comment
  6. 00000000 l d .xtensa.info 00000000 .xtensa.info
  7. 00000000 l d .xt.prop 00000000 .xt.prop
  8. 00000000 l df *ABS* 00000000 font_harmony_sans_20_font.c
  9. 00000000 l O .text 001d26db glyph_bitmap
  10. 001d26dc l O .text 000529d0 glyph_dsc

使用樂鑫官方的Flash downliad tool將fontharmonysans20font.bin燒錄到 Font Flash 定義的為止即可,(定義Arduino flash partition)

上面產生的 fontharmonysans20font.bin 在flash要預留glyphbitmap + glyphdsc 的大小,所以在partition.csv中定義 bin起始位址 0x150000,size為 0x2250ac

到此完成把字體bin燒錄到flash,在程式中要用到中文字時先呼叫 lvportfontharmonysans20load("font_hs20"); 函數就能夠使用中文字了

  1. lv_init();
  2. lv_display_t * disp;
  3.  
  4. /*TFT_eSPI can be enabled lv_conf.h to initialize the display in a simple way*/
  5. disp = lv_tft_espi_create(TFT_HOR_RES, TFT_VER_RES, draw_buf, sizeof(draw_buf));
  6. lv_display_set_rotation(disp, TFT_ROTATION);
  7.  
  8. /* Create simple label */
  9. lv_obj_t *label = lv_label_create(lv_screen_active());
  10.  
  11. lv_port_font_harmony_sans_20_load("font_hs20");
  12. lv_obj_set_style_text_font(label, &font_harmony_sans_20, 0);
  13.  
  14. lv_label_set_text(label, "Hello Arduino! (V9.0) 中文版");
  15. lv_obj_align(label, LV_ALIGN_CENTER, 0, -50);

2023年10月2日 星期一

Free ERP on the Raspberry Pi (odoo)

 

#更新系統軟體

sudo apt update && sudo apt upgrade -y


#安裝資料庫

sudo apt install postgresql -y


#安裝py程序

sudo apt install python3-pip -y


#安裝odoo PDF工具

# for 32bit

wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox0.12.6.1-2.raspberrypi.bullseyearmhf.deb

sudo apt install ./wkhtmltox0.12.6.1-2.raspberrypi.bullseyearmhf.deb -y


# for 64bit

wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox0.12.6.1-2.bullseyearm64.deb

sudo apt install ./wkhtmltox0.12.6.1-2.bullseyearm64.deb -y


#安裝PDF工具中文字形

sudo apt install fonts-wqy-microhei ttf-wqy-microhei fonts-wqy-zenhei ttf-wqy-zenhei -y


#清理快取

fc-cache -f -v


# check Odoo service is running

sudo systemctl status odoo

2022年9月12日 星期一

DIY 簡易式數位電源供應器

一個小型桌上型的電源是很久前就想做的,但想了很久還是沒動手做

但,現在只要接幾條線,就可以完成了,先看成品吧




輸出 5V的時候,跟旁邊的硬幣比,就知道大小了

這是用兩個模組拼接起來的,一個是AC轉DC12V2A的電壓轉換模組


另一個模組是DC數位式降壓模組,按鍵與功能說明如下
把AC/DC模組的輸出接到降壓模組的輸入端,然後再於降壓模組的輸出端接上香蕉端子座,就完成了

電壓設定的範圍從功能圖上可以看到,為1.2V~32V,實際來操作一下
每按一次+或 - 的按鈕,就會有0.05V的變化,若是長按的話,變化量則為0.1V的變化,最後的最大值與最小值設定確實為1.2V與32V




但因為現在的輸入只有12V,所以超過12V的電壓實際上還是只有12V而已,僅僅是降壓模組可以支援到32V的設定,不等於實際上的輸出,所以若真的要輸出32V,就必須把輸入端的電壓再提高到32V以上,不過因為目前實驗都在12V以下,因此就目前的電壓來說已經很足夠我使用了

最後來看一下輸入端的電壓,實際是12.1V,改天需要再找個外殼給它穿上












2021年3月26日 星期五

設定Home Assistant

 安裝完成HA後,接著就是要進行設定的工作

在左邊選單列中,選擇Supervisor,再到右邊畫面,上方選擇附加元件商店,安裝我們需要的套件包



這邊是安裝四個套件包的畫面,File editor請一定要選擇,因後面有部分設定會需要用到它來進行;同時也將樹莓派當作 MQTT broker ,因此有安裝 Mosquitto broker



點選 MQTT broker ,並於上方選擇[設定]
這邊有變動到的就只有使用者帳號與密碼,都修改為tester,可依自己需要做修改



最後一步驟,點選左邊File editor的選單,編輯 /config/configuration.yaml 檔案
在在最後面加入

  1. mqtt:
  2. discovery: true
  3. broker: 127.0.0.1
  4. username: tester
  5. password: tester

MQTT broker設定就算完成了







2021年3月25日 星期四

安裝 Home Assistant

 markdown

Home Assistant 我是用官方的映象檔安裝在樹莓派上使用,下載的檔案就直接燒錄在SD卡即可,這邊我使用的燒錄軟體是Rufus

但別急著插進樹莓派開機,還要設定WiFi連線,才能讓樹莓派連上網路

在SD卡根目錄下,新增一個CONFIG的目錄,裡面再新增一個network目錄

在network目錄內,增加一個文字檔案 my-network

  1. [connection]
  2. id=resin-wifi
  3. type=wifi
  4.  
  5. [wifi]
  6. hidden=true
  7. mode=infrastructure
  8. ssid=你的SSID名稱
  9.  
  10. [ipv4]
  11. method=auto
  12.  
  13. [ipv6]
  14. addr-gen-mode=stable-privacy
  15. method=auto
  16.  
  17. [wifi-security]
  18. auth-alg=open
  19. key-mgmt=wpa-psk
  20. psk=你的Wifi密碼

把ssid與wifi密碼修改完後,就可以插入樹莓派開機了

插入電源開機。第一次開機HA會自動下載最新版的 Home Assistant 並執行,耗時約 20 分鐘。

在等待更新的過程中,也可以打開瀏覽器輸入 http://hassio.local:8123 或是http://homeassistant.local:8123 看到HA的畫面

等待更新結束後,會看到建立帳號的畫面,就依照畫面指示,完成資料填寫即可






2020年10月23日 星期五

PL2303 傳輸線更換為 CH340N 晶片

手邊有兩個USB to Uart 的傳輸線都不能使用,可能是PL2303又掛了,所以這次不使用2303的IC,想要改裝成CH340的試試

從官網上查到有一個CH340N type,封裝只有8 pin,又不用外加振盪器,就入手了幾顆進行測試


首先當然是把PL2303從板子上移開,振盪器也卸除掉,如下圖


接著找看看有沒有相關的Pin 腳可以直接焊接就好


目前找到最好的擺法就是把 IC 反過來,背面朝上的方式,如下圖


焊接完後的結果


焊接的過程中,腦海中一直浮現一段話,「工程師沒什麼了不起的,只是比較會做手工藝而已」,這是一個業務朋友跟一個採購對話的內容,想想自己好像也是一個比較會做手工藝的工程師而已呀,哈

好了,焊接完成後,沒意外的話,應該就會在裝置管理員中看到COM Port了


後面再用 PUTTY 測試TXD/RXD是否正常,把TXD/RXD 短路在一起,Putty開啟 serial 模式,鍵盤敲什麼字元,Putty 終端機就應該要顯示什麼字元,如果都有顯示,代表正確焊接,收工啦













定義Arduino Flash Partition

在Arduino 的工程目錄中,增加一個 partitions.csv 文字檔案,內容範例如下 # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000, o...