Category Archives: lattepanda

[私下問公開答]如何提升LattePanda拿鐵熊貓的能力,從更新BIOS下手

感謝汐止的陳先生,他在使用LattePanda時,覺得裝置跑不出USB3.0應該有的速度,問我們有沒有解,這次解法我們從更新BIOS方面解決問題。

感謝鄭鴻旗先生的[私下問公開答]的梗,鄭老師表示不會付版稅給你XD

作者/攝影  豐智
時間  30分鐘
成本需要上網下載的費用
難度  * *
材料表

LattePanda是一個信用卡大小的Win10小電腦,內建一個Arduino晶片,各位可以看到LattePanda左邊偏中間的地方有一個USB3.0的接頭,如何提升它的速度呢?

LattePanda相關的Arduino、驅動程式、BIOS更新都在GitHub上-連結

這次實驗成果,是透過更新BIOS,提升USB3.0的功能。

首先點選[Star]→[ LattePandaTeam / LattePanda-Win10-Software]-連結

點選進[Bios]的資料夾之後有好幾個版本的Bios:

  • [LattePanda V1.2 for CR200 Z8350 only]
  • [LattePanda v1.0 for Z8300 only]
  • [LattePanda v1.1 for CR110 Z8350 only]

 

應該要裝哪一個呢?初學者會有一個迷思,裝越高版本的越好,首先請各位確認手上的LattePanda的出廠型號,型號裡有幾個關鍵字可供參考。

  • 首先是型號的最後方有Z8300、Z8350、兩個版本。
  • Z8350在型號的前面有R100、R110兩種不同型號。
  • Z8350在型號的前面有R110、R200兩種不同型號。

 

型號對應的Bios版本如下:

S70CR110/S70CR100 Z8300 -> V1.0

S70CR110 Z8350 -> V1.1

S70CR200 Z8350 -> V1.2

 

我使用的LattePanda是R110xxxxxx/Z8350的型號,直接對應資料夾[LattePanda v1.1 for CR110 Z8350 only]

 

接著請各位確認手上LattePanda的硬體/記憶體的規格是哪一個版本?目前有32GB/2GB、64GB/4GB兩個版本。

我使用的是64GB/4GB的版本,將/default BIOS/4G version/路徑下的資料夾內容下載下來。

 

請各位準備一個FAT32格式的隨身碟,將剛剛下載的資料複製到隨身碟的跟目錄並解壓縮LattePanda v1.1 4G default bios-J.zip

 

LattePanda更新Bios的的方法,是趁LattePanda重開機時,優先讀取隨身碟的資料,更新Bios,請把隨身碟接至LattePanda的USB接頭。

  • LattePanda剛開機時尚未開始讀取Win10系統之前,按著鍵盤上的[Esc]或[Del]即可進入
  • 還沒更新Bios之前螢幕上方的版本應該是2016年的版本[Aptio Setup Utility – copyright (c) 2016 American Megatrend, Inc]
  • 更新之後是2017年[Aptio Setup Utility – copyright (c) 2017 American Megatrend, Inc]

 

更新Bios之前需要調整兩個選項,以R110xxxxxx/Z8350的型號為例:

  • 首先到Boot選項,將Machine Status AC/Battery In從[Power off]-→[Power on]
  • 接著將Boot Option #1的選項[Windows Boot Manager]→[你的隨身碟]

 

 

最後儲存設定並重開機即可。到Save & Exit選擇[Save changes and Reset]

 

重新開機後,LattePanda首先讀取隨身碟資料,出現下圖的畫面就成功了,成功之後在鍵盤按下Ctrl+Alt+Del進行重開機,並且把隨身碟拔出來,進入到Bios看到更新年限為2017年即為成功。

 

感謝Scanace的工程師提供建議的USB測試軟體[USB Device Tree Viewer],大家可以下載來試試看,你的隨身碟是否在電腦上被認知為真的USB3.0的傳輸介面。

 

將LattePanda的USB3.0接頭,接上USB3.0的隨身碟

 

將LattePanda的USB3.0接頭,接上USB2.0的隨身碟

 

希望能帶給大家幫助,小智到此一遊。

 

相關文章:

[LattePanda] 使用LattePanda打造Line機器人

本文章將來介紹一下如何在LattePanda上面部署一個LINE智慧對話機器人,並拿它來控制LattePanda上的Arduino IO。

作者/攝影  袁佑緣
時間  3小時
成本 時間就是成本
難度  * * *
材料表
  • LattePanda
  • 手機

STEP1. LINE開發者帳號與取用LINE Message API

首先, 我們需要先在 LINE 的開發者官方網站 (https://developers.line.me/en/) 註冊一個LINE開發者帳號。

請點選右邊的 Start using Message API, 接下來系統將會提示使用者完成三個設定步驟以完成新增一個通道。

首先,你必須先選取一個提供者,也就是告訴系統是誰提供這個APP的服務。

接下來,請填上關於取用Messaging API 的必要資訊。

最後一步,確認玩設定都沒錯後,按下confirm,你將會看到一個新增的通道出現在一開始的console頁面。

STEP2. 安裝Node.js與下載 line-bot-sdk-nodejs library

在我們繼續完成 LINE Bot細部設定之前,我們必須先安裝一下LINE Bot的軟體開發環境。 我們開發LINE Bot所使用的程式語言是 node.js,所以請點選以下網址(https://nodejs.org/en/download/) 將Windows版本的node.js下載下來並安裝在LattePanda上面。

安裝完後,我們還需要用到LINE Bot SDK ,請到以下的github 網址(https://github.com/line/line-bot-sdk-nodejs) 下載並解壓縮官方的node.js 版 LINE Bot SDK。

如果有讀者想要查這個LINE Bot SDK的詳細使用資訊的話,可以點選此網址 (https://line.github.io/line-bot-sdk-nodejs/) 到官方的gitbook上看進一步的API使用說明,以及如何去用javascript來撰寫機器人的對話功能。

最後請打開命令提示字元(按下快捷鍵 <Win+R> 並輸入”cmd”叫出command prompt), 並輸入以下的命令將工作目錄移動到方才解壓縮的LINE Bot SDK資料夾下的echo-bot範例(line-bot-sdk-nodejs/examples/echo-bot)。

cd THE_ECHO-BOT_EXAPMLE_FOLDER(ex: C:\Users\lattepanda\line-bot-sdk-nodejs\examples\echo-bot)

接下來請輸入以下的指令來安裝需要用到的node.js套件,在這個範例中,我們會需要安裝兩個額外的套件,一個是用來開啟伺服器的express套件,另外一個則是LINE Bot的SDK函式庫。

npm install

 

STEP3. 用ngrok來將本地伺服器開放到網路上

在前面的步驟中,我們雖然可以開啟一個本地的伺服器,但是為了要能夠取用網路上的 LINE Messaging API,我們必須使用一些工具來將LattePanda上的服務開放到雲端上。

 

請點選此網址(https://ngrok.com/download)來下載ngrok,這套軟體可以讓使用者在本地伺服器與網際網路建立一個加密的網路通道。

下載完成後,請將壓縮檔解壓縮,並點選ngrok.exe,呼叫出一個命令提示字元。

請在上面輸入以下的指令在localhostport 3000開啟一個http的通道。

ngrok http 3000

成功開啟後,將會看到如以下的畫面。你將會得到兩個開放的網址,一個是走HTTP,另外一個則是走有加密的HTTPS,請記住這個連結,待會我們將要把這個連接填到LINE Bot上的回呼位址上。

STEP4. 設定Channel Secret/Webhook/Token

請點選剛剛在 STEP2 新增的APP,我們將要完成LINE Bot上最後三個主要的溝通憑證。

第一個是設定頻道的金鑰,請按下issue並複製這段的金鑰到echo-bot的範例資料夾中的index.js檔中。

接下來,同樣地也請點選issue並把channelaccess token貼到index.jsconfig中。

// create LINE SDK config from env variables
const config = {
  channelSecret: 'PASTE_YOUR_CHANNEL_SECRET',
  channelAccessToken: 'PASTE_YOUR_ACCESS_TOKEN',
};
index.js

最後,我們的APP需要設定一個webhook網址,請填上你在STEP3 中開啟的ngrok所得到的網址,並在最後面加上 “/callback” 。例如: “20c21167.ngrok.io/callback”.

STEP5. LineBot 測試

請用智慧型手機打開LINE APP並掃描這個機器人的QR code來加好友。

接下來回到LattePanda上輸入以下的指令執行echo-bot程式並確認ngrok通道已經正確開啟了且webhook的網址也有設定在LINE Bot console 頁面了。

node .

請在上面手機上用LINE打上一些文字看看LINE Bot會有什麼反應吧!

 

STEP6. 使用 serial來與Arduino做溝通

請下載以下的Arduino程式碼到 LattePanda上的 Arduino Leonardo核心。

這個程式中,我們時做了一個簡單的serial控制的LED開關,如果使用者在序列埠監控視窗中輸入一個大寫的T,LED燈就會被打開,如果輸入大寫的F,LED燈則會被關閉。

void setup()
{
    Serial.begin(9600);
    pinMode(LED_BUILTIN, OUTPUT);
    
}

void loop()
{
    if(Serial.available())
    {
        char cmd = Serial.read();
        if(cmd == 'T')
            digitalWrite(LED_BUILTIN, HIGH);
        else if(cmd == 'F')
            digitalWrite(LED_BUILTIN, LOW);
        else
            Serial.println("Enter T/F to turn ON/OFF LED");
    }
}

STEP7. 在LattePanda上使用LineBot 來控制LED

我們想在LattePanda上使用node.js取用serial來控制LED燈,所以我們必須再新增一個新的node.js函式庫。請在範例echo-bot中的資料夾中打開 package.json ,並如以下的範例加上 serialport 這個套件來讓node.js可以使用Serial來與Arduino做溝通。

package.json

{
  "name": "echo-bot",
  "version": "0.0.0",
  "description": "An example LINE bot just to echo messages",
  "main": "index.js",
  "scripts": {
    "start": "node ."
  },
  "dependencies": {
    "@line/bot-sdk": "^5.0.0",
    "express": "^4.15.2",
    "serialport": "^6.0.4"
  }
}

改完之後別忘了輸入以下的指令來更新node.js的套件。

npm install

現在我們要在原本的 echo-bot 中的index.js 程式中加入Serial的溝通功能。

首先,請如以下的範例加入serialport的設定,並注意設定好指定的COM Port,也就是在LattePanda上的Arduino Leonardo連接到的COM Port,例如:COM2。

 

index.js

'use strict';

const line = require('@line/bot-sdk');
const express = require('express');
const SerialPort = require('serialport');
const serialPort = new SerialPort('COM2', {
    baudRate: 9600
});

最後請修改echo-bot預設的handler函式中的功能,加入以下的程式碼好讓node.js根據不同的情形透過Serial送出大寫的T跟F到Arduino 。

 

 

index.js

// event handler
function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    // ignore non-text-message event
    return Promise.resolve(null);
  }

  if(event.message.text == 'ON') {
      serialPort.write('T');
      const echo = {type: 'text', text: 'Turn ON LED'};
      return client.replyMessage(event.replyToken, echo);
  } else if(event.message.text == 'OFF'){
      serialPort.write('F');
      const echo = {type: 'text', text: 'Turn OFF LED'};
      return client.replyMessage(event.replyToken, echo);
  } else {
      // create a echoing text message
      const echo = {type: 'text', text: event.message.text};
      return client.replyMessage(event.replyToken, echo);
  }
}

現在請重新執行index.js並確認ngrok有正確打開(STEP3),接下來就可以在手機上測試看看是否在LINE上輸入ON/OFF,LINE Bot就會去自動開關LattePanda上的LED燈囉!

以下是本文章的範例LINE Bot範例影片。

 

相關文章:

[ LattePanda] 結合雲端服務-MCS與ThingSpeak

這次向各位介紹常用的雲端服務,分別是台灣聯發科技公司搭配旗下LinkIt系列開發板之MCS與ThingSpeak,我們透過LattePanda實作。你可以從遠端來控制板子的腳位狀態或是檢視板子狀態與感測器的數值變化。類似的雲服務近年來如雨後春筍般冒出來,對於想找尋免費方案的使用者或教學單位來說是相當好的事呢。

作者/攝影  阿吉/豐智
時間  1小時
成本
  • 光感測器約NT200
  • 溫溼度感測器約NT160
難度  * * *
材料表

第一個範例是上傳LattePanda之Arduino的A0類比輸入腳位狀態到MCS雲服務,可以根據我們所設定的條件來觸發手機推播訊息。這裡使用DFRobot套件包中的環境光感測器(或可以改用一般常見的光敏電阻)。

 

一、認識MCS雲服務

MediaTek Cloud SandBox(MCS)是聯發科技創意實驗室為旗下LinkIt系列開發板所提供的專屬網頁介面雲端平台,具有物聯網裝置最需要的資料儲存及裝置管理服務。MCS可以很快速地建立雲端應用程式,對於有意將裝置原型快速商品化的人來說,是一套相當便利的系統。它可以讓使用者專注在取得最重要的實體運算資料,不需要處理網路協定。而在MCS所提供的各種資料通道(Data channel)中,你可以輕易的為物聯網裝置建立一個控制面板,還能夠使用專屬的Android手機應用程式來檢視喔!

 

二、MCS操作說明

接下來會依序介紹如何在MCS上建立原型(prototype)建立資料通道(Data channel),以及透過REST API進行溝通。完成後就可以從網頁或手機應用程式來觀看我們所上傳到MCS的資料啦!

請先到MCS網站(https://mcs.mediatek.com)註冊一個帳號,登入後的首頁如圖10-1。

01-MCS主畫面

 

MCS專有名詞介紹

在開始進入專案之前,介紹一下常見的MCS的專有名詞:

  • 原型(Prototype):裝置原型,具備各種資料通道。
  • 資料通道(Data channel):帶有時間資訊的資料串,分為控制器與顯示器,並根據不同的資料型態有不同的外觀。
  • 資料點(Datapoint):每筆上傳的資料。
  • 測試裝置(Test Device):某一時間點的原型,具備自動產生的DeviceId與DeivceKey。
  • DeviceId、DeviceKey:這組資訊無法修改,用於鎖定測試裝置,需要寫在程式碼中。

圖10-2 MCS雲服務架構(圖片來源:https://github.com/Mediatek-Cloud/MCS)

 

MCS選單功能介紹

  • 開發(Development):
    • 原型(Prototype):新增修改原型、資料通道與測試裝置
    • 測試裝置(Test Devices):已建立之測試裝置清單,可以與開發板互動
  • 管理(Management)
  • 資源(Resources):教學文件、API參考資料、手機端程式下載與更新日誌等。
  • 幫助(Help):常見問題、論壇、回饋
  • 個人檔案:設定使用者大頭照、系統語系以及開啟用於接收App推播訊息的手機(須先安裝MCS Android程式)。

資料通道(Data channel)

資料通道根據其動作分成兩種:用來發送訊息給開發板的控制器(Controller)跟接收開發板回傳的資料的顯示器(Display)。本範例將使用一個整數資料型態的顯示介面來接收來自LattePanda的資料。

表說:資料通道內容比較

三、MCS設定

接下來要帶各位在MCS上建立一個整數資料型態的顯示介面來接收來自LattePanda的資料。

  1. 登入MCS之後,請點選畫面左上角的「開發」,選擇「原型」
  2. 在畫面中點選「Create prototype」來建立新的原型。請按照以下設定完成原型設定:
    • 產品原型名稱:LattePanda
    • 產品原型版本:0
    • 硬體平台:Others
    • 產業:其他
    • 應用程式:其他

View post on imgur.com

創建原型

 

3.進入這個原型之後,請點選建立資料頻道,先選擇顯示器。並按照以下設定完成原型設定:

請注意實際上要填入程式的是資料通道Id,但由於實際上課時多數學員容易搞混,為求簡潔,建議資料通道名稱與Id可以使用相同名稱。

  • 資料通道名稱:sensor
  • 資料通道Id:sensor
  • 描述:隨意填入
  • 資料型態:在此請選整數

單位:在此請選「其他」,後續您可根據所使用的感測器來選擇正確的單位

View post on imgur.com

新增整數型顯示器資料通道

 

4.這樣具有一個顯示器資料通道的原型就建立完成了,請回到原型頁面可以看到方才所建立的原型,由於在此尚未建立測試裝置與裝置,因此兩個數字都是0。請點選其右上角的「…」,可以編輯、複製、匯出以及刪除。其中匯出之後的JSON檔可以讓別人直接匯入來建立原型,這個做法在原型已經很複雜時非常好用。

編輯原型

5.接著是要建立測試裝置(test device)。請點選畫面右上角「創建測試裝置」,在此請輸入裝置名稱即可。

建立測試裝置

 

6.建立測試裝置之後,請進入測試裝置頁面。與原型頁面有點像,但是您可以在頁面右上方看到DeviceId與DeviceKey兩筆參數。這兩筆資料也要填入程式中。

建立測試裝置完成

7.測試裝置設定完成後,就能將建好的測試裝置透過DeviceIdDeviceKey與別人分享,也可以自行設定觸發條件,讓MCS寄信給你。接著在原型頁面下點選「Trigger&Action」標籤,再點選「+ Add trigger & action」來加入新的觸發條件與動作。在此需要三個步驟:

  • 觸發條件名稱請隨意輸入,這會成為手機推播訊息標題或是電子郵件標題。

 

編輯觸發條件

  • 這時會根據既有資料通到來建立觸發條件,請選擇方才建立的資料通道:sensor,條件請設定為大於800

  • 最後一步是選擇觸發動作。動作類型請選擇「手機推播」(另外還有電子郵件與觸發其他網路服務的Webhook選項)。內容請輸入:

LattePanda’s A0 value exceeded: ${deviceName} / ${value}」,其中${deviceName}與${value}可以自動代出裝置名稱與觸發條件時的數值。

選擇觸發動作

8.請注意如果要使用手機推播功能,先到個人檔案中(MCS畫面右上角)打開所要接收推播訊息的手機,如下圖。手機需要先安裝MCS app(目前只有Android版)。

在個人檔案頁面打開要接收推播訊息的手機

 

View post on imgur.com

在測試裝置的「觸發條件與動作」標籤中檢查

在Google Play安裝「 MediaTek Cloud Sandbox」手機程式

程式說明

先安裝Python2.7(https://www.python.org/download/releases/2.7/),建立一個mcs.py檔之後貼入下方的程式碼,修改對應資訊之後使用以下指令執行:

   python mcs.py

執行順序1、先上傳Arduino端的程式之後,2、再執行Python或Node.js任一程式即可。Python或Node.js會透過我們在程式中所設定的序列埠號向Arduino要資料,即類比腳位A0的資料。

之所以使用這樣的架構,雖然使用了兩種程式語言,但是可以發現程式的總行數簡化很多。如果後續改用Raspberry Pi搭配Arduino或是7688 Duo的話,也可以看到這樣的混搭應用。

Python

#1~#3匯入了本程式所需的Python函式庫,其中serial是用來與序列裝置通訊,也就是Arduino。

#05是指定LattePanda上的Arduino晶片所取得的COM埠號,例如「COM4」。

#07 08 則是您先前辛辛苦苦在MCS上取得的測試裝置DeviceId / Key

#10   MCS所設定的資料通道ID

#22   無窮迴圈

#23   抓到來自Arduino丟來的第一筆資料’a’,這等於是標頭檔,以避免封包遺失對於通訊品質的影響。

#24 使用ser.read()取得來自Arduino的資料

#30 上傳資料到MCS

 

mcs.py範例

import serial
import time
import requests

ser = serial.Serial('COMX',9600) 

device_id = "Your device ID"
device_key = "Your device Key"

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

def MCS_upload(value,length):
        data = data_channel+str(value)
        r = requests.post(url,headers = {"deviceKey" : device_key,'Content-Type':'text/csv'},data=data)
        print r.text

print "Start"
while True:
        if ser.read()=='a':
                IncommingNum = ser.read()
                sensor = int(ser.read(int(IncommingNum)))
                a = 8
                a += int(IncommingNum)
                MCS_upload(sensor,a)

Node.js

Node.js也是相同的概念,我們可以比較一下與Python的異同,然後選一個喜歡的程式語言來開發。記得先安裝Node.js(https://nodejs.org/en/)。

請建立一個mcs.js檔之後貼入下列內容,修改對應資訊之後使用以下指令執行:

   node mcs.py

mcs.js範例:

var mcs = require('mcsjs');
var SerialPort = require("serialport").SerialPort
var serialPort = new SerialPort("COMX",
{baudrate: 9600
});

var myApp = mcs.register({
        deviceId: 'your device ID',
        deviceKey: 'your device Key',
});

serialPort.on("open", function () {
        receivedData ="";
        serialPort.on('data',function(data)
        {
                receivedData =data.toString();
                a = receivedData.length;
                myApp.emit('sensor','', receivedData.substring(2,a));
                //從字串的2號位置取長度a,即可取得資料本身
        });
});

 

Arduino

Arduino端程式很單純,主要是多開了一個序列連線(#5的Serial1,代表LattePanda對Arduino的序列通訊)。進入loop()函式之後,#11~#13為搭配標頭a、資料長度與資料本體結合成一個封包之後發送給LattePanda端的Python、Node.js或其他程式。

Arduino端程式

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

#define sensorPin A0

 

void setup() {

Serial.begin(9600);   //Serial monitor

Serial1.begin(9600); //LattePanda對Arduino的序列通訊

}

 

void loop() {

int Sensor = analogRead(sensorPin);

Serial.println(Sensor);   //顯示A0腳位狀態

Serial1.print(‘a’);

Serial1.print(String(Sensor).length());

Serial1.print(Sensor);

//#11~#13為搭配標頭a、資料長度與資料本體

//結合成一個封包之後發送給LattePanda

delay(1000);

}

實際執行

請先將Arduino端程式上傳到LattePanda的Arduino上,接著開啟Windows的命令提示字元來執行Node.js或Python(兩者任一)即可透過序列埠取得來自Arduino端的資料之後上傳到MCS雲服務,我們可以看到數值變化,並點選該資料通道的右上角即可看到歷史數值變化,如下圖。

也可由MCS手機端App檢視資料。

當數值超過我們所設定的上限時, Android手機會收到來自MCS手機端程式的推播訊息,如下圖。

View post on imgur.com

上傳溫溼度感測器資料到ThingSpeak雲服務

這次使用的是DFrobot之DHT11溫濕度感測器-連結

ThingSpeak雲服務與設定

ThingSpeak是另一個好用的雲服務,可以接收來自各種開發板或單一程式傳上去的資料,在網站上可以找到很多熱門開發板的現成範例,包含Arduino、ESP8266與Raspberry Pi等。請開啟ThingSpeak網站(https://thingspeak.com/)註冊一個帳號之後登入,登入之後主畫面如下圖:

ThingSpeak端設定

登入ThingSpeak網站之後點選「Channels」來建立新的Channel,並如下圖填入相關資訊,我們要把DHT11溫濕度感測器的溫度與濕度執分別傳上去,因此請將Field1填入temperature,Field 2則填入humidity

建立Channel之後,點選API Keys 標籤,請把上圖中的Channel ID與Write API Key記下來,後續要把這兩筆資料填入Visual Studio程式中。

於Visual Studio中讀取溫濕度感測器資料

糗確認在LattePanda上是否安裝Microsoft Visual Studio 2015(或以上)。

Arduino

  1. 在Arduino IDE中匯入Adafruit DHT11函式庫,請由函式庫管理員中搜尋「DHT11」後點選Install按鈕即可。

  1. 接著下載Arduino程式碼-連結,找到ino後上傳到LattePanda Arduino上即可。

本範例主要是如何透過Visual Studio取得Arduino的資料之上傳到ThingSpeak雲服務。架構與上一個範例使用Python是一樣的,看各位在PC端喜歡用什麼樣的程式語言。當然在ThingSpeak網站上也可以找到Python結合Arduino的範例,這樣做法就與上一個專題差不多了。

請開啟一個新的Visual Studio C#專案,並於Program.cs中貼入以下程式碼:

program.cs範例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Threading;
using LattePanda.Firmata;

namespace DHT
{
    class Program
    {
        const string WRITEKEY = "THINGSPEAK_KEY_HERE"; //ThingSpeak Key
        const int DELAY = 20;          //Delay time for send packet to ThingSpeak
        const int GET_TEMPERATURE = 0x47;
        const int GET_FAHRENHEIT = 0x48;
        const int GET_HUMIDITY = 0x49;
        static void Main(string[] args)
        {
            Arduino arduino = new Arduino();
            while (true)
            {
                Console.WriteLine("Receiving sensor data...");
                arduino.DHT(GET_TEMPERATURE); 
//For Fahrenheit : GET_FAHRENHEIT
                Thread.Sleep(2000);
                string temp = arduino.STRING_DHT;
                //
                arduino.DHT(GET_HUMIDITY);
                Thread.Sleep(2000);
                string hum = arduino.STRING_DHT;
                try
                {
                    string rec = "";
                    string strUpdateBase = "http://api.ThingSpeak.com/update";
                    string strUpdateURI = strUpdateBase + "?key=" + WRITEKEY;

                    strUpdateURI += "&field1=" + temp;
                    strUpdateURI += "&field2=" + hum;

                    HttpWebRequest request = WebRequest.Create(strUpdateURI) as HttpWebRequest;
                    request.Timeout = 5000;
                    request.Proxy = null;
                    //request.Accept = "application/xrds+xml";  
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    WebHeaderCollection header = response.Headers;
                    var encoding = ASCIIEncoding.ASCII;
                    using (var reader = new System.IO.StreamReader(response.GetResponseStream(), encoding))
                    {
                        rec = reader.ReadToEnd();
                        Console.WriteLine("The data was successfully sent. Node Number: " + rec);
                        Console.WriteLine(DateTime.Now.ToString("dd/MM/yyyy - HH:mm:ss") + "      Temperature: " + temp + " °C" + "       Humidity: " + hum+" %");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error: " + ex.Message);
                }
                Thread.Sleep(1000);
                for (int i = 0; i <= DELAY; i++)
                {                 
                    Console.Write(".");
                    Thread.Sleep(1000);
                }
                Console.WriteLine();
            }
        }
    }
}

實際執行

存檔之後點選 Start 按鈕,會看到Visual Studio執行畫面:

這時請開啟ThingSpeak網站,進入剛剛設定好的Channel,應該會看到類似下方的畫面,試著對感測器呵氣來改變溫度與溼度吧!

於ThingSpeak網站檢視溫度與濕度資料變化

這次介紹兩種雲服務:MCS與ThingSpeak,雖然功能上比Microsoft Azure來得少多了,但使用流程也因此簡化許多,功能上大致上還是可以滿足我們從雲端控制板子腳位或顯示板子資料等兩大訴求。請根據大家的使用需求來選用合適的雲服務。

 

相關文章:

[LattePanda] 使用Google Assistant玩互動語音助理

作者/攝影  袁佑緣
時間  1小時
成本
難度  * * * * *
材料表
  • LattePanda
  • 螢幕
  • 鍵盤
  • 滑鼠
  • 喇叭
  • 麥克風

本文說明如何使用 LattePanda搭配Google推出的Google Assistant服務,來打造一個智慧助手,一起來看看是如何完成的吧!

 

STEP0. 事前準備

為了要能夠使用語音服務,除了我們的小電腦LattePanda外,請額外再準備USB麥克風以及喇叭,另外本次的範例會需要連到Google 雲端的服務,所以請確認LattePanda能夠連到網路。

 

STEP1. 首先我們要到先設定一個Google Developer Project

請點選以下的網址到Google Cloud Platform,如下圖。

https://console.cloud.google.com/project

接著請點選”CREATE PROJECT”,建立一個新的專案,如下圖,建立一個新專案名稱為my-google-assistant。

初始設定完成後,要等幾分鐘才會建立完成,回到Platform的右上角可以看到正在建立新專案。

 

STEP2. 接著我們要完成Google Assistant API的設定

首先,請連到Google API的設定網頁(https://console.developers.google.com/apis/api/embeddedassistant.googleapis.com/overview),並把Google Assistant API設定為”ENABLE”。

接著,為了要取用Google雲端的API,我們必須先有一個認證的client端,所以請連到以下的網址來建立一組oauth client ID。

https://console.developers.google.com/apis/credentials/oauthclient

而如果還沒有設定過Consent Screen的話,系統會提示您填上必要的設定,請點選”Configure consent screen”,設定如下圖。

最後回到”Create client ID”這一步,在Application Type填上Other即可。

到這裡,我們就已經完成了Client ID的設定囉!

最後,請把這個Client ID資訊下載到電腦上(請點選右方的下載箭頭),待會在進行Google Assistant認證的時候會用到。

STEP3.設定Google Acitvity

 

在進到安裝Google Assistant 的程式之前,我們要先設定一下這個Google帳號的

Activity,請連到以下的網址進行設定。

 

https://myaccount.google.com/activitycontrols

 

至於什麼是Activity呢?簡單說就是允許Google能否取用某些個人資訊,例如聲音、App資訊等,為了要能夠讓Google助手能正常運作,請將以下三個Activity設為Enabled。

 

Web & App Activity

Device Information

Voice & Audio Activity

STEP4.安裝Google Assistant SDK Python函式庫

我們使用的Google Assistant SDK是基於Python這個程式語言下去實做的,所以必須先在電腦上安裝Python的執行環境。

請到Python的官網(https://www.python.org/downloads/windows/)下載最新版的安裝檔。

接下來執行下載的Python安裝檔,並記得將勾選”Add Python to PATH”的選項,讓Python的執行位址加到Windows的系統變數中。

再來,請按下Windows的快捷鍵<Win>+R,啟動Windows快速開啟,並打上cmd呼叫Windows Command Prompt。

請在開啟的Command Prompt中輸入以下指令

 

pip install –upgrade setuptools

 

呼叫Python的套件管理員更新setuptools這個套件。

接著再輸入以下指令

 

pip install –upgrade google-auth-oauthlib[tool]

 

把Google認證oauth client的工具安裝到系統中。

還記得我們在STEP2中下載的Client ID JSON檔嗎?請將下載的JSON檔的位址複製起來,並改到以下指令中的”path/to/client_secret_XXXXX.json”

 

在Command Prompt中輸入以下指令以完成認證。

 

google-oauthlib-tool –client-secrets path/to/client_secret_XXXXX.json –scope https://www.googleapis.com/auth/assistant-sdk-prototype –save

 

Google會自動提示您在瀏覽器中完成認證,認證完成如下圖。

認證完的credential.json會自動存在電腦的系統上,Windows環境中預設會存在AppData中,使用者以後在啟動Google Assistant時不用擔心需要再次認證。

最後我們看到Google Assistant SDK的source,前面有說過這個SDK是基於Python這款程式語言去實做的,使用上非常容易上手,而官方的github網址在這邊(https://github.com/googlesamples/assistant-sdk-python)。

裡面有紀錄如何安裝SDK,以及如何去使用提供的函式庫功能,另外還有一些現成的範例可以讓入門的使用者去做體驗,如果讀者想要擴充、修改自己的Google Assistant的功能,可以下載(Download ZIP)整個專案來去修改,有興趣的朋友不妨去嘗試看看!

 

而本文章為了快速的demo,在這邊直接使用包好的assistant-sdk範例套件,讓使用者可以省去下載、手動安裝的過程,所以請在Command Prompt中輸入以下指令

 

pip install google-assistant-sdk[samples]

 

最後我們輸入以下的指令來執行一個簡單的範例pushtotalk。

 

googlesamples-assistant-pushtotalk

 

這支pushtotalk會提示使用者按下Enter鍵並開啟Google Assistant的語音對談功能,請確定您的麥克風與喇叭都有接到LattePanda上,並確認前面的步驟都設定正確,接下來就可以來玩玩看Google Assistant有什麼功能吧!

 

 

相關文章:

 

 

 

[LattePanda] 作品發表:中文手指閱讀器

這次跟各位讀者分享的作品,是淡江大學電機系CILAB實驗室朱永龍同學發表的專題,CILAB在互動式學習、人機互動、嵌入式系統、影像分析與辨識 、模式識別是主要研究方向,近年在小朋友學習、弱勢族群、MAKE領域發表相當多作品,更多作品可以到這裡

作者/攝影 徐豐智/朱永龍

本次作品為中文手指閱讀器,希望提供視障者一個輕巧且易於攜帶的閱讀器;將閱讀器穿戴在視障者的食指上,協助他們閱讀紙本書籍上的中文文字。視障者使用手指閱讀器時,系統首先會利用震動提示的方式,來引導視障者將食指移動到適當的閱讀位置(觸覺回饋)。系統辨識書籍上的中文文字完成後,透過朗讀文字提供視障者聽覺上的回饋。

 

來認識一下視障者的相關資訊吧

一般日常生活中閱讀文字是不可或缺的事情,除了閱讀書籍外,包括閱讀藥物罐上的說明,操作家電(例如微波爐)上的按鈕,閱讀車站內看板上相關訊息(例如位置、樓層)時,都需要辨識這些文字訊息。對視障者來說,理解這些文字訊息是一件困難的任務。對「中途失明者」來說更是如此,所謂的「中途失明者」是指年齡為15歲以上之視障者,他們原本擁有正常的視力,後來因為疾病或意外傷害導致失明。這些視障者未曾接受過特殊教育,他們普遍呈現摸讀速度緩慢、連續性不足、缺乏效率等問題。(*註解[1]-[5])

 

為了協助視障者閱讀文字,近年來國內外許多研究者提出許多研究成果。主要可分為穿戴式裝備或是手持式裝置兩大類型的輔具。(*註解[6]-[13])

  • 穿戴式輔具:

將身體當為攝影機或相機的載具,並在攝影機擷取影像後,搜尋影像中可能存在的文字區塊加以辨識。學者Yi與Tain將小型攝影機架設在眼鏡上,並透過影像分析與文字辨識技術,辨識出書寫在物品上的文字。Hanif與Prevost 同樣將小型攝影機架設在眼鏡上的方式,來辨識招牌上的文字,並提供一個震動回饋來與視障者互動。Mattar等人[8]設計一個頭戴式攝影機,來辨識招牌上的文字。Ezaki等人將攝影機架設在肩膀上,來辨識招牌上的文字。

  • 手持式輔具:

手持式裝置的特色就是視障者透過PDA或智慧型手機作為影像擷取裝置。學者Peters 等人[10]以PDA的相機擷取影像來辨識鈔票、條碼與商品上的標籤。Shen等人[11]使用智慧型手機辨識門牌或路標,並提供震動回饋來與視障者互動。

 

現在技術上常遇到的問題

  • 在擷取影像時,影像品質容易受到光源、焦距、反光等影響。
  • 在複雜背景中尋找文字區域也不容易。
  • 需要耗費大量的運算資源(處理時間可能需要數秒至數十秒)。
  • 很難辨別出哪些文字資訊才是視障者真正關心的資訊。

由MIT多媒體實驗室Shilkrot等人在2014與2015年所提出的穿戴式手指閱讀器。協助視障者閱讀紙本書籍上的英文文字。當系統辨識書籍上的英文文字後,利用語音朗讀文字的方式,讓視障者得知書籍上的文字內容為何。

這次主題以辨識繁體中文為主,將閱讀器套在食指上並指向書籍,閱讀器將透過震動提示引導視障者閱讀書中文字,閱讀器也將透過攝影機逐一朗讀出書籍上的文字內容,閱讀器也可以幫助外籍人士學習中文字。

View post on imgur.com

裡面的硬體裝置包含(1)小型攝影機、(2)震動馬達、(3)電容式觸控開關,(4)控制馬達的微控制系統。我們利用小型攝影機擷取影像資訊來判斷手指與書本文字的相對位置,並進一步擷取文字字元的影像。

 

我們來看看硬體

閱讀器裡面安置一個(5)電容式觸控開關,手指可藉由觸摸開關來切換閱讀器的中文閱讀模式、閱讀器內部也安置四個具震動功能之微型馬達,電腦端的控制系統可以即時控制馬達震動,並透過震動的提示資訊,引導食指移動到適當的閱讀位置。(6)LattePanda做我們文字辨識的後端處理系統,配合閱讀器可以隨時做文字處理,並隨時提供給使用者語音回饋。

View post on imgur.com

View post on imgur.com

情景一 單字閱讀模式

閱讀器擁有中文單字閱讀模式,使用者手指指向文字時,閱讀器將只偵測手指上方所指到的中文單字,單字閱讀模式不使用振動馬達,並且關閉其它跳行偵測和引導換行等震動提示功能。

View post on imgur.com

單一字閱讀

 

情景二 文章閱讀書籍文字

視障者在閱讀文章時並無法順利的將手指指在適當的文字位置上,文章閱讀模式在閱讀書籍時,閱讀器會透過震動馬達的震動來提示視障者,並引導食指移動到適當的文字位置,方便閱讀器做文字辨識。

我們在手指閱讀器內部安置了四個具震動功能之微型馬達。電腦端依據不同的使用情景設計了三種主要的引導機制(A)引導使用者到距離手指最接近的文字段落,並引導手指移至該行文字的開頭位置(圖4(a))。(B) 當手指出現跳行或偏移到其他橫行文字的情況時,閱讀器透過震動提示的方式,引導手指移回原本的閱讀的位置(圖(b))。(C) 當手指移動到此橫行文字段落的結尾邊界時,將提示回到行頭並到達下一行從頭開始閱讀(圖(c))。

View post on imgur.com

(a) 引導至開頭

View post on imgur.com

(b) 跳行提醒

View post on imgur.com

 

(c) 閱讀至結尾邊界時(震動引導機制

 

中文字元切割

當手指閱讀器將指尖前方的影像資訊傳送至電腦端後,CILAB開發一套中文字元擷取與辨識演算法來辨識影像中的文字。下圖是系統流程圖,這個系統利用影像前處理(灰階、Otsu、Opening、Closing)等演算法,找出指尖位置與傾斜角度,再偵測出行高等相關資訊來做文字擷取切割出單一的文字圖,透過中文字元辨識以及文字轉語音讓閱讀器念出中文。

View post on imgur.com

系統流程圖

 

若是針對整張影像做二色化處理,其二色化結果非常容易受到光源以及其他因素影像,經常出現文字破損的情況,也進一步影響文字切割以及中文字元辨識(OCR)的準確性。設計者採用區域式(local-based)的二色化處理擷取出完整度較好的文字影像,並提升文字切割以及中文字元辨識(OCR)的準確性。

另外採用投影掃描線法來偵測橫行,圖的灰色區域代表掃描線經過文字區塊(圖6a)。當系統偵測橫行並計算出行高後,我們會根據指尖位置,往上方延伸兩倍行高的高度,以及四倍行高的寬度,進行區域影像的切割(如圖(a)之紅色矩形區域),並針對此矩形區域使用Otsu threshold再次進行二色化處理,圖7(b)為此矩形區域進行二色化處理後之結果。

View post on imgur.com

橫向投影掃描線法

View post on imgur.com

View post on imgur.com

 

 

接著使用垂直投影的方式來切割中文字元(圖(a)),此種方式相較於切割英文字元會有較為複雜的問題,對於某些中文字來說(例如:化、川),以垂直投影進行文字切割時,一個完整的中文字元會被分割成兩個或三個獨立的文字區塊。

我們發現中文字的外觀都非常接近方正型,我們根據中文字的行高資訊,在做文字切割時,將部分寬度較小的且鄰近的中文字元合併成一個中文字元,圖 (b)為成功切割出一中文字元。

View post on imgur.com

圖(a)垂直投影掃描線

View post on imgur.com

(b)切割獨立元

 

註解

[1] 柯明期, 中途失明者適應與重建之研究。師範大學特殊教育所碩士論文, 2004。

[2] 李佳玲, 中高齡視障者電腦使用動機及對圖書館電子化資源服務需求之研究。臺灣大學圖書資訊學研究所碩士論文, 2013。

[3] W. Jeong, “Emotions in information seeking of blind people,” in Diane Nahl and Dania Bilal (Eds.), Information and Emotion: The Emergent Affective Paradigm in Information Behavior Research and Theory pp. 267-278, 2007.

[4] 陳怡佩。視覺障礙兒童及青少年的資訊需求。臺灣圖書館管理季刊, 2(3), pp. 32-43, 2006.

[5] K. Carey, “The opportunities and challenges of the digital age: a blind user’s perspective,” Library Trends 55(4): 767-784, 2007.

[6] C. Yi, and Y. Tian, “Assistive text reading from complex background for blind persons,” in Camera-Based Document Analysis and Recognition. Springer, 15–28, 2012.

[7] S. M. Hanif, and L. Prevost, “Texture based text detection in natural scene images-a help to blind and visually impaired persons,” In CVHI, 2007.

[8] M. Mattar, A. Hanson, and E. Learned-Miller, “Sign classification using local and meta-features,” in IEEE CVPR Workshops, pp. 26–26, 2005.

[9] N. Ezaki, M. Bulacu, and L. Schomaker, “Text detection from natural scene images: towards a system for visually impaired persons,” in Proc. of ICPR, vol. 2, pp. 683–686, 2004.

[10] J.-P. Peters, C. Thillou, and S. Ferreira, “Embedded reading device for blind people: a user-centered design.” in Proc. of IEEE ISIT, pp. 217–222, 2004.

[11] H. Shen, and J. M. Coughlan, “Towards a real-time system for finding and reading signs for visually impaired users,” In Proc. of ICCHP, pp. 41–47, 2012.

[12] R. Shilkrot, J. Huber, C. Liu, P. Maes, and S. C. Nanayakkara, “Fingerreader: A wearable device to support text reading on the go,” in CHI EA, ACM, pp. 2359–2364, 2014.

[13] R. Shilkrot, J. Huber, M. E. Wong, P. Maes, and S. C. Nanayakkara, “Fingerreader: A wearable device to explore printed text on the go,” in ACM CHI 2015, pp. 2363–2372, 2015.

 

相關文章:

 

 

 

 

 

 

 

 

 

 

 

[ 課程紀錄文 ] 2017.08.07 LattePanda勉強會@東京21Cafe

8/5、8/6參觀完MakerFaire Tokyo,吸收完滿滿的能量CAVEDU東京遠征隊移動到涉谷,應DFrobot與日本在地工程師Hirokazu桑邀約下,我們在日本舉辦兩小時研習營,雖然研習當天還有颱風登陸,還是有不少人參加,真的很感謝。

作者/攝影 徐豐智/郭皇甫
課程時間 2017 年 8 月 7日 (月) 19:00 (開場 18:30) ~ 21:30
課程講師 徐豐智
課程場地 東京都渋谷区-21Cafe

 

這次是在東京澀谷的21Cafe舉辦研習營,主題是製作天氣預報的機器人,截取livedoor提供的日本各區天氣預報資料JSON資料,判斷明日的天氣氣溫是否讓人熱得滿頭大汗。

 

這次分享主題(1)認識LattePanda。(2)使用Python擷取JSON資料。(3)在LattePanda上使用Python控制Arduino。

 

日本の温度取得のチュートリアル (JSON)

http://weather.livedoor.com/weather_hacks/webservice

 

東京の温度のデータ取得のAPI

http://weather.livedoor.com/forecast/webservice/json/v1?city=130010

 

這次的講義,日本限定,感謝Hirokazu桑大力幫忙

 

首先由21Cafe的管理人-寶島春菜小姐致詞,21Cafe是一個工程師與設計師的免費活動空間,可以容納約30人,大家可以使用這個空間進行主題討論、學習課程。

View post on imgur.com

DFrobot本部的工程師-李暘也到現場,向大家介紹DFrobot團隊製作LattePanda的理想,希望在不久的將來,每個家庭都能擁有一個屬於自己的機器人,提供給”不是Linux”開發者”一塊開發板。

View post on imgur.com

隨後附上課程中的照片,目標是做出

View post on imgur.com

 

View post on imgur.com

View post on imgur.com

View post on imgur.com

 

 

相關文章:

[LattePanda] OpenCV視覺辨識人臉追蹤

本文說明如何使用 LattePanda搭配OpenCV視覺辨識函式庫來打造人臉辨識機器人。

作者/攝影 袁佑緣
時間  1小時
成本
  • LattePanda
  • 螢幕
  • 鍵盤
  • 滑鼠
  • 喇叭
  • webcam
難度 * *
材料表
  • LattePanda
  • 螢幕
  • 鍵盤
  • 滑鼠
  • Webcam

 

本文說明如何使用 LattePanda搭配 python語言去使用OpenCV機器視覺函式庫來打造一個人臉辨識機器人,本範例的操作環境將以LattePanda的Windows10為主。

 

1. 軟體準備

安裝Python與相關套件

首先請到Python的網站下載最新版的安裝檔,在這邊要提醒一下Python目前有兩種版本,一個是2.7x版,另一個3.x版。Python 2.7x版是比較舊的版本,同時官方也有發出聲明將不會在繼續更新了,而本篇的範例使用的是新版3.x的Python,所以請注意一下不要選錯囉,以本文為例,最新的版本是3.6.1,如下圖。接著請按照以下步驟進行。

 

請在安裝Python時,將下方Add Python 3.6 to PATH勾選起來,意思是要把Python加入windows作業系統的環境變數內。

 

安裝完成後,為了測試我們的電腦是否能正常呼叫Python,請呼叫您電腦的終端機,windows的使用者請按下快捷鍵win+R便會在左下角顯示執行視窗,接著輸入cmd,這樣一來就會叫出windows的命令提示字元。

 

 

接下來請在上面輸入Python,呼叫Python的互動界面,如果能成功看到>>>的符號,那就代表已經成功叫起Python的界面了,而使用者可以直接在上面輸入Python的相關指令,如果沒有正確顯示這個界面的話,可能是您前面的安裝過程有問題,請重新回到前面的安裝步驟,有可能是您沒有勾選系統變數那個選項,所以windows無從呼叫Python。

接下來請輸入exit()跳出這個Python互動界面,回到windows的命令提示字元。

接下來請輸入pip install numpy,使用Python的套件管理員pip來安裝numpy這個套件。

裝完numpy之後,一樣使用pip來安裝OpenCV套件,請輸入pip install opencv-python

最後請輸入pip install pyserial,安裝在python中用來做Serial溝通的pyserial套件。

準備Python IDE

撰寫Python的程式除了要打code之外,還需要執行的環境,所以筆者在這邊推薦一款非常容易上手的Python IDE,請到以下的網站(http://thonny.org/)下載並安裝Thonny。

 

裝完必要的Python套件之後,我們就要來把Thonny的程式路徑設定成我們電腦系統中預設的Python執行程式。請點選Tools然後再點選Options,進入Thonny的偏好設定。如下圖。

接下來選擇interpreter,也就是Python的直譯器為系統預設的路徑,如下圖。

2.硬體架設

 本範例使用羅技C170的webcam作為辨識人臉的攝影鏡頭,另外為了要能夠追蹤人臉的位置,我們還需要架設一個旋轉平台,如下圖,由底下的小型伺服馬達(MG90)來控制鏡頭對到的方位。且注意到下方的小馬達控制訊號線是接到LattePanda左邊的3Pin接頭,記得靠外側是要接深色的地線喔!

 

 

3.軟體實作

Arduino 程式碼

為了要控制旋轉平台的伺服馬達,我們需要使用LattePanda上的Arduino Leonardo晶片,請打開Arduino IDE並打上以下的程式碼,並上傳到LattePanda上的Arduino端(請記得選對COM port)。

Arduino端的控制動作其實很簡單,它會聽取Serial傳來的字元命令,如果是小寫的字母a或b就會分別左右旋轉一度,進而達到轉動鏡頭的效果,而伺服馬達的控制訊號腳位在本範例中用的是9號腳位,接法如上圖,如果想接其他腳位請記得要改一下Arduino程式碼裡的腳位定義(s.attach(9))。

#include <Servo.h>

Servo s;
int degree = 90;

void setup()
{
    Serial.begin(115200);
    s.attach(9);
}

void loop()
{
    if(Serial.available())
    {
        int cmd = Serial.read();
        if(cmd == 'a')
        {
            degree++;
            if(degree >= 180)
                degree = 180;
            s.write(degree);
        }
        else if(cmd == 'b')
        {
            degree--;
            if(degree <= 0)
                degree = 0;
            s.write(degree);
        }
        else
            Serial.println("Press a/b to turn the camrea!");
    }
}

 

Python 程式碼

前面已經準備好Python會需要用到的函式庫跟IDE了,接下來我們就要來實作最後關鍵的人臉辨識以及追蹤,因為需要用到辨識人臉的模型,請去OpenCV的github網站(https://github.com/opencv/opencv/tree/master/data/haarcascades)下載 haarcascade_frontalface_default.xml與 haarcascade_eye.xml這兩個.xml檔,分別是用來辨識人的臉部與以及眼睛。

程式碼的實做可以拆解成幾個重要的部份,以下就讓我們一步一步的來了解吧!

首先我們會由cv2.VideoCapture(0)來讀取Webcam的影像資訊,並且設定初始的解析度是640×480,接下來在連接埠COM5建立一個Serial通道,用來下指令給Arduino端,以控制鏡頭的方向。

而while迴圈裡面則包含了主要的辨識程式,辨識的方法其實很簡單,就是先把鏡頭每一幀的照片先灰階化,再透過前面下載的臉部及眼部辨識模組套進去(face_cascde和eye_cascade)去做最可能的人臉偵測(這裡使用的方法是取最大/近的臉部面積)。

最後為了要追蹤人臉,我們需要計算出人臉的中心位置(position = x + w/2.0),x是標示人臉方框的 角落x座標,w則是寬度,所以取一半的寬度就會得到人中的x座標位置,接下來我們只要跟我們取的影像中線做比較,然後左右旋轉鏡頭去做追蹤即可,而這調中線的位置則可以從前面設定的解析度640×480來算出,取寬的一半就能得到範例程式中的320了,如果說讀者想要嘗試其他的解析度,請記得也要修改鏡頭追蹤的中線喔!

import cv2
import numpy as np
import serial

face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('./haarcascade_eye.xml')

cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
ser = serial.Serial('COM5', 115200)

while True:
    _, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 2, 5)
    if len(faces):
        (x, y, w, h) = max(faces, key=lambda face: face[2]*face[3])
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex,ey,ew,eh) in eyes:
            cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
        position = x + w/2.0
        print(position)
        if position < 320:
            ser.write(b'a')
        else:
            ser.write(b'b')
        
    cv2.imshow('face', img)
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
cv2.destroyAllWindows()

 

示範影片

 

相關文章:

[LattePanda] 使用C# 來做藍牙4.0 iBeacon的門鎖系統

在學這篇教學前必須要先會一些事情,首先必須要會在Lattepanda上使用visual studio

(LattePanda 拿鐵熊貓教學:Arduino與Visual Studio環境設定)。

再來必須已經了解如何在visual studio裡使用C#控制Arduino的I/O

(LattePanda 拿鐵熊貓教學#1:LED 閃爍,使用Visual Studio)。

在這篇教學中會使用visual studio的C#來開發簡單的門鎖系統,一般在藍牙使用上都是使用藍牙傳輸資料,但在這篇是使用藍牙4.0中的iBeacon模式,在iBeacon模式中可以得知接收器與發射器的距離,而這個距離就可以當作我們決定要不要開門的條件,所以這樣連按按鈕的動作都可以省去。

作者/攝影  黃品叡
時間  3 小時 以上
難度  * * * * * * *
材料表
  • Lattepanda
  • USB to UART模組*1
  • HM-10模組(2個以上)*1
  • 電磁鎖*1
[請注意] 這邊教學是必須有一些基礎,首先前情提要中的Lattapanda上使用Visual Studio是基本,再來是必須要會開啟Window Forms C#、會使用基本的工具箱,並且可以編譯程式。最後是對於電路有基本的認識,能夠認識基本電路符號,並且能將簡單電路圖在麵包版上實現。

 

在這篇教學中分成硬體、軟體兩個部分,(1)硬體部分是電路的連接, (2)軟體部分是Visual Studio C#的程式撰寫。

 

(1)=====硬體部分:=====

在硬體連接的電路圖如下圖。

使用的有

  • 兩個<LED>燈(顯示門鎖是開啟還是關閉)
  • 一個12V的<LOCK>電磁鎖
  • 一個<USB to UART模組>
  • 兩個<HM10>的BLE模組,一個安裝至LattePanda,一個由使用者持有

下圖Lattepanda上左方USB孔上接上USB to UART模組(紅色),可接上HM10 BLE模組。

對應電路圖,接在麵包版上電路如下圖

整體看起來會是像下圖

換個角度再放一張圖,如下

在電磁鎖的部分基本上可以任意替換,在這裡我將它鎖在木板上,能夠表示他有鎖住或打開而已,其安裝後的圖如下(上方是一塊木板連結鐵塊,下面則是一個「ㄇ」字形的木板連結電磁鐵的線圈部分)。

(2)=====軟體部分:=====

我使用的程式開發環境是Windows 10、Visual studio 2017、C#,那我們就直接進入程式部分。

程式我分成(1)介面、(2)初始化、(3)Serial連接、(4)開啟backgroundWorker、(5)讀取iBeacon資訊、(6)iBeacon資訊解碼、(7)連結Arduino,這幾個部分。

1.介面

Form1中的介面配置如下圖

在最上面有一個textBox 命名為 textbox_door
中間是一個listView 命名為 listView_door
按鈕左邊是 button_connect
按鈕中間是button_findBeacon
按鈕右邊是button_loopFind
最下面的listBox 命名為 listBox_msg
在背景工具中有
serialPort 命名為 serialPort_beacon
backgroundWorker 命名為 backgroundWorker_findBeacon
timer 命名為 timer1

 

各個介面的命名可以參考下圖:

 

命名如果不一樣,請記得在程式中自行修改。

 

2.初始化

初始化的部分先從 include開始:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.IO.Ports; //serial
using LattePanda.Firmata; //Arduino

以上是所有要用到的namespace。

 

在全域變數裡:

Arduino arduino = new Arduino("COM3", 57600);
bool[] openlist = new bool[3];

(全域變數記得是寫在 class Form1 裡面,但是在一般函式外面)

 

在Form1()建構式裡:

public Form1()
{
InitializeComponent();
ColumnHeader header1, header2;
header1 = new ColumnHeader();
header2 = new ColumnHeader();

header1.Text = "--Time--";
header1.TextAlign = HorizontalAlignment.Center;
header1.Width = 90;
header2.Text = "--ID--";
header2.TextAlign = HorizontalAlignment.Center;
header2.Width = 70;

listView_door.Columns.Add(header1);
listView_door.Columns.Add(header2);

//which ID can open the lock
openlist[0] = false;
openlist[1] = true;
openlist[2] = true;

//arduino setting
arduino.pinMode(5, Arduino.OUTPUT);//pin of red LED
arduino.pinMode(6, Arduino.OUTPUT);//pin of green LED
arduino.pinMode(10, Arduino.OUTPUT);//pin of the lock

//set the door close first
doorOpen(false);
textBox_door.BackColor = Color.Red;
}

(這裡面設定了一些介面的東西,一些初始值還有門鎖狀態)

 

3.Serial連接

Serial 連接在C#中非常簡單,我是用一個按鈕,按下後連結Serial程式如下:

private void button_connect_Click(object sender, EventArgs e)
{
serialPort_beacon = new SerialPort("COM6", 9600, Parity.None, 8, StopBits.One);

if (!serialPort_beacon.IsOpen)
{
try
{
serialPort_beacon.Open();
listBox_msg.Items.Add("Connect");
}
catch
{
MessageBox.Show("Serial open error!");
}
}
else
listBox_msg.Items.Add("Opened");
}

 

(這個COM是USB to URAT晶片的COM角)

 

4.開啟backgroundWorker

首先是按鈕觸發尋找Beacon:

private void button_findBeacon_Click(object sender, EventArgs e)
{
//send DISC
string msgSend = "AT+DISI?";
byte[] buffer = System.Text.Encoding.Default.GetBytes(msgSend);
if (serialPort_beacon.IsOpen)
if (backgroundWorker_findBeacon.IsBusy != true)
{serialPort_beacon.Write(buffer, 0, buffer.Length);
backgroundWorker_findBeacon.RunWorkerAsync();
}
else
MessageBox.Show("already finding");
else
MessageBox.Show("Serial is close");
}

 

(在這裡是開啟一個backgroundWorker,而這裡只是單純地尋找一次Beacon而已)

若是要持續尋找,可以開啟一個timer來持續觸發,程式如下:

private void button_loopFind_Click(object sender, EventArgs e)
{
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
//send DISC
string msgSend = "AT+DISI?";
byte[] buffer = System.Text.Encoding.Default.GetBytes(msgSend);
if (serialPort_beacon.IsOpen)
if (backgroundWorker_findBeacon.IsBusy != true)
{
serialPort_beacon.DiscardInBuffer();
serialPort_beacon.Write(buffer, 0, buffer.Length);
backgroundWorker_findBeacon.RunWorkerAsync();
}
else
Console.Write("already finding");
else
MessageBox.Show("Serial is close");
}

(這裡開一個Timer讓我們可以每一段時間就開啟backgroundWorker)

 

5.讀取iBeacon資訊

這裡就是backgroundWorker裡所做的事情

private void backgroundWorker_findBeacon_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;

char[] buffer = new char[256];
string msg_read = "";
bool stringCheck = false;
//read data
byte loopCount = 0;

while (true)
{
if (serialPort_beacon.BytesToRead > 0)
{
//serial read to msg_read
serialPort_beacon.Read(buffer, 0, buffer.Length);
for (int i = 0; i < buffer.Length && buffer[i] != '\0'; i++)
msg_read += buffer[i];

//if msg_read end with "OK+DISCE" then stop reading
if (msg_read.Length > 8 && msg_read.IndexOf("OK+DISCE") != -1)
{
stringCheck = true;
break;

}
}
else
{
//timeout
System.Threading.Thread.Sleep(500);
loopCount++;
string dot = "";
for (int i = 1; i <= loopCount; i++)
dot = dot + ". ";

if (loopCount > 1)
this.Invoke((MethodInvoker)(() => listBox_msg.Items.RemoveAt(listBox_msg.Items.Count - 1)));
if (loopCount > 15)
break;
this.Invoke((MethodInvoker)(() => listBox_msg.Items.Add(dot)));
}
}

//if didn't read anything than prient "time out"
if (msg_read == "")
this.Invoke((MethodInvoker)(() => listBox_msg.Items.Add("Time out")));
else
{
if (stringCheck == false)
//if have read something but not iBeacon info
this.Invoke((MethodInvoker)(() => listBox_msg.Items.Add(msg_read)));
else
{
Tuple<int[], int[], int[], int> result = deCodeDISI(msg_read, 2);
this.Invoke((MethodInvoker)(() => listBox_msg.Items.Add("minor : " + result.Item2[0].ToString())));
this.Invoke((MethodInvoker)(() => listBox_msg.Items.Add("RSS : " + result.Item3[0].ToString())));
//if is close enough and it's in open list then open the lock
if (result.Item3[0] > -40 && openlist[result.Item2[0]] == true)
{
this.Invoke((MethodInvoker)(() => textBox_door.BackColor = Color.Green));
ListViewItem item1 = new ListViewItem(DateTime.Now.ToShortTimeString());
item1.SubItems.Add(result.Item2[0].ToString());
this.Invoke((MethodInvoker)(() => listView_door.Items.Add(item1)));
doorOpen(true);
}
else
{
this.Invoke((MethodInvoker)(() => textBox_door.BackColor = Color.Red));
doorOpen(false);
}
}
}
}

 

(這裡的程式包含好多東西,上半部分是在處理Serial read的問題,並且在讀取中有動態的「…」做顯示,若沒有收到資料則會有「time out」的資訊出現。下半部分是將得到的資訊做判斷,判斷要不要開門)

 

6.iBeacon資訊解碼

這裡是「deCodeDISI」副函式的程式部分:

private Tuple<int[], int[], int[], int> deCodeDISI(string serialData, int maxDiviceCount)
{

//OK+DISIS  OK+DISC : Factory ID : iBeacon UUID : Major+Minor+Measured : MAC : RSSI  OK+DISCE
//OK+DISISOK+DISC:4C000215:74278BDAB64445208F0C720EAF059935:11110001C5:88C25532ED1E:-032OK+DISCE

string DataRemain = serialData;
int[] FactoryID = new int[maxDiviceCount];
string[] UUID = new string[maxDiviceCount];
int[] Major = new int[maxDiviceCount];
int[] Minor = new int[maxDiviceCount];
string[] MAC = new string[maxDiviceCount];
int[] RSSvalue = new int[maxDiviceCount];
DataRemain = DataRemain.Substring(0, serialData.IndexOf("OK+DISCE"));
int count = 0;
while (true)
{
int findNum = DataRemain.IndexOf(":");
if (findNum == -1)
{
Console.Write("deCode done!");
break;
}
else
{
//Factory ID (length 8)
string FactoryID_str = DataRemain.Substring(findNum + 1, 8);
DataRemain = DataRemain.Substring(findNum + 9);
FactoryID[count] = Convert.ToInt32(FactoryID_str, 16);

//iBeacon UUID
findNum = DataRemain.IndexOf(":");
string UUID_str = DataRemain.Substring(findNum + 1, 32);
DataRemain = DataRemain.Substring(findNum + 33);
UUID[count] = UUID_str;

//Major
findNum = DataRemain.IndexOf(":");
string Major_str = DataRemain.Substring(findNum + 1, 4);
DataRemain = DataRemain.Substring(findNum + 5);
Major[count] = Convert.ToInt32(Major_str);
//Minor
string Minor_str = DataRemain.Substring(0, 4);
DataRemain = DataRemain.Substring(findNum + 4);
Minor[count] = Convert.ToInt32(Minor_str);

//MAC
findNum = DataRemain.IndexOf(":");
string MAC_str = DataRemain.Substring(findNum + 1, 12);
DataRemain = DataRemain.Substring(findNum + 13);
MAC[count] = MAC_str;

//RSS
findNum = DataRemain.IndexOf(":");
string RSS_str = DataRemain.Substring(findNum + 1, 4);
DataRemain = DataRemain.Substring(findNum + 5);
RSSvalue[count] = Convert.ToInt32(RSS_str);

count++;
}
}

return Tuple.Create(Major, Minor, RSSvalue, count);
}

(這就是解碼iBeacon的資訊的部分)

 

7.連結Arduino

跟Arduino的部分非常簡單,只有控制I/O的部分,D10腳位控制繼電器、D5控制紅色LED、D6控制綠色LED燈,副程式如下:

private void doorOpen(bool open)
{
if (open == false)//door close
{
//lock the door and red LED on
arduino.digitalWrite(10, Arduino.HIGH);
arduino.digitalWrite(5, Arduino.HIGH);
arduino.digitalWrite(6, Arduino.LOW);
}
else//door open
{
//unlock the door and green LED on
arduino.digitalWrite(10, Arduino.LOW);
arduino.digitalWrite(5, Arduino.LOW);
arduino.digitalWrite(6, Arduino.HIGH);
}
}

 

軟體部分就是以上程式了,其中包含了非常多的細節,像是處理Serial的部分,或是執行續(就是backgroundWorker)裡的處理,為什麼用Invoke,Tuple的用法,解碼的處理…等,這些初學的話建議複製副函式,直接用就好,裡面是什麼等對於程式更清楚後再慢慢回來看。

而當然這些副函式並不能稱作完美,例如並沒有對於不完整的iBeacon資訊做處理的地方,只有稍微確認,和在資訊結尾做非常簡單的處理,在這裡主要就是帶大家入門,在深入的部分,就請大家自己研究瞜~

 

 

相關文章:

 

[LattePanda] 使用Weather API、Google 雲服務打造氣象預報機器人

本文說明如何使用 LattePanda搭配 python語言去使用雲服務來打造一個簡單的氣象預報機器人。

作者/攝影 袁佑緣
時間  1小時
成本
  • LattePanda = 5,950
  • 螢幕
  • 鍵盤
  • 滑鼠
  • 喇叭
  • 麥克風
難度  * *
材料表
  • LattePanda = 5,950
  • 螢幕
  • 鍵盤
  • 滑鼠
  • 喇叭
  • 麥克風

 

本文說明如何使用 LattePanda搭配 python語言去使用雲服務來打造一個簡單的氣象預報機器人本範例的操作環境是以LattePanda的Windows10為主如果想要一般的PC上操作也可以另外對於linux與mac os的使用者建議用您的系統的軟件管理員來安裝以下的程式套件。

 

  1. 安裝python3 https://www.python.org/downloads/windows/記得在安裝時要選擇將python加入系統變數喔

  1. 執行Windows命令列

按下”win+R”的快捷鍵並輸入cmd便會叫出windows的命令提示字元 如果是windows10的使用者建議改輸入powershell。

 

  1. 安裝python套件

請在命令列中輸入以下的指令

pip install SpeechRecognition pyaudio python-forecastio gtts

  1. 從github上下載本專案 https://github.com/YuanYouYuan/weather-bot

  1. 從下列網址中下載mpv播放器如果您想要用windows media player也是可以但是要記得在第6步中程式碼修改播放器的檔案位置。

mpv 下載網址 https://mpv.srsfckn.biz/

如果您無法解壓縮7z檔案可以從以下的網址中下載7z的解壓縮安裝檔。

7z安裝檔下載網址 http://www.developershome.com/7-zip/

最後請記得將解壓縮後的mpv.exe移動到剛剛從github下載並解壓縮的專案資料夾中。

  1. 執行程式碼

請點開本專案資料夾並用python IDLE編輯器打開weather-test.py

請將裡面的api_key改成你在darkskyhttps://darksky.net/dev/上取得的api key。

請註冊一個新的帳號並取得一個weather api key。

本專案程式碼 weather-test.py

# This version is for windows, and there must be a mpv application in this work directory

import forecastio 引入python氣象互動函式庫from gtts import gTTS 引入google文字轉語音函式庫import subprocessapi_key = 'Enter your api key' 請輸入您的api key

# the following coordinate is Taipei/Taiwan
lat = 25.0391667 #在此您可以設定所要查詢的地點的經緯度
lng =  121.525
lang = 'zh-TW' 設定語言為繁體中文
file_name = 'weather.mp3'
player = './mpv' #設定播放器為mpv

forecast = forecastio.load_forecast(api_key, lat, lng)

by_hour = forecast.hourly()

for data in by_hour.data:
    text = '在' + str(data.time) + '氣溫是' +  str(data.temperature) + '度西' 取出預報時間與氣溫
    print(text)
    tts = gTTS(text, lang) 
    tts.save(file_name)
    subprocess.call([player, file_name]) 啟動一個子程序來播報氣象預報音檔

7.youtube影片範例

  1. 延伸應用

如果您想要再玩玩更多進階的功能可以參考python-forecastio的github網站裡面有詳細的說明跟應用比如說想要知道當下的氣溫、或者是知道今天的氣象概況甚至還能做到降雨率的預報有興趣的朋友不妨去試一試吧

 

相關文章:

[LattePanda] 從零開始教學,在LattePanda上使用Python與Arduino來控制meArm機械手臂

本文章將帶領讀者從基礎開始,到學會用在LattePanda上面使用Python跟內建的Arduino Leonardo來控制機械手臂,想學習Python圖控界面,與Arduino的Serial溝通,或者是機械手臂的介紹的朋友不妨來看看本篇教學文喔!

作者/攝影 袁佑緣
時間  3小時
成本  約1,850(不含LattePanda)
難度  * * * * *
材料表

1.Python的環境安裝

首先請到python的官網(https://www.python.org/downloads/windows/)下載最新版的安裝檔,在這邊要提醒一下python目前有兩種版本,一個是2.7x版,另一個3.x版,2.7x版python是比較舊的版本,同時官方也有發出聲明將不會在繼續更新了,而本篇的範例使用的是新版3.x的python,所以請讀者注意一下不要選錯囉。

以筆者為例,最新的Python版本是3.6.1,以及LattePanda是64bit版本的,所以點選Windowsx86-64-excutable installer,如下圖。

接下來請記得在安裝python的時候將下方”Add Python 3.6 to PATH”勾選起來,意思是要把python加入windows的環境變數內。

安裝完後,為了測試我們的電腦是否能正常呼叫python,請呼叫您電腦的終端機,windows的使用者請按下快捷鍵”win+R”便會在左下角顯示執行視窗,接著輸入”cmd”,這樣一來就會叫出windows的命令提示字元,如下圖。

命令提示字元(command prompt)

接下來請輸入”pip install matplotlib”,使用python的套件管理員pip來安裝matplotlib這個套件。

接下來請輸入”pip install pyserial”,使用python的套件管理員pip來安裝pyserial這個套件。

接下來為了要讓讀者方便開發python的程式,請到以下的網站(http://thonny.org/)下載並安裝Thonny這個python IDE。

2.Arduino 環境準備

請到官網下載最新板的Arduino IDE,下載網址請點這裡。以筆者為例,最新版本的Arduino IDE為8.2板,因為LattePanda上面運行的Windows10,所以請記得點選windows版的IDE來下載,另外為了不覆蓋到LattePanda系統原本舊版的Arduino,請點選”Windows ZIP file for non admin install”。

想直接下載的話請點選JUST DOWNLOAD,當然如果行有餘力的話也可以給予Arduino一些贊助喔!

最後解壓縮完成之後,點開Ardunio的資料夾執行IDE的程式即可。

另外,為了要控制LattePanda內建的Arduino Leonardo,必須將控制板選為Arduino Leonardo。

Arduino IDE在上傳程式碼的時候,需要選擇對應的port(連接埠)才能上傳到控制板上,如下圖,請選擇有Arduino Leonardo的COM port。

 

3.執行本專案的程式碼

請在Arduino IDE 上面完成以下的程式碼。

#include <Servo.h> // 引入Arduino控制伺服馬達的函式庫

Servo s[4]; // 建立一個長度為4的servo物件

// 宣告收到Serial的訊息與長度
int  data;
size_t data_size = sizeof(data_size);

void setup()
{
    Serial.begin(115200); // 將Serial的鮑率設定為115200
    
    // 將4個servo對應到以下4個Arduino腳位
    s[0].attach(7); 
    s[1].attach(8);
    s[2].attach(9);
    s[3].attach(10);
}


void loop()
{
    // 如果從Python圖控界面收到的資訊是s開頭,則檢視下一個字元
    // 是指定哪一個伺服馬達(0~3號)
    // 最後再接收一4個bytes的整數,作為馬達要轉到的角度(0~180度)
    if(Serial.available())
        if(Serial.read() == 's')
        {
            int servo_number = Serial.read() - '0';
            if(servo_number < 4 && servo_number >= 0)
            {
                Serial.print("Servo number: ");
                Serial.println(servo_number);

                while(Serial.available() < data_size);
                Serial.readBytes((char*)&data, data_size);
                Serial.println(data);
                s[servo_number].write(data);
            }
        }
}

上傳Arduino程式碼

請先確認您的Arduino IDE是否有按照2. Arduino環境設定,將Arduino Leonardo的板子與連接埠都選擇正確,並按下快捷鍵<Ctrl+U>或者是如下圖點選上傳的箭頭來上傳程式碼。

打開Thonny,完成以下的Python程式碼。

# matplotlib是用來顯示GUI的函式庫
# serial則是用來跟Arduino溝通的函式庫
# struct跟pack則是在Serial傳輸資料時,打包資訊會用到的工具
from matplotlib.widgets import Slider 
import matplotlib.pyplot as plt
import serial
from struct import pack

# 在連接埠COM8建立一個鮑率為115200的Serial
# 這裡要提醒讀者,記得要把COM8改成您LattePanda上的COM port
ser = serial.Serial('COM8', 115200, timeout=0)

# 定義一個函式,將會根據i(馬達/拉桿編號),回傳指定的函式
def send_ith(i):
    def send(val): # 定義一個函式,用來送出控制馬達角度的訊號
        data_header = bytes('s' + str(i), 'UTF8')
        data = int(val)
        ser.write(pack('<2si', data_header, data))
    return send


# 初始化伺服馬達控制拉桿的圖形化界面以及其對應的函式
a = []
s = []
for i in range(4):
    a.append(plt.axes([0.2, 0.2*(4 - i), 0.6, 0.07]))
    s.append(Slider(a[i], 'Servo' + str(i+1) + ' ', 0, 180, valfmt = '%d', valinit = 90))
    s[i].on_changed(send_ith(i))

plt.show()

執行Python程式

請在Thonny IDE上,按下快捷鍵<F5>或者是點選下圖中的播放鍵來執行Python

如果在執行Python時遇到如下的錯誤,那有可能是您的COM port沒有設定正確,請回去看一下2. Arduino 環境設定那一步中的COM port,並把正確的port輸入上面Python程式碼中。

成功執行後,就可以看到一個簡單的Python互動界面,讀者可以透過上面的拉桿來操控四個伺服馬達各別的角度。

4.接上機械手臂,來動手玩玩看吧

完成上述的步驟後,我們就可以來執行最後的實做部份了,本次範例所使用的機械手臂是有名的開源機械手臂meArm,上面有4個伺服馬達,一共有四個自由度,然後因為特殊的平行連桿機構,最尾端的夾爪會一直保持水平,方便機器夾取物件,加上使用壓克力平板與螺絲螺帽就能輕易組裝,是一個相當好入門的教育套件,接下來我們就來看一下要如何完成電路的連接吧。

LattePanda與機械手臂的接線如下圖,由於本範例所使用的Arduino腳位是7, 8, 9, 10,所以請按照官方給的腳位圖接上去(紅圈的部份)。

特別注意,為了保護馬達與電路系統,電源的部份請最後再接上去。

電路接線圖

LattePanda腳位圖

 

完成圖

上視圖

 

相關文章:

 

[LattePanda教學] lattepanda + Azure #2 上傳類比資料到Azure IoT hub

作者/攝影  曾吉弘
時間  3小時
成本  Lattepanda
難度  * * * * *
材料表
  • 個人電腦 (作業系統可用 Windows, Mac OSX 與 Linux,本範例使用 Windows 7)
  • Lattepanda Windows 單板電腦

請參閱 [LattePanda教學] lattepanda + Azure #1 環境建置] 本文將介紹如何上傳類比資料(電位計)到Azure IoT hub,並可在 Visual Studio 與 Power BI 中檢視資料。

環境建置

硬體

在此有兩種做法,使用 Lattepanda 感測器套件 中的 Analog Rotation Potentiometer sensor 接在 Lattepanda 上的 Gravity 4號接腳上,請參考下圖:

或採用一般的電位計,中央腳位接到 Lattepanda A0腳位,另外兩隻腳一端接 5V,一端接GND即可,完成如下圖:

Lattepanda Arduino

 

請上傳StandardFirmata Lattepanda Arduino 晶片中,別忘了 Board 要選 Arduino LeonardoCOM port 請根據 Windows裝置管理員為準,本程式中為 COM4

Lattepanda Windows端:

請用 git client 下載 azure iot sdk,請安裝 Windows git 工具之後在 powershell (cmd + r 之後搜尋 powershell )下執行以下指令把檔案下載到 lattepanda。在此我們預設的路徑皆為 C:\Users\Lattepanda:

git clone https://github.com/Azure/azure-iot-sdks.git

完成之後在其中的 /build 資料夾中找到 dev-setup.cmd,點擊兩下即可開始安裝程序。安裝完成之後可在同路徑下看到多了一個 node_modules 資料夾。

安裝Node.js所需套件

請在powershell 中執行以下指令,johnny-five serialport 這兩個是我們在 app.js 中會用到的套件:

npm install johnny-five serialport

 

建立Azure storage

Azure Storage

Azure Storage 是微軟所提供的雲端儲存方案,提供不同客戶在耐用性、取得性以及規模彈性上的各種需求,大到科學、金融用的數百TB以上資料,小到個人網站,都可在此完成。

請登入Azure portalNew -> Storage -> Storage account。並根據以下參數來建立 Storage account:

Name:自行取一個名稱,在此為 cavedu

Storage service ecryption: Disabled

Subscription: Free Trial (根據您帳號而定)

Resource group: Create new 或 USe existing 都可以,在此我建立一個新的: cavedu

location: 根據您所在地,在此我選 East Asia

建立完成後會看到以下畫面,請注意右下角的 URL 要記起來,後續與 Power BI 連接時會用到

Settings / Access Keys 下面的 key1 / key2也記起來,請任選一組輸入在後續要執行的程式中。

程式說明

Lattepanda Arduino

請確認 StandardFirmata 程式已經上傳 Lattepanda Arduino 晶片並執行,如果不確定的話可以再上傳一次或按下板子上的 Reset 鈕讓 Arduino 晶片重新執行程式。Arduino端程式一定要先執行,後續 app.js 去呼叫 Arduino COM port 時才可正常運作,否則就會顯示錯誤訊息。

Lattepanda Windows

請開啟power shell,切換到您解壓縮 azure-iot-sdk的資料夾下,(我們的路徑是 C:\Users\lattepanda),使用您喜歡的編輯程式建立一個名為 app.js 的檔案並貼入以下內容。您只要修改 accountNameaccountKeytableName這三筆資料即可,如下圖:

app.js

var azure = require('azure-storage');
var five = require('johnny-five');

var accountName = 'XXX'; // Enter your Azure storage account name
var accountKey = 'OOO'; // Enter your Azure storage account key
var tableName = 'MyLightSensorData'; // Name of your table to store the light sensor data

var arduinoPort = 'COM4';// Enter your Arduino Port

var tableService = azure.createTableService(accountName, accountKey);

if (CreateTable()) {
InitializeBoard();
}

// Create a table in Azure storage
function CreateTable() {
tableService.createTableIfNotExists(tableName, function (error, result, response) {
  if (error) {
    console.log(error);
    return false;
  }
});
return true;
}

// Initialize the Arduino board with Johnny-Five
function InitializeBoard() {
var board = new five.Board({ port: arduinoPort });

board.on('ready', function () {
  lightSensor = new five.Sensor({
    pin: "A0",
    freq: 30000 // 上傳間隔30秒
  });

  lightSensor.on('change', function () {
    InsertValue(this.value);
  });
});
}

function InsertValue(value) {
console.log('Value to insert: ' + value);

//建立一個實體,將光感測器值與日期存在資料表中
var entGen = azure.TableUtilities.entityGenerator;
var entity = {
  PartitionKey: entGen.String('Light'),
  RowKey: entGen.String(String(Date.now())),
  intValue: entGen.Int32(value),
  dateValue: entGen.DateTime(new Date().toISOString()),
};

//將實體插入Azure storage table
tableService.insertEntity(tableName, entity, function (error, result, response) {
  if (error) {
    console.log(error);
  }
});
}

 

執行與檢視資料

請在powershell 下切換到您的您解壓縮 azure-iot-sdk的資料夾下(我們的路徑是 C:\Users\lattepanda),執行以下指令來執行程式。 /XX 資料夾之後執行以下指令:

node app.js

即可看到以下畫面,由console中可看到程式已經陸續上傳多筆資料了。後續我們會在 VisualStudio 中檢視您所上傳的資料。

回到 Azure portal 的 storage acount,在左側選單中找到 Activity log選項,可以看到方才執行的動作。

在 Visual Studio中檢視資料

開啟VisualStudio時,請點選Connect to Azure並用您的Azure帳號登入。

在工具列的 View 中,點選 Server Explorer

登入您的 Azure 帳號之後,即可在 Storage 選項中找到您所建立的 Table 名稱(MyLightSensorData),點選即可看到資料喔!

在PowerBI中檢視資料( 選用)

Power BI 是微軟提供的商務分析工具套件,可用來分析資料及共用深入資訊。透過自行定義或預設的儀表板模組,使用者可以匯入、分析並取得資料中的重要資訊,協助決策。

登入Power BI 之後,您可以在此檢視 Azure storage 中的資料,就是上述我們所執行的程式結果。請點選下圖的 [取得 資料庫],並登入您的 Azure 帳號再輸入您的 server 路徑以及資料庫名稱,完成之後即可看到同一筆資料了

參考資料:

 

  1. 建議使用powershell,開啟方法:win+R快捷見,然後輸入powershell就可以開啟了
  2. 建議使用git,下載網址:https://git-scm.com/download/win

Git – Downloading Package

The entire Pro Git book written by Scott Chacon and Ben Straub is available to read online for free. Dead tree versions are available on Amazon.com.

git-scm.com

  1. 打開powershell,cd 到你想裝的地方,預設是直接在使用者的家目錄,然後輸入git clone https://github.com/Azure/azure-iot-sdks.git

Azure/azure-iot-sdks

azure-iot-sdks – SDKs for a variety of languages and platforms that help connect devices to Microsoft Azure IoT services

github.com

  1. 根據教學文它需要把其中node的submodule一併裝進來,所以輸入:git submodule update –init — node

這樣就搞定了

 

相關文章:

 

[LattePanda教學] lattepanda + Azure #1 環境建置

作者/攝影  曾吉弘
時間  3小時
成本  Lattepanda
難度  * * * * *
材料表
  • 個人電腦 (作業系統可用 Windows, Mac OSX 與 Linux,本範例使用 Windows 7)
  • Lattepanda Windows 單板電腦

本文說明如何在lattepanda上建置 Azure IoT 相關環境,包含:

  1. 下載相關檔案
  2. 安裝Visual Studio 2015
  3. 設定Azure portal 與 Storage acount

STEP 1 下載相關檔案

接下來要說明如何建置Microsoft Azure IoT SDK for Node.js的開發環境(您也可以採用C#來開發 Azure 相關應用,後續我們會專文介紹)請根據以下步驟操作:

  • 安裝 Node.js http://nodejs.org/,您可在 cmd 中用這個指令檢查 Node.js的版本,本專案需要 0.12.x 以上:node –version
  • 在cmd下輸入 node 進入 Node.js command prompt,切換到方才從 github 下載並解壓縮的 azure-iot-sdks /node 資料夾中。請執行 build\dev-setup.cmd 完成環境建置,如下圖:

STEP2 設定微軟IoT Hub

  接下來將介紹如何在 Azure 中建立一個 IoT hub,接著讓您的裝置與 IoT hub 完成介接,兩者即可通訊了。

建立一個IoT hub

  請由 Azure Portal 建立一個可用於您裝置(Lattepanda或其他聯網裝置)的IoT hub。

  1. 登入Azure Portal,如果尚未具有帳號的話請申請一個。
  2. 請點選左上角的[+ New] -> Internet of Things,由畫面右側找到Azure IoT Hub

3.這時需要新增訂閱帳戶,在此請先點選 Free Trial 為期一個月的免費試用方案,日後您可根據個人需求選擇合適的付費方案。請注意,Free trial 一樣須完成電話號碼與信用卡認證,但Free trial 不會向您收取任何費用。

4.New IoT Hub視窗中輸入相關訊息,打*者代表必填欄位,完成如下圖。

  • Name:幫您的IoT hub取個名字吧,系統會自動檢查您希望的名稱是否可用,以綠色勾勾表示。
  • Pricing and scale tier:使用預設的S1 – Standard 即可。
  • Resource group:您可建立新的資源團體或選擇既有的。請參考 Using resource groups to manage your Azure resources
  • Location :請選擇您所在地區即可。

5.IoT hub設定好之後請點選Create ,在此須等候一小段時間。完成之後即可在Azure portal 看到它,您可以自由更改 protal 上各元件的位置。

6.建立好IoT hub之後,點選它,記下右上角的 hostname URI(例如下圖的 lattepanda.azure-devices.net )之後點選左側選單的 Shared access policies.

7.在Shared access policy中,選擇iothubowner(代表我們需要 registry write, service connect 與 device connect 等最高權限),最後把最右側的 Connection string (HostName=lattepanda.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=OOOXXX 這一大串) 記下來,後續會用到。

STEP3: 安裝Visual Studio

STEP4: 設定Azire Storage account

請由此申請一個 Azure Storage Accout(https://azure.microsoft.com/en-us/documentation/articles/storage-create-storage-account/#create-a-storage-account  ,需登記信用卡,但在此不會收取任何費用)

IoT hub建立完成了,上一部的connection string 需搭配 iothub-explorer 或 Device Explorer工具來使用。這個字串可讓外部應用程式在IoT hub 上執行相關的管理動作,例如在 IoT hub 上新增裝置。

STEP3: 安裝Visual Studio

STEP4: 設定Azire Storage account

下一篇將告訴您如何將 Lattepanda 的類比腳位資料上傳到 Azure IoT hub,您可在這個腳位上使用電位計、光敏電阻或彎曲度電阻等類比元件。  

 

相關文章:

 

[LattePanda拿鐵熊貓 ] 簡單使用LettePanda遠端遙控3D列印機不求人

現今有很多人喜歡新玩意,我也一樣,3D印表機玩過的人應該不少,可是總是被綁死在機器旁有點討厭,列印時間不像普通印表機,只是印張紙,速度快,3D列印動不動就算小時的,實在會讓人發瘋,不過配合我剛搞到的小寶貝,我想應該可以實現脫離苦海的願望,小寶貝是LattePanda拿鐵熊貓,本文之後就叫它熊貓吧!

跑WIN10作業系統,那我想應該安裝印表機操控軟體不是啥問題吧!

作者/攝影  陳煜倫
時間  8小時至12小時
成本
難度  * *
材料表
  • LattePanda 4G/64GB(主板)
  • LattePanda 7-inch 1024 x 600 IPS Display(7吋顯示器)
  • LattePanda 7-inch Capacitive Touch Panel Overlay for Display(7吋覆蓋電容觸控板)
  • 自製壓克力支撐板數片

 

LattePanda 3D印表機遠控操作測試

現在幾乎所有外接裝置都採用USB接頭,剛好熊貓身上有3個,2個2.0接頭,1個3.0接頭,為了操控所有我想操作的印表機,我加了個USB HUB,還有開關的喔!雖然我一點都不知道如何使用開關,不管,至少看起來很漂亮。

 Step.1

首先要做出來就要有想法,個人這次的作法是希望用chrome中的遠控功能,為何選這個呢?取得容易,連線問題少,這是我的選擇,無論如何,看看先要怎麼做吧!

開啟瀏覽器後右上角先將帳號登錄,再來有兩個方式,一是擴充,二是Google play這兩個安裝後的東西不太相同。(本次犯利用的是擴充功能)

這就是Google Play下載的地方

這個是擴充功能下載的地方。

下載之後直接就能安裝,安裝完成後。

在Chrome的工作管理員中就能看到了。

接下來有兩種連線方式,上面是臨時的,也就是兩台電腦都有人,算是種求助,下面的算是永久的,但是只能是自己的,也就是要登入同一個帳號。

 

連線後就能在視窗上操控遠端電腦了。

連線之後就會是這樣的情況,再來就是實際操縱印表機了,這段因為需要觀察互動,實在不得已只好拍了個影片,希望不會影響各位看文章學習的進度。

遠控連線成功!

V1

再來遠端切層也沒問題。

不過切的時候進度條看起來有點奇怪。

我想幾張照片可能看不太出來,所以我們就將操作影片放上來,基本上都是利用遠控的功能按下列印鍵。

閃鑄是使用MakeBot的軟體來操作,ATOM是使用Cura的軟體,原本這兩個機器我們都是使用SD Card方式列印,不過在遠端列印的時候不太可能使用SD Card畢竟換卡這件事有點難度,所以我們回到最原本的列印方式USB連線列印。

各位可以看到影片中將已經切層好的圖檔以遠端操控的方式啟動列印。

遠控印表機成功!

ATOM

印匠

閃鑄

Ideawork

 

完成了,所以我們是不是就可以脫離守候在印表機旁的窘境了呢?當然啦!若有預算也能在熊貓身上裝個眼睛(攝影機),那除了延遲的情況外應該就很完美了。這樣就能靠寶貝熊貓幫忙守護印表機了^_^。

不過附帶一提,這款遠端控制是針對滑鼠的控制動作,想要打字的話可能要叫出螢幕鍵盤,不過無論如何依然是能夠遠端解決一切問題的。

其實市面上有很多種遠端控制軟體,個人的標準是只要免費又好用就行了,眼尖的人可能有發現其實我用了不只一種方法實驗,但是狀況都很OK才推薦的喔。

 

相關文章:

[LattePanda評測] 哪一些常用軟體可以跑在小電腦LattePanda上

也許你曾經聽說過有人用樹梅派製造個人電腦,可是那一般人不習慣用,有人說它可以取代很多電腦的作用,可是它用的軟體你都沒聽過。所以那是工程師在玩的,我想大部分的人應該是這樣想的吧!

可是一樣的體積,差不多的價格,如果能跑WIN10呢?而且它與樹梅派一樣都具備了開發板的作用,但是它保證更親切,因為它使用的軟體就是我們平常在WINDOWS系統下用的那些,我個人更看重的是跑個3D繪圖也沒問題喔。

這樣親切的東西,當然也有個親切的名子LattePanda(拿鐵熊貓) ,真的有這麼神嗎?我們來試試看吧!

作者/攝影  陳煜倫
時間  8小時至12小時
成本
難度  * *
材料表
  • LattePanda 4G/64GB(主板)
  • LattePanda 7-inch 1024 x 600 IPS Display(7吋顯示器)
  • LattePanda 7-inch Capacitive Touch Panel Overlay for Display(7吋覆蓋電容觸控板)
  • 自製壓克力支撐板數片

 

LattePanda軟體安裝測試

 

上圖是LattePanda的版面配置示意圖,為了方便,我們在本篇文章就叫它熊貓吧!

它看起來就是個開發板的樣子,該有的通通都有,這個圖是官網的,基本上看圖應該就能知道裝了什麼,真的是熊貓雖小五臟俱全阿(真熊貓似乎不小!?)。

我想各位一定想知道能跑WIN10那會順嗎?卡死的話跑啥就沒意義了!所以我們今天準備些軟體來惡整熊貓,相信經過這裡的殘酷擂台後出來的結果比較能說服大家。

當然我們會以用開發板的角度去選軟體,至於選啥?就原諒我的任性吧!

 

今天我們想要測試的軟體如下:

編號軟體名稱順暢度
1Google Chrome(瀏覽器)*****
2123circuit(電路設計)*****
3Appinventor(安卓app開發)*****
4Scratch網路版(程式開發軟體)*****
5FACEBOOK(非死不可,應該沒人不懂)*****
6LINE(社交軟體)*****
7Arduino(常見開發板軟體)*****
8Fritzing(電路設計)***
9Designspark pcb(電路設計)***\
10Designspark mechanical(3D繪圖)*****
11AutoDesk 123D Design (3D繪圖)*****
12LEGO Ev3 程式軟體(樂高機器人控制程式)*****
13Scratch離線版(程式開發軟體)*****
14Word(微軟的)*****
15Excel(微軟的)*****
16PowerPoint(微軟的)*****
17visual studio(程式開發軟體)***

▴(❊ 代表1星、\代表0.5星)▴

答案先告訴各位了,這是為了趕時間的客官,但還是希望大家能繼續看下去。

上述的順暢是指與2萬元以下文書型筆電的比較,差不多那就是3❊,若有超越酌量加分,但總分也只有5❊,5❊已經代表跟桌機沒啥分別了。

這些軟體雖然並不能代表所有電腦的能力,但是這些應該有些許代表性,就讓我們開始燒熊貓吧!

Step1.

第一個上場的十分簡單,只是個瀏覽器,相信基本上能跑WIN10的東西對這不會有問題。

很簡單完成,順暢度我給5❊,簡單又沒負擔。

 

Step2

既然裝了瀏覽器,就來試驗一下各個線上版的軟體吧!

123circuit、Appinventor、Scratch網路版

畫個簡單電路

我以前寫的簡單BMI計算程式

讓小貓往前走幾步

 執行轉檔也沒問題喔!

雖然說跑起來沒啥問題,可是畢竟是觸控螢幕,用觸控手指太大,裝了滑鼠鍵盤後好用點。

這三個大概跟頻寬限制比較有關,我給的頻寬算足夠,所以也沒出啥問題,跟桌機沒區別,所以順暢度也給5❊。

 

Step3

相信這時代大多數的人都有使用社交軟體的經驗,所以就拿個人有在使用的來試試。

基本上開啟連線後都沒啥問題,各位可能也有發現我下面開啟一大堆程式,而且測試過程中我也一直在操作3D印表機,無論如何CPU跟記憶體的起伏都不大。既然跟桌機比較沒有差距,所以順暢度依然5❊

 

熊貓身上本來就有Arduino,我呢就偷個小懶,用阿吉老師的範例玩玩。

LattePanda 拿鐵熊貓教學#1:LED 閃爍,使用Visual Studio

不過我沒啟動Visual Studio控制,畢竟我只是要測試Arduino軟體嘛!

熊貓身上跟所有開發板一樣都有LED13不過太小看不太出來,所以用了外接比較明顯。

這就是阿吉常強調的,按圖施工保證成功。

不過呢,這本來就是熊貓的本業,當然超順的啦!順暢度沒有超過滿分的,所以也給5*。

 

Step5

我想列表中有兩個離線電路設計軟體,就一起來試試吧!


開啟時間似乎只能跟文書筆電相比。

移動時有點小不順,當然或許跟我同時執行項目較多有關係。

看到了嗎?還控制了兩台印匠。

這款好點,不過依然只能用來跟文書筆電比較,所以Fritzing順暢度我只能給3*,算是堪用啦! Designspark pcb表現好一點,但是好不到哪去,所以我給3.5*。

 

Step6

接下來搞個我認為比較吃重的吧!繪圖軟體,Designspark mechanical、AutoDesk 123D Design,問我為啥挑這兩個嗎?成本考量,它們是免費的阿。

雞年快到了,畫隻小雞吧!

畫個之前教的齒輪也沒啥問題。

搞個陣列也沒問題喔!

這部分有點出乎意料,跟筆電比起來沒有差距,甚至更好。當然比不上桌機啦!關於這點,我有專門去光華問過原因,一般來說電玩繪圖卡跟專業繪圖卡是不同的,若是安裝一般電玩繪圖卡,因為計算方式的問題可能算錯,或甚至速度比不上主機板上的晶片。我想這或許就是3D繪圖軟體不是很吃重的原因吧!

這兩個軟體以順暢度來說非常接近筆電,甚至可以說比我現在用的筆電還強XD,但是畢竟不是專業級的,不能用桌機的品質來要求它。另外一提mechanical在小雞轉檔成STL時有當機情形,但把小雞傳回筆電一樣當機,結果把精細度降低一些就可以順利轉檔,但不知是不是桌機也會這樣。所以以繪圖順暢度來說真的沒得挑了,所以我依然給5*。

Step7.

再來搞點看得到[動]的軟體,那就是EV3啦!

EV3可能不一定所有人都知道,但LEGO應該就是眾所皆知吧,EV3就是LEGO機器人的控制程式。

照片可能比較難看出運轉情形,但有看到左下方的輪胎有點模糊吧!

當然這只是個小動作,沒理由達不成的,既然完全順利,那順暢度當然是5❊了。

 

Step8

再來剩下的軟體不多了,來個簡單的,Scratch離線版吧!

連線版基本上是可以的,那離線版應該也不會有問題吧!所以完全通過,順暢度當然是5❊。

 

Step9

剩下的基本上都是微軟的東西,那我們就把三個文書的一起做作吧!

用WORD寫寫小文章OK的,很合理的動作。

我想這個動作正常的電腦都能完成(熊貓好像不算正常的電腦…..)

Excel既然是用來計算的,總不能沒計算功能吧! 來個萬年曆吧!

(這個簡單的表格是我自己改版多次後的結果,或許有人有學過,也或許有人有更精簡的寫法,也歡迎指教,改一個日期就能全部跟著動喔。)

看到上面函式視窗中的內容吧!這是個人喜歡的簡單寫法,看得懂的就送給各位吧!

PowerPoint剛好之前有用到,就直接拿來試試看,無論是編輯還是撥放都難不倒。

所以文書三人組也完全過關,順暢度5❊。

 

Step10

還剩下些什麼?只剩下兩顆冰凍的眼淚。不對…..那是歌詞,剩下的這個應該也算是熊貓的本業,可是說真的把它放在最後其實是有點擔心它。為啥呢!因為雖然它算本業,可它非常龐大阿,就算跑得動好了,可是我也怕空間被塞爆阿。

花了好多時間總算是安裝完成。

當然跑起來沒啥問題,畢竟阿吉之前就測過了嘛!不過說起順暢度嘛,我還是不能給滿分,為何呢?因為在轉換各個頁面的時候都會出現延遲狀態,或許是我已經安裝很多東西了,不過我想應該影響不大。所以順暢度只能給3❊。

好不容易測完了,可以說這些軟體都難不倒熊貓,這跟牠外觀可一點都不成比例。

雖然整理出來了,可是我還是要再強調一次,這是以文書電腦比較的結果,跟桌機還是比不了的。

或許有人對筆電的結構比較了解,有天可以製作出熊貓版筆電,還能控制周圍跟背板發光,我想會是個有趣的提案。

好了,熊貓燒完了,希望這篇文章能讓各位看官更了解熊貓的能力。

 

 

相關文章:

[LattePanda教學] openCV環境安裝與基本臉孔瞳孔偵測 @Windows 10

本文將說明如何設定 LattePanda 拿鐵熊貓開發板上的 openCV環境,並執行一個小範例來玩玩看

延伸閱讀


Continue reading