Tag Archives: linkit

[教學投影片] LINE bot 聊天機器人結合 LinkIt 7697

 

作者/攝影  曾吉弘
時間  4小時
成本
  • LinkIt 7697開發板
  • LED (或用板子上的LED也可以)
難度 * * * * *
材料表
  • 個人電腦
  • LinkIt 7697開發板 LED (或用板子上的LED也可以)
  • Arduino IDE

本文先上架CAVEDU版本的LINE chatbot (Messageing API) 結合 LinkIt 7697 開發板,可以控制腳位狀態也可以回傳感測器狀態。製作過程參考了劉正吉老師的個人網站,獲益良多,在此感謝。

 

做法分為兩種:

 

  1. 使用ngrok讓7697直接能與LINE指定帳號溝通
  2. 7697透過 Mediatek Cloud Sandbox 雲服務,LINE再去讀取指定的資料通道。

 

請先看看投影片,後續的教學文章會先從 LINE 發訊息來控制 7697 的腳位狀態開始。


[contact-form][contact-field label=”名稱” type=”name” required=”true” /][contact-field label=”電子郵件” type=”email” required=”true” /][contact-field label=”網站” type=”url” /][contact-field label=”訊息” type=”textarea” /][/contact-form]

 

程式碼下載請點我

[LinkIt 7697開發板教學]BLE藍牙簡介

本文要介紹聯發科技實驗室7697開發板的BLE藍牙4.0通訊機制,包含central、iBeacon 以及 peripheral 等三種角色。

作者/攝影 曾吉弘
時間  3小時
成本  LinkIt 7697開發板
難度  * * *
材料表
  • 個人電腦
  • LinkIt 7697 開發板

LinkIt 7697的BLE

LinkIt 7697支援藍牙低功耗通訊協定Bluetooth Low Energy),但不支援傳統的 profile 像是 Bluetooth BR 或 EDR。Bluetooth Low Energy 裝置可作為 central 或 peripheral 裝置。peripheral裝置(像是心跳計) 會把關於本身的資料廣播出去。central裝置則會尋找附近的peripheral裝置,並可進一步連到peripheral 來存取其屬性,例如服務(service)或特徵(chracteristic)。

*BLE peripheral 與 Central   001

LinkIt 7697 提供了以下 Arduino 函式庫類別:

  • LBLE:用來初始化 Bluetooth Low Energy子系統subsystem
  • LBLECentral:提供central裝置的基本功能,例如掃描鄰近的peripheral
  • LBLEPeripheral:提供peripheral裝置的基本功能:
    • 設定advertisement package
    • 設定 characteristic與service(UUID).

7697 可用作 Central、iBeacon 以及 peripheral,請看以下介紹:

 

7697作為Central

7697的LBLE 函式庫可讓 7697 成為一個central裝置來掃描附近的BLE裝置。如以下程式中的scanner

LBLE.begin();
while(!LBLE.ready())
{
delay(10);
}
Serial.println(“BLE ready”);

//開始掃瞄鄰近的廣播資料
LBLECentral scanner;
scanner.scan();

呼叫scan()之後,central裝置就會不斷蒐尋附近的Blueotooth裝置,掃描結果會更新在LBLECentral類別,後續可呼叫 getPeripheralCount() 來取得掃瞄到的 peripheral 裝置數量。

for(int i = 0; i < scanner.getPeripheralCount(); ++i)
{
Serial.println(scanner.getName(i));
}

請注意藍牙 peripheral 的廣播內容會因不同的裝置而異,例如,一台 iBeacon 裝置丟出來資料可能會有 connectivity flag 以及製造商資料,但心跳計則可能包含 service UUID 與裝置名稱。

常見的情境是 central 去掃描附近的 iBeacon 裝置,在此會用到兩個方法isIBeacongetIBeaconInfo,用來解析iBeacon廣播資料相當好用。有掃到裝置的話,就可由Arduino IDE 的 serial monitor 畫面看到該裝置的基本資料。

 

File > Examples > LBLE > ScanPeripherals

#include <LBLE.h>
#include <LBLECentral.h>

LBLECentral scanner;

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

  //初始化BLE
  Serial.println("BLE begin");
  LBLE.begin();
  while (!LBLE.ready()) {
    delay(10);
  }
  Serial.println("BLE ready");

  //開始掃瞄鄰近的廣播資料
  scanner.scan();
}

void printDeviceInfo(int i) {
  Serial.print("Addr: ");
  Serial.println(scanner.getAddress(i));
  Serial.print("RSSI: ");
  Serial.println(scanner.getRSSI(i));
  Serial.print("Name: ");
  Serial.println(scanner.getName(i));
  Serial.print("UUID: ");
  if (!scanner.getServiceUuid(i).isEmpty()) {
    Serial.println(scanner.getServiceUuid(i));
  } else {
    Serial.println();
  }
  Serial.print("Flag: ");
  Serial.println(scanner.getAdvertisementFlag(i), HEX);
  Serial.print("Manu: ");
  Serial.println(scanner.getManufacturer(i));

  if (scanner.isIBeacon(i)) {
    LBLEUuid uuid;
    uint16_t major = 0, minor = 0;
    uint8_t txPower = 0;
    scanner.getIBeaconInfo(i, uuid, major, minor, txPower);

    Serial.println("iBeacon->");
    Serial.print("    UUID: ");
    Serial.println(uuid);
    Serial.print("    Major: ");
    Serial.println(major);
    Serial.print("    Minor: ");
    Serial.println(minor);
    Serial.print("    txPower: ");
    Serial.println(txPower);
  }
}

void loop() {
  delay(3000);

  //顯示找到的peripheral裝置
  Serial.println(scanner.getPeripheralCount());
  for (int i = 0; i < scanner.getPeripheralCount(); ++i) {
    Serial.println("---");
    printDeviceInfo(i);
  }

  Serial.println("----------------------");
}

 

7697作為iBeacon

iBeacon是一個只會廣播(advertise)資料的BLE裝置,廣播的資料格式可以自訂。請注意做為 iBeacon 的 BLE 裝置無法被連接。

請用LBLEAdvertisement類別就能產生所需的iBeacon廣播資料。並可呼叫configAsIBeacon方法將廣播資料設定為iBeacon格式,如以下程式碼所示:

LBLEAdvertisementData beaconData;
beaconData.configAsIBeacon(“E2C56DB5-DFFB-48D2-B060-D0F5A71096E0”, 01, 02, -40);

  • E2C56DB5-DFFB-48D2-B060-D0F5A71096E0是您的 iBeacon UUID。這個值您可以自行產生。E2C56DB5-DFFB-48D2-B060-D0F5A71096E0因為是iOS AirLocate iBeacon example 中所用的UUID,因此許多 iOS 工具程式都有內建設定來搜尋這組UUID。
  • 01與02是 major ID 與 minor ID,可用來區別不同的iBeacon裝置。例如,您可能會在會議室或辦公室放置多台7697。您可把 major number 設為樓層,minor number 則是房間編號等。這樣一來iBeacon scanner只要透過這兩個數字就能知道使用者現在是在哪一層樓的哪一間房間了。
  • 最後一個數字Tx Power,-40,代表該裝置的發送功率。beacon scanner只要去比較這個數值與實際的訊號強度就能約略估算距離。實際的發送功率會根據天線設定方式而有異,所以建議這個數值要與 scanner 一併校正。

廣播資料設定完成之後,只要呼叫LBLEPeripheral的 advertise方法就能開始廣播資料:

LBLEPeripheral.advertise(beaconData);
LinkIt 7697 會馬上開始廣播資料,呼叫 stopAdvertise() 即可停止廣播。

7697 有現成的範例(BeaconAdvertisement),您可運用Locate Beacon這類的 ibeacon 工具來搜尋。以下是這個 app 的搜尋畫面擷圖:

File > Examples > LBLE > BeaconAdvertisement

#include <LBLE.h>
#include <LBLEPeriphral.h>

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

  //初始化BLE
  Serial.println("BLE begin");
  LBLE.begin();
  while (!LBLE.ready()) {
    delay(100);
  }
  Serial.println("BLE ready");

  //將廣播資料設定為iBeacon.
  LBLEAdvertisementData beaconData;

  //以下是AirLocate通用的UUID.
  LBLEUuid uuid("E2C56DB5-DFFB-48D2-B060-D0F5A71096E0");
  beaconData.configAsIBeacon(uuid, 01, 02, -40);

  Serial.print("Start advertising iBeacon with uuid=");
  Serial.println(uuid);

  //開始廣播
  LBLEPeripheral.advertise(beaconData);
}

void loop() {
  // The underlying framework will advertise periodically.
  // we simply wait here.
  // You can use iBeacon apps such as
  // "Locate Beacon" by Radius Networks on iOS devices to locate this beacon.
  delay(3000);
}

7697作為peripheral

第三種應用是將 7697 作為周邊,這時我們就能從別的裝置去連接它。這也是CAVEDU之前在使用LinkIt ONE較常用的方式,搭配手機來與開發板互動。

 

peripheral device裝置上需要先建立一個 GATT 伺服器,才能讓其他的 BLE central 連到這個peripheral。GATT伺服器包含了一組屬性:service與characterstic。像是心跳帶這類的服務就是用UUID來區分。一個服務可能包含多個具有數值(value)的特徵(characteristic),例如心跳帶服務就應該會有一個heart rate measurement value特徵。BLE central裝置就可以發送需求來讀寫這些數值。

關於GATT屬性,請參考Bluetooth.com 或 https://learn.adafruit.com/introduction-to-bluetooth-low-energy/gatt#services-and-characteristics

啟動GATT伺服器之前,需要定義這個服務以及我們要用到的特徵。由於服務與特徵都是永久性(persistent),並且應該會被其他central裝置頻繁讀寫,在此把service與characteristic定義為global是比較好的做法,如下所示:

#include <LBLE.h>
#include <LBLEPeriphral.h>

//定義具備一個特徵GATT服務
LBLEService ledService(“19B10010-E8F2-537E-4F6C-D104768A1214”);
LBLECharacteristicInt switchCharacteristic(“19B10011-E8F2-537E-4F6C-D104768A1214”, LBLE_READ | LBLE_WRITE);

  • 19B10010-E8F2-537E-4F6C-D104768A1214是服務UUID,可供其他central裝置尋找到它。
  • 19B10011-E8F2-537E-4F6C-D104768A1214是特徵UUID。. GATT通訊協定會把特徵視為一個緩衝器,長度最大可到512位元組。 LBLECharacteristicInt可用來定義整數型別的特徵,您再用setValue() 去設定其整數參數即可,不必去動到緩衝器內部。

定義好服務與特徵之後,接著要定義它們的關係,再把這些服務加入peripheral裝置,如下所示:

void setup() {
//將特徵加入ledService
ledService.addAttribute(switchCharacteristic);

//將服務加入GATT伺服器(即一個 BLE peripheral)
LBLEPeripheral.addService(ledService);
使用以下語法來初始化GATT伺服器:

LBLEPeripheral.begin();
請注意一旦呼叫begin()之後,就無法加入更多service,也無法修改service與characteristic之間的關係了。

peripheral裝置現在已準備好由central裝置來連線,並可藉由isWritten()檢查特徵值是否有被外部裝置來修改:

 

File > Examples > LBLE > SimplePeripheral

 

為了安全性起見,裝置的addr 不會直接寫在板子上(當然也是有這麼做的)。本範例透過以下語法將 7697 addr 顯示於 serial monitor 中,您再修改 App Inventor 即可。

 

Serial.println(LBLE.getDeviceAddress());

 

#include <LBLE.h>
#include <LBLEPeriphral.h>

// Define a simple GATT service with only 1 characteristic
LBLEService ledService("19B10010-E8F2-537E-4F6C-D104768A1214");
LBLECharacteristicInt switchCharacteristic("19B10011-E8F2-537E-4F6C-D104768A1214", LBLE_READ | LBLE_WRITE);

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

  Serial.begin(9600);

  //初始化BLE
  Serial.println("BLE begin");
  LBLE.begin();
  while (!LBLE.ready()) {
    delay(100);
  }
  Serial.println("BLE ready");
  Serial.print("device address is:");
  Serial.println(LBLE.getDeviceAddress()); //顯示7697 BLE addr

  //設定廣播資料
  // In this case, we simply create an advertisement that represents an
  // connectable device with a device name
  LBLEAdvertisementData advertisement;
  advertisement.configAsConnectableDevice("BLE LED");

  // Configure our device's Generic Access Profile's device name
  // Ususally this is the same as the name in the advertisement data.
  LBLEPeripheral.setName("BLE LED");

  // Add characteristics into ledService
  ledService.addAttribute(switchCharacteristic);

  // Add service to GATT server (peripheral)
  LBLEPeripheral.addService(ledService);

  //啟動GATT伺服器,此時已可被連線
  LBLEPeripheral.begin();

  //開始廣播
  LBLEPeripheral.advertise(advertisement);
}

void loop() {
  delay(100);
  if (switchCharacteristic.isWritten()) {
    const char value = switchCharacteristic.getValue();
    switch (value) {
      case '1':
        digitalWrite(LED_BUILTIN, HIGH); //7697就是D7, 其他Arduino為D13
        break;
      case '0':
        digitalWrite(LED_BUILTIN, LOW);
        break;
      default:
        break;
    }
  }
}

Android端(App Inventor)

要寫一個小程式來與7697互動,在此推薦使用App Inventor來編寫Android端程式,一方面是圖形化介面開發非常快,另一方面則是手機端有許多豐富的資源,可以讓您的專題更完整。別忘了參考CAVEDU所開發的App Inventor中文學習網喔!

請登入App Inventor (http://ai2.appinventor.mit.edu) 之後建立一個新的專案,或由此下載本範例所需之 .aia 檔

 

Designer 頁面

本範例用到的元件有多個按鈕、顯示訊息用的 Labe; 當然也需要用到最新的 BluetoothLE 元件。Designer 頁面完成如下圖,您只要做得差不多就好,不需要一模一樣。

 

Blocks 頁面

STEP1:

宣告 addr 變數,代表所要連線的7697 藍牙位址。

Screen1初始化時,要求 BluetoothLE元件開始掃瞄,連線成功的話會自動呼叫BluetoothLE.Connnected事件,並修改相關元件的設定。

STEP2:

按下連線按鈕時,根據按鈕的文字來決定要連線或斷線。您也可以使用兩個獨立的按鈕來做到這件事。

STEP3  :

斷線時呼叫BluetoothLE事件,並將元件回復到初始狀態等候下一次連線。

 

STEP4  :

按下按鈕時,透過 WriteIntValue 方法分別發送 1 與 0 出去,7697 接到這兩個整數值之後就會執行對應的動作。您可以依照這樣的架構加入更多按鈕或其他二元觸發條件(例如Google語音辨識、感測器值等等)。別忘了 7697 端也要加入更多case 來接收您新增的控制碼。

操作

請先上傳7697端的程式並開啟serial monitor來看看狀態,在此7697是一個peripheral。請點選App端的 Connect按鈕就會連線,連線成功即可點選ON/OFF按鈕(在連線成功之前不可按)來控制7697的 D7 USR LED燈亮滅。

 

相關文章:

[課程紀錄]170615,16 國中小自造者教育師資培訓營@日新國小

作者/攝影 曾吉弘/趙偉伶
課程時間 2017 6/ 15 16 
課程講師 徐豐智、趙偉伶、陳煜倫
課程場地  台北市日新國小 / 台北市自造教育示範中心

l來自台北市二十多位國小教師齊聚一堂,一起來認識如何將新的物聯網開發板 LinkIt 7697 應用於國小教學,為此聯發科技實驗室特別開發了以 Google Blockly 為基礎的 Blocklyduino 圖形化介面,不僅具備了圖形化介面,相關周邊如各種感測器的指令,還有Wi-Fi / BLE / 雲服務的指令也都有了,可以說是相當完整。

Blocklyduino 各作業系統版本下載頁面

106年度臺北市政府教育局與財團法人聯發科技教育基金會自造者教育合作計畫之夏令營報連結(請點選報名)

本次課程除了感謝台北市日新國小暨台北市自造教育示範中心聯發科技教育基金會的大力支持,讓所有老師都能有一套完整的設備帶回去慢慢研究。最感謝的當然就是兩天超認真上課的各位老師囉,期待各位能實際運用LinkIt 7697 x Blocklyduino於課堂中。

這兩天課程上了什麼呢?

6/156/16
  • 安裝程式環境
  • 接線讓LED亮
  • 組裝搶答器按鈕
  • 寫程式
  • 組裝搶答器外殼
  • 光線感測器程式講解
  • 組裝繼電器
  • 講解繼電器程式
  • 溫溼度感測器程式講解
  • 物聯網教室/物聯網屋demo

 

投影片:


來看課程花絮吧~

日新國小徐臺屏老師,近年推廣maker教育不遺餘力,本次活動很高興能在日新國小舉行,場地非常專業,相信上課的老師們都有同感。

(聯發科技教育基金會 Alan & Cynthia)


第一天:Blocklyduino 環境應用與搶答器製作

動手做就是快樂,哪怕手上都是雷切灰~

慢慢有樣子出來了

 

第二天:使用 :Blocklyduino 結合 MCS雲服務

第二天的課程內容是將7697的資料上傳到MCS雲服務,對小朋友來說就能從網頁上去監測某些感測器數值的變化。在此有請聯發科技基金會Alan來分享開發祕辛。

上傳之後除了可以看到最新一筆資料,也可以用折線圖的方式來呈現歷史資料,馬上知道數值的變化趨勢喔!

當然有了手機app,就可以設定當感測器值滿足我們所設定的條件時,自動推播訊息給您(這位老師的訊息有點… 但我想小朋友發的推播訊息內容應該會更勁爆吧)

樂高物聯網小屋示範

CAVEDU針對教學場域的物聯網應用也是很積極在推動的,除了有比較貼近生活情境的應用之外,還有一個比較整合性的思考。學生可以去構思在一個場域(教室、家庭或百貨公司)需要應用哪些技術可以解決現實生活中的問題。使用Blocklyduino 編寫 LinkIt 7697 板子的程式,再搭配 MCS 雲服務,看起來是相當不錯的選擇。可以從雲端控制電器狀態,也可以多人透過網頁/app 來觀看場域狀態。如果滿足某些條件的話,還可以寄發email / app 推播或經由 webhook 觸發其他應用程式,非常方便!

 

(更多資訊請參考,可以名正言順買樂高了![物聯網屋專題實作計畫]用LEGO®製作物聯網屋)

透過手機就能控制家中各種簡易電器開關,是不是很方便呢?

更多照片請參考台北市自造教育示範中心的Facebook粉絲頁,本文部分照片經中心同意使用之,特此感謝。

註:台灣如 webduino, iFrog 以及 Motoduino 也有類似的Blockly 圖形化環境並針對自家產品最佳化,也請點選上述連結來看看喔!

相關文章:

[物聯網屋專題實作計畫]用LEGO®製作物聯網屋

誤:為了名正言順的動用公司資金玩LEGO,特別提案製作LEGO物聯網企劃。

正:為了提供更好的物聯網學習體驗,使用互動性、模組化最佳的LEGO積木為素材,整合Linkit Smart 7688 Duo物聯網開發板、聯發科雲端服務(MCS)、Seeed Grove感應器,打造【CAVEDU第三代物聯網屋】。

作者/攝影  鄭建彥/CAVEDU教育團隊
時間
  •  30分鐘(開箱時間)
  • 2~5分鐘(製作時間)
成本
  • Linkit Smart 7688 Duo
  • Linkit Smart7688 Duo Arduino相容擴充轉接板
  • LEGO 75827
  • Grove加速度感應器
  • Grove火焰感應器
  • Grove溫溼度感應器
  • Grove 水感應器
  • 風扇模組
  • 5mmLED
難度 

我們家老闆也不是那麼好騙的,哪有這麼隨便就讓我們動用公司資源開專案,一定要有範例佐證一下。

還好我出門遊玩工作時,有順手拍照記錄的好習慣。

這是2016 CAVEDU物聯網應用發表會,亞馬遜雲端服務(AWS)所展出的LEGO物聯網屋。

2016年的新加坡Maker Faire,Cognizant的攤位活動也是LEGO小屋+樹莓派+平板

 

已經可以證明使用LEGO為房屋素材,是世界級大廠的共同選擇,所以我們選用LEGO也只是剛好跟上一流國際科技品牌的腳步而已。

我們在玩了評測好幾間LEGO屋之後,決定選用LEGO 75827。

是的,就是那棟魔鬼剋星消防局總部,滿滿三層樓的回憶與感動(想當年那卷魔鬼剋星錄影帶我也是一看再看啊!)。

這麼豐富的零件,讓滿懷感動的我們,花了好幾個晚上組裝才完成。

 

說好的物聯網功能呢?

首先,先研究如何將感應器跟LEGO積木裝在一起。Seeed Studio推出了可以將Grove系列模組跟LEGO積木結合的保護殼(工商服務:http://shop.robotkingdom.com.tw/seeedstudio/grove.html),剛好解決這個問題。

接下來就可以輕鬆愉快的Grove感應器們裝上去了。

 

安頓好了各輸出入模組,下個問題才讓我們手忙腳亂,線 要 按 怎 牽 ?

每個樓層都有好幾個模組,每個模組都要拉線到控制板上,這麼多線要如何安全、整齊的配置呢?我們製作了這個黑盒子(商業機密,恕不公開內部照片),解決了這個惱人的問題。

 

好用又好玩的LEGO物聯網屋就完成啦。

 

等等,你以為我們這樣就滿意了。

我們再接再厲的改裝了LEGO辛普森他們家。

 

下個改裝目標據說是這個

 

想看實體嗎?歡迎在2017/5/27、28來華山1914文創園區的東二館,我們會在【放課後】展出。

購票網址:http://shop.robotkingdom.com.tw/funschool/funschool.html

 

相關文章:

[LinkIt 7697開發板上市啦!] 燒燙燙開箱規格報你知

本文要介紹聯發科技實驗室推出的7697開發板,包括其硬體規格、Arduino環境建置以及基礎I/O控制。

作者/攝影  曾吉弘
時間  3小時
成本  LinkIt 7697開發板
難度  * * *
材料表
  • 個人電腦
  • LinkIt 7697 開發板

認識LinkIt 7697

  • 採用 ARM Cortex-M4, 192 Mhz
  • 擁有 352 KB RAM, 4MB Flash
  • 同時支持 Wifi 802.11 b/g/n 和 Bluetooth LE 4.2 雙通訊功能
  • 主要軟體支持FreeRTOS 與Arduino

LinkIt 7697 是以MediaTek MT7697 系統單晶片SoC. 為核心的開發板,支援Wi-Fi 與Bluetooth Low Energy( BLE)通訊功能。您可使用GCC、IAR embedded workbench 或 KEIL uVision 來編寫原生的 LinkIt SDK。或者可採用相當普遍的 Arduino IDE (已經幫入門使用者架好了) 來編寫 Arduino 草稿碼並運用周邊驅動程式與函式庫。

腳位配置(圖片來源 labs.mediatek.com)

與Arduino UNO 簡單比較一下

LinkIt 7697Arduino UNO
微控制器聯發科MT7697Microchip ATmega328p
主時脈192 MHz16 MHz
RAM352K2K
Flash3612K32K
Wi-Fi802.11 b/g/n
BLEBLE 4.2
尺寸48 x 26 mm69 x 53 mm
週邊硬體支援普通非常好

規格一覽

模組wrtnode^7 (wrtnode.com)
晶片MT7697

Cortex-M4 with FPU @ 192Mhz

RAM352 KB
Flash4 MB
Wi-Fi802.11 b/g/n (2.4G)
Bluetooth4.2 LE
尺寸48×26 mm
作業電壓3v3
輸入電壓5v (microUSB)
USB2UARTCP2102N
周邊介面GPIO x18

UART x2

I2C x1

SPI x1

PWM x18

EINT x4

ADC x4 (0~2.5V)

IrDA x1

I2S x1

除錯介面SWD x1
可用的SDKLinkIt SDK

Arduino for LinkIt 7697

LinkIt 7697腳位配置

Download (PDF)

Arduino環境建置與 LED 閃爍-簡易實作教學

Arduino環境建置

請先下載 Arduino 1.6 之後的輸入“http://download.labs.mediatek.com/package_mtk_linkit_7697_index.json”,如下圖:版本,開啟Arduino IDE之後,請於 File/Preferences中的 Additional Board Url 欄位中

接著開啟 Tools/Board,在 Board Manager 中輸入 7697 會看到以下畫面:

安裝驅動程式

7697 需要安裝CP2102N VCP driver,下載之後解壓縮,根據您的作業系統版本點選CP210x_Windows_Drivers資料夾中的 x64 或 x86.exe

完成之後系統就會給予7697 一個 COM port。請於裝置管理員中檢視,Arduino IDE 的 Tools/Ports 也會看到同樣的 port 號:

基礎範例操作

數位輸出 LED Blink

檔案路徑:File/Examples/01. Basic/Blink

萬丈高樓平地起,使用 Blink 來控制吧,唯一不同之處請將LED的腳位改為7號, 代表7697的P7腳位,也就是 USR LED。接線方式如下圖:

void setup() {
  pinMode(7, OUTPUT);

}

void loop() {
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

類比輸入 analogReadSerial

檔案路徑:File/Examples/01. Basic/analogReadSerial

在此有一些關於LinkIt 7697的類比輸入腳位需要注意的地方:

  1. 7697 的 ADC 輸入電壓範圍是 0 到5V,並非3.3V。
  2. 7697 ADC 解析度為 12-bit,因此analogRead()的數值範圍是 0 ~ 4095
  3. 在 Arduino IDE 中,A0 是對應到 7697 的 ADC_IN0 (P14) ,也就是說P14~17 分別代表Arduino的A0~A3,請參照先前的腳位配置圖。

請按照以下來接線,請注意這樣的做法可讓5V降到 2.5V:

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

void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // print out the value you read:
  Serial.println(sensorValue);
  delay(1);        // delay in between reads for stability
}

 

[ MakeNTU_MTK 研習營 ] 課程記錄&常用的7688Duo作品教學分享

作者/攝影 徐豐智/薛皓云、洪卉君
課程時間  2017 2/17 4hr
課程講師  徐豐智
課程場地  台大-新生教學館

大家好,這周六日即將進行MakeNTU,今天想先跟大家分享一些MTK企業獎主題OpenData的網站,作為製作作品的參考

寒假依然努力不懈的各位

最近佑緣助教也有試一個不錯的API,可以用python抓溫度資料,推薦給大家DarkSky API。六日早上會出現在三創園區,大家可以把握機會捕獲他~

 

其他的助教與老師還在確認時程,我們預計周六周日早上到下午會在各位的場區擺攤,有需要可以來問問題喔。當天上課資料在這裡

 

正在推眼鏡的皓云助教

附上雷虎遙控車 – 使用LinkIt Smart 7688 改裝成FPV第一人稱視角載具一枚

 

台大電機土生土長的宗穎助教

有些操作小技巧可以看這邊

 

在台上抓著麥克風獨唱的我

在大家背後默默付出的阿倫助教

 

以及本團隊的藏鏡人阿吉

 

最後還是寒假也努力學習的各位囉!

打完收工,下台一鞠躬,下次再見。

[誰偷喝我的五十嵐?] 使用7688 Duo與MCS雲服務打造小偷偵測系統

本文說明如何使用 7688 Duo 搭配 Mediatek Cloud Sandbox 雲服務做一個小偷偵測系統

作者/攝影  曾吉弘
時間  3小時
成本
  • 7688 Duo 開發板 = $600
  • PIR 紅外線感測器 = $
  • Webcam (Logitech C170) = $600
  • USB OTG轉接線 = $100
難度  * * * * * * *
材料表
  • 可聯網的個人電腦 (作業系統可用 Windows, Mac OSX 與 Linux,本範例使用 Windows 7) 只要能SSH登入 7688 來編寫 Node.js程式即可
  • 7688 Duo 開發板
  • PIR 紅外線感測器
  • Webcam (Logitech C170)
  • USB OTG轉接線


1.MCS端設定

  • 請登入Mediatek Cloud Sandbox,建立一個原型,裡面需有一個 Image Display channel,在此 channelId 為 image。這筆資訊需寫在 Node.js 程式中不可寫錯

  • 針對這個原型建立一個測試裝置,並記下 DeviceId, DeviceKey

2.7688 Duo 端設定

    • 將PIR感測器接好,訊號腳位接到D7,另外的Vcc 與 GND 就這是因為 7688 Duo 的 GPIO(0)與MCU D7連通,所以我可以用 pin.read(); 語法去讀取PIR是否被觸發。
    • 如果您有 7688 Duo 擴充板的話,就可以直接把 webcam 接上擴充板上的 USB host 接口,不然就需要額外的 USB OTG轉接線。

    • 請先將您的7688 Duo 連上外部網路,並SSH登入。請先執行以下指令來更新與安裝必要的函式庫:
      1. $ opkg update      (更新可用軟體)
      2. $ opkg install fswebcam  (拍攝照片軟體)
      3. $ npm install mcsjs   (Node.js的 mcs 函式庫)
      4. $ npm install bluebird –save  (另一個本範例所需的函式庫)
    • 使用 vim 或 nano 開啟一個 .js 檔並貼上以下內容,請把相關資訊改為您的資料。

                  $ nano imageupload.js


var m=require('mraa');
var mcs = require('mcsjs');   //匯入所需函式庫
var exec = require('child_process').exec;
var Promise = require('bluebird');
var fs = Promise.promisifyAll(require("fs"));

var pin=new m.Gpio(0);  //GPIO(0) -> D7
pin.dir(m.DIR_IN);          //設定該腳位為輸入模式

var myApp = mcs.register({
  deviceId: 'XXXXX',
  deviceKey: 'OOOOO',   //在此填入您MCS test device 的 ID, Key
  host: 'api.mediatek.com'
});


checkButton();

function checkButton() {
  var btn=pin.read();  //讀取PIR腳位狀態
  if(btn==0) {
     //一秒之內只能按一次,這個偵測頻率可自行修訂
    setTimeout(checkButton,1000);   
    console.log('button pressed');
    takeSnapshot();
  }
  else setTimeout(checkButton,100);  //每0.1秒讀取一次D7狀態
}

function takeSnapshot() {

    child = exec('fswebcam -i 0 -d v4l2:/dev/video0 --no-banner -p YUYV --jpeg 95 --save /tmp/test.jpg',
      function (error, stdout, stderr) {
      console.log('stdout: ' + stdout);
      console.log('stderr: ' + stderr);
      if (error !== null) {
        console.log('exec error: ' + error);
      }
      //讀取已拍照的圖檔
      fs.readFileAsync('/tmp/test.jpg')
        .then(function(data) {
        myApp.emit('Image','', new Buffer(data).toString('base64'));
      });
    });
}

 

 

 

3.檔案確定都好了之後,使用 Ctrl + x離開 nano (vim 的話是 :wq),使用以下語法執行:

              $ node imageupload.js

4.請在PIR感測器前方,如果一直觸發或一直無法觸發,請調整PIR感測器上的十字鏍絲來得到比較好的偵測效果(應該說…  PIR的效果不算太好,受不了的話可以改用更簡單的 pushbutton)。您就能在MCS test device頁面上看到有照片被上傳了,可以點選該資料頻道右上角->打開歷史資料,就可以看到到底有幾張照片。

5.在此有個有趣的事情值得大家關注一下,我們每次照相的檔名都是 test.jpg,所以您如果在多次拍照之後,到 /tmp 資料夾中看看,一樣只有一張 test.jpg,因為每次都會覆寫掉前一張照片。但是這不會影響MCS上傳的功能。

 

相關文章:

[課程紀錄] CAVEDU的物聯網教學心路歷程

對於CAVEDU來說,將實用的科技以有趣的主題融入教學中一直是我們的核心價值,因此在辦理各式研習與講座中收集大家的意見與困難點就至關重要了。以下內容只代表CAVEDU這兩年多來在物聯網這個主題上的些許教學心得(可能還有一點機器人與Android app),如有偏頗還請大家不吝指正。

作者/攝影 曾吉弘
課程時間  8週 (週四 18:00-20:00)
課程講師 2015-持續努力中
課程場地 全台各地

概念很簡單:如果只是把感測器數值顯示在網頁上,這樣就真的無聊透了。相對地,如果Arduino這類型的入門 maker board 已經很普及的情況下,該如何改變學習這件事:讓小孩子覺得有趣,讓高中與大學生們學到真實可應用的第一線技術?

2015年11月2016年5月各舉辦了一場[物聯網教學應用發表會],邀請了許多朋友來參加,有趣的是在2015年參加以開發板製造商為主,到了2016年則以雲服務提供者為主。這與我們的想法相當接近,使用者對於物聯網的期待已從基礎的資料呈現與控制,進一步到希望有運算、智能服務以及串聯常用的網路服務等等。

針對物聯網教學這件事,我們大概歸納了幾個特性:

 

1. 重點在於網路品質:頻寬、連線數上的要求都會比傳統教室來得更高

  1. 以Raspberry Pi 或 7688課程來說,學員的電腦、開發板與手機都需要在同一個網段之下,這樣連線數就會是學員數的至少3倍。

2.網路端與開發板端的開發環境大不相同

  1. maker 開發板常見程式環境自然是以Arduino為主,網路端則五花八門,node.js、python或php都有。如果想要一個程式語言就打通關的話,可能會遇到某個感測器沒有python函式庫而無法讀取或是所有東西都用Arduino IDE硬幹而程式碼太長的狀況。

3.雲服務端常常改版,使用者只能被動接受

4.上課可能發生問題的地方更多,老師心臟要夠強

  1. 無法連上網路(帳號密碼錯誤)、無法連上server、意外斷線、腳位接錯、函式庫引用錯誤、呼叫次數太密集…  太多啦

5.承3.4.  教師需要花更多時間備課

而使用者對於雲服務的期待也大致整理如下:

1.免費,至少不要太貴

  1. 學校對於看不到的東西很難編列預算

2.希望可與熱門的網路服務結合,因此才會有像是IFTTTTemboo這類型的中介SDK provider 存在。

3.入門範例真的很重要,哪怕只是LED閃啊閃,對於很多人來說也是要花一段時間才能學會。

    1. 要用雲服務來進行LED hello world範例的話,代表您得做到這些事情:
      1. 讓開發板連上網路
      2. 讓開發板連上雲服務 (以上兩點需要使用者具備網路基本知識)
      3. 開發板可讀取來自雲服務的資訊
      4. 使用者可擴充,例如兩個控制頻道分別控制對應的腳位狀態,以及在雲服務上顯示開發板回傳的數值(數字、文字或布林)

真的不太簡單,對吧?

 

4.離線版或區域網路版

    1. local cloud 或 private cloud 對於網路品質不佳或是對於關注資料私密性的用戶來說相當重要,您可以參考QNAP與Arduino合作推出私有雲服務一文

對於學生來說,教學者得先建構一個情境來引起學生們的興趣,例如以下:

  • 可以自動發佈Facebook動態嗎?
  • 事件觸發後可以推播或寄郵件給我?
  • 可以結合 open data嗎?
  • 可以影音串流或影像辨識嗎?
  • 有圖形化介面可以用嗎?
  • 可以不用除錯嗎? <- 最好有這種事情

您可在App Inventor中文學習網上的範例教學頁面看到我們寫了許多讓app與各種網路服務結合,包含Goolgle map、Google 街景服務、微軟認知服務、LASS空汙地圖、政府提供的紫外線與空氣汙染open data等等。對於開發板的聯網應用,也從雲端控制家電、氣象站這類基礎應用,進一步到Facebook天氣播報機器人(IBM Bluemix + Facebook Messenger API)、7688聊天機器人(IBM Bluemix)以及串流影像中的臉孔與年齡辨識

針對大家又期待又怕受傷害的107課綱,由於[物聯網]已確定排入高職課程中,我們也接到許多學校詢問課程、師資與教室設備等等規劃上的問題,我們很樂意提供相關的建議喔!!

 

(展示用的物聯網屋,具備各種感測器、聯網開發板以及雲端控制介面)

不論是學校社團業界講師、公民營研習社群分享一般民眾課程,都很期待與您見面喔!

(2016公民營研習@彰化建國科大,彰師附工主辦)

(2016  Mobile Hero 通訊大賽物聯網教師研習研習@T客邦創客基地)

(2015 創客night分享 Raspberry Pi 影像辨識機器手臂@T客邦創客基地)

(一般民眾物聯網課程@T客邦創客基地)

 

有興趣的朋友可以參考阿吉老師在去年新北 mini Maker Faire 分享的內容:

[活動紀錄] 2016 新北Mini Maker Faire 物聯網好棒棒分享會

希望日後有機會再寫一篇關於程式教學的心得分享囉!!

[Intel Edison X MCS X MeArm] MCS Gamepad 元件應用,智慧型手機操控機械手臂

本篇文章將介紹綜合性的應用,透過智慧型手機上的MediaTek Cloud Sandbox (聯發科的免費雲端資料平台,簡稱MCS)app,經由WiFi傳送訊息到我們的控制器Intel Edison,並控制我們的機械手臂MeArm

事前準備:

  1. Intel Edison 要先準備好linux的系統,本範例使用的是ubilinux,並且完成最基本的GPIO設定
  2. 本範例會需要用到python requests函式庫來跟MCS溝通,所以也請先安裝
  3. 在MCS上新增一個Prototype及test device,記下device id , device key
  4. MCS的Prototype加入本範例需要用的gamepad元件,並將ID命名為gamepad,如圖:

 

Screen Shot 2016-01-02 at 11.54.44 PM

 

 

硬體部分:準備好MeArm機械手臂,連接好我們的控制器Intel Edison,如圖:

 

 

IMG_0951

 

 

程式部分:

import mraa
import time
import requests

device_id = "輸入device_id"
device_key = "輸入device_key"

data_channel = "gamepad"
url = "http://api.mediatek.com/mcs/v2/devices/" + device_id 
url += "/datachannels/" + data_channel + "/datapoints.csv"

def game_pad():
    r = requests.get(url, headers = {"deviceKey" : device_key})
    data = r.content.split(',')[2:]
    print data
    #time.sleep(0.01)
    return (data[0][0], data[0][-1])


pin = [3, 5, 6, 9]
servo = []
servo_degree = [90, 90, 90, 180]
for p in pin:
    servo.append(mraa.Pwm(p))
    
for s in servo:
    s.period_us(20000) #50Hz
    s.enable(False)

max_duty = 2300.0 #us
min_duty = 500.0

def servo_rotate(servo_number, degree): #servo_number (0, 1, 2, 3) = (3, 5, 6, 9)
    duty_cycle = ((max_duty - min_duty) * degree / 180.0 + min_duty) / 20000.0
    servo[servo_number].enable(True)
    servo[servo_number].write(duty_cycle)
    print "duty_cycle = ", duty_cycle, "\n"

dt = 0.01

for s in servo:
    s.enable(False)

unit_degree = 30
while True:
    command = game_pad()
    if command[1] == "1":
        if command[0] == "l":
            print "left"
            if servo_degree[0] > unit_degree:
                servo_degree[0] -= unit_degree
                servo_rotate(0, servo_degree[0])
        elif command[0] == "r":
            print "right"
            if servo_degree[0] < 180 - unit_degree:
                servo_degree[0] += unit_degree
                servo_rotate(0, servo_degree[0])
        elif command[0] == "d":
            print "down"
            if servo_degree[2] < 180 - unit_degree: 
                servo_degree[2] += unit_degree servo_rotate(2, servo_degree[2]) 
        elif command[0] == "u": 
            print "up" 
            if servo_degree[2] > unit_degree:
                servo_degree[2] -= unit_degree
                servo_rotate(2, servo_degree[2])
        elif command[0] == "A":
            print "A"
            servo_rotate(3, 0)
        elif command[0] == "B":
            print "B"
            servo_rotate(3, 180)

最後就是影片展示啦!