Blog
Gemini CLI 專案協作筆記:從 Web App 到極簡自動化的開發歷程
總覽
本專案的初始目標是建立一個具備篩選功能的使用者介面,以自動化處理貓咪住宿文件。在開發過程中,我們遭遇了數個與 Google Apps Script 環境相關的挑戰,最終透過簡化架構和採用更穩健的技術決策,成功達成目標。
第一階段:不可行方案與經驗教訓
我們首先嘗試了建立一個功能豐富的前端介面,但最終證明此路不通。(如圖一、二)
方案:獨立 Web App / 側邊欄 (Client-side UI)
-
嘗試過程:
- 建立 Web App:最初構想是建立一個獨立的網頁應用程式(doGet),提供篩選欄位和操作按鈕。(如圖三)
- 遭遇神秘錯誤:即使提供了語法正確的現代 JavaScript (ES6+)程式碼,在執行時依然反覆出現 SyntaxError (語法錯誤),例如Unexpected token。
- 偵錯與降級:為了排除問題,我們將後端 Code.gs 的程式碼全部降級為相容性更強的舊版 ES5 語法。
- 遭遇前端腳本失效:即便後端語法降級,前端網頁的按鈕依然完全沒有反應。進一步偵錯發現,無論是寫在 HTML 中的 onclick屬性,還是使用標準的 addEventListener 事件綁定,前端的 JavaScript 腳本都完全沒有被執行。 (如圖四)
-
根本原因:
Google Apps Script 的 HtmlService 沙箱環境非常特殊且存在諸多限制。標準的網頁開發實踐(如 DOMContentLoaded 事件)可能無法運作,且 Client-side JavaScript 的執行容易受到使用者的 Google 帳號安全設定、瀏覽器版本、擴充功能等我們無法直接控制的因素干擾。
-
教訓:
對於 Google Apps Script 專案,其核心優勢在於與 Google 服務的後端整合。任何複雜的前端 UI 都會引入巨大的不確定性。應優先考慮純後端 (Server-side)執行,只有在絕對必要時才引入前端 UI,並要為其不穩定性做好準備。 (如圖五)
第二階段:最終可行方案與設計決策
在放棄了複雜的前端 UI 後,我們回歸到最原始、最穩定的架構,並解 決了資料處理中的核心難題。
方案:純後端 + 自訂選單 (Server-side Only)
-
設計理念:
- 放棄所有不穩定的前端介面(Web App、側邊欄、HTML)。
- 將所有邏輯都放在 Code.gs 中。
- 僅透過在試算表頂端建立的自訂選單 (onOpen 函式)來觸發後端函式。
- 這是最穩定、最可靠、最容易維護的架構。
-
關鍵的技術決策:
-
語法選擇 (Syntax Choice): 由於使用現代 JavaScript (ES6+) 在該專案環境中反覆出現無法解釋的語法錯誤,最終決定全部採用舊版 ES5語法,以換取最高的相容性與穩定性。
-
資料去重邏輯的演進 (Evolution of Deduplication Logic):
- 目標:integrateData 函式在多次執行時,只新增真正的「 新」資料,而不是重複附加。
- 失敗的嘗試: 最初嘗試在執行時比對「來源日期」和「已存 入的日期」。但因 Google 試算表會自動將「日期文字」轉換為「日期物件」,兩者在 格式和精度上的微小差異導致比對永遠失敗。
- 成功的方案:寫入「唯一識別碼」(EntryKey)
- 在 IntegratedData 工作表中新增 EntryKey 欄位。
- 第一次處理資料時,根據其內容產生一個標準化的字串Key(格式為 手機_貓名_YYYY-MM-DD)並存入此欄。
- 後續執行時,直接進行「字串對比字串」,徹底避免了所有資料格式轉換的問題。這是解決此類重複資料問題最專業、最可靠的方法。 (如圖六、七)
-
程式碼結構優化 (Code Structure Optimization): 為了解決因平台顯示長字串時自動換行,而導致使用者複製貼上程式碼出錯的問題,最終版本將indexOf(‘一個很長的欄位名稱’) 的寫法,全部重構為在迴圈外預先定義好所有欄位的索引變數(如 var ownerNameCol=headers.indexOf(…))。這讓程式碼更乾淨、效率更高,也杜絕了格式問題。 (如圖八)
-
總結
這個專案的成功,關鍵在於透過務實的偵錯,辨識出平台的限制,並做出正確的架構決策。最終,一個由繁化簡、回歸後端核心的設計,搭配一個穩健的資料去重策略,成功地實現了使用者的核心需求。








NUVOTON 新唐 NuMaker-UNO-M4 開箱文
作者:順哥
email:palmbear@gmail.com
參考資料 1:NUVOTON 新唐 NuMaker-UNO-M4 產品頁,https://direct.nuvoton.com/tw/numaker-uno-m4?srsltid=AfmBOopFhCXT5ftx5FTkoTcIVZLXr0MX_9o07sI9xKODXf4wINY5kuBc
參考資料 2:Chat Everywhere,https://v2.chateverywhere.app/zh
一、簡介(引用參考資料 1)
新唐 NuMaker-UNO-M4 開發板是使用新唐 MCU 作為微控制器的一款 Arduino 相容硬體。它的功能可以透過 Arduino 相容的擴充板來擴展。使用者可以使用 Arduino 相容的 IDE 來開發他們的應用程式,並充分利用大量的公開範例。
NuMaker-UNO-M4 是一個特別的開發工具,用於新唐 Cortex®-M4 系列的使用者透過其可以開發並容易驗證該應用程式。其目的是提供一套開發及學習的平台,具有 ADC、PWM、I²C、SPI 等周邊功能,使用者可以設定不同功能的 NuMaker-UNO-M4 開發套件,也可根據使用者需求增加外設功能的開發套件,易於上手,提供開發所需的靈活性。
二、外觀
NUVOTON 新唐 NuMaker-UNO-M4 外觀



三、主要特點(引用參考資料 1)
特色:
* 學習/應用/調試:全系列開發工具
* 攜帶方便的開發調試工具包
* 豐富的微控制器周邊設備功能,如ADC、PWM、I²C、SPI、UART…
* 具有高可擴展性:連接電路板可以改變不同的應用模組
* 相容 Arduino UNO R4
* 支持對 USB 的虛擬串口
* 支援 Arduino 的 IDE
* 多元的供電方式
– USB VBUS
– 外部電源支援 5V,可以從其他電源提供給 DC 插座
* LEDs 狀態指示燈
– Power, I/O, UART (Tx, Rx) 和 SPI CLK 狀態…等燈號
* 提供 RESET 按鈕
NuMaker-UNO-M4開發板接頭名稱及定義如下:


插上電後,有一個閃爍3顆LED的程式已預先燒入上去。
四、Arduino IDE 開發環境安裝
1. 至Arduino 官網下載 Arduino IDE 開發環境,執行所下載之安裝檔,並安裝 Arduino IDE。
2. 執行 Arduino IDE。選擇 File → Preferences
3. 並在 Additional Board Manager 的欄位中輸入下列網址: https://raw.githubusercontent.com/OpenNuvoton/NuMaker_UNO/master/package_nuvoton_index.json

4. 利用左邊「開發板」按鈕,搜尋NuMaker UNO M4,並安裝「UnMaker M4」,目前最新版是「13.3.9」。
或
選擇 Tools → Board → Boards Manager ,
NuMaker M4 會出現在清單底部;點選 NuMaker M4 並按下 Install



5. 待軟體包下載安裝完畢,即可在 Tools → Board 選用 NuMaker-UNO-M4

6. 選擇開發板NuMaker-UNO-M4,以及連接埠。

或點選「工具」,再選擇開發板NuMaker-UNO-M4,以及連接埠


7. 開啟範例程式:Blink,並上傳

8. 編譯完成上傳失敗,缺少「isptool」這個程式。

9. 「isptool」這個程式是一個Windows OS的bat檔,在macOS當然不能用。

10. 經過一個下午,找ChatGPT幫忙,用Python做出了「Nuvoton ISP Tool」GUI程式,但是無法正常連接 NuMaker-UNO-M4。

11. 使用「UTM」Windows虛擬機,進行測試才順利上傳Blink程式。


12. Blink.py測試程式
點亮、熄滅內建LED,每0.2秒循環一次內建LED,Blink.py。
“`c++=
//Blink程式,閃爍內建「LED 3」每0.2秒閃爍一次
// 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(200); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(200); // wait for a second
}
“`
測試程式Blink.ino影片
五、結論
目前「NUVOTON 新唐 NuMaker-UNO-M4」在Arduino IDE開發環境,僅支援「Windows OS」,不支援「macOS」。
希望「新唐NUVOTON」早點支援 macOS。
在 macOS 上安裝 MariaDB 伺服器
作者:順哥
email:palmbear@gmail.com
參考資料 1:Installing MariaDB Server on macOS Using Homebrew
參考資料 2:Mac安裝MariaDB資料庫
參考資料 3:macOS 上安裝 Sequel Pro 資料庫管理介面
Table of Contents
[TOC]
前言
因為上宅老大的課程需要使用MariaDB資料庫,但是官網的下載頁面沒有提供下載,查詢google後,找到相關參考資料,將安裝流程記錄一下。
MariaDB官方Download網頁:Download MariaDB Server
安裝環境
- Macbook pro M1
- macOS 15.6
參考各「參考資料」及官網,實際的安裝程序如下:
步驟一:打開終端機
查詢MariaDB資料庫有哪些版本:brew search mariadb
步驟二:安裝MariaDB資料庫
安裝MariaDB資料庫:brew install mariadb
下完安裝命令後,brew 會先自行更新,然後才開始安裝 MariaDB。

MariaDB安裝完成後,會自行執行brew cleanup mariadb。
接著自動執行brew cleanup,清除無用程式庫。
步驟三:啟動 MariaDB
啟動MariaDB資料庫:brew services start mariadb

步驟四:登入「MariaDB」
MariaDB 伺服器啟動後,您可以以您的使用者身分登入:mysql
或以 root 身分登入:sudo mysql -u root
出現下圖就是安裝完成。
離開「MariaDB」:exit
重新啟動MariaDB資料庫:brew services restart mariadb
步驟五:變更 MariaDB root 密碼
- 打開 iTerm2 終端機
- 終端機執行指令
sudo mariadb-secure-installation,變更 root 密碼


步驟六:安裝資料庫管理介面(sequel pro)
因為sequel pro已經沒有繼續維護,無法使用brew install sequel-pro來安裝,搜尋到「參考資料 3」可以下載「sequel-pro-1.1.2.dmg」,直接打開後如下圖:
將 Sequel Pro.app 拉到應用程式就可以了。
打開 Sequel Pro.app 後如下圖:
輸入資料如下:
進入MariaDB資料庫後畫面如下:
參考:macOS 上安裝 MySQL 與 Sequel Pro 資料庫管理介面
其他資源
如何在masOS安裝Google Gemini CLI
作者:順哥
email:palmbear@gmail.com
參考資料 1:Gemini CLI GitHub,https://github.com/google-gemini/gemini-cli
參考資料 2:【Gemini CLI 安裝/使用教學】Mac版|程式安裝+指令大補帖,https://www.youtube.com/watch?v=AO2tuyNFXkEGemini
參考資料 3:CLI 橫空出世 | 不只免費,軟體還開源 | 完整安裝 可呼叫Google Search,https://www.youtube.com/watch?v=ws1ee6aKB7Q
一、簡介
Gemini CLI 是一款基於 Gemini AI 技術的命令列工具,支持繁體中文輸入與輸出,方便用戶在終端環境中快速進行自然語言交互。它能處理繁體中文的文本生成、問題回答、文本摘要和翻譯等功能,操作簡潔直觀,適合開發者和專業用戶用於自動化腳本、資料處理及快速查詢。
二、安裝環境
1. Macbook pro M1
2. macOS 15.6.1
3. brew
4. node.js
三、參考Gemini CLI GitHub及各「參考資料」,實際的安裝程序如下:
- 步驟一:打開終端機,安裝 Gemini CLI1
使用 brew 直接安裝:`brew install gemini-cli`

2. 步驟二:執行 Gemini CLI
安裝完成後,輸入 `gemini` 直接執行 Gemini CLI ,會出現下圖:

3. 步驟三:登入 Gemini CLI
我使用第一種方法,就是使用Google 帳號登入,最簡單。
(使用上下鍵可以在選項中移動,按下 “Enter" 鍵,選擇)

登入後就可以直接使用了。
三、問題
執行Gemini CLI後,出現這段文字,指的是「你現在是在"home"目錄下執行Gemini CLI,推薦在『特定專案』目錄下執行Gemini CLI。」(如下圖)

登入Gemini CLI後,我直接問 Gemini:
「我收到『You are running Gemini CLI in your home directory. It is recommended to run in a project-specific directory.』這段訊息,執行Gemini CLI對我有什麼壞處?
他把問題的壞處說明後,直接提出最佳解決方法。(如下圖)

我接著請Gemini「請為我建立一個目錄「Gemini Test Project」,並且在這個目錄下重新啟動Gemini」。
但基於AI的本分,可以幫我建立目錄,但不能直接幫我執行這個操作。

執行 `/quit` 離開 Gemini,出現下圖。

因為macOS的目錄名稱中間不能有空白,所以重新建立「Gemini_test」目錄,在執行 Gemini CLI。

Raspberry Pi 5 開箱文
作者:順哥
email:palmbear@gmail.com
Table of Contents
[TOC]
緣起
Raspberry Pi 5 在2023年10月發表後,一直沒有出現在市面上發售,在digikey的行銷email中知道digikey有在預購,就趕緊上網下訂預購,經過一個多月的時間,Raspberry Pi 5 在 2023/11/20 終於到手了。
Raspberry Pi 5 網頁:
https://www.raspberrypi.com/products/raspberry-pi-5/
digikey官網:
https://www.digikey.tw/
外觀
- 我們的戰利品







硬體規格
- Broadcom BCM2712 2.4GHz quad-core 64-bit Arm Cortex-A76 CPU, with cryptography extensions, 512KB per-core L2 caches and a 2MB shared L3 cache
Broadcom BCM2712 2.4GHz 四核 64 位元 Arm Cortex-A76 CPU,具有加密擴展、每核 512KB 二級緩存和 2MB 共用三級緩存 - VideoCore VII GPU, supporting OpenGL ES 3.1, Vulkan 1.2
VideoCore VII GPU,支援 OpenGL ES 3.1、Vulkan 1.2 - Dual 4Kp60 HDMI® display output with HDR support
雙 4Kp60 HDMI® 顯示輸出,支援 HDR - 4Kp60 HEVC decoder
4Kp60 HEVC 解碼器 - LPDDR4X-4267 SDRAM (4GB and 8GB SKUs available at launch)
LPDDR4X-4267 SDRAM(發佈時提供 4GB 和 8GB SKU) - Dual-band 802.11ac Wi-Fi®
雙頻 802.11ac Wi-Fi® - Bluetooth 5.0 / Bluetooth Low Energy (BLE)
藍牙 5.0 / 低功耗藍牙 (BLE) - microSD card slot, with support for high-speed SDR104 mode
microSD 卡插槽,支援高速 SDR104 模式 - 2 × USB 3.0 ports, supporting simultaneous 5Gbps operation
2 個× USB 3.0 埠,支援同時 5Gbps 操作 - 2 × USB 2.0 ports
2 個× USB 2.0 埠 - Gigabit Ethernet, with PoE+ support (requires separate PoE+ HAT)
千兆乙太網,支援 PoE+(需要單獨的 PoE+ HAT) - 2 × 4-lane MIPI camera/display transceivers
2 × 4 通道 MIPI 攝像頭/顯示收發器 - PCIe 2.0 x1 interface for fast peripherals (requires separate M.2 HAT or other adapter)
PCIe 2.0 x1 介面,用於快速外設(需要單獨的 M.2 HAT 或其他適配器) - 5V/5A DC power via USB-C, with Power Delivery support
通過USB-C提供5V/5A直流電源,支援Power Delivery - Raspberry Pi standard 40-pin header
Raspberry Pi 標準 40 針接頭 - Real-time clock (RTC), powered from external battery
即時時鐘 (RTC),由外部電池供電 - Power button
電源按鈕

注意事項
- 您的Raspberry Pi 5 需要最新版本的Raspberry Pi OS, Bookworm。
- Raspberry Pi 5 是比 Raspberry Pi 4 性能更高的電腦,使用電源供電不足時可能會遇到問題。建議是用原廠高品質的 5V 5A USB-C 電源。
- Raspberry Pi 5 不適合Raspberry Pi 4 外殼。可以使用原廠 Raspberry Pi 5 的 Raspberry Pi 保護殼。
- Raspberry Pi 5 比上一代 Raspberry Pi 更快、更強大,並且與大多數電腦一樣,它在主動冷卻下表現最佳。可以購買Raspberry Pi 5 的 Raspberry Pi Case 搭配原廠專用散熱風扇,可以達到較佳的散熱效果。
- Raspberry Pi 5 已針對 PCIe Gen 2.0 速度(5 GT/秒)進行了認證,但如果將以下行添加到 /boot/firmware/config.txt .可以強迫升級至 PCIe Gen 3.0
# Enable the PCIe external connector
dtparam=pciex1
# Force Gen 3.0 speeds
dtparam=pciex1_gen=3
原廠技術文件:
https://www.raspberrypi.com/documentation/computers/raspberry-pi-5.html
安裝作業系統
- 下載 Raspberry Pi Imager:

- 將MicroSD卡或隨身碟或USB隨身硬碟重新格式化為FAT32格式,可以使用 Raspberry Pi Imager 直接處理。
- 燒錄作業系統:
選取 RASPBERRY PI 5 、 RASPBERRY PI OS(64-BIT) 以及你的 「MicroSD卡」 或 「隨身碟」 或 「USB隨身硬碟」。

選取「編輯配置」

在GENERAL頁籤可以直接配置使用者名稱及Wi-Fi無線網路

可以勾選啟用SSH

其他選項

- 開機測試


改裝外殼
因為我不喜歡原廠外殼,所以自己拿 舊 Pi 4 的壓克力外殼改裝。
另外,Pi 4 與 Pi 5 網路端子是顛倒,所以剛好把這個積層式外殼顛倒過來就可以用了。
另外,一些開孔不同處,墊了8個M4尼龍螺母,稍微改裝一下,順利把Raspberry Pi 5 安裝上去了。
這樣先頂著用,另外,在物色散熱良好的外殼來安裝。


tags: Raspberry Pi 5 樹莓派
xTool M1 雷射雕刻玻璃瓶
—
xTool M1 雷射雕刻玻璃瓶
===
作者:順哥
email:palmbear@gmail.com
## Table of Contents
[TOC]
## 玻璃瓶雷射雕刻步驟
1.先在玻璃瓶上雷雕區域塗上水性顏料如圖片,不需要稀釋,我使用淘汰的軟毛牙刷來塗,均勻塗抹不需塗抹太厚。




2. 使用吹風機吹乾。

3. 拆除底板,將控制線連接滾筒模組與雷雕機背後圓形插座,滾筒模組調整到適合的間距,打開xTool M1,墊高滾筒到雷射雕刻可雕刻高度。

6. 將玻璃瓶放入滾筒模組,雷射雕刻區域(塗佈水性顏料區塊)左側對準正上方。

8. 打開xTool Creative Space軟體,雷射圓柱會出現一條黃線在中間,如下圖。這是雷射雕刻的起點定位線,將要雷射雕刻的圖樣放在定位線的右邊,圖案大小調整完成後,點選加工,走邊框測試雷雕範圍是否在預定位置?沒問題就可以開始雕刻了



[xTool M1 雷射雕刻玻璃瓶-走邊框影片]
(https://youtu.be/f0kSQDVcKqY)
[xTool M1 玻璃瓶雷射雕刻影片]
(https://youtu.be/AMwIB222Byw)
## 雷射雕刻相關參數如下:
選取:雷射圓柱
材料:自定義材料
距離:自動測量
模式:滾筒
填充雕刻輸出:
功率:100
速度:80
加工次數:1
雕刻密度:100
雕刻模式:雙向掃描
線條雕刻輸出:
功率:100
速度:25
加工次數:1
##雷雕成果

雷雕完成後的線條雕刻不太理想,"O" 偏移了,或許速度慢一點可以改善。

用水沖洗就可以沖掉原先塗上去的水性塗料

擦乾後的成果
###### tags: `xTool M1` `雷射雕刻` `雷雕` `Laser Engrave` `玻璃`
Pico 及 Micro:bit 的程式或韌體在 macOS 13.01 無法拖拉上傳?請升級到 macOS 13.1
作者:順哥
email:palmbear@gmail.com

先前使用 MacBook pro 將 Pico 及 Micro:bit 的程式或韌體拖拉上傳到裝置的功能,非常方便。


Micro:bit,請參考 Micro:bit官網 Transfer from a computer 直接拖拉hex檔到Micro:bit。
但是在 macOS 更新到 macOS 13.01 後,便無法用拖拉上傳了,後來問了Google 大神才知道這是 macOS 的問題!
請參考下面網址:
參考資料1:https://www.raspberrypi.com/news/the-ventura-problem/
Raspberry Pi 及 Adafruit 這二個單位都鼓勵大家跟 Apple 公司回報問題,希望 Apple 能儘快修正!
未修改前,可以使用終端機命令列來上傳程式或韌體到裝置上,命令參考如下:
cp -X MICROBIT.hex /Volumes/MICROBIT/
Apple 公司這幾天已經發佈了macOS 13.1,經過測試已經解決這個無法拖拉上傳程式的問題了。
如果你使用的朋友,建議大家趕快升級到 macOS 13.1。
VIA Pixetto Vision Sensor視覺感測器 開箱及教學資料
作者:順哥
email:palmbear@gmail.com
資料來源:
Table of Contents
[TOC]
前言
" VIA Pixetto Vision Sensor 視覺感測器 " 是一個存有預訓練機器學習模型,與機器學習加速器的超高畫質感測器,涵括物體、形狀、顏色、人臉及手寫辨識特點,並可上傳神經網路模型進行辨識。
硬體規格
| 型號 | Pixetto (VTS8787C) |
|---|---|
| 處理器 | ARM Cortex-A7 900MHz |
| 記憶體 | 64MB DDR SDRAM |
| 儲存空間 | 128MB SPI 快閃記憶體 |
| 鏡頭感光元件 | GalaxyCore GC2053 CMOS 圖像感測器 |
| 鏡頭解析度 | 1920×1080 |
| 鏡頭可視角 | 130° field-of-view |
| 板載輸入/輸出 | 3 LEDs (電源-Green、無線網路-Blue、辨識狀態指示燈-Red) |
| 重置按鍵 | |
| 麥克風 | |
| Grove 連接器(UART) | |
| Micro USB 2.0 端口 | |
| Micro SD 卡插槽 | |
| Wi-Fi 內置微型天線 (802.11b/g/n ) | |
| 輸入電源 | |
| 5V/300mA 4針 Grove 連接器 | |
| 運作溫度 | 0 ~ 45℃ |
| 尺寸 | 38mm x 38mm (1.5” x 1.5”) |

原廠最新版韌體
我使用最新版本軟體及韌體:
| Pixetto 韌體修復工具 | Pixetto Firmware Recovery v1.6.2 |
|---|---|
| Pixetto 設置工具 | Pixetto Utility v1.6.2 |
| Pixetto 函式庫 | Pixetto Library for Arduino v1.6.4 v1.6.5 |
| Pixetto Lite 函式庫 | Pixetto Lite Library for Arduino v1.6.4 v1.6.5 |
| Pixetto Editor v1.6.0 | |
| Pixetto Link v1.2.5 | |
| Pixetto Lite | 圖形化積木設計指南 v0.1 |
原廠最新版軟體及韌體下載如下:
https://learn.pixetto.ai/pixetto.html#r15
軟體安裝教學
- 威盛 Pixetto 基礎安裝
https://pixetto.ai/tw/2020/07/getting-started-with-pixetto-tw/ - 【AI人工智慧-神經運算】環境建置:安裝Anaconda、Tensorflow、Keras與openCV(Windows篇)
https://blog.cavedu.com/2018/09/28/general_env_setup_anaconda_tensorflow_keras_opencv/ - VIA Python 環境設置
https://pixetto.ai/tw/2020/08/python-environment-setup-tw/ - 教你如何連接威盛Pixetto 到Arduino開發板
https://pixetto.ai/tw/2020/07/connecting-pixetto-to-arduino-uno-tw/ - 本日範例(AI_TEST.zip)
https://drive.google.com/drive/folders/1lQDew5C2Ma4KzbXARk-uUEv-mj6yTCnx?usp=sharing
Python Jupyter Notebook應用
前置軟體:Pixetto Utility、Python Jupyter Notebook
通訊方式:Serial、Pixetto
- 用TensorFlow訓練CNN模型判別剪刀石頭布
Jupyter Notebook(雲端)
https://pixetto.ai/tw/2020/12/rock-paper-scissors-game-tw/ - 決鬥吧!TensorFlow剪刀石頭布進階Python應用:猜拳遊戲!
https://pixetto.ai/tw/2020/12/rock-paper-scissors-game-tw/ - 辨識手寫英文單字
https://pixetto.ai/tw/2020/08/handwritten-english-word-recognition-tw/ - 利用神經網路訓練威盛Pixetto辨識物件
https://pixetto.ai/tw/2020/07/object-recognition-using-an-neural-network-tw/
Python Jupyter Notebook應用
前置軟體:Scratch(雲端) + Arduino
通訊方式:Serial、Pixetto
- 紅是紅、藍是藍!超好玩的「Scratch顏色分類機」
https://pixetto.ai/tw/2020/11/color-sorter-device-tw/ - 一起玩 Scratch 遊戲吧!適合大朋友小朋友的「口罩配戴辨識遊戲」
https://pixetto.ai/tw/2020/10/mask-wearing-recognition-game-tw/ - 活用Scratch和Arduino,實作威盛Pixetto「人臉偵測警示燈」
https://pixetto.ai/tw/2020/10/face-detection-warning-light-tw/ - 教你如何運用威盛Pixetto來製作「人臉偵測警報器」
https://pixetto.ai/tw/2020/09/face-detection-alarm-tw/ - 一元一次方程式流程說明
https://pixetto.ai/tw/2020/08/linear-equation-game-tw/ - 教你創作水果著色遊戲
https://pixetto.ai/tw/2020/08/learn-how-to-create-a-fruit-coloring-game-tw/ - 教你做出貓咪抓老鼠小遊戲
https://pixetto.ai/tw/2020/07/cat-chasing-mouse-tw/ - 教你如何做出可愛的變色龍
https://pixetto.ai/tw/2020/07/learn-how-to-create-a-color-changing-chameleon-tw/ - 教你學會如何運用顏色辨識功能來控制自動小車
https://pixetto.ai/tw/2020/07/learn-how-to-program-a-color-controlled-driverless-car-tw/ - 教你輕鬆學會讓自動小車追蹤彩球
https://pixetto.ai/tw/2020/07/color-following-driverless-car-step-by-step-guide-tw/ - 教你使用Blocks程式積木,設計有趣的鸚鵡追球遊戲
https://pixetto.ai/tw/2020/06/parrot-chasing-ball-learn-how-to-code-with-blocks-tw/ - 前置軟體:Pixetto Utility + Arduino
教你運用威盛Pixetto的AprilTag辨識功能來控制自動小車
https://pixetto.ai/tw/2020/09/apriltag-controlled-car-tw/
實作:使用 Google Teachable Machine 訓練模型檔,威盛Pixetto辨識物件
- 使用 Google Teachable Machine 訓練模型檔

- 下載模型

- 儲存模型

- 模型內檔案

- 開啟Pixetto Utility,選取"神經網路辨識"

- 選取模型

- 上傳模型

- 立即辨識

- 辨識影片Youtube辨識影片
結語
VIA 這個 pixetto 視覺感測器真是好用,可以立即把 Google Teachable Machines 訓練完成 Tensorflow Lite floating point 的模型直接上傳到視覺感測器內,並且直接辨識,省去非常多的時間。
130度廣角、高解析度鏡頭,簡單、便利的 UI 介面,提供預訓練模型,也可以結合 Google Teachable Machines 訓練的模型, NO Code 的完成神經網路模型訓練、辨識,實在是教學上的利器,也是進階者後續應用的好工具。
Appendix and FAQ
tags: AI NN Pixetto 神經網路 視覺辨識 視覺感測器
在 macOS Monterey 12.4 環境,使用 Micropython 在 ESP32 SSD1306 顯示 圖形
作者:順哥
email:palmbear@gmail.com
資料來源:
1.image2cpp
2.| ESP32 教學 | MicroPython | I2C OLED Image 顯示圖像 | 209 |
3.SSD1306.py
Table of Contents
[TOC]
前言
測試在 macOS Monterey 12.4 環境,使用 Micropython 在 ESP32 用 SSD1306 OLED 顯示 image 圖形。
Step 1:使用的圖形
在 google網站搜尋一張看起來順眼,個人使用無版權的黑色的熊熊圖(png檔),就用這張圖來做測試,這張圖的原始尺寸為 “981 x 562″。
網頁畫面:
Step 2:將圖形轉換成 byte arrays
因為在macOS上找不到適當軟體可以使用,在 google網站上找到這個
image2ccp
這個網站可以將 image 轉換為 byte arrays(或將您的 byte arrays 轉換回 image),然後給 OLED 顯示出來。
網頁畫面:
- 選擇圖形 Select image:
點選「選擇檔案」,上傳圖形檔。
網頁畫面:
- 圖形設定 image Settings:
在「畫布尺寸」 Canvas size(s) 欄位中,填入 OLED 的像數規格,我使用 “128 x 64″ ,所以在這裡我們填入 “128″ 及 “64″ ,圖形的原始尺寸為 “981 x 562″,這個網站可以將圖形直接轉成我們需要的大小。
接下來選擇 “stretch to fill canvas" 「拉伸填充畫布」。
網頁畫面:
- 圖形預覽 Preview:
隨即就會在「圖形預覽」Preview,看到圖形。 - 輸出 Output:
在「代碼輸出格式」"Code output format" 欄位中,填入 “plain bytes" ,
接下來在「繪製模式」"Draw mode" 欄位中,填入 “Vertical – 1 bit per pixel" ,
最後按下 “Generate code" 擷取碼,並將16進位的碼 Copy 下來。
網頁畫面:
Step 3:測試程式碼
我使用 資料來源2 的程式碼,SSD1306 module 使用 資料來源3 ,並依照自己的ESP32接腳,改用SoftI2C,我的程式碼如下:
from machine import Pin, SoftI2C #從machine 匯入 Pin, SoftI2C
import ssd1306 #匯入 ssd1306模組
import framebuf #匯入 fram3buf模組
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=400000) # 建立 i2c 物件
oled=ssd1306.SSD1306_I2C(128, 64, i2c) #建立 oled096 物件,第 1 個參數與第 2 個參數設定為 OLED 模組的像素,第 3 個參數為 I2C 的物件名稱
# img64 是一個 bytearrays 的列表(List)
img64 = [
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f,
0x3f, 0x1f, 0x1f, 0x0f, 0x07, 0x07, 0x07, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x0f, 0x0f, 0x0f, 0x1f,
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x7f, 0x7f,
0x7f, 0x3f, 0x3f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x1f, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x07, 0x2f, 0x7f, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xc3, 0xf7,
0xff, 0xff, 0xff, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x08, 0x38, 0xf8, 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe,
0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfc, 0xfc, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
0x80, 0x80, 0x80, 0xc0, 0xc0, 0x80, 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0x20, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0xc0, 0xf0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0f, 0x3f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xe0, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xf0, 0xfc,
0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf8, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x1f, 0x3f,
0x7f, 0x3f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xc1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xc0,
0xc0, 0xe0, 0xf0, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xfc, 0xfe, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfe, 0xf8, 0xf8, 0xf8, 0xf8, 0xf0, 0xf8, 0xf8, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
0xf0, 0xf0, 0xf0, 0xf0, 0xf8, 0xfc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfc, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03,
0x87, 0x9f, 0xff, 0xff, 0xfc, 0xf8, 0xf8, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
0xf0, 0xf0, 0xf0, 0xf8, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf0, 0xf0, 0xe0, 0xe0, 0xe0,
0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1, 0xc1, 0xc1, 0xc3, 0xc3,
0xe7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
]
img064b = bytearray(img64) # 將 img64 轉成 bytearray 型態,並取名 img64b
imgbuf=framebuf.FrameBuffer(img064b,128,64,framebuf.MONO_VLSB) #framebuf 第 1 個參數為影像資料的 bytearray名稱,第 2、3 個參數是影像的寬度與高度,第 4 個參數是像素形式與排列,MONO_VLSB 是指 單色+垂直+LSB
oled.blit(imgbuf, 0, 0) #blit方法,是將imgbuf 物件,由指定的 X,Y 位置,依序開始填入 OLED 記憶體
oled.invert(1) #以反白螢幕方式顯示圖形畫面
oled.show() #顯示螢幕畫面
程式說明
- 因為 framebuf 使用的資料型態是 bytearray,所以將 img64 轉成 bytearray 型態,並取名 img64b。
- 我們在轉檔時時是採用單色與垂直方向排列(Vertical)的方式存檔,所以預設轉出陣列就是 1btye 會有 8 像素,資料排列也就照著直線方式一條一條轉換,img64 原始資料共有 1024 個 bytes,換算成像素也就是1024×8=8192個像素,與我們OLED 的像素128*64=8192 Pixel 是相符的。
- mgbuf 為新建立的 framebuf 物件,framebuf 第 1 個參數為影像資料的 byte 序列,第 2、3 個參數分別為影像的寬度與高度,第 4 個參數就是像素形式與排列,MONO_VLSB 是指 單色+垂直+LSB(如果是其他形式可以填入framebuf.MONO_HLSB、framebuf.RGB565、framebuf.GS4_HMSB等。
- blit 這個方法也是源自 framebuf,將建立好的 imgbuf 物件,由指定的 X,Y 位置,依序開始填入 OLED 記憶體內。
Micropython framebuf 模組的官方說明
成果
完成畫面:
我使用的硬體:

作者:順哥
email:palmbear@gmail.com
參考資料 1:ESP32 WeMos LOLIN32 Lite high resolution pinout and specs,https://mischianti.org/esp32-wemos-lolin32-lite-high-resolution-pinout-and-specs/
參考資料 2:Chat Everywhere,https://v2.chateverywhere.app/zh
參考資料 3:WeMos LOLIN32 Lite相片,https://www.hobbyelectronica.nl/en/product/lolin32-lite-esp-32/?srsltid=AfmBOorF4n7AuI2vquJZ4Mr0pyaCws4JqpqrfqukliniuSiYuIzDMXbt
Table of Contents
一、簡介
二、外觀
電池接頭:板上有 JST 2‑pin 電池插座(標示 BAT / BATT / VBAT),靠近 USB 與充電電路區域。
LOLIN32 Lite 外觀
三、主要特點
四、硬體規格
WeMos LOLIN32 Lite 接腳圖如下圖:
五、Arduino Blink 範例程式測試
目的:確認板子與開發環境(Arduino IDE)能正常上傳與執行程式,並驗證內建 LED 的運作。
A. 安裝 Arduino IDE。
B. 在「開發板管理員」中加入 Espressif ESP32 支援:在「偏好設定」→「附加開發板網址」加入https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
,然後在「開發板管理員」搜尋並安裝「esp32 by Espressif Systems」。
相關參數設定如下圖:
內建 LED:多數 LOLIN32 Lite 的 User LED 對應 LED_BUILTIN (以實物為準)。
先在 USB 連接並上傳 Blink;若上傳失敗,檢查 USB 線、驅動與開發板選項。遇到 “Wrong boot mode detected” 之類訊息,先換線或嘗試手動 Reset(Lolin32 Lite 會自動進入燒錄模式),上傳成功後確認 LED 閃爍。
Blink影片如下:
六、注意事項