Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

LinkIt Smart 7688程式開發

6.022 visualizaciones

Publicado el

真理大學資訊工程學系物聯網系統與應用課程

Publicado en: Educación
  • Sé el primero en comentar

LinkIt Smart 7688程式開發

  1. 1. 物聯網系統與應用 LinkIt Smart 7688 Series 真理大學資訊工程學系 黃信貿、蘇維宗 1
  2. 2. 版本控制 • 2016/05/08: 第1.1版(加入HttpClient POST, MCS) • 2016/03/10: 第1版(Arduino, MRAA, Yun Bridge) 2
  3. 3. 簡介 3
  4. 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 4
  5. 5. MT7688 Functional Block* 5 *有些功能在LinkIt Smart 7688中沒有把PIN腳拉出來
  6. 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 6
  7. 7. 各種在7688 Duo開發的方式 • Programming Arduino (MCU) • Programming Linux (MPU)  MRAA  UPM • Programming between Arduino and Linux (MCU/MPU)  Arduino Yun Bridge  Firmata  UART 7
  8. 8. Programming Arduino ※ 開發版必須為LinkIt Smart 7688 Duo 8
  9. 9. Programming Arduino • 適用情境  需要大量I/O控制而沒有複雜運算的物聯網應用 • 開發環境  Arduino IDE • 基本Arduino API請參閱  https://www.arduino.cc/en/Reference/HomePage 9
  10. 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; } } } 10
  11. 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 11
  12. 12. MRAA ※ 由Intel開發的C/C++函式庫(透過Python, JavaScript, Java來控制I/O) 12
  13. 13. MRAA • 適用情境  需要複雜運算但少量I/O控制的物聯網應用 • 開發環境  Python/Linux via SSH • 要注意的事項  MT7688沒有ADC  MRAA對應腳位要查MT7688規格 • MRAA相關資訊請參閱  http://iotdk.intel.com/docs/master/mraa/ 13
  14. 14. MRAA (續) • MRAA基本程式架構(以範例Blink說明) import mraa import 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) 14
  15. 15. Arduino Yun Bridge ※ 由Arduino開發的函式庫 15
  16. 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 16
  17. 17. Arduino Yun Bridge REST API / Internet 運作方向 Internet  HTTP Request  MPU  Bridge  MCU 17
  18. 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 18
  19. 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); } } } } 19
  20. 20. Arduino Yun Bridge REST API / Local 運作方向 Python/MPU  HTTP Request  MPU  Bridge  MCU 20
  21. 21. Arduino Yun Bridge - REST API (續) • 適用情境  需要複雜運算且進行大量I/O控制的物聯網應用(限制: 控制頻率不能太高) • 開發環境  Python/Linux via SSH • import httplib import 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) 21
  22. 22. Arduino Yun Bridge HTTP Client 運作方向 MCU  Bridge  MPU  HTTP Request  Internet 22
  23. 23. Arduino Yun Bridge – HttpClient GET方法 • 適用情境  想將感測器數值透過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); } 23
  24. 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.comrn” “Content-type: application/json”); client.post([URL],[DATA]); while(client.available()) { char c = client.read(); Serial.print(c); } Serial.flush(); delay(5000); } 24
  25. 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 } } ] }  程式碼(接下頁) 25
  26. 26. Arduino JSON Library (續) • //產生JSON字串的緩衝區 StaticJsonBuffer<150> jsonBuffer; //產生最外層的JSON Object JsonObject& 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; 26
  27. 27. Arduino Yun Bridge HTTP Client with MediaTek Cloud Sandbox (MCS) 運作方向 MCU  Bridge  MPU  HTTP Request  Internet 27
  28. 28. MediaTek Cloud Sandbox (MCS) • MCS是聯發科提供的物聯網雲端服務  官方網站: https://mcs.mediatek.com/ • 如何將資料傳送到MCS? 28
  29. 29. MCS設定 • Step 1: 產生原型  點選「開發」>「原型」  選「創建」產生新的原型 29
  30. 30. MCS設定(續) • Step 1: 產生原型  點選「開發」>「原型」  選「創建」產生新的原型 • Step 2: 新增資料通道  以「顯示器」顯示溫度為例 30
  31. 31. MCS設定(續) • Step 1: 產生原型  點選「開發」>「原型」  選「創建」產生新的原型 • Step 2: 新增資料通道  以「顯示器」顯示溫度為例  “資料通道Id”之後會用到 31
  32. 32. MCS設定(續) • Step 1: 產生原型  點選「開發」>「原型」  選「創建」產生新的原型 • Step 2: 新增資料通道  以「顯示器」顯示溫度為例  “資料通道Id”之後會用到 • Step 3: 創建測試裝置  “DeviceId”與”DeviceKey” 之後會用到 32
  33. 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/ 33
  34. 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]rn” “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; } 34
  35. 35. Firmata 35
  36. 36. 安裝firmata • https://pypi.python.org/pypi/pyFirmata • 為了讓python程式可以與Arduino溝通 • Arduino端  寫入firmata sketch • Linux端  from firmata import Arduino, util board = 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() 36

×