2019年6月30日 星期日

2019 年第 26 周記事

昨天下午姐姐與五個大學室友放暑假回高雄玩, 我兩點半去火車站載她們回鄉下. 順路經過岳父果園進去逛了一下. 回到家稍事整頓後她們去附近爬山, 等我做完菜就帶她們去鎮里吃冰, 然後她們逛旗山老街, 我則去麥當勞打電腦. 姊姊說明天一大早四點半要去山上看日出, 結果今天都睡到九點日昇三竿! 哈, 還看日出哩, 都太陽曬屁股了. 今天中午她們要去台中, 所以早上去魔法阿嬤吃冰後就出高雄, 我又再返鄉下, 所以這兩天跑了四趟還真累.

昨晚在旗山老街買了兩株台農二號木瓜苗, 老闆說此品種好吃但樹比較高, 要種在排水良好處才能長得好. 下午爸將其種在原來的草莓區附近. 為了澆水方便, 下午去富億資材行買了一個 250L 的水桶, 準備儲存車庫屋頂雨水集水管排放的水, 免得每次都要拉很長的水管, 而且雨水讓它白白流掉也很可惜.

本周空閒時間大都花在測試 ESP32 模組上面, 雖說與 ESP8266 同出一系, 但還是有些不同. 

2019年6月29日 星期六

市圖還書 16 本

下列書籍有的已看完, 有的已用完, 更多的是在未來半年應該都沒時間看, 那就先還吧!
  1. 社群網站的資料探勘
  2. Google御用網頁語言Node.js :一流程式設計師養成精華
  3. 不一樣的Node.js :用JavaScript打造高效能的前後台網頁程式
  4. 學得快才會想學 :黃金20小時學習法
  5. 一次搞懂熱門前端框架 React Vue.js Angular Backbone.js Aurelia
  6. 一路笑到掛的生死哲學課 :哈佛哲學家用幽默剖析生與死的一切
  7. 改變未來的祕密交易 :英國BBC調查記者揭露!他們怎麼創造了問題,然後把答案賣給我們
  8. 未來預演 :改寫大腦慣性反應,成為不敢想的自己
  9. 數學家忙什麼? =Mathematician busy for what
  10. 破梯效應 :社會就是地位的階梯,比較的結果決定處境,我要跟誰比,才有實質效益而非打擊?
  11. AI行銷學
  12. 解放的悲劇
  13. 數位邏輯 =Digital logic (施純協)
  14. 數位邏輯設計 (黃慶輝)
  15. 數位系統設計 (許榮睦)
  16. 數位邏輯設計 =Digital logic design (蔡昌隆)
我總是心猿意馬見異思遷, 見一個愛一個, 無法 focus 是要怎樣到彼岸呢?

MicroPython on ESP32 尚未支援藍芽

這幾天在玩 ESP32 板子, 覺得雖然比 ESP8266 模組貴 2.5 倍, 但接腳與功能都比較豐富, 計算能力也強很多, 特別是比 ESP8266 多了藍芽, 一個藍芽模組少說也要 120 元, 所以用 ESP32 較划算. 當然如果專案較簡單, 用不到藍芽, 其實 D1 mini 就可以了.

今天想說就來試試 MicroPython on ESP32 的藍芽功能, 但是引入 bluetooth 模組卻出現無此模組錯誤訊息 :

>>> import bluetooth 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: no module named 'bluetooth'

查詢網路才知道 MicroPython for ESP32 韌體尚未支援藍芽功能, 雖然 ESP32 開發板有藍芽也還不能用, 參見 GitHub 論壇 2018-05-28 這篇 :

https://github.com/micropython/micropython/issues/3809

開發者的回答是 :  "No, BLE on ESP32 is not yet implemented"

但我也找到高手分享的自行開發的藍芽韌體, 不過看起來還有些問題, 參見 :

ESP32 bluetooth basic support
https://github.com/icetomcat/micropython/tree/bluetooth

另外一個可跑 MicroPython 的 BBC micro:bit 板子雖然硬體支援 bluetooth, 但是因為藍芽堆疊需要 12KB 的 RAM 記憶體,  micro:bit 板上卻只有 16KB RAM, 如果跑藍芽的話其他功能就沒辦法玩了, 參考 :

https://microbit-micropython.readthedocs.io/en/latest/ble.html

看來目前大概只有 Pyboard 已經支援 bluetooth 模組, 但還是基本的藍芽連線, 尚無配對等進階功能, 也是處於開發階段 :

https://docs.pycom.io/tutorials/all/ble.html

現階段若要用到 ESP32 的藍芽功能必須使用 Arduino IDE 才行, 參考 :

How to Use Serial Bluetooth in ESP32
Getting Started with ESP32 Bluetooth Low Energy (BLE) on Arduino IDE


2019-07-15 補充 :

bpi::bit 的韌體有支援藍芽驅動, 範例參考 :

https://github.com/BPI-STEAM/BPI-BIT-MicroPython/releases
https://github.com/micropython/micropython/pull/4589

2019-07-24 補充 :

今天在下面這篇讀到, 原來也有人自行開發 ESP32 的藍芽套件 :

Getting Started with MicroPython on ESP32 – Hello World, GPIO, and WiFi
https://github.com/MrSurly/micropython-esp32/blob/dev-bluetooth/esp32/bluetooth_docs.md

2020-02-11 補充:

MicroPython 自 1.12 版韌體起支援 BLE 藍芽, 參考 :

MicroPython 1.12 釋出

購買 WD 2.5 吋 4TB 行動硬碟

昨天收到順發傳的會員促銷訊息, WD 2.5 吋 4TB 行動硬碟賣 2999, 我查了PChome 等賣場, 市價賣 3399 沒錯, 會員優惠價到 6/30 為止, 早上就趁雨停的時候去建國路買一個, 出乎意料之外竟收到 WD 贈送保溫水壺一個 (店員說送完為止) :




其實我行動硬碟有好幾顆, 但每隔 2~3 年就會添購一顆, 將相片等重要資料再做一個備份, 畢竟硬碟也是有壞掉的時候, 資料無價, 一旦毀損, 就算花 10000 元或更多也可能救不回來.

2019年6月28日 星期五

購買 4G TF 卡

因 ESP32-CAM 插卡最高為 4GB, 買 6 片備用 :

# 出清大特價 全新現貨 KINGSTON 金士頓 TF 4G(Class4) MICRO SDHC 記憶卡 $60*6=360

360 + 60 =420 元

購買 Micro USB 傳輸線

今天測試 NodeMCU (ESP8266) 板子時發現 PuTTY 可以連線顯示 MicroPython 開機訊息, 但是按鍵盤卻無反應, 按板子的 reset 鍵可順利重開機, 換了另外一條傳輸線後就正常了, 顯示 Micro USB 線品質或者劣化會影響 COM 埠連線是否順利. 因此上露天跟高雄建興路的賣家購買新線長 3 短 8 共 11 條 :

玉蜀黍的窩★ MicroUSB 22cm彩色麵條線 短線 傳輸線 充電線 扁線20cm  9*8=72
玉蜀黍的窩★ MicroUSB 1米 彩色麵條線 傳輸線 充電線 扁線1M  10*3=30

合計 102 元, 和春戲院門口面交免運.

2019年6月27日 星期四

MicroPython on ESP32 學習筆記 (一) : 燒錄韌體

上週末購買的兩塊 NodeMCU-32S 昨天到貨, 這兩天才有時間開封測試. 但因為沒有事先研究而做了許多白工, 先說結論好了 :
  1. NodeMCU 的 USB 晶片用的是 CP2102, 必須下載安裝驅動程式才能抓到 COM port. 
  2. ESP32 要用 pip3 install esptool 安裝 esptool 這個 Python 套件燒錄韌體, 不要用以前 ESP8266 的 Espflasher.exe 程式. 
  3. 清除 flash 與燒錄韌體指令執行前必須按住板子右下角的 flash 按鈕, 等指令開始執行後再放開, 否則無法正常開機. 
ESP32 開發板內建藍芽與 WiFi, 是 ESP8266 模組的進階版, 擁有更多 ADC 接腳, CP 值更高, 因為一塊藍芽模組也要 100~300 元左右. Arduino, ESP8266, ESP32 這三塊開發板的主要功能比較如下表 :


 功能 Arduino ESP8266 ESP32
 CPU AVR ATMega328P Tensilica Xtensa LX106 Tensilica Xtensa LX6
 資料寬度 8 位元 32 位元 32 位元
 核心數 單核心 單核心 雙核心
 操作頻率 20MHz 80/160MHz 160/240MHz
 SRAM 16KB 160KB 512KB
 Flash 32KB 1-4MB 4-16MB
 WiFi 無 802.11 b/g/n 802.11 b/g/n/a/c
 Bluetooth 無 無 Bluetooth 5.0 LE
 DIO 有 (13 個) 有 (8 個) 有 (18 個)
 ADC 有 (8 個) 有 (1 個) 有 (18 個)
 DAC 無 無 有 (2 個)
 UART 有 (1 組, D0, D1) 有 (1 組) 有 (3 組)
 I2C 有 (1 組, A4, A5) 有 (1 組) 有 (2 組)
 I2S 有 (1 組) 有 (1 組) 有 (2 組)
 SPI 有 (1 組) 有 (1 組) 有 (3 組)
 PWM 有 (6 個, 3/5/6/9/10/11) 有 (8 個) 有 (16 個)
 電容觸控輸入 無 無 有 (10 個)


參考 :

https://nick.zoic.org/talk/lca2017/

我手上目前有三種 ESP32 開發板 : NodeMCU 32S, rpi:bit, 以及 ESP-CAM, 它們都是 4MB Flash 的板子, 相關教學資料參考 :

https://docs.micropython.org/en/latest/ (官方文件)

以下紀錄這兩天的測試過程, 都是在我的 Acer Swift 5 筆電的 Win10 下進行, 主要是依照 Randomnerd 的教學網頁, 參考 :

Flashing MicroPython Firmware with esptool.py on ESP32 and ESP8266

如果一開始就找到此網頁應該就可少走許多冤枉路.

除了 esptool 外,  還有一個 GUI 軟體 uPyCraft 可以燒錄 ESP32 韌體, 參考 :

Flash/Upload MicroPython Firmware to ESP32 and ESP8266

但我覺得 esptool 的 CLI 介面就很好用了.


1. 安裝 CP2102 驅動程式 : 

剛拆封的 NodeMCU 板子用 micro USB 線接上 PC 時, 開啟裝置管理員, 在連接埠 (COM 與 PRT) 項下會找不到 COM 埠. 因為此板內建的 USB 晶片不是常見的 CH340 (D1 mini 採用此晶片), 而是 Silicon Labs 的 CP2102, Windows 10 沒有內建, 必須下載安裝驅動程式 (CH340 在 Win10 就有, 毋須安裝), 參考 :

Arduino ESP32 精簡型開發板 安裝教學
https://cityos-air.readme.io/docs/1-usb-drivers-for-nodemcu-v10

CP2102 的下載位址 :

https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers

我下載的是 WINDOWS 10 Universal 版 (zip 檔) :




解開後執行 x64 那個 .exe 檔安裝驅動程式 :




然後開啟控制台的裝置管理員, 在連接埠項下就會出現 CP210X 的 COM 埠了 :




這時再次將 NodeMCU-32S 板子連接電腦 USB 埠, 開啟 Putty 以 115200 bps 速率 Serial 連線此 COM 埠 :




連線 NodeMCU 成功後 Putty 出現如下訊息, 此乃出廠時預燒的 Lua 程式, 會讓板子上的 LED 燈閃爍 :

ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0x00
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3ffc0000,len:0
load:0x3ffc0000,len:920
load:0x40078000,len:2624
load:0x40098000,len:508
entry 0x40098118
I (73) heap_alloc_caps: Initializing heap allocator:
I (73) heap_alloc_caps: Region 19: 3FFC03A0 len 0001FC60 tag 0
I (73) heap_alloc_caps: Region 23: 3FFE8000 len 00010000 tag 1
check b=0x3ffc03ac size=130116 ok
check b=0x3ffdfff0 size=0 ok
check b=0x3ffe800c size=65508 ok
I (92) cpu_start: Pro cpu up.
I (96) cpu_start: Single core mode
I (100) cpu_start: Pro cpu start user code
rtc v112 Sep 22 2016 16:08:39
XTAL 40M
I (133) cpu_start: Starting scheduler on PRO CPU.
D (135) nvs: init start=6 count=3
D (138) nvs: nvs_open misc 1
D (139) nvs: nvs_get_str_or_blob log
frc2_timer_task_hdl:3ffc4224, prio:22, stack:2048
tcpip_task_hdlxxx : 3ffc4e58, prio:18,stack:2048
phy_version: 123, Sep 13 2016, 20:01:58, 0
D (268) nvs: nvs_open nvs.net80211 1
D (268) nvs: nvs_get opmode 1
D (268) nvs: nvs_get country 1
D (269) nvs: nvs_get_str_or_blob sta.ssid
D (273) nvs: nvs_get_str_or_blob sta.mac
D (276) nvs: nvs_get sta.authmode 1
D (280) nvs: nvs_get_str_or_blob sta.pswd
D (283) nvs: nvs_get_str_or_blob sta.pmk
D (287) nvs: nvs_get sta.chan 1
D (290) nvs: nvs_get auto.conn 1
D (293) nvs: nvs_get bssid.set 1
D (296) nvs: nvs_get_str_or_blob sta.bssid
D (300) nvs: nvs_get sta.phym 1
D (302) nvs: nvs_get sta.phybw 1
D (305) nvs: nvs_get_str_or_blob sta.apsw
D (309) nvs: nvs_get_str_or_blob sta.apinfo
D (313) nvs: nvs_get_str_or_blob ap.ssid
D (317) nvs: nvs_get_str_or_blob ap.mac
D (320) nvs: nvs_get_str_or_blob ap.passwd
D (324) nvs: nvs_get_str_or_blob ap.pmk
D (328) nvs: nvs_get ap.chan 1
D (330) nvs: nvs_get ap.authmode 1
D (333) nvs: nvs_get ap.hidden 1
D (336) nvs: nvs_get ap.max.conn 1
D (340) nvs: nvs_get bcn.interval 2
D (343) nvs: nvs_get ap.phym 1
D (346) nvs: nvs_get ap.phybw 1
D (348) nvs: nvs_get ap.sndchan 1
D (352) nvs: nvs_set_blob sta.mac 6
D (355) nvs: nvs_set_blob ap.mac 6
pp_task_hdl : 3ffc8710, prio:23, stack:8192
get wifi mode: 2
set wifi mode
get wifi ap mac: 7D:3A:B7:B7:A7:5C
get wifi ap ssid: ESP_B7A75C
get wifi ap password:
set wifi ap ...
get wifi sta ssid:
get wifi sta password:
set wifi sta ...
wifi start
mode : sta(80:7d:3a:b7:a7:5c) + softAP(82:7d:3a:b7:a7:5c)
D (387) event: SYSTEM_EVENT_STA_START
V (390) event: enter default callback
V (393) event: exit default callback
D (396) event: SYSTEM_EVENT_AP_START
V (400) event: enter default callback
dhcp server start:(ip: 192.168.4.1, mask: 255.255.255.0, gw: 192.168.4.1)
V (410) event: exit default callback
mode : softAP(82:7d:3a:b7:a7:5c)
D (416) event: SYSTEM_EVENT_STA_STOP
V (419) event: enter default callback
V (423) event: exit default callback
start led blink task.
start http server task.

接下來要安裝 esptool 套件, 將板子 flash 裡面的既有程式清除掉, 再燒錄我們要的 MicroPython 韌體.


2. 安裝 esptool 套件 :

去年 Tim 大哥給了我一塊 rpi:bit ESP32 開發板, 當時燒錄 MicroPython 的經驗是 ESP32 不能用之前燒錄 ESP8266 (例如 ESP-01 或 D1 mini) 板子的 ESPflasher.exe 這個程式, 而是要用 Python 的 esptool 套件, 參考 :

# rpi:bit ESP32 開發板測試 (一) : 燒錄 MicroPython 韌體

Randomnerd 寫的教學文件裡也是用 esptool, 可以用 pip 直接安裝 :


C:\Users\User> pip3 install esptool 

完畢後檢視 Python 安裝目錄的 Scripts 資料夾, 會發現多了幾個 esp 開頭的檔案, 其中的 esptool.py 或 esptool.py.exe 就是我們要用來清除 flash 以及燒錄韌體的程式. 如果安裝 Python 時有勾選自動加入 path 環境變數, 那麼在任何目錄下都可執行 esptool.py.exe, 否則就要手動將 Scripts 目錄自行加入 path 中了.




注意, 在 Randomnerd 寫的教學文件裡是用 esptool.py, 這兩個都可以用. 執行 esptool.py 或  esptool.py.exe 會顯示指令說明 :

D:\test>esptool.py 
esptool.py v2.6
usage: esptool [-h] [--chip {auto,esp8266,esp32}] [--port PORT] [--baud BAUD]
               [--before {default_reset,no_reset,no_reset_no_sync}]
               [--after {hard_reset,soft_reset,no_reset}] [--no-stub]
               [--trace] [--override-vddsdio [{1.8V,1.9V,OFF}]]
               {load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash_status,write_flash_status,read_flash,verify_flash,erase_flash,erase_region,version}
               ...

esptool.py v2.6 - ESP8266 ROM Bootloader Utility

positional arguments:
  {load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,chip_id,flash_id,read_flash_status,write_flash_status,read_flash,verify_flash,erase_flash,erase_region,version}
                        Run esptool {command} -h for additional help
    load_ram            Download an image to RAM and execute
    dump_mem            Dump arbitrary memory to disk
    read_mem            Read arbitrary memory location
    write_mem           Read-modify-write to arbitrary memory location
    write_flash         Write a binary blob to flash
    run                 Run application code in flash
    image_info          Dump headers from an application image
    make_image          Create an application image from binary files
    elf2image           Create an application image from ELF file
    read_mac            Read MAC address from OTP ROM
    chip_id             Read Chip ID from OTP ROM
    flash_id            Read SPI flash manufacturer and device ID
    read_flash_status   Read SPI flash status register
    write_flash_status  Write SPI flash status register
    read_flash          Read SPI flash content
    verify_flash        Verify a binary blob against flash
    erase_flash         Perform Chip Erase on SPI flash
    erase_region        Erase a region of the flash
    version             Print esptool version

optional arguments:
  -h, --help            show this help message and exit
  --chip {auto,esp8266,esp32}, -c {auto,esp8266,esp32}
                        Target chip type
  --port PORT, -p PORT  Serial port device
  --baud BAUD, -b BAUD  Serial port baud rate used when flashing/reading
  --before {default_reset,no_reset,no_reset_no_sync}
                        What to do before connecting to the chip
  --after {hard_reset,soft_reset,no_reset}, -a {hard_reset,soft_reset,no_reset}
                        What to do after esptool.py is finished
  --no-stub             Disable launching the flasher stub, only talk to ROM
                        bootloader. Some features will not be available.
  --trace, -t           Enable trace-level output of esptool.py interactions.
  --override-vddsdio [{1.8V,1.9V,OFF}]
                        Override ESP32 VDDSDIO internal voltage regulator (use
                        with care)



3. 清除 flash 內容 :

在燒錄 MicroPython 韌體之前須先清空裡面的程式與資料, 指令如下 :

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

但是要注意, 在按下 ENTER 鍵之前要按住右下角的 IO0 (即 flash) 按鈕 :




直到 Connecting ... 後面的 Chip 編號出來, 如果沒有按的話會可能會出現如下 "Failed to connect to Espressif device" 錯誤 :

D:\test>esptool.py --chip esp32 --port COM8 erase_flash
esptool.py v2.6
Serial port COM8
Connecting........_____....._____....._____....._____....._____....._____....._____

A fatal error occurred: Failed to connect to Espressif device: Timed out waiting for packet header

我搜尋了網路發現有非常多人遇到這問題, 其原因除了沒按下 flash 按鈕外, 還有一個原因是 USB 線不對, 有可能只是充電線而已而不是資料傳輸線, 只要更換好一點的線即可.

按住 flash 鍵後再執行清除指令的話很快就與晶片連線了 :

D:\test>esptool.py --chip esp32 --port COM8 erase_flash 
esptool.py v2.6
Serial port COM8
Connecting.....
Chip is ESP32D0WDQ6 (revision 1) 
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
MAC: 80:7d:3a:b7:c0:8c
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 3.0s
Hard resetting via RTS pin...


4. 查詢 flash 資訊 : 

指令如下 :

esptool.py --port COM8 flash_id

與上面清除 flash 一樣, 下達查詢指令前按住 flash 鈕 (即 IO0) 才會順利連線 :

D:\test>esptool.py --port COM8 flash_id 
esptool.py v2.6
Serial port COM8
Connecting....
Detecting chip type... ESP32 
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
MAC: 80:7d:3a:b7:c0:8c
Uploading stub...
Running stub...
Stub running...
Manufacturer: 68
Device: 4016
Detected flash size: 4MB
Hard resetting via RTS pin...

可見 CPU 是 240 MHz 雙核心, 具備 WiFi 與藍芽功能, flash 容量為 4MB PSRAM, 關於 PSRAM 參考 :

PSRAM偽靜態隨機存取記憶體


5. 下載並燒錄 MicroPython 韌體 :

ESP32 版的 MicroPython 韌體可在下列網址下載,  有 Standard 與 SPIRAM 兩種版本, Standard 版本可在任何一種 ESP32 板子上運作, 但 SPIRAM 版本只能在配備 4MB 外部 PSRAM (SPI RAM) 的板子上跑. NodeMCU-32S 沒有 SPI RAM, 雖然兩種版本都可以跑, 但燒錄 SPIRAM 版韌體事實上無法啟動 SPI RAM (因為沒有), 故此處下載 Standard 版本 :

https://micropython.org/download/esp32/

先切換到下載韌體所在目錄, 與上面清除與查詢 flash 一樣, 在下達燒錄指令前需按住 flash 鍵 (即 IO0) 直到 Connecting ... 後面的 Chip 編號出來才放掉 :

D:\ESP32>esptool.py --chip esp32 --port COM8 write_flash -z 0x1000 esp32-20190711-v1.11-142-ga73859d5a.bin
esptool.py v2.6
Serial port COM8
Connecting....
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
MAC: 80:7d:3a:b7:c0:8c
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 1167312 bytes to 729739...
Wrote 1167312 bytes (729739 compressed) at 0x00001000 in 65.1 seconds (effective 143.4 kbit/s)...
Hash of data verified.

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

這樣就燒錄完成了. 接著開啟 PuTTY 以 Serial 115200 速率連線 COM port, 應該馬上就進入 REPL 介面了 :

ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:4928
ho 0 tail 12 room 4
load:0x40078000,len:9404
load:0x40080400,len:6228
entry 0x400806ec
I (439) cpu_start: Pro cpu up.
I (439) cpu_start: Application information:
I (439) cpu_start: Compile time:     Jun 25 2019 12:38:11
I (443) cpu_start: ELF file SHA256:  0000000000000000...
I (449) cpu_start: ESP-IDF:          v3.3-beta1-694-g6b3da6b18
I (455) cpu_start: Starting app cpu, entry point is 0x40082b54
I (0) cpu_start: App cpu up.
I (466) heap_init: Initializing. RAM available for dynamic allocation:
I (473) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (479) heap_init: At 3FFB9ED0 len 00026130 (152 KiB): DRAM
I (485) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (491) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (498) heap_init: At 400921FC len 0000DE04 (55 KiB): IRAM
I (504) cpu_start: Pro cpu start user code
I (75) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
MicroPython v1.11-63-gd889def06 on 2019-06-25; ESP32 module with ESP32
Type "help()" for more information.
>>> import sys
>>> print("Version Python ", sys.version) 
Version Python  3.4.0   

可見 v1.11-63 版韌體是實作 Python v3.4.0.

雖然 NodeMCU 32S 這塊開發板沒有外部 SPI RAM, 但也可以燒錄 SPI RAM 版本的韌體, 只是開機時會顯示 "SPI RAM enabled but initialization failed" 以及 "Failed to init external RAM" 等訊息, 雖然都能正常運作, 還是燒錄 Standard 版本吧!

ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:4928
ho 0 tail 12 room 4
load:0x40078000,len:10264
ho 0 tail 12 room 4
load:0x40080400,len:6740
entry 0x400806ec
E (509) spiram: SPI RAM enabled but initialization failed. Bailing out.
I (510) cpu_start: Failed to init external RAM; continuing without it.
I (513) cpu_start: Pro cpu up.
I (516) cpu_start: Application information:
I (521) cpu_start: Compile time:     Jun 25 2019 00:44:35
I (527) cpu_start: ELF file SHA256:  0000000000000000...
I (533) cpu_start: ESP-IDF:          v3.3-beta1-694-g6b3da6b18
I (540) cpu_start: Starting app cpu, entry point is 0x40083014
I (0) cpu_start: App cpu up.
I (550) heap_init: Initializing. RAM available for dynamic allocation:
I (557) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (563) heap_init: At 3FFBA098 len 00025F68 (151 KiB): DRAM
I (570) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (576) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (582) heap_init: At 40096438 len 00009BC8 (38 KiB): IRAM
I (588) cpu_start: Pro cpu start user code
I (159) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
E (20) spiram: SPI RAM not initialized
I (40) modsocket: Initializing
I (60) wifi: wifi driver task: 3ffe2f08, prio:23, stack:3584, core=0
I (283) wifi: wifi firmware version: 7240fb7
I (283) wifi: config NVS flash: enabled
I (283) wifi: config nano formating: disabled
I (283) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
I (293) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
I (323) wifi: Init dynamic tx buffer num: 32
I (323) wifi: Init data frame dynamic rx buffer num: 32
I (323) wifi: Init management frame dynamic rx buffer num: 32
I (323) wifi: Init management short buffer num: 32
I (333) wifi: Init static rx buffer size: 1600
I (333) wifi: Init static rx buffer num: 10
I (343) wifi: Init dynamic rx buffer num: 32
Started webrepl in normal mode
MicroPython v1.11-52-g205c6d0dc on 2019-06-25; ESP32 module with ESP32
Type "help()" for more information.

如果買的是 ESP32 WROVER 開發板就有 4MB 的外部 SPI RAM, 需要用到 SPI RAM 的話就可以燒錄 SPI RAM 版韌體, 但 SPI RAM 運作速度較低, 不需要 SPI RAM 的話就安裝 Standard 版. 關於 SPI RAM 參考 :

  1. SPIRAM 速度較慢, 理論上是 40MB/s, 實際應用大約 14MB/s
  2. 如果燒錄的韌體是 SPI 版, 則系統會自動使用 SPIRAM 而非較快的 SRAM. 


6. 檢查硬體與韌體狀態 :

MicroPython v1.11-63-gd889def06 on 2019-06-25; ESP32 module with ESP32
Type "help()" for more information.
>>> import esp   
>>> esp.check_fw()    
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'check_fw'
>>> import port_diag   
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: no module named 'port_diag'
>>> dir()
['uos', '__name__', 'gc', 'bdev', 'esp']
>>> dir(esp)
['__class__', '__name__', 'LOG_DEBUG', 'LOG_ERROR', 'LOG_INFO', 'LOG_NONE', 'LOG_VERBOSE', 'LOG_WARNING', 'dht_readinto', 'flash_erase', 'flash_read', 'flash_size', 'flash_user_start', 'flash_write', 'gpio_matrix_in', 'gpio_matrix_out', 'neopixel_write', 'osdebug']
>>> esp.flash_size()   
4194304   

可見 ESP32 版本的 MicroPython 雖然有 esp 模組, 但已經移除 check_fw() 方法, 而且也沒有 port_diag 模組了. 利用 esp.flash_size() 查詢記憶體容量確實有 4MB. 


7. 檢查檔案系統 :

>>> dir()
['uos', 'gc', '__name__', 'bdev']

注意, 上面是 SPIRAM 版的預載模組, 如果是 Standard 版則不同 :

>>> dir()
['bdev', 'gc', '__name__', 'os', 'uos', 'f', 'webrepl', 'line']

檔案系統根目錄下只有一個 boot.py :

>>> import os 
>>> os.uname()
(sysname='esp32', nodename='esp32', release='1.11.0', version='v1.11-52-g205c6d0dc on 2019-06-25', machine='ESP32 module with ESP32')
>>> os.listdir() 
['boot.py']
>>> f=open('boot.py','r') 
>>> for line in f.readlines(): 
...     print(line)
...
...
...
# This file is executed on every boot (including wake-boot from deepsleep

#import esp

#esp.osdebug(None)

#import webrepl

#webrepl.start()

>>> f.close() 

可見預設載入了 os, gc, webrepl 等模組, 但 webrepl 並未開啟. 其中 esp.osdebug(None) 用來關閉系統偵錯訊息, 在開發階段要像這樣用 # 註解掉以利程式錯誤時有資訊可用來除錯,


8. 開啟 webrepl 功能 :

>>> import webrepl_setup 
WebREPL daemon auto-start status: disabled 

Would you like to (E)nable or (D)isable it running on boot?
(Empty line to quit)
> E
To enable WebREPL, you must set password for it
New password (4-9 chars): 123456
Confirm password: 123456
Changes will be activated after reboot
Would you like to reboot now? (y/n)y

重新讀取 boot.py  :

>>> f=open('boot.py','r') 
>>> for line in f.readlines(): 
...     print(line) 
...
...
...
# This file is executed on every boot (including wake-boot from deepsleep)

#import esp

#esp.osdebug(None)

import webrepl

webrepl.start()   

>>> f.close()

可見 webrepl 已開啟.

完成上面的燒錄作業, 就可以開始測試 ESP32 開發板的功能了. 上面讀取檔案可用 with, 這樣讀取完畢會自動關檔, 不須呼叫 close() :

>>> with open('boot.py','r') as lines: 
...     for line in lines: 
...         print(line) 
...
...
...
# This file is executed on every boot (including wake-boot from deepsleep)

#import esp

#esp.osdebug(None)

import webrepl

webrepl.start()



9. 系統內建模組 :

呼叫內建函數 dir() 可以檢視 MicroPython 內建模組 :

>>> dir() 
['bdev', 'gc', '__name__', 'esp', 'uos', 'machine', 'webrepl']

其中 uos 是 CPython 的 os 模組在 MicroPython 上實作的子集合, 可以用 import os 或 import uos 引入模組 (用 os 其實會被轉成 uos), 主要是檔案管理函數, 參考 :

https://docs.micropython.org/en/latest/library/uos.html#module-uos

>>> import uos 
>>> dir(uos) 
['__class__', '__name__', 'remove', 'VfsFat', 'chdir', 'dupterm', 'dupterm_notify', 'getcwd', 'ilistdir', 'listdir', 'mkdir', 'mount', 'rename', 'rmdir', 'stat', 'statvfs', 'umount', 'uname', 'urandom']
nique_id']

其次是 esp 模組, 此為 ESP8266 與 ESP32 特有的模組, 大部分是與 flash 記憶體與 GPIO 操作有關, 參考 :

https://docs.micropython.org/en/latest/library/esp.html#module-esp

>>> dir(esp) 
['__class__', '__name__', 'LOG_DEBUG', 'LOG_ERROR', 'LOG_INFO', 'LOG_NONE', 'LOG_VERBOSE', 'LOG_WARNING', 'dht_readinto', 'flash_erase', 'flash_read', 'flash_size', 'flash_user_start', 'flash_write', 'gpio_matrix_in', 'gpio_matrix_out', 'neopixel_write', 'osdebug']

另外還有一個 ESP32 特有的模組 esp32, 主要是與睡眠及喚醒功能有關之函數, 參考 :

https://docs.micropython.org/en/latest/library/esp32.html#module-esp32

>>> import esp32 
>>> dir(esp32) 
['__class__', '__name__', 'ULP', 'WAKEUP_ALL_LOW', 'WAKEUP_ANY_HIGH', 'hall_sensor', 'raw_temperature', 'wake_on_ext0', 'wake_on_ext1', 'wake_on_touch']

最後是 machine 模組, 包含重啟, 中斷, 計時器, 看門狗等硬體功能相關之函數與屬性, 參考 :

https://docs.micropython.org/en/latest/library/machine.html#module-machine

>>> import machine 
>>> dir(machine) 
['__class__', '__name__', 'ADC', 'DAC', 'DEEPSLEEP', 'DEEPSLEEP_RESET', 'EXT0_WAKE', 'EXT1_WAKE', 'HARD_RESET', 'I2C', 'PIN_WAKE', 'PWM', 'PWRON_RESET', 'Pin', 'RTC', 'SDCard', 'SLEEP', 'SOFT_RESET', 'SPI', 'Signal', 'TIMER_WAKE', 'TOUCHPAD_WAKE', 'Timer', 'TouchPad', 'UART', 'ULP_WAKE', 'WDT', 'WDT_RESET', 'deepsleep', 'disable_irq', 'enable_irq', 'freq', 'idle', 'lightsleep', 'mem16', 'mem32', 'mem8', 'reset', 'reset_cause', 'sleep', 'time_pulse_us', 'unique_id', 'wake_reason']


參考 :

[SOLVED] Failed to connect to ESP32: Timed out waiting for packet header
Flash/Upload MicroPython Firmware to ESP32 and ESP8266
[芸庭樹]安信可原廠 NodeMCU-32S Lua ESP32S開發板Arduino MicroPython

好書 : Python 程式設計與人工智慧入門:使用 DJI Tello 和 Microsoft Azure

最近找到一台可程式的室內空拍機 Tello, 這是大疆 DJI 子公司睿熾 (Ryze) 開發的小型玩具型無人機, 也有教育型的叫 Tello EDU, 大概貴個 1000 元左右 :

《iCshop1》TELLO 迷你空拍機●368040500021●DJI Ryze 特洛 無人機 $2980
《iCshop4》TELLO EDU 多軸飛行器●368040500061●DJI Ryze 特洛 無人機 $4600

在博客來找到一本台科大出版的 Python 書籍裡有用 Tello 做範例, 去明儀找到了這本書, 覺得還蠻有趣實用的 (但書很薄, 篇幅有點少), 目前沒時間玩, 先記錄下來 :

Python 程式設計與人工智慧入門:使用 DJI Tello 和 Microsoft Azure


Source : 博客來

參考 :

可以寫程式控制的 Tello 自拍無人機
Tello EDU 不僅僅是飛行
How to make drone at home - Dji Tello | plastic box drone

Win10 升級 Python 3.7 (64-bit) 安裝套件清單

電腦由 Win 7 升版為Win 10 後, Python 也安裝最新的 3.7 版, 常用套件也重新安裝, 清單如下 :

1. 基本工具
python -m pip install --upgrade pip
pip install ipython 
pip install virtualenv

2. 網路爬蟲
pip install requests
pip install beautifulsoup4
pip install lxml
pip install html5lib
pip install selenium
pip install scrapy

3. 機器學習
pip install scipy (會同時安裝 Numpy)
pip install pandas
pip install sympy
pip install simpy
pip install matplotlib
pip install seaborn
pip install bokeh
pip install plotly
pip install scikit-learn
pip install --upgrade tensorflow > tensorflow.txt
pip install keras > keras.txt
pip install https://download.pytorch.org/whl/cpu/torch-1.1.0-cp37-cp37m-win_amd64.whl
pip install https://download.pytorch.org/whl/cpu/torchvision-0.3.0-cp37-cp37m-win_amd64.whl

4. 語音相關 :
pip install SpeechRecognition (Google 語音辨識)
pip install PyAudio-0.2.11-cp37-cp37m-win_amd64.whl (讀取麥克風, 下載)
pip install gTTS (文字轉語音)
pip install pygame (讀取及播放語音檔)

5. MicroPython 工具 :
pip install esptool (燒錄)
pip install adafruit-ampy (檔案上傳)

6. Fintech 工具 :
pip install twstock (台股)
pip install TA_Lib-0.4.17-cp37-cp37m-win_amd64.whl (技術分析 下載
pip install twder (台銀外匯)

7. 架站工具 :
pip install flask
pip install django
pip install reflex

8. 計算語言學與自然語言處理 :
pip install -U nltk (下載 NLTK 資料庫 import nltk; nltk.download())
pip install spacy
pip install gensim (有 word2vec)

9. 其他 :
pip install twilio
pip install twitter
pip install pexpect

參考 :

2018年Python最常用的20個資料科學庫 


2023-05-17 補充 :

今天在水某的 ThinkPad 安裝 TensorFlow, 居然要 272MB :

C:\Users\User>pip install tensorflow
Collecting tensorflow
  Downloading tensorflow-2.12.0-cp311-cp311-win_amd64.whl (1.9 kB)
Collecting tensorflow-intel==2.12.0 (from tensorflow)
  Downloading tensorflow_intel-2.12.0-cp311-cp311-win_amd64.whl (272.9 MB)


ESP8266/ESP32 物聯網開發板安裝軟體與套件清單

在物聯網專案中使用 ESP8266/ESP32 開發板很方便, 特別是 ESP32 內建藍芽與 WiFi, 價格約 200~250 元, 如果用不到藍芽, 則可使用價格約 80 元的 D1 mini, 燒錄 MicroPython 韌體後即可以簡單易學的 Python 語言開發, 所需要的軟體與套件如下 :

1. USB 驅動程式 (Win10 以下) :

CP2102 (參考)
PL2303 (參考)

2. 韌體燒錄套件 :

pip3 install esptool
ESP8266Flasher.exe (for ESP8266 only)

3. 檔案管理套件 :

pip3 install adafruit-ampy (好用)
pip3 install mpfshell
pip3 install rshell

2019年6月25日 星期二

MicroPython v1.11 釋出

最近因為要幫二哥規劃物聯網學習進程, 重拾 MicroPython on ESP8266 專案, 於是上網追蹤 MicroPython 演進, 發現它已釋出 v1.11 版韌體, ESP8266 與 ESP32 版本下載連結如下 :

http://micropython.org/download/#esp8266
http://micropython.org/download/#esp32

最近跟露天賣家買了兩塊 NodeMCU ESP32 板子, 我看了賣家提供的教學說明, 覺得以 ESP32 取代 Arduino 很有道理, 不過他採用 Arduino IDE 作為開發工具, 參考 :

ESP32 Arduino開發環境架設(取代Arduino UNO及ESP8266首選)

其論點我非常認同, 摘要如下 :
  1. Arduino 缺乏 WiFi 與藍芽, 需要另購模組很不實用. ESP32 則一應俱全, 學校應該改用 ESP32 教學. 
  2. ESP8266 模組例如 D1 mni 只有一個 ADC 腳太少 (需要另外購買 PCF8591 ADC/DAC 模組), 而 ESP32 的 18 隻 GPIO 都可做DIO 或 ADC 使用. 
另外一篇作者也是使用 NodeMCU, 雖然不是採用 ESP32 (應該是 ESP-12 模組), 但開發工具是 MicroPython :

用 Python 玩硬體:MicroPython 簡介與實作

其論點認為 ESP-01 模組只有兩個 GPIO 腳太陽春, 做不了甚麼大事. 而 NodeMCU 有 USB 與多個 GPIO, 比 ESP-01 方便太多. 這個我非常認同. ESP-01 只適合用在簡單的 ON-OFF 控制應用.

綜合而言我覺得 :
  1. 簡單的 2 個輸出入控制 : ESP-01 (60 元)
  2. 需要 8 個輸出入不需要藍芽的應用 : D1 mini (80 元)
  3. 需要 8 個以上 GPIO & ADC 以及藍芽的應用 : ESP32 (200 元)
關於 D1 mini 與 MicroPython 參考 :

WeMOS D1 Mini 開發板測試
MicroPython 學習筆記索引

我在零件箱找到以前買的一塊 NodeMCU (ESP-12), 就用這塊 ESP8266 模組來燒錄 MicroPython v1.11 韌體吧 ! 這款 NodeMCU 是 ESP8266 模組, 因此仍可用 ESP8266Flasher.exe 程式燒錄, 但我打算改用 esptool 套件, 先用 pip3 安裝此套件 :

pip3 install esptool

另外 NodeMCU 大都採用 CP2102 晶片做 UART 與 USB 轉換, 需到 Silicon Labs 公司網站下載安裝驅動程式 :

https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers

安裝好後在控制台的裝置管理員頁面就會看到 CP210X 的 COM 埠, 此處為 COM8, 清除與燒錄需指定所連接的 COM 埠.


1. 檢查 flash id 與 size : 

下面指令用來檢查這塊 NodeMCU 上的 flash 記憶體大小 :

C:\Users\User>esptool.py.exe --port COM8 --baud 115200 flash_id 
esptool.py v2.6
Serial port COM8
Connecting....
Detecting chip type... ESP8266 
Chip is ESP8266EX
Features: WiFi
MAC: 18:fe:34:e1:48:22 
Uploading stub...
Running stub...
Stub running...
Manufacturer: e0
Device: 4016
Detected flash size: 4MB 
Hard resetting via RTS pin...

可見此板上的 SoC 處理器晶片為 ESP8266, flash 大小為 4MB, 只有 WiFi 功能.


2. 清除 flash 內程式與資料 : 

注意, 在按 ENTER 執行刪除 flash 與燒錄韌體前須先按住板子右下角的 flash 鈕, 等出現 Connecting ... 後再放開 :




C:\Users\User>esptool.py.exe --port COM8 erase_flash 
esptool.py v2.6
Serial port COM8
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
MAC: 18:fe:34:e1:48:22
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 13.6s
Hard resetting via RTS pin...


3. 下載 MicroPython 韌體進行燒錄 : 

先切換到下載韌體所在目錄, 同樣地, 在按 ENTER 執行燒錄韌體前須先按住板子右下角的 flash 鈕, 等出現 Connecting ... 後再放開 :

D:\>cd test 

D:\test>esptool.py.exe --port COM8 --baud 115200 write_flash -fm dio -fs 4MB 0x00000 esp8266-20190529-v1.11.bin   
esptool.py v2.6
Serial port COM8
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
MAC: 18:fe:34:e1:48:22
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Flash params set to 0x0240
Compressed 617880 bytes to 402086...
Wrote 617880 bytes (402086 compressed) at 0x00000000 in 35.9 seconds (effective 137.7 kbit/s)...
Hash of data verified.

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

這樣就燒錄完成了.


4. 檢查硬體與韌體狀態 : 

以 PuTTY 用 Serial 115200 連線 NodeMCU, 檢查硬體與韌體狀態 :

MicroPython v1.11-8-g48dcbbe60 on 2019-05-29; ESP module with ESP8266
Type "help()" for more information.
>>> import esp 
>>> esp.check_fw()   
size: 617864
md5: 9cdb85c9e0150cef6a2a5cc589283483
True   
>>> import port_diag   
FlashROM:
Flash ID: 1640e0 (Vendor: e0 Device: 4016)
Flash bootloader data:
Byte @2: 02
Byte @3: 40 (Flash size: 4MB Flash freq: 40MHZ)
Firmware checksum:
size: 617864
md5: 9cdb85c9e0150cef6a2a5cc589283483
True
Networking:
STA ifconfig: ('0.0.0.0', '0.0.0.0', '0.0.0.0', '208.67.222.222')
AP ifconfig: ('192.168.4.1', '255.255.255.0', '192.168.4.1', '208.67.222.222')
Free WiFi driver buffers of type:
0: 8 (1,2 TX)
1: 0 (4 Mngmt TX(len: 0x41-0x100))
2: 8 (5 Mngmt TX (len: 0-0x40))
3: 4 (7)
4: 7 (8 RX)
lwIP PCBs:
Active PCB states:
Listen PCB states:
TIME-WAIT PCB states:

韌體 checksum 結果 True 表示韌體正常無毀損. 此外也顯示固定的 AP 網址為 192.168.4.1, 而 flash 有 4MB, 對於一般物聯網應用絕對足夠使用.


5. 檢查檔案系統  : 

>>> import os 
>>> os.listdir() 
['boot.py'] 

可見根目錄下只有一個啟動檔案 boot.py, 用 open() 開啟 boot.py 再用迴圈讀取內容 :

>>> f=open('boot.py','r') 
>>> for line in f.readlines():   
...     print(line) 
...
...
...
# This file is executed on every boot (including wake-boot from deepsleep)

#import esp

#esp.osdebug(None)

import uos, machine   

#uos.dupterm(None, 1) # disable REPL on UART(0)

import gc 

#import webrepl

#webrepl.start()

gc.collect() 

可見預設已引入 uos, gc, 以及 machine 三個內建模組, webrepl 是關閉的, 需手動開啟.


6. 開啟 webrepl 功能 : 

只要引入 webrepl_setup 模組即可開啟 werepl 功能 :

 >>> import webrepl_setup 
WebREPL daemon auto-start status: disabled

Would you like to (E)nable or (D)isable it running on boot?
(Empty line to quit)
> E 
To enable WebREPL, you must set password for it
New password (4-9 chars): 123456   
Confirm password: 123456   
Changes will be activated after reboot 
Would you like to reboot now? (y/n) y

開啟 webrepl 後要按 reset 鈕重啟, 但我發現只有這樣好像看起來開機成功, 但按鍵盤 PuTTY 卻沒反應, 但關掉 PuTTY 並重插 USB 線就可以了.

這樣再次讀取 boot.py 會發現 webrepl 在啟動時就開啟了 :

>>> f=open('boot.py','r') 
>>> for line in f.readlines(): 
...     print(line)
...
...
...
# This file is executed on every boot (including wake-boot from deepsleep)

#import esp

#esp.osdebug(None)

import uos, machine

#uos.dupterm(None, 1) # disable REPL on UART(0)

import gc

import webrepl

webrepl.start()

gc.collect()

如何在 Win10 刪除 SD 卡的分割

最近把以前的舊手機 HTC Desire S 拿來當備用機 (SIM 卡是中華預付卡如意卡), 找了一片 8G SD 卡格式化後放進去, 卻發現容量只有 60MB, 檢查發現此 SD 卡有兩個分割, 一個標籤為 BOOT 就是 60MB 那個, 另一個為 7.4GB 手機卻讀不到. 我猜手機可能只會讀第一個分割.

此 SD 卡原本是給樹莓派用的, 所以燒錄完映像檔後會多出一個 44MB 的分割作為啟動磁區, 如果要讓手機讀到 SD 卡後面那個大磁區, 必須將小的這個刪除, 怎麼做呢? 參考 :

3 Methods to Remove / Delete Partition from SD Card on Windows 10?

首先開啟 "開始/Windows 系統管理工具/電腦管理" 頁面, 選擇 "磁碟管理", 然後點選那個 44MB 的 BOOT 磁區, 按滑鼠右鍵選取 "刪除磁碟區" 即可 :




這樣處理後將 SD 卡放回手機就可以讀到整個 SD 卡了.

2019年6月24日 星期一

2019 年第 25 周記事

本周已是第 25 周, 也就是這年快過了一半了. 這半年好像還是在瞎忙, 專案進度有限, 學研速度慢如龜, 下半年能不能專心一點呢? 周三開始從頭整理 Python 筆記給二哥上課用, 我以為很簡單, 但寫了四五天卻連基本語法篇都還沒寫完, Line 別看, Yahoo 新聞別看, 真的太浪費時間.

週五水某赴港出差, 還好坐華航, 不然就去不了了. 早上五點載她去小港登機, 回來才六點多, 但回籠覺睡不著了, 開始整理雜亂的書房, 將小狐狸們的教科書都先打包帶回鄉下.

週六隨老張去北大武檜谷山莊, 我以為登過幾座山還有四次旗靈縱走應該沒問題, 走過才知難度倍增, 體力消耗太大, 回來兩天除了酸腫痛也沒啥精神, 愛睏. 以後登山必須充分準備, 一個月前就要加強體能訓練. 就算關節 ok, 肌耐力差也是不行的.

月底有同事要退休, 下周三歡送, 據說要吃披薩與點心, 嗯, 披薩盒要給我留下, 有空要來製作披薩盒 RC 遙控飛機, 記得中華路那邊有家模型店可買到遙控器與伺服機推進器等.

樹莓派 4 上市了

今天收到 PIMORONI 寄來的促銷信 (以前跟他們買過 Pi Zero W), 赫然發現樹莓派已經推出第四版, 主要規格如下 :
  1. 四核 1.5GHz 64-bit ARM Cortex-A72 CPU
  2. 1GB/2GB/4GB of LPDDR4 RAM 
  3. 802.11 b/g/n/ac WiFi 
  4. 低功率藍芽 5.0
  5. H.265 4K 解碼
  6. H.264 1080P60/30 解碼
  7. 雙 micro-HDMI 埠 (支援 4KP60)
  8. USB2*2
  9. USB3*2
  10. USB Type-C Power
若搭配 4GB 記憶體, 效能直逼入門級 PC! 功率消耗自然也較高, 變電器需使用 3A 輸出的才行. 價格上比 Pi 3 要貴一些 :
  1. 1GB 款定價 34 英鎊, 合台幣約 1343 元
  2. 2GB 款定價 44 英鎊, 合台幣約 1738 元
  3. 4GB 款定價 54 英鎊, 合台幣約 2133 元. 

參考 :

# PIMORONI Raspberry Pi 4

另外發現 Pi Zero W 漲價為 9.3 英鎊 (合台幣約 367 元), 我 2017 年買才 8 塊英鎊, 若加上運費約 5.5 英鎊, 總價就要台幣 584 元, 還不如跟露天下面這個賣家買, 才 450 元, 含運也才 510 元, 較划算, 參考 :

Raspberry Pi Zero W (wireless)主機板,新春特價! $450
https://shop.pimoroni.com/products/raspberry-pi-zero-w

2019年6月22日 星期六

北大武檜谷山莊一日行

今天跟老張與大師一夥人共 16 人搭兩部 9 人座去爬北大武, 因為是一天體驗行程, 故只到檜谷山莊而已. 早上 06:20 在凹子底出發, 走 88 到萬巒上泰武部落, 車子光上山沿著蜿蜒山路到新登山口就要 50 分鐘.

車子放在新登山口, 一進去馬上來個震撼教育 : 好幾層的 z 字形的陡坡, 然後上上下下要走約 70 分鐘才到舊登山口, 那裏手機信號就弱了, 勉強還能傳文字訊息與打電話 (中華電信), 在檢查哨簽了名點了人數就開始這趟自虐過程了.




然後就爬上又爬下, 從這山繞那山, 途中幾次腳抽筋, 幸好大師帶了非常多梅子片讓我度過難關. 堅持再堅持, 終於在 1 點 20 分抵達目的地檜谷山莊, 腳程快的老張已經睡一覺起來.




我以為是像松雪樓那樣的豪華山莊, 原來是個大通鋪! 隊友說這是山莊裡面除排雲山莊外最豪華的了, 不要跟松雪樓比好嗎? 呵呵, 我這個業餘插花登山客也算長見識了.

【新手專區】我是新手,我想去北大武山!

2019年6月21日 星期五

購買 ESP32-CAM 與 iBeacon

前天在露天找到 ESP32-CAM, 價格約在 300~500 之間, 評估後決定向台南這位賣家購買一組來測試, 此賣家應該是專業工程師, 購買後可加 Line 傳送教學資料. 另購 iBeacon 室內定位模組一個 :

正廠 廣角 夜視arduino esp32-cam wifi 藍芽BLE 辨識 ov2640 2百萬 $430
ble4.0 低功率 ibeacon室內定位應用系統 $195
# NODEMCU-32S ESP32 Arduino 相容 含藍芽WIFI (ESP8266) $197*2=394

430+20(天線)+195++394+60=1099




關於 iBeacon 賣家有一篇說明可參考 :

ESP32 Arduino Beacon簡易室內定位

2019年6月20日 星期四

Pizza 盒三角翼 RC 遙控飛機

今天在 Youtube 看到下面這幾個有趣的影片, 只要用 Pizza 盒與 RC 射頻遙控器才就可製作三角翼遙控飛機, 看起來很簡單, 也非常好玩, 參考 :

Pizza Box Plane BUILD - FT Slice




所需材料如下 :
  1. Pizza 盒 * 1
  2. 螺旋槳 + 馬達 * 1
  3. 伺服機 *2
  4. 遙控器 * 1
  5. 熱熔膠槍 * 1
  6. 膠布 * 1
  7. 塑膠瓶蓋 * 1
  8. 橡皮筋 
另外一個影片也是用披薩盒製作 :

Airplane from a Pizza Box?




關於 RC 遙控飛機的部件說明參考下面兩部影片 :

RC Electronics for Noobs





Maker Hangar: Episode 11 - Installing Electronics




Maker Hangar: Episode 12 - Programing Radio




與多旋翼無人機比起來, 其實我比較喜歡固定翼, 因為它可以靠空氣浮力飛翔, 其推進器不需要全力抵抗地心引力, 所以同樣的電池應該可以在空較久的時間, 目前市售一般多旋翼機續航力最多只有 40 分鐘而已. 關於多旋翼與固定翼之比較, 參考 :

Choosing the Right Mapping Drone for Your Business Part I: Multi-Rotor vs. Fixed Wing Aircraft

其他相關訊息參考 :

RC Plane Electronics and Connections for Begineers
How to make a styrofoam RC airplane yourself | homemade low cost project
How to Make an RC Airplane with Recycled Parts
FPV49 v3 Plans & Some Build Tips
FPV49 v3 Build Video
SOLAR powered Plane / Drone / FPV / Build / RC Aircraft 
FT Mighty Mini Arrow - DIY Build | Flite Test
Flite Test Mighty Mini Arrow Electric Airplane Kit (737mm)
全新 富斯 FS-I6X 超薄 省電 10動 10通道 2.4G 遙控器 攀岩車 飛機 拖車 怪手 $1449
四通八鍵2.4G遙控器手把+接收板 $420
【您來瘋商城】4WD 合金遙控車 2.4G 遙控車 28CM 電動越野車 炫酷車 $590

太陽能無人機使用的電池片 Sunpower C60

今天在回味我之前貼過的太陽能無人機影片時, 注意到此 maker 使用的太陽能電池片名稱為 Sunpower C60, 參考 :

太陽能無人機






我在露天找到一個賣此太陽能電池片的賣家 (唯一), 一片 295 元, 但第二片起打對折 150 元 :

[巨將] 美國進口原包sunpower 單晶矽太陽能電池片C60 3.46W高效 (已下架)

買 10 片價錢 : 295 + 150*9=1600 元, 不便宜.

一片 3.46W (0.58V, 6A), 10 片約 35 W, 片中 maker 製作的是翼展 2 米的較大型固定翼, 裝了 30 片, 價格就要 4800 元了.

另外, 作者使用的視傳板露天也有賣, 一塊約 500 元 :

免Y線 MinimOSD 改良款 OSD naze32 mwc pixhawk 視頻疊加模塊 $500

2020-06-18 補充 :

此賣家巨將已下架此貨品, 其他賣家有海外代購, 價格較貴 :

NEW 10pcs 3.6W C60 Flexible Solar Cell Sunpower Maxeon 21 - 24% HIGH EFFICIENCY $2163

但直接到 Aliexpress 買更便宜, 10 片約台幣 830 元, 平均每片 83 元 :

Flexible Solar cell Max power 3.46W/pcs Monocrystalline 5'x5' Sunpower solar cell for DIY Flexible solar panel car charger US$27.62 (已打折)

買 50 片更便宜, 約台幣 3000 元, 平均每片 60 元台幣 :

50 Pcs 3.2W 125MM Flexible Maxeon Sunpower Solar Cell C60 Monocrystalline Silicon For DIY PV Solar Panel US$100

# Solar plane RC. 600Km of autonomy without batteries. Land and sea monitoring. Model SolarDR1L 2.0

2019年6月19日 星期三

可以寫程式控制的 Tello 自拍無人機

最近有網友留言 (JJRC H36), 讓我想起已遺忘多時的這台小玩具 (小咪超怕它). 哎呀, 我何時才有空玩空拍機啊?

我在 Youtube 上看到網紅介紹下面這款大疆 DJI 的 Mavic 2 Pro 超帥的, 但是 ~~~ 非常貴, 要好幾個萬, 看影片過過癮就好了 :

2019空拍機怎麼買|開箱DJI Smart Controller带屏遥控器




還有一款自拍神器 Kimon (續航力 15 分鐘), 但也要 17000 元左右, 相當於一台手機了, 也是欣賞就好 :

https://youtu.be/G0nmCS5N2WE
遙控飛機4K高清專業無人機gps定位自動跟隨環繞折疊抖音直播基石kimon--一級棒 $17089




如果是室內玩解解悶的話, 米兔或 Tello 價格還算不貴, 參考 :

https://www.youtube.com/watch?v=j3hXuPrj5KI




兩台性能差不多, 都有攝影機可透過手機操控, 米兔較便宜.

現貨720P高畫質 小米 米兔遥控小飛機四軸飛行器遙控飛機 $2000
《iCshop1》TELLO 迷你空拍機●368040500021●DJI Ryze 特洛 無人機 $2980

但我覺得 Tello 較好, 因為它有開放 SDK, 可用 Scratch 或 Python 寫程式控制, 參考 :

https://youtu.be/rRJj-2jaZiE
Python程式設計與人工智慧入門:使用DJI Tello和Microsoft Azure
輕課程 Tello空拍機入門含影片拍攝後製與Scratch程式設計
深入體驗 Tello 無人機,這是你可以用台幣3500元買到最不像玩具的玩具無人機
Scratch多媒體遊戲設計 & Tello無人機
TELLO EDU飛行器程式教育超值套書
Tello 即時飛行控制器實作
https://bitbucket.org/PingguSoft/pytello/src/master/




據聞今年七月起民航法空拍機相關法令上路, 空拍機 250g 以上需註冊, 2kg 以上須考證照, 無照駕駛罰鍰 6 萬元以上, 侵入禁航區 30 萬元以上, 參考 :

台灣空拍機違法嗎?考證照注意事項整理、入門推薦懶人包
https://goods.ruten.com.tw/item/show?21911196055370

邏輯設計筆記索引

這些筆記來自今年 05-14 ~ 06-11 參與邏輯設計協同教學編寫的五份簡報資料. 為了這個外務我把邏輯設計的書重讀了一遍, 因為承諾學生要放到網路以便他們用 Google 翻譯閱讀, 況且二哥上大學也用得到, 所以就花了蠻多時間整理了序向電路部分共 4 篇.

邏輯設計筆記序向篇 : Latch (電栓) 與 Flip-Flop (正反器)
邏輯設計筆記序向篇 : Register (暫存器)
邏輯設計筆記序向篇 : Counter (計數器)
邏輯設計筆記序向篇 : Finite State Machine (有限狀態機)

由於數位電路設計在物聯網應用中也會用到, 所以打算有空把組合篇也補齊, 這樣比較完整. 邏輯設計是進階到 Verilog/VHDL 設計的基礎知識, 也是我在學校讀的書裡面唯一真正有用到工作上的.

組合篇的大綱如下 :
  1. 數碼系統
  2. 邏輯閘
  3. 布林代數
  4. 卡諾圖化簡
  5. 組合電路設計 (1) 加減法器
  6. 組合電路設計 (2) 同位元偵測器
  7. 組合電路設計 (3) 編碼器與解碼器
  8. 組合電路設計 (4)多工器與解多工器
  9. 組合電路設計 (5) 可程式化邏輯元件 PLD/PLA/PAL
序向篇補充 :
  1. 狀態化簡
  2. ASM (演算法狀態機) 設計
  3. GAL 電路設計

2019年6月18日 星期二

物聯網開發板 ESP32-CAM

最近看到臉友 Lanma Chiu 發布的這篇 :

https://www.facebook.com/lanma0307/posts/10156756405913402

讓我想起了 ESP32-CAM 這塊照相開發板, 大約半年前在淘寶看到時感到很新奇, 曾想託大帥幫我從廈門帶回來, 但琢磨著可能沒時間玩就暫時打消念頭了. 看了 Lanma 介紹後到露天去找, 嘿, 居然已經有很多賣家了, 一塊大約在 300~400 左右.

此板 CPU 為 32 位元雙核 (160 MHz, 最高 240 MHz), 內建 512KB SRAM 與 4M PSRAM, 自帶 2.4 GHz WiFi 802.11 b/g/n/e/i + 藍芽 4.2, 以及霍爾與溫度感應器, 預設串列埠速率 115200 bps. 板上還有 MicroSD 卡槽 (最高 4GB) 與 FPC 視訊介面槽, 隨板附 OV2640 兩百萬畫素迷你相機, 支持 jpeg, bmp 與灰階圖像, 可做臉部識別應用, 此外板上還有一個補光用 LED 閃光燈, 關閉閃光燈時耗電 180mA, 開啟且亮度最大時耗電 350mA, 提供 9 個 I/O 埠, 建議 5V 2A 電源供應.

這樣一組 300 元的價格實在很迷人, 唯一美中不足之處是這款沒有內建 MicroUSB 介面, 需要另外準備一條 USB-TTL 上傳線才能讓 Arduino IDE 等開發工具連線以便上傳程式.

參考 :

ESP32-CAM Development Board(with camera) $420
☫TIY Store☫ arduino esp32-cam wifi 藍芽 辨識 ov2640 2百萬 $275
安信可原廠 ESP32-CAM 攝像頭 WIFI藍芽雙模開發板 QR識別 監控 OV2640 ESP8266 $295
【睿康創意】arduino esp32-cam wifi cam 影像辨識 ov2640 2百萬 ESP8266 $290
副廠ESP32-CAM wifi 藍芽BLE 辨識 ov2640 2百萬 ESP8266

上面副廠賣家的一篇文章對用法有較詳細說明 (可加購天線與廣角), 參考 :

Build a Video Stream Server by ESP32-CAM (arduino)影像伺服器及臉部辨識

注意, 此板預設使用板上之 PCB 天線, 也可以外接 IPEX 天線, 但必須更換天線座旁邊的電阻, 參考 :

ESP32-CAM攝像頭開發板 WiFi+藍牙模組/串口轉Wifi W2-1  $439

下面這篇底下有列出 ESP32 的各種技術文件連結 :

ESP32-CAM 開發板(帶攝像頭)

Youtube 上的 demo 教學



ESP32 Camera programmed using Arduino



下面這篇有完整的書面資料 :

ESP32-CAM Video Streaming Web Server (works with Home Assistant)
45元的WIFI攝像頭模塊,能玩出什麼花樣?
https://github.com/namato/micropython-ov2640
ESP32+OV7670 — WebSocket Video Camera
ESP32-CAMをテスト