Arduino UNO WiFi = Arduino UNO板 + ESP8266

2016年元旦當天,收到Arduino S.R.L公司(arduino.org)創辦人Federico Musto先生寄來的聖誕禮物:Arduino UNO WiFi控制板

Arduino UNO WiFi控制板

跟新的Arduino系列控制板一樣,UNO WiFi板的排插外側有印上接腳的編號(所以我們不用自己搞貼紙DIY了):

Arduino UNO WiFi控制板

這張控制板的尺寸和UNO一樣,板子上整合了Arduino UNO和ESP8266(具備Wi-Fi網路連線的系統級晶片)。它採用ATmega328微控器執行Arduino程式,並且同樣採用ATmega16U2作為USB序列埠通訊晶片。廣告一下,ESP8266的說明和程式設計請參閱《超圖解物聯網IoT實作入門》第12和13章。

Arduino UNO WiFi控制板

ESP8266晶片透過序列通訊介面連接其他微控器(如:Arduino板),但由於Arduino控制板的序列埠肩負接收程式碼的重責大任,因此,UNO WiFi板採用NXP(恩智浦半導體)的SC16IS750IBS序列轉I2C/SPI介面的晶片,把EP8266的序列介面轉換成I2C,再連接到Arduino的ATmega328微控器。

SC16IS750IBS序列轉I2C/SPI介面的作用

平時,Arduino UNO的網路資料經由I2C介面(亦即:A4和A5腳)傳送到SC16IS750IBS,再從這個晶片的序列埠,轉送給ESP8266晶片,反之亦然。

上傳程式給Arduino時,除了透過控制板的USB介面,也可以用Wi-Fi無線方式上傳。透過無線上傳程式時,程式檔將從ESP8266的序列埠直接傳入Arduino的序列埠。ESP8266的序列埠和I2C介面通訊會依照使用情況自動切換,我們的程式碼無須介入。

設置Wi-Fi網路和ESP8266的運作模式

Arduino Uno WiFi板子上的16M bit(2MB)快閃記憶體,用於儲存ESP8266的韌體,此網路晶片的預設工作模式為AP+STA,也就是同時充當網路基地台(Access Point)和無線終端設備(Station)。

若要啟用OTA(Over The Air,無線上傳程式碼)功能,ESP8266必須先設置成STA(無線終端)模式。Arduino UNO WiFi的無線網路參數,都是用瀏覽器設置。設置參數之前,要先透過Wi-Fi連接此控制板。

接上電源之後不久,即可探尋到此控制板的Wi-Fi訊號:

連接Arduino UNO WiFi的無線網路

連上Arduino Uno WiFi基地台,再透過瀏覽器連接到http://192.168.240.1/網址,即可進入此控制板的無線網路設置畫面。

Arduino UNO WiFi的無線網路設置畫面

這個網頁程式存在EP8266韌體中,可顯示無線網路的運作狀況和資訊,例如,IP位址、MAC位址、工作模式…等等,也有提供一個相當於無線版「序列埠監測視窗」的WiFi Console(WiFi控制台)

在WIFI設定畫面,設定讓無線網路連接到家裡的無線路由器之後,再按下右上角的SWITCH TO STA MODE(切換到連線終端模式),詳細的操作說明可參閱arduino.org網站的Getting started with Arduino UNO WiFi

設定成STA模式,UNO WiFi板便失去無線基地台(AP)的能力,但仍具備網路連線功能。連接UNO WiFi板的電腦,必須和它連線到相同的無線網路環境。UNO WiFi板預設的主機名稱是“arduino”,透過“arduino.local”網址,即可開啟它的網路設定頁面:

http://arduino.local/

使用Arduino IDE 1.7.10版撰寫程式

Arduino UNO WiFi控制板是Arduino S.R.L公司的產品,請使用該公司的新版Arduino IDE(目前是1.7.10版)來編寫程式。Arduino S.R.L公司的Jeff告知,在今年五月舊金山Maker Faire會展中,該公司宣佈計劃未來會透過add-on platform packages(外掛平台套件)來支援arduino.cc的Arduino IDE,減少開發者使用Arduino IDE的困擾。

先在IDE主功能表的「工具→板子」選擇Arduino Uno WiFi板,再從「工具→序列埠」選擇有線序列埠(如下圖中的COM5),或者網路埠(如下圖中的arduino at 192.168.7.185)。

使用Arduino IDE 1.7.10版撰寫程式

這項「網路埠」連線功能,可讓開發人員在遠端更新Arduino控制板的軟體。

Arduino UNO WiFi網路程式入門

以往,Arduino都是透過乙太網路或者Wi-Fi無線網路擴展板(像Arduino官網的這一款WiFi Shield)連接網際網路,這兩種方案都使用SPI介面與Arduino控制板相連。

Arduino UNO WiFi板的ESP8266晶片則是經由I2C連接Arduino微控器,加上每個網路晶片的控制方式都不一樣,所以UNO WiFi板的網路程式也不同於乙太網路程式;若不使用Wi-Fi網路功能,這塊板子的程式設計方式和普通的UNO相同。

乙太網路以及UNO WiFi的連接方式

在連接乙太網路模組的情況下,Arduino UNO板的數位10~13腳無法挪作他用;Arduino UNO WiFi則是犧牲了A4和A5兩個類比腳。

Arduino S.R.L公司(arduino.org)創辦人Federico Musto先生

底下的程式將使用Arduino IDE內建的WebSever(網站伺服器)範例,說明UNO WiFi板的程式架構。上傳此程式碼之後,使用者將能透過底下的網址讀取UNO WiFi板的自製網站:

讀取UNO WiFi板的自製網站的URL網址

我們自訂的網路程式路徑,始終被附加在arduino.local/arduino/後面。底下是WiFi網站伺服器程式的架構,由於無線網路的IP、閘道器(gateway)位址…等參數,都是透過瀏覽器設置,所以我們的程式碼裡面不需要設定:

WiFi網站伺服器程式的架構

其中負責處理前端資料的WiFiData類型,定義在ArduinoWiFi程式庫資料夾裡的SC16IS750.h檔案中。每當有用戶連接此控制板時,process()自訂函式將讀取URL網址最後面的參數,其值若是“webserver”,則呼叫WebServer()自訂函式輸出網頁,若非“webserver”,ESP8266會自行在網頁上輸出“Not found.”(查無此資源)。

修改自Arduino IDE內建的WebSever(網站伺服器)範例的完整程式碼如下:

乙太網路和WiFi擴展板程式,都是透過底下的語法中斷用戶端的連線:

client.stop();

UNO WiFi控制板則是透過這個敘述中斷連線,其中的DELIMITER常數也是定義在SC16IS750.h檔案裡面:

client.print(DELIMITER);

延伸閱讀

21 thoughts on “Arduino UNO WiFi = Arduino UNO板 + ESP8266

    1. 嗯…不過,UNO WiFi和Yun,都是arduino.org位於台北的Dog Hunter設計團隊的成果,台灣設計、義大利製造。

      thanks,
      jeffrey

  1. 你好,我是初3的學生,想要請教一下如何作出像ethernet的webclient程式連接其他伺服器呢?

    1. 咦~jeff~你該不會是今年6月3日晚上參加arduino.org舉辦的Maker+Pizza活動的那位學生吧??

      用Arduino Uno WiFi當作webclient… 好問題,我還沒試過,測試後告訴你,拍謝。

      thanks,
      jeffrey

    2. 從Uno WiFi的範例程式得知,讓Uno WiFi當作前端連接網站伺服器的程式,必須透過Ciao(橋接器)程式庫連接無線網路晶片,Ciao提供的write()方法用於對伺服發出連線資料。

      執行Ciao的write方法之前,程式還要指定連接器(connector)類型,我們可以把「連接器」看待成「線路轉接頭」,在連接HTTP網站伺服器的場合,連接器類型請設定成"rest"。

      筆者使用Node.js建立一個簡易的網站伺服器程式,它的rnd路徑將能接收一個r參數:

      假設網站伺服器的IP是 192.168.7.101,那麼,在瀏覽器中輸入 “192.168.7.101/rnd?r=12″,伺服器將會在終端機視窗顯示「 隨機數字: 12」。

      Arduino Uno WiFi的測試程式碼如下,它將每隔10秒連線到 192.168.7.101網站伺服器,並且送出一個隨機數字:

      thanks,
      jeffrey

  2. 您好~我最近照著 超圖解物聯網IoT實作入門 第十二章 實作透過Arduino執行ESP8266的AT command,確定線路都沒問題,不管下任何指令都沒有回覆,請問有什麼可能原因嗎?p.s.透過CP2102轉接板則能正常執行

    1. 蛤?CP2102可以,Arduino卻不行?可是,它們倆個只是晶片型號不同,功能一樣欸。
      請把送出AT命令的那一行敘述,也就是ESP.print()改成ESP.write()試試看。

      thanks,
      jeffrey

    2. 如果你確定線路, Arduino和ESP8266都沒有問題的話, 建議你可以把ESP8266″完全斷電"(我有自己做一塊3.3V供電的擴充板, ESP8266直接插在擴充板上).
      我的情況是, 線路、Arduino和ESP8266之前使用都是正常, 是忽然間在Serial Monitor裡下AT command完全沒有反應. 之前遇到這個情況, 我都是重刷ESP8266的韌體就好了. 但後來發現, 只要把ESP8266 “完全斷電"(不是只有拔除擴充板的電源而已, 是把ESP8266從擴充板上拔下), 過個幾秒再插上, 其它東西都沒動, 再下AT command就出來了…
      至於是什麼原因我不確定, 因為電子元件我不是很熟, 詳細情形可能要查查看有沒有相關的官方文件說明了.

  3. 你好,我按照你寫在評論區的教程做了一個那種的node.js伺服器,成功訪問并返回隨機數到終端,然而試圖使用你給出的Arduino Uno WiFi的測試程式碼透過Arduino IDE上傳到板子上卻失敗。錯誤提示是:

    Arduino:1.8.0 (Mac OS X), 开发板:"Arduino Uno WiFi"

    In file included from /Users/pgool/Documents/Arduino/draft_ciao/draft_ciao.ino:1:0:
    /Users/pgool/Documents/Arduino/libraries/Ciao/src/Ciao.h:42:2: error: #error CPU not yet supported
    #error CPU not yet supported
    ^
    exit status 1
    为开发板 Arduino Uno WiFi 编译时出错。

    似乎目前ciao並不支持Arduino Uno WiFi這個開發板型號呀。。請問你是如何成功上傳代碼的?

  4. 老師您好~
    個人有架設伺服器做數據收集
    我使用的方式是利用一個PHP網頁讀取
    GET值後再寫入伺服器 http://…/index.php/?humi=26&temp=63
    Arduino uno wifi 的部分利用String做組合網址並存入變數
    現在的問題出在於如何單純連到網址做資料傳送?
    還請您多多幫忙!

  5. 使用 Arduino org 1.7.11 所編譯問題
    程式:

    #include
    #include // 必須引用「橋接器」程式庫

    #define CONNECTOR “rest" // 連接器類型
    #define SERVER_ADDR “192.168.7.101″ // 網站伺服器IP位址

    int r = 100; // 暫存隨機數字的變數
    String command = “/rnd?r="; // 傳給網站伺服器的路徑參數

    void setup() {
    Ciao.begin(); // 啟用「橋接器」
    // 以"rest"連接器類型,連線到網站伺服器,送出隨機數字。
    Ciao.write(CONNECTOR, SERVER_ADDR, command+r);
    }
    void loop() {
    delay(10000); // 暫停10秒
    r = random(1000); // 取隨機數字
    Ciao.write(CONNECTOR, SERVER_ADDR, command+r);
    }

    錯誤訊息:
    In file included from sketch_jan11a.ino:2:0:
    C:\Users\dawei\Documents\Arduino\libraries\Ciao\src/Ciao.h:42:2: error: #error CPU not yet supported
    #error CPU not yet supported
    :
    sketch_jan11a.ino: In function ‘void setup()’:
    sketch_jan11a.ino:11:14: error: call to ‘void SerialCiaoClass::begin(long unsigned int)’ uses the default argument for parameter 1, which is not yet defined
    編譯時發生錯誤

    1. 剛剛測試了一下程式碼,發現我上面留言中的程式庫 Wire.h 和 Ciao.h 名稱字首沒有大寫,拍謝。
      這是編譯成功的畫面:

      Arduino Uno WiFi Ciao.h library

      thanks,
      jeffrey

    2. 我上次有注意到大小寫問題
      改正之後還是有錯誤訊息…
      (如下)
      In file included from sketch_jan12a.ino:1:0:
      C:\Users\Unrealin\Documents\Arduino\libraries\Ciao\src/Ciao.h:42:2: error: #error CPU not yet supported
      #error CPU not yet supported
      :
      :
      C:\Users\Unrealin\Documents\Arduino\libraries\Ciao\src/CiaoData.h:39:7: error: previous definition of ‘class CiaoData’
      class CiaoData {
      ^
      sketch_jan12a.ino: In function ‘void setup()’:
      sketch_jan12a.ino:13:14: error: call to ‘void SerialCiaoClass::begin(long unsigned int)’ uses the default argument for parameter 1, which is not yet defined
      編譯時發生錯誤
      ==========================================================================================
      目前我覺得還是Ciao.h程式庫的問題

    3. Ciao程式庫使用內建在IDE的版本即可(位於Arduino安裝路徑的libraries裡面),不需要重新安裝。

      thanks,
      jeffrey

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *