linkit smart 7688程式開發
TRANSCRIPT
1
物聯網系統與應用LinkIt Smart 7688 Series
真理大學資訊工程學系黃信貿、蘇維宗
2
版本控制• 2016/05/08: 第 1.1 版 ( 加入 HttpClient POST, MCS)• 2016/03/10: 第 1 版 (Arduino, MRAA, Yun Bridge)
3
簡介
4
LinkIt Smart 7688 Serial• 處理單元
MPU: MediaTek MT7688 (580 MHz) MCU: Atmega32U4 (7688 Duo only)
similar to Arduino Leonardo
• 記憶體 ROM: 32MB RAM: 128MB DDR2
• 網路介面 WiFi 802.11n (1T1R) Ethernet (extension board required)
• I/O 介面 Micro USB for PWR/MCU Micro USB OTG Micro SD card slot GPIO, I2C, I2S, SPI, UART, PWM USB 2.0 host (extension board required)
• 作業系統 OpenWrt Linux
5
MT7688 Functional Block*
* 有些功能在 LinkIt Smart 7688 中沒有把 PIN 腳拉出來
6
開發環境設定• 開發環境設定概述
安裝 Arduino IDE ( 建議安裝 1.6.5 版 ) Step 1. 加入開發版支援套件 ( 將 7688 開發版資訊匯入 Arduino IDE)
開啟「 File 」 > 「 Preferences 」 在 Additional Boards Manager URL 中輸入下列網址
http://download.labs.mediatek.com/package_mtk_linkit_smart_7688_test_index.json Step 2. 安裝開發版支援套件
開啟「 Tools 」 > 「 Boards Manager 」 找到 MediaTek LinkIt Smart Boards 並安裝
安裝 COM Port驅動程式 安裝 SSH 客戶端程式 ( 例如, Putty 或 Tera Term)
• 詳細過程可參閱下列文件 MediaTek LinkIt™ Smart 7688 Duo Get Started Guide
7
各種在 7688 Duo 開發的方式• Programming Arduino (MCU)• Programming Linux (MPU)
MRAA UPM
• Programming between Arduino and Linux (MCU/MPU) Arduino Yun Bridge Firmata UART
8
Programming Arduino
※ 開發版必須為 LinkIt Smart 7688 Duo
9
Programming Arduino• 適用情境
需要大量 I/O 控制而沒有複雜運算的物聯網應用
• 開發環境 Arduino IDE
• 基本 Arduino API 請參閱 https://www.arduino.cc/en/Reference/HomePage
10
Programming Arduino ( 續 )• Arduino基本程式架構 (以範例Blink說明 )
int led_pin = 13;
void setup(){ //當MCU啟動後會被執行一次 //將GPIO數位腳位13設定為輸出 pinMode(led_pin, OUTPUT);}
void loop(){ //重複執行 //數位高電位(LED亮) digitalWrite(led_pin,HIGH); delay(1000); //延遲1000微秒(1秒) //數位低電位(LED暗) digitalWrite(led_pin,LOW); delay(1000);}
• 動手做做看 結果是什麼? 試著修改延遲時間 試著修改腳位 試著控制多顆LED燈
• 從序列埠輸出 /出入資料int led_pin = 13;boolean isLedOn = false;
void setup(){ Serial.begin(9600); pinMode(led_pin, OUTPUT); digitalWrite(led_pin,LOW);}
void loop(){ while(Serial.available()){ char cmd = Serial.read(); //從序列埠讀取資料 if(isLedOn == false && cmd == ‘1’){ Serial.println(“LED ON”); //寫入資料到序列埠 digitalWrite(led_pin, HIGH); isLedOn = true; }else if(isLedOn == true && cmd ==‘0’){ Serial.println(“LED OFF”); digitalWrite(led_pin, LOW); isLedOn = false; } }}
11
Programming Arduino ( 續 )• 如果是類比訊號輸入呢 ?
int light_pin = A0;
void setup(){ Serial.begin(9600); pinMode(light_pin, INPUT);}
void loop(){ //取得類比A0接腳的輸入 int light = analogRead(light_pin); Serial.println(light); delay(2000);}
• 動手做做看 偵測室內光源,如果
光源不足,打開 LED 燈 光源充足,關閉 LED 燈
所需材料 ( 想一想 )
• 參考文件 http://
coopermaa2nd.blogspot.tw/2010/12/arduino-lab8-led.html
12
MRAA
※ 由 Intel 開發的 C/C++ 函式庫 ( 透過 Python, JavaScript, Java 來控制 I/O)
13
MRAA• 適用情境
需要複雜運算但少量 I/O 控制的物聯網應用
• 開發環境 Python/Linux via SSH
• 要注意的事項 MT7688 沒有 ADC MRAA 對應腳位要查 MT7688 規格
• MRAA 相關資訊請參閱 http://iotdk.intel.com/docs/master/mraa/
14
MRAA ( 續 )• MRAA 基本程式架構 ( 以範例 Blink 說明 )
import mraaimport time
print (mraa.getVersion())
# GPIO 17對應到LinkIt Smart 7688 Duo的S0腳位# 練習時可以試用GPIO 44(對應到LinkIt Smart 7688的WiFi LED)pin = mraa.Gpio(17)pin.dir(mraa.DIR_OUT) # 將GPIO設定為輸出while True: pin.write(1) #輸出高電位 time.sleep(1) #延遲1秒 pin.write(0) #輸出低電位 time.sleep(1)
15
Arduino Yun Bridge
※ 由 Arduino 開發的函式庫
16
Arduino Yun Bridge• 開發環境
Python/Linux via SSH Arduino IDE
• Arduino Yun Bridge 相關資訊請參閱 https://www.arduino.cc/en/Reference/YunBridgeLibrary
• 在 OpenWrt Linux 中啟用 Arduino Yun Bridge $ uci set yunbridge.config.disabled=’0’ $ uci commit $ reboot
17
Arduino Yun BridgeREST API / Internet
運作方向Internet HTTP Request MPU Bridge MCU
18
Arduino Yun Bridge - REST API• 適用情境
想從網際網路用簡單的 HTTP 要求進行大量 I/O 控制的物聯網應用
• 開發環境 Arduino IDE
• 開發步驟 設計自己的 REST API ,例如
開啟數位腳位 13 的 LED http://[URL]/arduino/led/13/on
關閉數位腳位 13 的 LED http://[URL]/arduino/led/13/off
撰寫 Arduino 程式處理 REST API
19
Arduino Yun Bridge - REST API ( 續 )• #include<Bridge.h>
#include<YunServer.h>#include<YunClient.h>
YunServer server;
void setup(){ Bridge.begin(); server.begin();}
void loop(){ YunClient client = server.accept();
if(client){ process(client); client.stop(); } delay(50); //避免同時太多requests}
• void process(YunClient client){
String cmd = client.readStringUntil(‘/’); cmd.trim(); //處理led命令 if(cmd == ”led”){ int pin = client.parseInt(); //取得LED腳位 if(client.read()==‘/’) { String act = client.readString(); act.trim();
if(act == “on”) { //開啟LED digitalWrite(pin, HIGH); } else if(act == “off”) { digitalWrite(pin, LOW); } } }}
20
Arduino Yun BridgeREST API / Local
運作方向Python/MPU HTTP Request MPU Bridge MCU
21
Arduino Yun Bridge - REST API ( 續 )• 適用情境
需要複雜運算且進行大量 I/O 控制的物聯網應用 ( 限制 : 控制頻率不能太高 )• 開發環境
Python/Linux via SSH
• import httplibimport time
while True: conn = httplib.HTTPConnection(‘127.0.0.1’) conn.request(“GET”,”/arduino/led/13/on”) response = conn.getresponse() time.sleep(1)
conn = httplib.HTTPConnection(‘127.0.0.1’) conn.request(“GET”,”/arduino/led/13/off”) time.sleep(1)
22
Arduino Yun BridgeHTTP Client
運作方向MCU Bridge MPU HTTP Request Internet
23
Arduino Yun Bridge – HttpClientGET 方法• 適用情境
想將感測器數值透過 HTTP GET Request 傳送到雲端伺服器進行儲存的物聯網應用
• 開發環境 Arduino IDE
• 必要條件 確定已經將 7688 設定成 Station
Mode 並可以連接上網際網路
• #include<Bridge.h>#include<HttpClient.h>
void setup() { Serial.begin(9600); Bridge.begin();}
void loop() { HttpClient client; client.get([URL]);
while(client.available()) { char c = client.read(); Serial.print(c); } Serial.flush(); delay(5000);}
24
Arduino Yun Bridge – HttpClient POST 方法• #include<Bridge.h>#include<HttpClient.h>
void setup() { Serial.begin(9600); Bridge.begin();}
void loop() { HttpClient client; // Set all header fields in one method client.setHeader(“Host: api.mediatek.com\r\n” “Content-type: application/json”); client.post([URL],[DATA]);
while(client.available()) { char c = client.read(); Serial.print(c); } Serial.flush(); delay(5000);}
25
Arduino JSON Library• Arduino JSON library
https://github.com/bblanchon/ArduinoJson 下載原始碼解壓縮後放在 Arduino/libraries目錄中
• JSON 格式範例 ( 以 MediaTek Cloud Sandbox為例 ) { datapoints: [ { “dataChnId”: “1”, “timestamp”: 12345, “values”: { “value”: 20 } } ]}
程式碼 (接下頁 )
26
Arduino JSON Library ( 續 )• //產生JSON字串的緩衝區
StaticJsonBuffer<150> jsonBuffer;//產生最外層的JSON ObjectJsonObject& root = jsonBuffer.createObject(); //加入資料(key為datapoints, value為一個JSON Array)//{“datapoints”:[]}JsonArray& data = root.createNestedArray(“datapoints”);//在JSON Array中加入一個JSON Object//{“datapoints”:[{}]}JsonObject& channel = data.createNestedObject(); //在此JSON Object中加入資料(key為dataChnId, value為1)//{“datapoints”:[{“dataChnId”:”1”}]}channel[“dataChnId”] = “1”; //在此JSON Object中加入資料(key為timestamp, value為12345)//{“datapoints”:[{“dataChnId”:”1”,“timestamp”:1235}]}channel[“timestamp”] = 12345; //在此JSON Object中加入資料(key為values, value為一個JSON Object)//{“datapoints”:[{“dataChnId”:”1”,“timestamp”:1235,”values”:{}}]}JsonObject& values = channel.createNestedObject("values");//在此JSON Object中加入資料(key為value, value為20)//{“datapoints”:[{“dataChnId”:”1”,“timestamp”:1235,”values”:{“value”:20}}]}values["value"] = 20;
27
Arduino Yun BridgeHTTP Client withMediaTek Cloud Sandbox (MCS)
運作方向MCU Bridge MPU HTTP Request Internet
28
MediaTek Cloud Sandbox (MCS)• MCS 是聯發科提供的物聯網雲端服務
官方網站 : https://mcs.mediatek.com/• 如何將資料傳送到 MCS?
29
MCS 設定• Step 1: 產生原型
點選「開發」 > 「原型」 選「創建」產生新的原型
30
MCS 設定 ( 續 )• Step 1: 產生原型
點選「開發」 > 「原型」 選「創建」產生新的原型
• Step 2: 新增資料通道 以「顯示器」顯示溫度為例
31
MCS 設定 ( 續 )• Step 1: 產生原型
點選「開發」 > 「原型」 選「創建」產生新的原型
• Step 2: 新增資料通道 以「顯示器」顯示溫度為例 “資料通道 Id”之後會用到
32
MCS 設定 ( 續 )• Step 1: 產生原型
點選「開發」 > 「原型」 選「創建」產生新的原型
• Step 2: 新增資料通道 以「顯示器」顯示溫度為例 “資料通道 Id”之後會用到
• Step 3: 創建測試裝置 “DeviceId” 與”DeviceKey”之後會用到
33
透過 HTTP 將資料傳送到 MCS• 只能用 HTTP POST 方法
URL https://api.mediatek.com/mcs/v2/devices/[DeviceId]/datapoints
Header deviceKey: [DeviceKey] Content-Type: application/json
Body { "datapoints":[ { "dataChnId":"563T", "timestamp":1432538716989, "values":{"value":"26"} } ]}
• 參考資料 https://mcs.mediatek.com/resources/zh-TW/latest/api_references/
34
透過 HTTP 將資料傳送到 MCS( 續 )以 Arduino實作發出 HTTP POST 要求• #include <ArduinoJson.h>
#include <Bridge.h>#include <HttpClient.h>#include <Time.h>
HttpClient http;int tempPin = A0;int value = 0;
void setup(){ pinMode(A0, INPUT); Serial.begin(9600); Bridge.begin();}
void loop() { http.setHeader( “deviceKey: [DeviceKey]\r\n” “Content-Type: application/json”); value = analogRead(tempPin);
String url = “https://api.mediatek.com/mcs/v2/devices/[DeviceId]/datapoints”; String json = genJSON(value);
int result = http.post(url, json); while(http.available()) { char c = http.read(); Serial.print(c); } Serial.flush(); delay(10000);}
• String genJSON(int value){ time_t unixtime = now(); StaticJsonBuffer<150> jsonBuffer; JsonObject& root = jsonBuffer.createObject(); JsonArray& data = root.createNestedArray("datapoints"); JsonObject& channel = data.createNestedObject(); channel["dataChnId"] = “563T”; channel["timestamp"] = unixtime; JsonObject& values = channel.createNestedObject("values"); values["value"] = value;
String temp; root.printTo(temp); return temp;}
35
Firmata
36
安裝 firmata• https://pypi.python.org/pypi/pyFirmata• 為了讓python 程式可以與 Arduino溝通• Arduino 端
寫入 firmata sketch• Linux 端
from firmata import Arduino, utilboard = Arduino(‘/dev/ttyXXX’)Dpin = board.get_pin(‘d:13:o’) #將數位接腳13設定為輸出Dpin.write(1)
it = util.Iterator(board)it.start()Apin = board.get_pin(‘a:0:I’) #將類比接腳0設定為輸入value = Apin.read()