顯示具有 mBlock 使用技巧 標籤的文章。 顯示所有文章
顯示具有 mBlock 使用技巧 標籤的文章。 顯示所有文章

2017年10月15日 星期日

mBlock 使用技巧:IoT 應用(三)

簡介

近日得知 Makeblock 其中一間港澳認證教育夥伴(Certified Educational Partner)亦發佈了一個名為〝ME IoT WiFi Module〞的擴展,功能更簡潔,但亦有需要注意的地方。

IoT的相關擴展

在 mBlock 3.4.11 之後版本的擴展管理器中,搜尋功能終於有搜尋能力,若果我們在擴展管理器中搜尋〝IoT〞,可以找到以下相關的擴展:


5 個擴展都是 Makeblock 港澳認證教育夥伴的作品,雖然功能性大致相同,但亦讓我們來比較一下每個的優劣處:

ME IoT WiFi Module

這個就是剛才說的那個新擴展,非常簡潔,只有 3 個積木,已經包含了 IFTTT 及 ThingSpeak 的功能。


但需注意的地方是,連接 WiFi 的積木固定了連接埠 1 - 4:


仔細看一下 Arduino C 的程式會發現,連接埠 1 - 4 已經指定了 mBot 的連接埠 1 - 4。即是說,如果你使用其他的板子,就會因為 RX 和 TX 的不同(詳細的 PIN 號參考這裡),而它不會因應板子的轉變而令連接埠有所不同,導致無法使用這個積木:


所以,這個擴展絕對適合使用 mBot ,且打算用 IoT 連接 IFTTT 或 ThingSpeak 的用家。如果你使用其他板子,就必須使用其他擴展。

其他擴展

其他的擴展都由另一間 Makeblock 港澳認證教育夥伴的發佈,如果你打算使用 Blynk,真的非常抱歉,你只有這個選擇。但若果你打算使用 IFTTT 或 ThingSpeak,你也可以考慮這個。

相對上面的擴展,這個擴展分開了 IFTTT 和 ThingSpeak的擴展,而且每個擴展的積木也不少:


但是它也有它的好處,它可以自由選擇接腳位,即是它並不限制板子的種類,你可以使用其他板子來使用 IoT 的功能:


更新(2017-10-16):

IoT_IFTTT 及 IoT_ThingSpeak 現已更新至 v1.3.0 及 v1.1.0,可於 Makeblock 四大主控板 (mCore、Orion、Auriga、MegaPi)上選擇連接埠,比舊版本更容易使用;另外也可自行選擇數位腳位(Digital PIN)或類比腳位(Analog PIN)。


收腳位(RX)和接腳位(TX)你當然可以參考的文章,也可以靠自己找出來,方法很簡單,而且已經寫在板子上:


每一個連接埠有幾個小字,都是這個連接埠不同的 PIN,其中最右面的就是收腳位(RX),在它旁邊的就是接腳位(TX)。所以 mCore 的連接埠 1 的 RX 和 TX 分別是 12 和 11,而連接埠 2 的 RX 和 TX 就是 10 和 9 了。

總結

如果你只有 mBot 或是教導學生使用,我會建議使用前者,十分方便簡單;但其他情況下,我會強烈建議使用後者。

2017年7月29日 星期六

mBlock 使用技巧:IoT 應用(二)

前提

早前,發佈了關於 IoT 應用的文章。而近日,香港有一間公司發佈了關於 IoT 的 mBlock 擴展,分別是在 IFTTT 和 ThingSpeak 上使用。

下載方法

  1. 開啟 mBlock
  2. 按上方的擴充 (Extensions) > 擴展管理員 (Manage Extensions)
  3. 搜尋 "IoT_ThingSpeak" 或 "IoT_IFTTT",然後下載

程式編寫

我參考了他們的 Arduino 原始碼,相對我之前編寫的較為簡單,而且不需要外加 ESP8266 的檔案。我為方便自己的應用,修改了發送資料的部份。程式主要分成了三個部份:

設置Wi-Fi模組收腳位

首先,還是需要一些基本的設定,當然也包括WIFI模組的接腳位設定:
#include <Arduino.h>
#include <MeOrion.h>
#include <Wire.h>
#include <SoftwareSerial.h>

SoftwareSerial wifiSerial(A3, A2); /* 腳位選擇請參考上一篇文章 */
char cmd[256]; /* 用於發送資料 */

連接WIFI路由器

然後連接自家的Wi-Fi路由器,將程式中的 _SSID_ 及 _PWD_ 換成你的 Wi-Fi SSID 和密碼。
void setup() {
    wifiSerial.begin(9600);
    wifiSerial.println(F("AT+CWMODE=1"));
    delay(1000);
    wifiSerial.println("AT+CWJAP=\""+(String)"_SSID_"+"\"+\""+(String)"_PWD_"+"\"");
    delay(10000);
}

發送資料

最後是發送資料,做法就是 HTTP Request 方法中的 GET 一樣
void loop() {
    /* 準備上傳資料的指令 */
    /* 按自己需求提交資料到網頁 */
    /* %s:字串  %d:數字 */
    /* 最後必須用\r\n作結尾 */
    sprintf(cmd, "GET /test.php?name1=%s&name2=%d\r\n", "value1", value2);

    /* 連接自己網址的TCP(更改_IP_Address_) */
    wifiSerial.println(F("AT+CIPSTART=\"TCP\",\"_IP_Address_",80"));
    delay(5000);

    /* 發送資料 */
    int len = strlen(cmd) + 2;
    wifiSerial.println("AT+CIPSEND="+(String)len);
    delay(3000);
    wifiSerial.println(cmd);
    delay(5000);
    wifiSerial.println(F("AT+CIPCLOSE"));
}

總結

這樣就可以做到自己定義的 IoT 程式,不一定要將數據上傳到 IFTTT 或是 ThingSpeak。

而其中有些程式用到了 F() 這個功能(不是打多了一個F字),而它是 Arduino 的一個功能,用於將字串存儲在暫存記憶體內,而非 RAM 內,可以減少大量 RAM 的使用量。

2017年6月20日 星期二

mBlock 使用技巧:IoT 應用

前提

近日購買了 Makeblock 的 Me IoT Wi-Fi 模組,可以讓 mBot 通過 Wi-Fi 上傳資料或下載資料。正式使用 Me IoT Wi-Fi 模組前,需要先進行簡單的設定,詳情可參閱港澳區獨家總代理 Everbest 的教學。另外,亦需要對 ESP8266 的 AT 指令有少許認識,可以看看這裡

程式編寫

由於這個 Me IoT Wi-Fi 模組真的很新,暫時沒有 mBlock 程式可以使用,需要使用 Arduino C 進行編寫,希望將來會有人開發 mBlock 程式,讓小學生也可以輕易受惠。

今次我會使用 Thingspeak 作為例子,上傳溫濕度到 Thingspeak 網站,成果可以看這裡。主控版用了 Me Orion 作例子,mCore 也可使用的。

一開始先要 include 一些必須的 Header 檔,其中 ESP8266 是 Wi-Fi 晶片的 Header 檔,可以在這裡下載,然後把 ESP8266.h 和 ESP8266.cpp 和你的 ino 檔案放在同一個資料夾內,放置後需要重啟 Arduino IDE,才可成功 Compile。

#include <Arduino.h>
#include <MeOrion.h>
#include "ESP8266.h"
#include <Wire.h>
#include <SoftwareSerial.h>


之後就到一些我們會用上的感應器:

/* Me 溫濕度計 */
MeHumiture thermometer(PORT_4);

/* Wi-Fi模組 PORT_6*/
SoftwareSerial wifiSerial(A3, A2);
ESP8266 wifiConnection(wifiSerial);


SoftwareSerial 要使用每個連接埠的 RX 和 TX 作為輸入,每塊主控板的互相對應的 PIN 可參考下表:
連接埠mCore(MeMCore.h)Me Orion(MeOrion.h)Me Auriga(MeAuriga.h)Me Uno Shield(MeShield.h)
PORT_112, 1110, 114, 510, 11
PORT_210, 99, 32, 312, 9
PORT_3A3, A213, 126, 78, 13
PORT_4A1, A02, 88, 93, NC
PORT_5RX, TXRX2, TX2RX, TX
PORT_6A3, A2A15, A102, NC
PORT_7A1, A6A14, A9A3, A2
PORT_8A0, A7A13, A8A1, A0
PORT_9A12, A74, 5
PORT_10A11, A67, 6


程式的設定部份:

int humidity;
int temperature;

void setup() {
    Serial.begin(9600);
}


最後就是程式的不斷重覆的部份,我會一次過將所有程式貼上,然後在註解中解釋:

void loop() {
    /* 先從感應器取得需要的數據 */
    thermometer.update();
    humidity = thermometer.getHumidity();
    temperature = thermometer.getTemperature();

    /* 將Wi-Fi模組設置到STA+AP 模式 */
    if (wifiConnection.setOprToStationSoftAP()) {
        Serial.println("Set Wi-Fi Module to STA+AP Success");
    } else {
        Serial.println("Set Wi-Fi Module to STA+AP Fail");
    }
    delay(5000);

    /* 連接Wi-Fi SSID */
    /* 分別將你知道的Wi-Fi SSID和密碼填在joinAP的副程式內 */
    if (wifiConnection.joinAP("XXXXXXXX", "********")) {
        Serial.print("Connect to Wi-Fi Success");
    } else {
        Serial.print("Connect to Wi-Fi Fail");
    }
    delay(5000);

    /* 連接Thingspeak的TCP */
    if (wifiConnection.createTCP("184.106.153.149", 80)) {
        Serial.println("Create TCP Connection Success");
    } else {
        Serial.println("Create TCP Connection Fail");
    }
    delay(5000);

    char cmd[100];

    /* 準備上傳資料的指令 */
    /* API_KEY是你的頻度的Thingspeak API Key,每個頻度的都不同 */
    /* 最後必須用\r\n作結尾 */
    sprintf(cmd, "GET /update?api_key=API_KEY&field1=%d&field2=%d\r\n", temperature, humidity);
    Serial.println(cmd);

    /* 傳送指令 */
    if(wifiConnection.send(cmd, strlen(cmd))) {
        Serial.println("Send Command Success");
    } else {
        Serial.println("Send Command Fail");
    }
    delay(5000);

    /* 斷接TCP */
    /* 由於這個程式會不斷運行,不會關上 */
    /* 為避免太多TCP連接造成網絡緩慢,因此每次更新資料後,都應要斷接TCP */
    if (wifiConnection.releaseTCP()) {
        Serial.println("Release TCP Success");
    } else {
        Serial.println("Release TCP Fail");
    }
    delay(1000);
    Serial.println("End of Data Update");

    /* 再等候10秒,共30秒更新一次資料,Thingspeak要求最少要等候15秒 */
    delay(10000);
}


總結

以上程式最重要是用了 HTTP 的 GET 去給伺服器更新資料,如果你對網頁編寫有經驗,可以嘗試為自己的網站進行資料更新。之後,我會嘗試用這個方法,讓 mBot 取得網上的資料,再呈現在 mBot 上。

2017年4月17日 星期一

編程概念認識:程序結構(Program Structure)

簡介

當我們在撰寫 mBlock 拼圖程式的時候,往往會依照不同的需求,而撰寫一連串的拼圖命令方塊,並且當某一件事件發生時,它會根據「不同情況」來選擇不同的執行動作,並且要反覆的檢查環境變化。因此,我們想要完成以上的程序,就必須要學會拼圖程式的三種流程控制結構。

循序結構(Sequential)

循序結構是指程式由上至下,逐一執行一連串的拼圖程式,其間並沒有分岔及迴圈的情況。

【常用的循序結構拼圖積木】

  1. 持續前一動作或行為
  2. 等待某一條件成立
  3. 停止指定程式

【優點】

  1. 由上至下,非常容易閱讀。
  2. 結構比較單純,沒有複雜的變化。

【缺點】

  1. 無法表達複雜性的條件結構。
  2. 雖然可以表達重複性的迴圈結構,但是往往要撰寫較長的拼圖程式。

【適用時機】

  1. 不需進行判斷的情況。
  2. 沒有重複撰寫的情況。

分岔結構(Switch)

分岔結構是指根據「條件式」來選擇不同的執行路徑。

【常用的循序結構拼圖積木】

  1. 單一分岔結構
  2. 雙重分岔結構

【優點】

  1. 可以判斷出不同的情況。

【缺點】

  1. 當條件式過多時,結構比較複習,初學者較難馬上了解。

【適用時機】

  1. 當條件式有兩種或兩種以上。

迴圈結構(Loop)

迴圈結構是指重複執行某一段「拼圖方塊」。

【常用的循序結構拼圖積木】

  1. 計數迴圈
  2. 條件迴圈
  3. 無窮迴圈

【優點】

  1. 容易表達複雜性的條件結構。

【缺點】

  1. 當使用到巢狀迴圈時,結構比較複習,初學者較難馬上了解。

【適用時機】

  1. 處理重複性或有規則的動作。

2017年4月14日 星期五

編程概念認識:副程式(Sub-Function)

簡介

副程式是集合一些常用且重複撰寫的程式碼。

它的特性:

  1. 可以使程式更簡化,因為把重覆的程式模組化。
  2. 增加程式的可讀性。
  3. 提高程式的維護性。
  4. 節省程式所佔用的記憶體空間。
  5. 節省重覆撰寫程式的時間。

建立副程式

在撰寫 mBlock 程式時,都會希望將獨立的功能寫成「副程式」,以便日後的維護工作。因此,必須先宣告副程式。
  1. 【程式區】【資料和指令】【新增積木指令】
  2. 宣告一個副程式的名稱
宣告副程式時,可以選擇是否加入參數(Parameter)。參數是指呼叫副程式時,主程式會傳遞一些變數給副程式,而這些變數就是參數。參數可以是數字、字串或是一個布林(Boolean),一個「條件式」。而標籤文字就可以為副程式加入簡單的註解。

副程式的呼叫及編輯

  • 副程式的呼叫
  • 副程式的編輯

編程概念認識:清單(List)

簡介

清單是集合一群具有「相同名稱」及「資料型態」的變數。

它的特性:

  1. 佔用連續記憶體空間。
  2. 用來表示有序串列之一種方式。
  3. 各元素的資料型態皆相同。
  4. 支援隨機存取(Random Access)與循序存取(Sequential Access)。
  5. 插入或刪除元素時較為麻煩,因為須挪移其他元素。

建立清單

在撰寫 mBlock 程式時,如果時常要收集連續性的資料時,因此,必須先宣告清單陣列。
  1. 【程式區】【資料和指令】【做一個清單】
  2. 宣告一個清單的名稱
「適用所有的角色」代表「全域性清單(Global List)」,我們一般會使用這種清單,使用時比較方便,但因為任何地方都可以改變它的值,出錯的機會亦因此提高。「僅適用本角色」代表「區域性清單(Local List)」,由於使用彈性低,因此較為少用。

清單的綜合運算

成立建立清單後,它會自動產生指定的「清單名稱」及一系列清單相關的拼圖積木。如下表所示:
取得清單中的所有元素 新增資料到清單中 將第N項的資料從清單中移除
將資料插入到清單中第N項的前面 將清單中第N項的資料換成新的值
取得清單中第N項的資料 取得清單的長度 判斷清單中是否有包含該項資料

注意:清單未能透過「上傳Arduino程式」將程式上傳到 mBot,如果要在 mBot 上使用清單,可以使用 Arduino IDE 編程,或使用多個變數,製成「假清單」。

編程概念認識:運算子(Operators)

簡介

我們在使用變數時,除了可以使用「設為…」積木或「改變為…」積木外,還可以使用運算子(Operators),對變數作出比較或加入數學運算,讓變數的功能更完善。

在 mBlock 拼圖程式中,資料的運算大致上可分為以下五種:

  1. 四則運算
  2. 比較運算
  3. 邏輯運算
  4. 字串運算
  5. 數學運算

指定運算子(Assignment)

指定運算子是將「右邊」運算式的結果、數字或字串指定給「左邊」的運算元(即變數名稱)。例如:
設為(直接指定)

四則運算子(Calculation)

四則運算子用於處理使用者輸入的「數值資料」進行四則運算積木。
加法 減法 乘法 除法

關係運算子(Boolean)

關係用於判斷「條件式」是否成立。
AND(且) OR(或) NOT(反)

字串運算子(String)

字串運算子讓字串資料的輸出更有彈性。
合併字串 取出字串中的第N個字符 計算字串的長度
取出指定字串在字串中的位置 將數字轉換成字串

數學運算子(Mathematics)

數學運算子讓 mBot 機械人具有數學運算的能力。
隨機數 取餘數 四捨五入取整數
絕對值 無條件捨去(Round Down) 無條件進位(Round Up)
平方根 其他數學公式
(sin / cos / tan / asin / acos / atan / ln / log / e^ / 10^)