linkit smart 7688程式開發

36
物物物物物物物物 LinkIt Smart 7688 Series 物物物物物物物物物物 物物物 物物物 1

Upload: wei-tsung-su

Post on 21-Apr-2017

4.298 views

Category:

Education


0 download

TRANSCRIPT

Page 1: LinkIt Smart 7688程式開發

1

物聯網系統與應用LinkIt Smart 7688 Series

真理大學資訊工程學系黃信貿、蘇維宗

Page 2: LinkIt Smart 7688程式開發

2

版本控制• 2016/05/08: 第 1.1 版 ( 加入 HttpClient POST, MCS)• 2016/03/10: 第 1 版 (Arduino, MRAA, Yun Bridge)

Page 3: LinkIt Smart 7688程式開發

3

簡介

Page 4: LinkIt Smart 7688程式開發

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

Page 5: LinkIt Smart 7688程式開發

5

MT7688 Functional Block*

* 有些功能在 LinkIt Smart 7688 中沒有把 PIN 腳拉出來

Page 6: LinkIt Smart 7688程式開發

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

Page 7: LinkIt Smart 7688程式開發

7

各種在 7688 Duo 開發的方式• Programming Arduino (MCU)• Programming Linux (MPU)

MRAA UPM

• Programming between Arduino and Linux (MCU/MPU) Arduino Yun Bridge Firmata UART

Page 8: LinkIt Smart 7688程式開發

8

Programming Arduino

※ 開發版必須為 LinkIt Smart 7688 Duo

Page 9: LinkIt Smart 7688程式開發

9

Programming Arduino• 適用情境

需要大量 I/O 控制而沒有複雜運算的物聯網應用

• 開發環境 Arduino IDE

• 基本 Arduino API 請參閱 https://www.arduino.cc/en/Reference/HomePage

Page 10: LinkIt Smart 7688程式開發

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; } }}

Page 11: LinkIt Smart 7688程式開發

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

Page 12: LinkIt Smart 7688程式開發

12

MRAA

※ 由 Intel 開發的 C/C++ 函式庫 ( 透過 Python, JavaScript, Java 來控制 I/O)

Page 13: LinkIt Smart 7688程式開發

13

MRAA• 適用情境

需要複雜運算但少量 I/O 控制的物聯網應用

• 開發環境 Python/Linux via SSH

• 要注意的事項 MT7688 沒有 ADC MRAA 對應腳位要查 MT7688 規格

• MRAA 相關資訊請參閱 http://iotdk.intel.com/docs/master/mraa/

Page 14: LinkIt Smart 7688程式開發

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)

Page 15: LinkIt Smart 7688程式開發

15

Arduino Yun Bridge

※ 由 Arduino 開發的函式庫

Page 16: LinkIt Smart 7688程式開發

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

Page 17: LinkIt Smart 7688程式開發

17

Arduino Yun BridgeREST API / Internet

運作方向Internet HTTP Request MPU Bridge MCU

Page 18: LinkIt Smart 7688程式開發

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

Page 19: LinkIt Smart 7688程式開發

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); } } }}

Page 20: LinkIt Smart 7688程式開發

20

Arduino Yun BridgeREST API / Local

運作方向Python/MPU HTTP Request MPU Bridge MCU

Page 21: LinkIt Smart 7688程式開發

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)

Page 22: LinkIt Smart 7688程式開發

22

Arduino Yun BridgeHTTP Client

運作方向MCU Bridge MPU HTTP Request Internet

Page 23: LinkIt Smart 7688程式開發

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);}

Page 24: LinkIt Smart 7688程式開發

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);}

Page 25: LinkIt Smart 7688程式開發

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 } } ]}

程式碼 (接下頁 )

Page 26: LinkIt Smart 7688程式開發

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;

Page 27: LinkIt Smart 7688程式開發

27

Arduino Yun BridgeHTTP Client withMediaTek Cloud Sandbox (MCS)

運作方向MCU Bridge MPU HTTP Request Internet

Page 28: LinkIt Smart 7688程式開發

28

MediaTek Cloud Sandbox (MCS)• MCS 是聯發科提供的物聯網雲端服務

官方網站 : https://mcs.mediatek.com/• 如何將資料傳送到 MCS?

Page 29: LinkIt Smart 7688程式開發

29

MCS 設定• Step 1: 產生原型

點選「開發」 > 「原型」 選「創建」產生新的原型

Page 30: LinkIt Smart 7688程式開發

30

MCS 設定 ( 續 )• Step 1: 產生原型

點選「開發」 > 「原型」 選「創建」產生新的原型

• Step 2: 新增資料通道 以「顯示器」顯示溫度為例

Page 31: LinkIt Smart 7688程式開發

31

MCS 設定 ( 續 )• Step 1: 產生原型

點選「開發」 > 「原型」 選「創建」產生新的原型

• Step 2: 新增資料通道 以「顯示器」顯示溫度為例 “資料通道 Id”之後會用到

Page 32: LinkIt Smart 7688程式開發

32

MCS 設定 ( 續 )• Step 1: 產生原型

點選「開發」 > 「原型」 選「創建」產生新的原型

• Step 2: 新增資料通道 以「顯示器」顯示溫度為例 “資料通道 Id”之後會用到

• Step 3: 創建測試裝置 “DeviceId” 與”DeviceKey”之後會用到

Page 33: LinkIt Smart 7688程式開發

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/

Page 34: LinkIt Smart 7688程式開發

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;}

Page 35: LinkIt Smart 7688程式開發

35

Firmata

Page 36: LinkIt Smart 7688程式開發

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()