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年6月15日 星期四

Makeblock電子模組手冊:Me 超聲波模組

簡介

Me 超聲波模組是一個用來測量距離的電子模組,測量範圍由 3 cm 到 400 cm.。可以用來幫助 mBot 機械人避開障礙,或用於其他有關測量距離的創客專案。本模組介面是黃色色標,說明是單數字介面,需要連接到主機板上的黃色標識的介面。

技術規格

  • 作業電壓:5V DC 
  • 工作溫度:-25 ~ +80℃ 
  • 檢測範圍:3 ~ 400 cm (誤差值 1 cm)
  • 檢測角度:30°範圍內 
  • 超聲波頻率:42kHz
  • 控制方式:單數位口控制 
  • 模組尺寸:56 x 36 x 31 mm (長 x 寬 x 高)

特點

  • 具有反接保護,電源反接不會損壞 IC
  • 模組的白色區域是與金屬梁接觸的參考區域
  • 支援 Arduino IDE 程式設計,並且提供運行庫來簡化程式設計
  • 支援 mBlock 圖形化程式設計,適合全年齡用戶
  • 使用 RJ25 介面連線方便
  • 模組化安裝,相容樂高系列
  • 配有接頭支援絕大多數 Arduino 系列主控板

引腳定義

Me 超聲波模組有三個針腳的接頭,每個針腳的功能如下表:
序號引腳功能
1GND接地
2VCC接電源
3SIG距離信號輸出引腳

連接模式

以 RJ25 連接

由於 Me 超聲波模組介面是黃色色標,當使用 RJ25 介面時,需要連接到主控板上帶有黃色色標的介面。以 Makeblock Orion 為例,可以連接到3,4,5,6,7,8 號介面,如圖:

以杜邦線連接

當使用杜邦線連接到 Arduino Uno 主機板時,模組 SIG 引腳需要連接到 DIGITAL(數位)口,如下圖所示:


原理解析

Me 超聲波模組中,超聲波發射器向某一方向發射超聲波,在發射的同時開始計時,超聲波在空氣中傳播,途中碰到障礙物就立即返回來,超聲波接收器收到反射波就立即停止計時。聲波在空氣中的傳播速度為 340米/秒,根據計時器記錄的時間,就可以計算出發射點距障礙物的距離,即:距離=時間差 ÷ 2 × 超聲波的音速。

編程指南

mBlock 程式設計

Me 超聲波模組的相關 mBlock 積木只有一個,只要選對連接埠,直接回傳 Me 超聲波模組偵測到的距離,單位是 cm。


Arduino 程式設計

如果使用 Arduino 程式設計,需要使用資源庫 Makeblock-Library-master 來讓模組測量距離。
本代碼的功能是讀取測量距離(兩種單位)輸出結果到 Arduino IDE 串口監視器,週期為  100ms。上傳代碼到Makeblock主機板點擊 Arduino 串口監視器 您將可看到運行結果。

Me 超聲波模組指令列表:

函數功能
MeUltrasonicSensor(uint8_t port)定義連接埠
long distanceCm()測量距離(厘米)
long distanceInch()測量距離(英寸)

程式範例

#include "MeOrion.h" /* 本範例以Me Orion作主控板 */
#include <Wire.h>
#include <SoftwareSerial.h>

MeUltrasonicSensor ultraSensor(PORT_8); /* 本範例中以連接埠8連接Me 超聲波模組 */

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

void loop() {
  Serial.print(“Distance : “);
  Serial.print(ultraSensor.distanceCm()); /* 取得當時Me 超聲波模組的回傅值(cm) */
  Serial.print(“ cm “);
  Serial.print(ultraSensor.distanceInch()); /* 取得當時Me 超聲波模組的回傅值(inch) */
  Serial.print(“ inch “);
  delay(100);
}