從小我就對電子有濃厚興趣,無奈自己的聯考分數不給力,唸不了電子電機。

上專科後有了第一台電腦(CPU 是 8088 4.77MHz + 640K RAM),意外地寫程式的時間比打電動多(但很多時候在寫 BASIC 程式破解遊戲 XD),有一天,我發現搖桿的 X/Y 軸其實是兩個可變電阻,推向不同角度會改變電阻值傳回不同的數字,背後是不折不扣的類比數位轉換。這個發現令我喜出望外,異想天開搞出兩個失敗的土砲作品:

  1. 自製麥克風
    拆下對講機話筒的碳粉盒(會因音波震動改變電阻)接到搖桿 X 軸,寫程式以固定頻率取樣記錄數值,幻想可以錄下聲音。當年不懂得用電晶體放大訊號(那個年代知識來源有限,沒有 Google 可用),跟傻子一樣對著搖桿吶喊(咦?)一下午,嗓子都啞了也沒錄出個鳥來,只有勉強還原吹口哨的音頻。
  2. 自製掃瞄器
    把光敏電阻黏在點陣列表機的印表頭,寫程式控制印機頭定速左右移動加捲動,光敏電阻接搖桿 X 軸讀值,妄想掃出紙張不同位置的顏色深淺。想當然爾又失敗了,光敏電阻的精確度遠低於預期,我做了一台物理式亂數產生器。

多年前得知有 Arduino 開發板這種東西讓我很興奮,它不折不扣是實現當年異想天開電子夢的土砲聖品,價錢也不貴,幾百塊就能玩到不亦樂乎,陸續買過幾塊,胡亂玩過一些有趣題材。

thumbnail

不過,Arduino 有個問題,它不具網路功能,資料只能靠 USB 線走 COM Port 交換(是可以外接 WiFi、藍牙模組啦,但很麻煩),像是我做冰箱側面溫度的 24 小時監測,派出能插 USB 無線網卡的 Raspberry Pi (樹莓派) 才搞定:(延伸閱讀:也來IoT好了,Raspberry Pi 冰箱散熱溫度監測系統)

thumbnail

樹莓派就是台小電腦,跑 Linux 有網路,還可以寫 C# 寫 Python,感覺挺好,但有些缺點:

  1. 價格偏高
    Arduino 兩三百元就買得到,樹莓派則是一兩千元起跳,若要設計成小裝置長期使用花不下手,而硬體成本過高也會讓創意應用的實用性下降。
  2. 硬體介面不夠豐富
    光敏電阻等量測元件不可或缺的類比輸入(Analog Input),Arduino UNO 隨便都有六組,但 Raspberry Pi 沒有就是沒有,需額外接類比數位轉換版(DAC),或是串接 Arduino,對我來說完全不合格呀!
  3. 技術資源少
    由於價格高,樹莓派的普及率遠不如 Arduino,串接硬體元件尋找程式庫、範例時較吃力,不像 Arudino 幾乎是信手捻來。

講完 Arudino 與樹莓派,今天的主角要登場了 - 內建 WiFi 功能又與 Arudino 相容的 ESP 開發板!

ESP8266 是上海樂鑫公司推出的 WiFi 模組,但因為功能夠強大,足以扛下傳統由 Arduino 負處理的數位、類比輸入輸出工作,加上價格低廉(國外網站甚至有 2 USD 一片的行情),很快成為許多玩家搞物聯網(Internet of Things, IoT)應用的首選。

其實我在之前就買過用過,家用打卡鐘便是用 ESP8266 做出來的:

thumbnail

但當時急著做出成品,瞎抄了一堆程式能動就交差,對於 ESP 與 Arduino 的關係一無所知。前陣子被稚暉君的影片燒到,喚醒沈睡多時的創客魂,讓我花了點時間重新認識 ESP8266 晶片,頓時發現新大陸,原來 ESP8266 早有現成的網站伺服器程式庫,不只能當客戶端。於是我迫不及待地寫了小網站,端出多年來所學的 Vue.js/jQuery/Bootstrape,做了一個響蜂嗚器跟亮 LED 燈的華麗網頁操作介面。(註:跑步、3D 列印與電子類胡搞瞎搞我會發佈在黑暗後花園臉書粉專,對這部分感興趣的朋友請按讚追蹤)

同時我做了一些功課,對 ESP 做了較深入的了解。

ESP8266 本身是 WiFi 晶片,市面上有許多尺寸、功能不同的模組版本(例如 ESP-01),有些體積超小但需要外接 USB 轉 TTL 模組寫入程式,若想像 Arduino 一樣直接開發使用,挑內建 USB 插孔並附帶輸出輸入針腳或插孔的開發板較省時省力,插上 USB 連電腦就能供電,還有序列埠可上傳程式及輸出訊息,跟 Arduino 一樣方便。諸多 ESP8266 板中,而最多人用的就是家用打卡機那塊 ESP-12E NodeMCU,因為很普遍,價格平實,在網拍網站百元有找,在淘寶甚至比一罐可樂便宜。

在 ESP8266 之後,樂鑫公司再推出新一代晶片 - ESP32,標榜雙核心、CPU 頻率翻倍、SRAM、Flash、GPIO/I2C/SPI/UART 都加倍,還內建藍牙、觸控電容、溫度感測器、霍爾(磁力)感測器,規格上完全輾壓 ESP8266,價格也不貴,大約 180-300 就買得到。關於 ESP8266 與 ESP32 比較及市面常見 ESP32 開發板選擇,推薦這篇 - ESP32評比與教學推薦NodeMCU-32s的理由

認識 ESP32 後,不囉嗦馬上入手。下圖我拉了 ESP8266 一同入鏡,右邊尺寸較小的就是 ESP32-S NodeMCU,

thumbnail

至於開發工具方面,過去我都用 Arduino IDE 在開發,這回蒐集資料及試玩 ESP32 過程發現更好的選擇 - VSCode + PlatformIO!

Arduino IDE 介面簡單很容易上手,但 PlatformIO + VSCode 提供更貼近「開發環境」的體驗:同一專案的程式碼、函式庫集中一個資料夾,目錄結構分明;用關鍵字搜尋程式庫自動下載安裝(就像 NuGet 或 npm),要明確為專案加入參照,依賴關係明確。開發過程跟日常寫 C#/JavaScript 專案接近,再加上 VSCode 強大的 Intellisense、自動完成、跳至函式定義(Goto Definition)... 等功能,如果你本身是開發者,用過一次就回不去了。若你只想隨意寫寫小程式,Arduino IDE 較簡單友善,仍是不錯的選擇。但如果要幹票大的,程式碼複雜到需要拆函式庫搞物件導向,VSCode + PlatformIO 能提供較好的體驗。

最後聊聊開發語言。開發 ESP32 程式,有幾種語言選擇:

  1. C/C++
    最正統資源最豐富,有數不盡的程式庫與範例。用 C/C++ 開發還可細分為使用 Arduino Framework 或樂鑫自己研發的 ESP-IDF(Espressif IoT Development Framework))。 Arduino 簡單易入門,資源豐富,但如果你要玩真的,不該被 setup()、loop() 框住,Task 導向才是王道,IDF 跑 freeRTOS 更符合嵌入系統的標準。IDF 相對複雜許多,能做到一些 Arduino 做不到的事,例如:偵測 WiFi 訊號。 但 Arduino 仍可整合互通,例如在 IDF 引用 Arduino Library、在 Arduino 呼叫 IDF API。
  2. Lua
    Lua 是一種腳本語言,把 ESP32 韌體換成內含 Lua 直譯器的版本,便可在 ESP32 上跑 Lua 程式,跟以前可以用 JavaScript 寫程式的 Espruino概念相近。 我對直譯式語言的效能存疑,也不想再多學一種語言,跳過。
    補充:編譯 NodeMCU Lua 韌體與燒錄示範影片
  3. C#
    是的! 就是 C#!!

    微軟的物聯網解決方案包含 nanoFramework,把 .NET CLR 精簡到 32K RAM、256K Flash 就能跑,故能支援一堆低階開發板,包含 ESP32!
    想到能在兩張郵票大小的電路板上跑 C# 程式讓我好激動,但建置 nanoCLR 及燒錄的步驟頗複雜,另外一點是雖然 nanoFramework 可整合原生 C/C++ 程式庫,要整合其他硬體少不了將 Arduino 程式庫翻成 nanoFramework 相容的程序,我目前的 C/C++ 知識與經驗肯定無力駕御,故這段會留到以後再嘗試。
  4. MicroPython
    MicroPython是精簡版 Python3,只需 256K 儲存空間跟 16 KB RAM 的硬體上執行,小狐狸事務所有系列文章可參考。因我 Python 經驗有限,一樣也跳過。

經過這般考察評估,我打算好好用 ESP8266 跟 ESP32 玩些有趣的應用,未來再陸續分享。

Introducing the cheap but powerful device for IoT solution - ESP8266 and ESP32.


Comments

# by 安桌桌

唸書時c指令都背沒幾個,自己做esp8266連德文的project都完成做了,年紀大的求知欲和做法改變了

# by Nelson

感謝分享,我最近也在玩esp8266做點小應用,目前手上正在做一個給長輩用的忘記關門語言提醒跟自動關閉冷氣的小裝置,這個便宜的小東西真的很有趣!

Post a comment