2021年11月29日 星期一

2021 年第 48 周記事

這一周天氣大都為陰冷天, 週日鄉下還下起雨來, 原本要帶一大袋書去還也就作罷, 反正下周才到期. 寒流要來讓我認真地找之前一件很保暖有帽子的外套, 過完年後就不知塞到哪兒了, 找東西最累, 忙了老半天還徒勞無功. 

本周較少看電視了 (除了周三的韓劇 "戀慕"), 所以也比較專心於學習. 由於上周買的兩本 MicroPython 書到貨, 看著看著就去找出已兩年沒玩的 ESP8266/ESP 板子, 動手更新韌體, 順便把樹莓派 Pico 也搞定了, 還上 Aliexpress 買了一些新貨. 這些電子玩具很有趣, 看到組合起來的電路能照我們的意志工作就有一種成就感, 哈哈, 2022 還沒開始, 但我已暖身要開始來執行計畫已久的物聯網專案了. 

週五收到大灰熊要定檢的通知, 我週六馬上就去完成檢驗, 學乖了, 以前拖拖拉拉過了一個月到現場才發現強制險效期不足一個月, 要嘛現場買一家沒折扣的, 要嘛等上班後續約完成再跑一趟, 費事又費時, 該做的事不能拖. 

自從打兩劑 AZ 滿兩周後就開始預約周六下午去愛心探視, 本周第三次, 除了熟識的運金伯母外, 還多了一些生面孔長輩. 在推阿蘭逛花園時拍了一張花的微物攝影, 姊姊說我手機的鏡頭超棒 : 




以前都沒發現微物攝影的妙用, 直到最近看到一篇新聞介紹有一個人只用手機就拍出許多微小生物的美照, 我才開始嘗試, 發覺用來拍電路板效果特好. 

因週日下雨沒辦法整理菜園, 所以一整天都在書房玩 Pico. 但盤點一下最近要做的事還蠻多的 : 
  1. 安裝車庫米家監視器 2
  2. 種玉米 + 木瓜
  3. 剷除菜園甘蔗
  4. 除蟻
  5. 清除水圳淤泥 (菜園填土)
一個周末大概只能完成一項, 別貪心, 就一個一個來吧 (完成就槓掉). 

2021年11月28日 星期日

Raspberry Pi Pico 學習筆記 (二) : 燒錄 MicroPython 韌體

最近因為買了兩本 MicroPython 的書, 掀起了內心冷卻已久的 maker 熱, 也想起了我之前買的三片 Pico, 上回焊好針腳後就丟一邊, 這回打鐵趁熱把 MicroPython 灌進去吧! 以下測試除了參考官網資料外, 主要是按照神人筆記 "天花板隨記" 部落格的說明.  

本系列前面的相關文章參考 :


將 MicroPython 韌體燒錄到 Pico 的方式有兩種 : 
  • 使用 UF2 檔安裝 :  
    須先下載 MicroPython 的 UF2 檔, 放入 RPI-RP2 虛擬磁碟機即完成燒錄. 
  • 使用 Thonny 安裝 : 
    利用 Thonny 直譯器選單裡的安裝與更新功能進行燒錄. 
參考 Raspberry Pi Pico 的說明文件 :



1. 上傳 UF2 檔燒錄 MicroPython 韌體 :     

UF2 是微軟所制訂的一種二進制檔案格式, 可用來為 Flash 記憶體進行快速燒錄, 參考 : 


首先到 MicroPython 官網下載 Pico 的 UF2 檔 : 


點選 Releases 下最近的穩定版本, 不要下載 Nightly Builds 下的最新版 : 


然後按住 Pico 上的 BOOTSEL 鈕不放, 將 Pico 連接到 PC 的 USB 槽後再放開 : 




這時檔案總管會出現一個新的磁碟機 RPI-RP2, 裡面內建了 INDEX.HTM 與 INFO_UF2.TXT 這兩個檔案, 點擊前者會連接到 Pico 的說明文件網頁, 後者則是 UF2 的說明文件 :




不用管這兩個檔案, 直接將所下載的 MicroPython UF2 檔案複製到此 RPI-RP2 磁碟機即可, 貼上 UF2 就會馬上進行燒錄, 很快就完成了, 這時 Pico 板會重啟, RPI-RP2 磁碟機會會被卸除, 這時開啟裝置管理員可知 Pico 已連接到 COM 埠 : 




這時開啟 Putty 連線 COM 埠, 首先會進入 Raw REPL 介面, 要按 CTRL + B 才會進入 MicroPython Shell : 




Pico 板載的 LED 接在 GPIO25, 下面就用迴圈來測試 LED 閃爍 : 

MicroPython v1.17 on 2021-09-02; Raspberry Pi Pico with RP2040
Type "help()" for more information.
>>> from machine import Pin
>>> import time   
>>> LED=Pin(25, Pin.OUT)   
>>> while True:   
...     LED.value(0) 
...     time.sleep(1)   
...     LED.value(1)   
...     time.sleep(0.5)   
...
...

由於 Pico 沒有 Reset 按鈕, 終止此無限迴圈的辦法是關掉 Putty, 移除 USB 接線接回後再重新連線. 或是把 RUN 接腳接地亦可, 參考 :

How to Reset Your Raspberry Pi Pico With a Button

也可以使用 Thonny 編輯器的 Shell 介面來執行 MicroPython 程式, 點選 "執行/選擇直譯器" : 



 
切到 "直譯器" 頁籤, 上面選擇 "MicroPython (Raspberry Pi Pico)", 底下選擇所連接的 COM 埠或 "自動偵測連接埠", 確認後底下應該會出現 MicroPython 命令列 :





輸入如下指令 :

MicroPython v1.17 on 2021-09-02; Raspberry Pi Pico with RP2040

Type "help()" for more information.
>>> from machine import Pin
>>> import time
>>> LED=Pin(25, Pin.OUT)
>>> while True:
    LED.toggle()
    time.sleep(1)

就可以看到板載 LED 閃爍了 : 




此處改用 Pin 物件的 toggle() 方法來使 LED 狀態 High/Low 切換, 雖然指令較精簡, 但缺點是 ON/OFF 時間相同, 無法個別調整. 


2. 使用 Thonny 燒錄 MicroPython 韌體 :  

Python 專用編輯器 Thonny 也可以直接燒錄 MicroPython 韌體 (須網路保持連線, 因 Thonny 要從官網下載 UF2 韌體檔), 以下就用 Thonny 來燒錄另外兩片空白的 Pico 吧! 

首先開啟 Thonny, 按住 Pico 的 BOOTSEL 鈕不放, 將 Pico 用 USB 連接 PC 後再放開 BOOTSEL 鈕, 跟上面一樣檔案總管會出現名稱為 RPI-RP2 的磁碟機, 但不用管它, 接下來點選 Thonny 的 "執行/選擇直譯器" : 




上面的選單選擇 "MicroPython (Raspberry Pi Pico)" : 




下面選擇 "自動偵測連接埠", 然後按右下角的 "" :




這時 Thonny 會自動找尋最新的 MicroPython 版本, 但在跳出的視窗中按 "安裝" 卻出現 "certificate verify failed: certificate has expired (_ssl.c:1091)" 的錯誤訊息 : 





完整的錯誤訊息如下 : 

Downloading 563200 bytes from https://micropython.org/resources/firmware/rp2-pico-20210902-v1.17.uf2

Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\urllib\request.py", line 1350, in do_open
    encode_chunked=req.has_header('Transfer-encoding'))
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\http\client.py", line 1277, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\http\client.py", line 1323, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\http\client.py", line 1272, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\http\client.py", line 1032, in _send_output
    self.send(msg)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\http\client.py", line 972, in send
    self.connect()
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\http\client.py", line 1447, in connect
    server_hostname=server_hostname)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\ssl.py", line 423, in wrap_socket
    session=session
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\ssl.py", line 870, in _create
    self.do_handshake()
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\ssl.py", line 1139, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1091)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\site-packages\thonny\plugins\micropython\uf2dialog.py", line 271, in _perform_work
    self._download_to_the_device(download_url, size, target_dir)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\site-packages\thonny\plugins\micropython\uf2dialog.py", line 333, in _download_to_the_device
    with urlopen(req, timeout=5) as fsrc:
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\urllib\request.py", line 525, in open
    response = self._open(req, data)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\urllib\request.py", line 543, in _open
    '_open', req)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\urllib\request.py", line 503, in _call_chain
    result = func(*args)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\urllib\request.py", line 1393, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "C:\Users\User\AppData\Local\Programs\Thonny\lib\urllib\request.py", line 1352, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1091)>

看起來是 SSL 認證問題, 我檢查目前使用的 Thonny 版本是 3.3.10 : 




但官網已到 3.3.13 版, 我以為是版本太舊的關係, 就先移除 Thonny, 然後下載最新的 3.3.13 來安裝, 但結果還是一樣, 所以跟 Thonny 版本無關. 後來找到下面文章才找到解決辦法 :





原來只要去下載安裝 lets-encrypt-r3.der 憑證即可 : 


點擊下載的憑證檔按確定與下一步即可完成安裝 : 








然後回到 Thonny 再次安裝韌體即可順利進行了 :






OK! 完成了. 

2021年11月27日 星期六

於 Aliexpress 購買 D1 mini pro 十五套件組

今天在 Aliexpress 找到 Wavgate 免運 25.52 美元的 D1 mini 十五套件組 :





以昨日美元賣出匯率 27.87 計算, 25.25 美元折合台幣約 704 元. 為了避免以後用到時產品已下架, 所以將產品網頁截圖紀錄如下 : 







各元件電器規格摘要如下 : 
  1. D1 Mini pro : 
    • ESP-8266EX 
    • 16MB Flash
    • CP2102 USB 驅動
    • 板載陶瓷天線 + 外加天線座
  2. WS2812 RGB 全彩 LED 模組 :
    • 最高 800Kbps 傳輸率
    • 256 階明暗度
    • 16777216 全彩
    • 掃描頻率不低於 400 Hz/s
    • IO 介面 : D2
  3. DS18B20 溫度感測模組
    • 感測範圍 : 攝氏 -55~+125 誤差攝氏 0.5 度
    • 擷取精確度 9~12 位元
    • IO 介面 : D2
  4. DHT 溫溼度模組 :
    • 濕度範圍 : 20%~-95% 誤差 %
    • 溫度範圍 : 攝氏 0~50 度 誤差 2 度
    • 操作電壓 : 3.3~5V
    • IO 介面 : D4
  5. BMP180 氣壓感測模組 ; 
    • 氣壓範圍 : ˇ300~1100 hPa 解析度 0.03~0.06 hPa
    • 電源 1.8~3.6V (VDDA) 1.62~3.6V (VDDD)
    • IO 介面 : D1=SCL, D2=SDA
  6. 溫溼度感測器 SHT30 :
    • 溫度範圍 : 攝氏 -40~100 度 誤差 0.3 度 反應時間 8 秒
    • 濕度範圍 : 0~100% RH 誤差 3% 反應時間 5~30 秒
    • I2C 介面
    • IO 介面 : D1=SCL, D2=SDA
  7. 繼電器模組 :
    • 高位準觸發
    • KF301 控制端點
    • 電源 5V
    • IO 介面 : D1
  8. TF 卡模組 : 
    • 支援容量 : micro SD 小於 2GB, micro SDHC 卡 小於 32 GB
    • 電源 5V, 介面 3.3~5V
    • 最大電流 : 200 ma
    • IO 介面 : D5=CLK, D6=MISO, D7=MOSI, D8=CS
  9. 按鈕模組 : 
    • 按下是 High, 放開是 Low
    • 絕緣電壓 30 V
  10. 馬達驅動模組
    • 使用 TB6612 晶片, 自帶 boot 程式
    • 介面 : A1, A2 (馬達 A 驅動端子), B1, B2 (馬達 B 驅動), S (模式選擇)
    • IO 介面 : D1=SCL, D2=SDA
  11. 0.66 吋 OLED 顯示模組 :
    • 解析度 : 64848
    • 驅動 IC : SSD1306
    • I2C 介面 : 位址 0x3C, 0x3D
    • 工作電壓 : 3.3V
    • IO 介面 : D1=SCL, D2=SDA



用 esptool.py 燒錄 MicroPython 韌體 (ESP8266/ESP32)

今天在零件箱找到一塊之前測試過的 Wemos ESP8266, 接上 USB 後板載藍色 LED 會持續閃爍, 可見裡面已有程式在跑, 但卻無法用 Thonny 與 Putty 連線 COM 埠, 可能太久沒有使用秀逗了. 我看背板有打印這是 32MB, 喜出望外以為這是 32M Bytes : 





我用 esptool.py 查詢 flash_id 發現只有 4M Bytes, 背板打印的其實是 32M bits, 執行下列指令前須按住右下方的 Flash 鈕約直到顯示結果再放開 : 

D:\ESP8266>esptool.py --port COM8 flash_id    
esptool.py v2.6
Serial port COM8
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX   
Features: WiFi
MAC: 2c:3a:e8:06:b9:ca
Uploading stub...
Running stub...
Stub running...
Manufacturer: c8
Device: 4016
Detected flash size: 4MB    
Hard resetting via RTS pin...

雖然用 Thonny 或 ESPFlasher.exe 燒錄韌體很方便, 但命令列的 esptool.py 提供的功能更多 (Thonny 背後也是執行 esptool.py), 例如 flash_id 指令不僅顯示 Flash 大小, 還包括所使用的晶片. 詳細用法參考 :


我之前都是在燒錄 ESP32 時才會用 esptool.py, 今天就用它來將這塊無法連線的板子重新燒錄最新版 MicroPython 吧! 


1. 抹除 Flash 內容 :   

首先要將 Flash 裡面的舊資料清除乾淨, 同樣地, 在執行下列指令前須按住右下方的 Flash 鈕直到顯示結果再放開 : 

D:\ESP8266>esptool.py --chip esp8266 --port COM8 erase_flash     
esptool.py v2.6
Serial port COM8
Connecting....
Chip is ESP8266EX
Features: WiFi
MAC: 2c:3a:e8:06:b9:ca
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 6.1s
Hard resetting via RTS pin...


2. 燒錄 MicroPython 映像檔 :   

接下來就可以開始燒錄映像檔了, 同樣地, 在執行下列指令前須先按住右下方的 Flash 鈕直到顯示結果再放開 : 

D:\ESP8266>esptool.py --port COM8 --baud 115200 write_flash --flash_size=detect -fm dio 0 esp8266-20210902-v1.17.bin   
esptool.py v2.6
Serial port COM8
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
MAC: 2c:3a:e8:06:b9:ca
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0040
Compressed 633688 bytes to 416262...
Wrote 633688 bytes (416262 compressed) at 0x00000000 in 36.8 seconds (effective 137.8 kbit/s)...
Hash of data verified.

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

此處黃底色部分是連續燒兩次沒成功 (燒錄過程無錯誤, 但出現怪碼) 後添加上去的, Baud rate 用 115200 較保險, 總之, 整個指令須要改的部分就是 COM 埠與映像檔檔名而已. 

完成後用 Thonny 或 Putty 均可正常連線進入 Shell/REPL 介面了 : 




關於 Thonny 操作參考 :


燒錄 ESP32 的 esptool 指令轉寫如下 : 

1. 清除 Flash :

esptool.py --port COM9 flash_id

2. 燒錄韌體 : 

esptool.py --chip esp32 --port COM9 write_flash -z 0x1000 esp32-20210418-v1.15.bin

3. 檢查 Flash : 

esptool.py --chip esp32 --port COM9 erase_flash

參考 : 


市圖還書 8 本 (二哥的參考書)

本周市圖還書如下 : 
這些主要是之前幫二哥借的, 除 3, 5 續借外, 其餘已修過不用再借. 工程數學我想要複習, 但現在還沒空, 要用時再借. 

2021年11月26日 星期五

好站 : Home Assistant 是甚麼?

最近收到熱心網友 Daren 兄留言 (他也記錄了非常豐富的物聯網實驗記錄, 非常值得參考學習), 建議我在進行智慧家居的物聯網專案時可以考慮使用 Google Home Assistant, 還提供了如下參考文章 : 


此文建議使用低耗電且運轉穩定的樹莓派來安裝 Home Assistant, 透過 Etcher 軟體來燒錄 Hass.io 作業系統的映像檔 (新版 Etcher 有 Flash from URL 按鈕可輸入 URL 下載映像檔並進行燒錄), 然後就可以用瀏覽器連線到 http://hassio.local:8123 來加入物聯網設備. 

下面這篇的做法說明也很詳細, 還有 Youtube 影片 Demo : 





有空拿閒置中的 Pi Zero 來安裝 Home Assistnt 試試. 

發現新玩具 : Pimoroni Tiny 2040

今天在 Pimoroni 網站上發現一塊非常小巧可愛的 RP2040 開發板 : Tiny 2040, 它使用樹莓派自行開發的 ARM 處理器 RP2040, 板載一顆 RGB 全彩 LED, 一個 Reset 按鈕, 以及一個 Flash 按鈕, 自帶 Type-C USB 介面可連接電腦, 結構就這麼簡單, 大小差不多跟郵票一樣大. 最吸睛的是配備超大 8MB Flash, 是我夢想中的極品 : 





主要性能如下 :
  • MPU : RP2040 (ARM M0+ 133 MHz)
  • SRAM : 264KB
  • FLASH :  8MB
  • GPIO : 8 個 (GPIO0~7)
  • ADC : 4 個 (12 bits)
參考 : 


可以把 Tiny 2040 看成是樹莓派 Pico 的縮小版, 可像 Pico 那樣用 C/C++ 或 MicroPython, CircuitPython 來操控它. 板載 RGB 全彩 LED 內接於 GPIO18~20, 不占用外接的 GPIO 接腳. 不過一塊報價 8.4 英鎊有點小貴 (約台幣 311 元), 目前促銷降價為 6.4 英鎊 (約台幣 237 元, 但放進購物車卻是 5.25 英鎊), 倒是可以考慮買一片來玩玩. 但買一片加上 5 英鎊運費就有點貴了 : 




10.25 英鎊約合台幣 380 元, 買兩片含運是 15.5 英鎊, 合台幣 574 元, 單價就降到台幣 287 元 :




總之要買多片才會把運費攤掉 (運費都是 5 英鎊), 我試算買 5 片單價降到 231 元, 買 10 片降到 213 元,  買 15 片是 207 元, 買 20 片是 204 元, 買 25 片是 202 元, 買 30 片是 200 元 ... 我寫了一個 Python 程式做單價估算, 發現買 2~5 片降幅較大 :

for i in range(1, 31):
    gpb=5.25 * i + 5          # 英鎊含運總價
    gpb_pc= gpb / i           # 英鎊含運單價
    twd=gpb * 37              # 台幣含運總價
    twd_pc=twd / i            # 計算現在單價
    if i==1:
        pre_drop=0                  # 與前一單價相比降幅初值
        total_drop=0                # 總降幅初值
        twd_pc_1=twd_pc       # 記住只買 1 片單價
    else:
        pre_drop=(twd_pc_old - twd_pc) / twd_pc_old * 100
        total_drop=(twd_pc_1 - twd_pc) / twd_pc_1 * 100
    twd_pc_old=twd_pc         # 記住前一個單價    
    print(f'{i}片總價={gpb:.2f}英鎊, 約台幣={twd:.2f}', end=" ")
    print(f'單價={gpb_pc:.2f}英鎊 約台幣={twd_pc:.2f}', end=" ")
    print(f'前降幅={pre_drop:.2f}% 總降幅={total_drop:.2f}%')
    
1片總價=10.25英鎊, 約台幣=379.25 單價=10.25英鎊 約台幣=379.25 前降幅=0.00% 總降幅=0.00%
2片總價=15.50英鎊, 約台幣=573.50 單價=7.75英鎊 約台幣=286.75 前降幅=24.39% 總降幅=24.39%
3片總價=20.75英鎊, 約台幣=767.75 單價=6.92英鎊 約台幣=255.92 前降幅=10.75% 總降幅=32.52%
4片總價=26.00英鎊, 約台幣=962.00 單價=6.50英鎊 約台幣=240.50 前降幅=6.02% 總降幅=36.59%
5片總價=31.25英鎊, 約台幣=1156.25 單價=6.25英鎊 約台幣=231.25 前降幅=3.85% 總降幅=39.02%
6片總價=36.50英鎊, 約台幣=1350.50 單價=6.08英鎊 約台幣=225.08 前降幅=2.67% 總降幅=40.65%
7片總價=41.75英鎊, 約台幣=1544.75 單價=5.96英鎊 約台幣=220.68 前降幅=1.96% 總降幅=41.81%
8片總價=47.00英鎊, 約台幣=1739.00 單價=5.88英鎊 約台幣=217.38 前降幅=1.50% 總降幅=42.68%
9片總價=52.25英鎊, 約台幣=1933.25 單價=5.81英鎊 約台幣=214.81 前降幅=1.18% 總降幅=43.36%
10片總價=57.50英鎊, 約台幣=2127.50 單價=5.75英鎊 約台幣=212.75 前降幅=0.96% 總降幅=43.90%
11片總價=62.75英鎊, 約台幣=2321.75 單價=5.70英鎊 約台幣=211.07 前降幅=0.79% 總降幅=44.35%
12片總價=68.00英鎊, 約台幣=2516.00 單價=5.67英鎊 約台幣=209.67 前降幅=0.66% 總降幅=44.72%
13片總價=73.25英鎊, 約台幣=2710.25 單價=5.63英鎊 約台幣=208.48 前降幅=0.57% 總降幅=45.03%
14片總價=78.50英鎊, 約台幣=2904.50 單價=5.61英鎊 約台幣=207.46 前降幅=0.49% 總降幅=45.30%
15片總價=83.75英鎊, 約台幣=3098.75 單價=5.58英鎊 約台幣=206.58 前降幅=0.42% 總降幅=45.53%
16片總價=89.00英鎊, 約台幣=3293.00 單價=5.56英鎊 約台幣=205.81 前降幅=0.37% 總降幅=45.73%
17片總價=94.25英鎊, 約台幣=3487.25 單價=5.54英鎊 約台幣=205.13 前降幅=0.33% 總降幅=45.91%
18片總價=99.50英鎊, 約台幣=3681.50 單價=5.53英鎊 約台幣=204.53 前降幅=0.29% 總降幅=46.07%
19片總價=104.75英鎊, 約台幣=3875.75 單價=5.51英鎊 約台幣=203.99 前降幅=0.26% 總降幅=46.21%
20片總價=110.00英鎊, 約台幣=4070.00 單價=5.50英鎊 約台幣=203.50 前降幅=0.24% 總降幅=46.34%
21片總價=115.25英鎊, 約台幣=4264.25 單價=5.49英鎊 約台幣=203.06 前降幅=0.22% 總降幅=46.46%
22片總價=120.50英鎊, 約台幣=4458.50 單價=5.48英鎊 約台幣=202.66 前降幅=0.20% 總降幅=46.56%
23片總價=125.75英鎊, 約台幣=4652.75 單價=5.47英鎊 約台幣=202.29 前降幅=0.18% 總降幅=46.66%
24片總價=131.00英鎊, 約台幣=4847.00 單價=5.46英鎊 約台幣=201.96 前降幅=0.17% 總降幅=46.75%
25片總價=136.25英鎊, 約台幣=5041.25 單價=5.45英鎊 約台幣=201.65 前降幅=0.15% 總降幅=46.83%
26片總價=141.50英鎊, 約台幣=5235.50 單價=5.44英鎊 約台幣=201.37 前降幅=0.14% 總降幅=46.90%
27片總價=146.75英鎊, 約台幣=5429.75 單價=5.44英鎊 約台幣=201.10 前降幅=0.13% 總降幅=46.97%
28片總價=152.00英鎊, 約台幣=5624.00 單價=5.43英鎊 約台幣=200.86 前降幅=0.12% 總降幅=47.04%
29片總價=157.25英鎊, 約台幣=5818.25 單價=5.42英鎊 約台幣=200.63 前降幅=0.11% 總降幅=47.10%
30片總價=162.50英鎊, 約台幣=6012.50 單價=5.42英鎊 約台幣=200.42 前降幅=0.11% 總降幅=47.15%

可見, 超過 5 片之後前降幅就變很小了, 而超過 10 片之後總降幅就不大了, 所以如果只是測試的話, 考量運費的攤分效果, 買 3~10 片攤提效果就算不錯了, 例如買五片含運單價 6.25 英鎊就低於 DM 上的促銷價 6.3 英鎊了. 

2021年11月25日 星期四

NodeMCU PyFlasher 是惡意軟體?

今天在新買的 "超簡單Python/MicroPython物聯網應用" 這本書上看到另外一個 MicroPython 韌體燒錄軟體 NodeMCU PyFlasher.exe, 本來打算用它來更新手上其他幾顆 ESP8266/ESP32 開發板的 MicroPython 版本, 但執行時卻發現 Win10 冒出警告視窗 : 




我是從 NodeMCU PyFlasher 的 GitHub 直接下載最新的 v5.0 版軟體 (約 16.4MB) :


此軟體為免安裝 (portable), 所以 Win10 出現警告應該是例行公事, 但我將此 exe 檔上傳到 VirusTotal 檢查卻出現 2/67 檢出比率, 有兩款資安軟體判定為 malicious (惡意軟體) :




有些防毒軟體會誤判, 但既然書上推薦使用 NodeMCU Flasher, 我想應該不會有問題, 但基於保險起見我都是要 0 檢出才敢用, 所以我還是暫時不使用了. 

購買 Witty Cloud ESP8266 開發板

今天在 "超簡單Python/MicroPython物聯網應用" 這本書上看到 Witty Cloud 這塊 ESP8266 開發板, 此板採上下兩層設計 (可拆開), 上層是搭載 ESP-12F 模組+光敏電阻+全彩LED+按鈕的主板, 下層則主要是 CH340 USB 模組+兩個按鈕, 對於學習 ESP8266 非常方便 : 




我查露天這塊 Witty cloud 一般價格約 200 元左右, 傑森創工賣 180 元, 參考 :


但 Aliexpress 一塊約 1.6~3 美元, 但今天剛好有一個 vendor 買 10 片 21.12 美元免運, 平均一塊 2.1 美元似乎蠻划算的, 所以就買一組來測試看看 :






以今日美元賣出 28 元匯率計算, 21.12 美元折合台幣約 591 元, 平均每塊 59 元. 

此開發板事實上就是 D1 mini + 三種感測器, 所以若使用 Arduino IDE 用 C 語言開發時板子種類可直接選擇 Wemos D1 mini, 當然也可以用 MicroPython 開發. 只是 free shipping 是從新加坡保稅區出貨需 20~40 天才會到貨. 


好書 : 超簡單Python/MicroPython物聯網應用

上週在 momo 買了陳會安老師的 MicroPython 新書, 這兩天稍微翻閱了一下, 雖然前面 Python 基礎篇章對我是多餘的 (但極適合入門初學者), 但後半部的實作部分非常有參考價值 (尤其是 FireBase 的介紹與 WiFi 遙控車作法) :  



Source : 博客來


書中範例檔案可在博碩網站下載 : 


作者著作等身, 我學習 PHP, Javascript, jQuery, HTML5 等網頁相關科目時從圖書館借過很多陳老師寫的書來看. 作者還開發了流程圖軟體 fchart 來協助程式教學工作, 讓小朋友或非資訊科系背景的人也能透過 fchart 以堆積木方式輕鬆實作軟體與務聯網應用, 參考 : 


雖然我從 2017 年就看好 ESP8266 而開始學習 MicroPython, 但走走停停只走到中段班而已, 買這本書也是為了刺激一下我沉寂已久的動手作慾望, 希望明年能開展計畫已久的物聯網專案製作

2021年11月24日 星期三

MicroPython on ESP8266 學習筆記 (二十六) : 使用 Thonny 編輯器作為開發工具

我以前不管是寫 HTML, Javascript, PHP, 還是 Python 都習慣使用 EditPlus 編輯器進行測試開發, 因為 EditPlus 不僅輕量, 支援度高, 特別是有一個 Ctrl + J 快捷鍵可以立刻複製一行程式碼, 真的非常方便. 不過最近我寫 Python 程式已改用同樣很輕量的 Thonny, 原因如下 : 
  1. 可直接燒錄 MicroPython 韌體 (雖然以下測試不知原因失敗). 
  2. 自帶 Python 直譯器, 也可以選用本機所安裝的 Python 直譯器. 
  3. 支援 MicroPython 開發板檔案上傳, 下載, 刪除, 新增目錄等操作. 
特別是第三項非常優, 不僅可用 REPL 互動模式立即執行程式碼 (取代 Pytty), 也可以直接上傳程式檔案到控制板的 MicroPython 檔案系統中 (取代 ampy/rshell/mpfshell 等程式), 這實在太方便了, 基本上這款愛沙尼亞開發的編輯器就是專為 Python 應用程式開發而設計的, 特別是對嵌入式系統而言是個完整的開發工具. 關於 Thonny 參考 :


之前用的 MicroPython 開發方式參考 :


以下介紹如何使用 Thonny 編輯器連線 MicroPython 控制板, 此處使用 D1 Mini 為例, 此板體積小價格便宜 (130~200 元左右), 控制器使用 ESP8266 (ESP-12EX 模組), 有 9 個 GPIO 埠 (其中 D4/GPIO2 已接到板載 LED), 2 個 UART 埠, 1 個 ADC 腳 (A0, 10 位元解析度), 內建 4MB 的 Flash, 容量足以開發較大型物聯網應用, 燒錄韌體時須將 D3/GPIO0 接地, 參考 : 


在 Thonny 編輯器裡可以用互動環境模式直接以 MicroPython 指令操控連線中的開發板, 也可以將編輯視窗中的程式存檔後, 透過左邊的檔案目錄視窗將本機檔案上傳到 MicroPython 開發板的檔案系統內 (左上方窗格), 或將 MicroPython 設備中的檔案下載到本機目錄下 (左下方窗格). 


1. 以互動模式直接操控開發板 : 

首先開啟 Thonny, 點選 "執行/選擇直譯器 ..." :





在直譯器選擇頁面中點選第一個下拉式選單, 可見 Thonny 支援 ESP8266, ESP32, Micro::bit, 以以及 Raspberry Pico 等開發板, 點選 MicroPython (ESP8266) 這一項, 因為此處使用的 D1 mini 為 ESP8266 模組, 若是 ESP32 就要選 MicroPython (ESP32) : 




第二個下拉式選單點選 "<自動偵測連接埠>" 即可, 這真的超方便, 不用再去開啟裝置管理員檢查目前控制板是接在哪個 COM 埠 :




按 "確認" 鈕後, Thonny 就會自動透過 COM 埠連線控制板 (如同用 Putty 手動連線 D1 Mini 一樣), 成功後會在視窗底下的 Shell (互動環境) 區顯示 MicroPython 的命令列 : 




這樣就可以直接在此 Shell 命令列輸入 Python 指令, 例如下面的程式碼是以無窮迴圈控制與 D4/GPIO2 連接的板載藍色 LED 燈 ON/OFF 不停地閃爍 : 

MicroPython v1.13 on 2020-09-02; ESP module with ESP8266

Type "help()" for more information.
>>> from machine import Pin   
>>> import time     
>>> led=Pin(2, Pin.OUT)        
>>> while True:         
    led.value(1)      
    time.sleep(0.5)     
    led.value(0)      
    time.sleep(1)       

此互動程式執行後即可看到 D1 mini 板載的藍色 LED 不斷地一閃一閃.


2. 將本地檔案上傳到 MicroPython 開發板 : 

互動模式通常只用來暫時測試一小段程式碼是否功能正確, 測試好的完整程式必須上傳到開發板根目錄下, 然後按 Reset 鍵, MicroPython 固定會去抓根目錄下的 main.py 開始執行, 首先開啟 Thonny 的 "檢視" 頁籤勾選 "檔案", 這樣視窗左邊就會顯示兩個檔案目錄窗格, 左上方是本機檔案系統窗格; 左下方是 MicroPython 設備之檔案系統窗格  :




在編輯區輸入上面的 LED 閃爍程式後存成 main.py 檔案, 然後於左上方本機目錄中點選此檔案, 按右鍵點選 "上傳到/" 即可將此 main.py 上傳到開發板的根目錄下 (這取代了 ampy 的功能) :





除了上傳還可以將開發板中的檔案下載到本機目錄中檢視或保存, 只要在左下方 "MicroPython 設備" 窗格中點選要下載的檔案 (例如 boot.py), 按滑鼠右鍵點選 "下載到 ..." 即可 : 




點選檔案後按滑鼠右鍵選擇 "刪除" 則可以刪除該檔案 : 




也可以在 "MicroPython 設備" 窗格的空白區域按滑鼠右鍵點選 "新增目錄", 輸入目錄名稱, 例如用來放置第三方模組的 lib 目錄, 按確定即可 : 






可見有了 Thonny 後完全不必再使用 ampy 或 rshell 等程式來管理開發板的檔案系統了, 真的非常方便. 尤其是像上面這個無窮迴圈程式, 以前用 ampy 常常會無法連線進去刪除 main.py, 因為 CPU 不斷在跑迴圈, 無暇理會連線要求. 現在可以點選 Thonny 的 "執行" 頁籤, 選擇 "停止/重新啟動後端程式" 終止程式後, 點選 main.py 刪除即可 :




另外, 如果 MicroPython 設備斷線 (似乎閒置一段時間沒有用就會出現 "Backend terminated or disconnected. Use 'Stop/Restart' to restart." 斷線訊息), 也是點選 "停止/重新啟動後端程式" 來重新連線 : 




這樣 Shell 窗格就會再次出現  >>> 提示號了.  


3. 燒錄 MicroPython 韌體 : 

我這塊 D1 mini 之前燒錄的韌體是 1.13 版, 現在 MicroPython 已升至 1.17 版, 正好用這塊來試試看如何用 Thonny 來燒錄新韌體. 首先到 MicroPython 官網下載 2MB Flash 以上的韌體, 所下載的檔案是 esp8266-20210902-v1.17.bin : 





然後用杜邦線將 D3/GPIO0 接地 (這樣才會進入 Flash mode) : 




接著點選 Thonny 的 點選 "執行/選擇直譯器 ...", 拉下 "選擇連接埠" 選單, 可知目前開發板是接在 COM 8 埠上, 選擇此埠或 "自動偵測連接埠" 亦可, 但要知道實際是在哪個埠 (下一步上傳韌體時會用到) : 




然後按右下角 "安裝或更新韌體" 連結 : 




在 Port 欄中點選上面已得知 MicroPython 設備所連接的 COM 8 埠, 



然後按 "Firmware" 欄位右邊的 "Browse" 鈕從檔案系統中選取所下載的 MicroPython 韌體, 其他欄位維持預設值 (例如已勾選的 Erase flase before installing 等), 按 "安裝" 鈕即先清除 Flash 並開始燒錄韌體, 完成後左下角會顯示 "Done!" :






燒錄完成後, 移除 D3/GPIO0 的接地線, 在 Shell 區按 Ctrl + D 軟開機或按板上的 Reset 鍵卻出現怪碼無法進入 REPL/Shell 介面, Why? 看起來燒錄過程都沒問題啊! 奇怪. 有空再來研究看看是哪裡有問題

只好用以前用的 ESP8266Flasher.exe 來燒錄, 結果 OK :







參考 : 



2021-11-24 補充 :

D1 mini 若使用長針腳的母插座來焊接的話, 不僅可以插在麵包板上使用公的杜邦線連接其他元件, 若無麵包板也可以直接使用上面的母座, 下次要焊針腳時可考慮這種母座 : 




當然這只是對開發測試較方便, 實際運作時這種長針腳母座很佔空間. 

2021-11-25 補充 : 

今天換另外一塊 D1 mini 板子用 Thonny 燒錄 v1.17 版韌體就沒問題, 拔掉 D3/GPIO0 接地線後按 Reset 鈕會先出現怪碼, 但隨後就出現 Shell 提示號了 : 




所以結論是, Thonny 包辦了從燒錄韌體, 編輯程式, 到上傳/下載/刪除/新增目錄等所有會用到的工具, 是開發 MicroPython 應用的輕量好幫手.