返回文章列表

ESP8266 ESP32 MicroPython 物聯網開發入門

本文介紹如何使用 MicroPython 開發 ESP8266 和 ESP32 物聯網應用。涵蓋了硬體特性、開發環境設定、WebREPL 使用、韌體燒錄以及基礎程式碼範例。此外,也探討了嵌入式開發思維,引導讀者思考如何利用 MicroPython 解決實際問題,並提供一個框架來產生、評估和改進嵌入式專案。

物聯網 嵌入式系統

MicroPython 的出現,讓 Python 開發者能更輕鬆踏入嵌入式系統領域,也讓嵌入式開發者享有 Python 的開發效率。本文除了介紹 ESP8266 與 ESP32 的硬體特性、開發環境設定、WebREPL 的使用與韌體燒錄流程外,更著重於 MicroPython 的基礎應用,提供讀者能快速上手的程式碼範例。同時,本文也探討嵌入式開發思維,引導讀者思考如何利用 MicroPython 解決實際問題,並提供框架來產生、評估和改進嵌入式專案,避免落入為技術而技術的陷阱。從而讓讀者不僅學會如何使用 MicroPython 控制硬體,更能理解如何將其應用於解決生活中的實際需求。

ESP8266/ESP32:物聯網的核心微控制器

物聯網(Internet of Things, IoT)是當前科技發展的重要趨勢,它將嵌入式裝置與網路連線,使日常生活中的物件能夠被控制或感知。這些裝置使我們周圍的世界變得更加智慧化和自動化。根據布魯斯·施奈爾(Bruce Schneier)的觀點,這些感測器就像網際網路的眼睛和耳朵,控制器像是手和腳,而運算能力則類別似大腦,共同構成了「世界級的機器人」。

ESP8266與ESP32的特性

在這個世界中,像ESP8266和ESP32這樣的微控制器扮演著核心角色。ESP8266由上海的樂鑫資訊科技(Espressif Systems)開發,具有內建WiFi和完整的TCP/IP網路堆積疊,價格極為低廉(某些裝置甚至不到一美元)。自2014年被駭客社群發現以來,ESP8266因其出色的功能、體積小巧和低成本而廣受歡迎,許多開發者致力於讓MicroPython在該裝置上執行,使根據網路的物聯網專案變得簡單易行。

ESP32則是ESP8266的升級版,不僅具備WiFi連線功能,還支援雙模藍牙(包括傳統藍牙和低功耗藍牙)。此外,ESP32採用雙核心微處理器架構,並包含針對常見演算法的硬體加密加速器和密碼學安全的亂數產生器。雖然目前MicroPython對ESP32的支援仍在持續開發中,但隨著ESP32的日益普及,其穩定性和功能性預計將迅速提升。

MicroPython在ESP8266/ESP32上的應用

MicroPython讓ESP8266和ESP32在程式設計層面具有相似的使用體驗。無論是使用ESP8266還是ESP32,開發者都可以利用MicroPython輕鬆建立網路連線的物聯網專案。對於初學者和經驗豐富的開發者來說,這些微控制器的低成本和強大功能使其成為實作創意專案的理想選擇。

開始使用ESP8266/ESP32

要開始使用ESP8266或ESP32,首先需要了解如何將MicroPython燒錄到裝置上。對於ESP8266,可以使用特定的工具來完成這一步驟。對於ESP32,則需要使用不同的編譯工具鏈來構建MicroPython韌體。一旦韌體準備就緒,就可以將其燒錄到裝置上,並開始使用MicroPython進行程式設計。

使用MicroPython控制ESP8266/ESP32

下面的範例展示瞭如何使用MicroPython控制ESP8266或ESP32上的數位輸出:

import machine
import time

# 設定D13引腳為輸出
led = machine.Pin(13, machine.Pin.OUT)

while True:
    # 切換LED狀態
    led.value(not led.value())
    # 延遲0.5秒
    time.sleep(0.5)

內容解密:

  1. import machine:匯入machine模組,用於與硬體互動。
  2. import time:匯入time模組,用於控制時間相關的操作,如延遲。
  3. led = machine.Pin(13, machine.Pin.OUT):將D13引腳設定為輸出模式,並將其指定給led變數。
  4. while True:進入無限迴圈,不斷切換LED的狀態。
  5. led.value(not led.value()):切換LED的狀態。如果當前LED是亮的,則將其關閉;如果當前是關閉的,則將其開啟。
  6. time.sleep(0.5):延遲0.5秒,使得LED每秒閃爍兩次。

ESP8266與ESP32微控制器的介紹與開發設定

ESP8266和ESP32是兩款由不同製造商生產的微控制器晶片,它們在硬體和功能上有所不同,但都支援WiFi連線。雖然它們是裸晶片,但市面上有很多開發板和模組包含了這些晶片,使得它們更容易被開發者和愛好者使用。

ESP8266與ESP32的硬體特性

ESP8266執行在80 MHz,擁有64 Kb的指令RAM和96 Kb的資料RAM。它支援IEEE 802.11 b/g/n無線規範和WEP或WPA/WPA2身份驗證,具有16個GPIO針腳可供與周邊裝置互動。

ESP32則是一款更為強大的雙核心微處理器,執行頻率可達160或240 MHz,並擁有520 Kb的RAM。它支援WiFi和藍牙連線,具有36個GPIO針腳,並具備多種安全功能,如安全啟動、快閃記憶體加密和密碼學硬體加速。

開發板的選擇

市面上的ESP8266和ESP32開發板種類別繁多,包括模組板和開發板。模組板通常不具有標準的周邊連線,而開發板則通常具備DIL(雙列直插)接頭、LED燈和按鈕等,更加適合初學者和實驗使用。ESP8266開發板的價格非常便宜,從大約1美元到5美元不等,而ESP32開發板由於較新且供應有限,價格約為30美元,但隨著其普及,價格和供應情況預計將會改善。

為ESP8266設定開發環境

與其他MicroPython開發板不同,ESP8266通常不預裝MicroPython韌體,因此需要手動刷入。步驟如下:

  1. 從MicroPython的官方發布頁下載最新版本的韌體。
  2. 使用esptool.py工具將韌體刷入ESP8266。首先需要安裝esptool.py,可透過Python的pip命令安裝:
    $ pip install esptool
    
  3. 將ESP8266置於引導載入器模式,然後使用esptool.py擦除快閃記憶體:
    $ esptool.py --port PORT erase_flash
    
  4. 刷入MicroPython韌體:
    $ esptool.py --port PORT --baud 460800 write_flash --flash_size=detect 0 PATH/TO/firmware.bin
    
    如果遇到錯誤,可能需要降低波特率或新增額外的引數。

使用WebREPL存取檔案系統

ESP8266上的MicroPython提供了一個名為WebREPL的功能,允許透過瀏覽器存取REPL介面和檔案系統。首先需要在瀏覽器中開啟WebREPL網頁應用程式,並設定開發板接受WebSocket連線。

程式碼示例:控制LED燈

>>> from machine import Pin
>>> import time
>>> led = Pin(2, Pin.OUT)
>>> while True:
...     led.value(not led.value())
...     time.sleep(0.5)
...

內容解密:

  1. from machine import Pin:從machine模組匯入Pin類別,用於控制GPIO針腳。
  2. import time:匯入time模組,用於實作延時功能。
  3. led = Pin(2, Pin.OUT):將GPIO 2設定為輸出模式,並指定給led變數,用於控制LED燈。
  4. while True::進入無限迴圈,不斷切換LED燈的狀態。
  5. led.value(not led.value()):切換LED燈的狀態,如果當前是亮的,則熄滅,反之亦然。
  6. time.sleep(0.5):延時0.5秒,使得LED燈每0.5秒切換一次狀態。

設定與使用WebREPL於ESP8266/ESP32

WebREPL簡介與設定

MicroPython的WebREPL是一個方便的網頁應用程式,允許使用者透過瀏覽器直接與開發板進行互動,無需額外的線纜連線。這個應用程式被託管在MicroPython的官方網站上,但使用者也可以從GitHub下載原始碼自行架設。

首先,開啟現代瀏覽器(建議使用Firefox或Chrome)並存取WebREPL應用程式。你將看到類別似於圖5-2的介面。

組態WebREPL密碼

  1. 連線裝置:將ESP8266/ESP32開發板連線到電腦。
  2. 啟用WebREPL:透過串列連線進入MicroPython的REPL介面,匯入webrepl_setup模組並依照指示進行操作。
    >>> 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: 你的密碼
    Confirm password: 你的密碼
    

    內容解密:

    • import webrepl_setup:匯入用於設定WebREPL的模組。
    • 設定密碼:為WebREPL設定密碼以確保安全性。
  3. 重啟裝置:完成設定後,系統會提示你是否重啟裝置。輸入y以重啟。

連線至WebREPL

  1. 掃描WiFi網路:重啟後,掃描附近的WiFi網路。你將看到一個名為MicroPython-xxxxxx的網路,預設密碼是micropythoN(注意大寫N)。
  2. 連線至裝置的WiFi網路:連線到這個網路。
  3. 存取WebREPL:回到WebREPL網頁應用,將裝置的WebREPL URL(形如ws://192.168.4.1:8266)輸入到左上角的欄位中,並點選“Connect”。
  4. 輸入密碼:在出現的密碼提示中輸入之前設定的密碼,即可進入Python REPL介面。

使用WebREPL

  • 檔案操作:透過網頁右側的表單,你可以上傳、下載或刪除裝置上的檔案。
  • 遠端連線:除了直接連線裝置外,也可以設定裝置連線到現有的WiFi網路,從而透過區域網路存取WebREPL。

ESP32開發板的額外步驟

由於ESP32支援仍在發展中,刷寫韌體的過程較為複雜。雖然本文主要以ESP8266為例,但ESP32的API設計與ESP8266相似,因此大部分範例程式碼應該可以直接在ESP32上執行。

編譯ESP32韌體

  1. 下載原始碼:從GitHub下載MicroPython的ESP32版本原始碼。
  2. 安裝交叉編譯器:安裝針對Xtensa CPU的交叉編譯器,並下載Espressif IDF。
  3. 設定環境變數:根據MicroPython檔案的指示,設定ESPIDF環境變數指向Espressif IDF的根目錄。
  4. 編譯韌體:按照README.md中的指示進行編譯。

內容解密:

  • 下載並設定正確版本的Espressif IDF對於成功編譯至關重要。
  • 設定正確的ESPIDF_SUPHASH以確保相容性。

嵌入式開發思維

本章將協助你思考如何利用嵌入式裝置解決現實世界的問題。

為何重要?

儘管根據微控制器的裝置已經存在很長時間,但直到最近,由於物聯網(IoT)的炒作,它們才獲得廣泛關注。許多人對這個領域的機會感興趣,尤其是考慮到媒體中的一些誇張的語言。

明顯地,我們正「站在下一次變革性發展的懸崖邊緣,一個創新變得更加人性化的世界」,在那裡,「技術將嵌入我們已經使用的數百種日常物品中——我們的汽車、錢包、手錶、雨傘,甚至我們的垃圾桶。」

對於這種令人厭倦的炒作,解毒劑是反思、務實和批判性思維。這種思維方式對於識別和評估用真正有用的嵌入式解決方案解決重要問題的機會至關重要。

在道格拉斯·亞當斯(Douglas Adams)的《銀河系漫遊》(The Hitchhiker’s Guide to the Galaxy)系列書籍中,他美妙地嘲諷了缺乏這種思維方式的情況。他描述了天狼星網路公司(Sirius Cybernetics Corporation),他們製造了各種包含「先進技術」的日常物品:

很容易被他們的產品「終於能運作」的成就感矇蔽了雙眼,以至於忽略了它們的基本無用性。換句話說——這是該公司整個銀河系成功建立的堅實原則——他們的根本設計缺陷完全被表面的設計缺陷所掩蓋。 ——道格拉斯·亞當斯,《再見,謝謝你們的魚》

這種對無能技術的誤用是亞當斯作品中反覆出現的主題。例如,具有內建個性的門不僅能開關,還能感謝人們使用它們,並「滿意地嘆息一聲,表示工作做得很好」。它們被書中的其他角色普遍厭惡。

缺乏批判性思維和盲目熱衷於技術解決方案(為了技術解決方案本身)證明瞭對他人的需求完全缺乏同情。更糟糕的是,它用煩人、難以理解且往往無用的小玩意兒汙染了我們的世界。

我認為,一種更好的專案開發方法是站在他人的立場上,或者至少傾聽人們的話,幫助他們將技術適應他們自己的需求。畢竟,你確定你確切知道別人想要或需要什麼嗎?只有透過傾聽、反思、評估和實驗,才能揭示出這種寶貴的知識。只有這樣,你才會知道要解決哪些重要問題。

這意味著什麼?

  1. 慶祝差異和多樣性,因為它能鍛鍊我們對他人生活、問題和興趣的同理心和理解力。
  2. 承認、評估並從錯誤中學習,因為不這樣做,你就無法適應變化或新資訊的啟示。
  3. 保持開放的心態,因為誰願意成為一個因錯誤資訊而產生盲點、看不到解決方案的偏執固執的人呢?
  4. 向外探索,因為進步只有透過無畏的探索才能實作。

這與MicroPython有何關係?

MicroPython使迭代、調整和更改變得容易,因為Python促進了動態、簡單和清晰的程式碼。它讓你能夠靈活地更快地實驗、評估和改進你的嵌入式專案。此外,更廣泛的Python社群是一個多元化的群體,他們重視上述屬性,這些屬性對於避免變成像天狼星網路公司那樣的設計師至關重要。

如果你的專案是為你自己的特定需求量身定做的,那麼這些屬性仍然適用。雖然你可能知道自己想要什麼,但拓展視野,探索他人如何解決類別似問題,是一項既有用又有趣的活動。

MicroPython的興起和流行在很大程度上是因為它是一項令人驚嘆的嵌入式工程成就,而Python作為一種語言,具有優秀的功能。但MicroPython的興起和流行也是因為它的技術屬性促進了一種敏捷和以使用者為中心的嵌入式開發方式。

# 以下是一個簡單的例子,用於展示MicroPython如何使實驗變得容易
import machine
import time

# 初始化LED
led = machine.Pin(2, machine.Pin.OUT)

try:
    while True:
        # 開啟LED
        led.value(1)
        time.sleep(1)
        # 關閉LED
        led.value(0)
        time.sleep(1)
except:
    # 在異常發生時關閉LED
    led.value(0)

內容解密:

這段程式碼首先匯入必要的machinetime模組。然後,它初始化一個連線到ESP32板上GPIO2的LED。主迴圈內,LED每隔一秒開啟和關閉一次。這展示了MicroPython如何使實驗和測試嵌入式硬體變得簡單直接。如果發生異常,LED將被關閉,以確保安全。

嵌入式思維:探索MicroPython的無限可能

MicroPython為三類別人群帶來了新的機遇:Python程式設計師得以將經驗和技能應用於嵌入式裝置,嵌入式開發者能夠享受快速開發的便利,而初學者則獲得了一個學習程式設計的絕佳平台。然而,許多人面臨著不知道如何利用MicroPython及其支援的裝置來創造有價值的專案的困擾。

問題的本質

要有效利用MicroPython,首先需要回答三個基本問題:

  • 我能解決什麼問題?
  • 如何使用MicroPython來解決這些問題?
  • 嵌入式裝置是否為最佳解決方案?

本章節將幫助讀者回答第一個問題,透過技術能力的探索,激發創意,思考使用者如何與嵌入式裝置互動,並瞭解如何利用這些裝置改善生活。

建立有價值的嵌入式專案

本章節的其餘部分將探討一個框架,以幫助讀者產生、評估和改進有價值的嵌入式專案。這個框架根據MIT的David Rose在其著作《Enchanted Objects》中描述的工作。Rose的工作有助於揭示潛在的盲點,挑戰習慣性思維,並促進分析和反思。

人類驅動力

Rose提出了三個概念列表,分別是:

  • 人類驅動力
  • 魔法能力
  • 實作魔法的步驟

這些列表將有助於讀者想像和評估嵌入式裝置的使用方式。

人類驅動力包括六個基本且普遍的驅動力:無所不知、心靈感應、保護、永生、傳送和表達。這些驅動力為理解使用者與產品或裝置之間的共鳴提供了線索。

無所不知與心靈感應

無所不知

無所不知意味著知道一切。人們渴望瞭解各種事物,從物理學到名人的私生活。同時,人們樂於成為擁有特殊知識的人,因為這賦予了他們地位。如弗朗西斯·培根所說,「知識就是力量」。

已經有一些物件能夠積累或傳遞知識,例如氣壓計可以預測天氣,而環境光球可以透過色彩繽紛的燈光顯示股票市場的狀況。Philip Pullman的小說《黑暗物質》三部曲中的「真理儀」是一個虛構的物件,能夠揭示真相。

問問自己或潛在的使用者,什麼樣的資訊是他們總是需要在第一時間瞭解的?這種資訊如何在一個物件中體現?

心靈感應

心靈感應意味著將我們的思想、感受和狀態傳達給他人。這是人類的一個基本驅動力,透過各種方式實作,例如語言、文字和肢體語言。在現代,科技進一步擴充套件了心靈感應的能力,例如電話、電子郵件和社交媒體。

思考如何利用MicroPython和嵌入式裝置來增強或實作心靈感應。例如,使用者可以透過一個簡單的裝置與親人保持聯絡,或者透過一個智慧家居系統控制家中的燈光和溫度。

結語

MicroPython為開發者提供了無限的可能性,透過瞭解人類的基本驅動力,我們可以創造出更符合使用者需求的產品和服務。在接下來的章節中,我們將探討如何使用MicroPython來實作這些想法,並提供實用的範例和程式碼來說明相關的概念。

# 以下是一個簡單的範例,展示如何使用MicroPython控制LED燈
import machine
import time

# 初始化LED燈
led = machine.Pin(2, machine.Pin.OUT)

while True:
    # 開啟LED燈
    led.value(1)
    time.sleep(1)
    # 關閉LED燈
    led.value(0)
    time.sleep(1)

內容解密:

  1. import machineimport time:匯入必要的模組,分別用於控制硬體和處理時間相關的功能。
  2. led = machine.Pin(2, machine.Pin.OUT):初始化一個連線到GPIO2的LED燈,將其設定為輸出模式。
  3. while True:進入無限迴圈,不斷執行迴圈內的程式碼。
  4. led.value(1)led.value(0):分別開啟和關閉LED燈。
  5. time.sleep(1):使程式暫停1秒,實作LED燈閃爍的效果。

這個範例展示瞭如何使用MicroPython控制硬體,實作簡單的互動效果。透過類別似的方式,可以開發出更複雜和有趣的專案。