Author Archives: CAVEDU小編

[Micro:bit] 使用DFROBOT BOSON套件設計智慧小屋

在本篇文章中,我們將介紹如何用micro:bit和DFROBOT BOSON套件打造智慧小屋,套件上安裝孔位與樂高相容,組裝上更方便了。

我們將實做三個特別的功能,第一個是能夠根據環境光源自動調整亮度的LED燈,第二是設計一個可以按鈕控制吊扇,第三則是做出一個地震警報器。

作者/攝影  袁佑緣
時間  3小時
成本 放課後的製作時間便是我的成本
難度  * * *
材料表
  • Micro:bit
  • 樂高積木
  • Micro:bit Boson 擴充板

準備工作

Microbit and Boson Kit

 

在這篇文章中,我們將使用BBC推出的Micro:bit開發板來當作是我們智慧屋的控制器。

為了要能夠控制智慧屋中的電子元件,也就是上面的感測器與制動器,除了原本的Micro:bit之外,我們還要額外裝上一塊DFRobot推出的Boson擴充板來控制Boson Kit中的電子模組。

如果讀者想獲得關於 Boson Kit更進一步的資訊的話,不妨去以下的網站觀看詳細的介紹喔。 (https://www.dfrobot.com/boson).

以下是我們在本篇文章中,我們將會用到的Boson電子積木有LED、按鈕、傾斜、風扇、聲音、光感應。

1.Light Sensor Module
2.LED Module
3.Button Module
4.Fan Module
5.Tilt Sensor Module
6.Buzzer Module

Mu editor

接下來,為了要撰寫micro:bit的micro python 程式碼,我們需要去下載以下的編輯器:Mu Editor(https://github.com/mu-editor/mu/releases).

此外,我們也建議讀者可以去官方的文件查看Micro Python API for Micro:bit (https://microbit-micropython.readthedocs.io/en/0.9/)的詳細使用說明,裡面還有許多的範例教學可以參考喔!

硬體

以下的圖片是本文所使用的雙層樂高屋以及樂高屋內部的構造。

注意到除了一般水平放置的Boson元件可以接在樂高的平板上,一些懸掛的Boson元件可以用其他的方式固定在樂高小屋上面,例如下圖中使用BOSON的中間積木,我們使用金屬螺絲與螺絲帽固定,底座固定之後,Boson電子元件就可以用磁力吸附在上面。

範例教學

 

接下來我們就來在 Mu Editor中撰寫 Micro Python吧!

 

1. 小夜燈

在第一個範例中,我們將原本的LED燈擴充成可以自動調整亮度的LED燈,更進一步它能根據環境光的亮度適當地調整LED燈亮度。

於是我們要在LED燈上再加上一個光源感測器,如下圖。

首先,我們必須先用以下的程式碼來去偵測光源感測器的最大最小值,而為了要讓數值更精確一點,我們讓程式在一段時間內的對光感值進行取樣,將光感值加總後再依取樣的次數做平均,經過計算就能得我們想要的平均值。

 

night-light-measure.py

from microbit import *

light_sensor = pin1.read_analog()
counter = 0
timer = running_time()

while (running_time() - timer) <= 3 * 1000:
    light_sensor += pin1.read_analog()
    counter += 1

light_sensor /= counter
print("mean light sensor value: ", light_sensor)

打開Mu Editor的REPL視窗,並在有環境光跟沒有環境光的情況下執行程式,你將會得到如下圖的光源平均值,當環境光很亮時的平均亮值是900多,環境光很暗時的平均暗值10多。

接下來,我們將前面求出的平均亮值跟平均暗值,帶入到變數ligjt跟dark中,將這兩個數值作為最大值與最小值,是按照比例換算成Micro:bit的類比角為數值,控制LED燈的亮度。

 

算式:

((light – light_sensor)/(light – dark)*1023)

比如:light=966、dark=14,數值範圍為952。現在讀到一個光感數值為500,帶入算式((966-500)/(952))*1023 = 500,最後micro:bit的類比輸出值為500。

 

night-light.py

from microbit import *

light_sensor = pin1.read_analog()
counter = 0
timer = running_time()

light = 966.4033
dark = 14.81614

while True:
    light_sensor = pin1.read_analog()
    LED = int((light - light_sensor)/(light - dark)*1023)

    if LED > 1023:
        LED = 1023
    elif LED < 0:
        LED = 0

    print("LED lightness: ", LED)

    pin2.set_analog_period(1)
    pin2.write_analog(LED)
    sleep(0.5)

 

範例影片:

 

2. 吊扇設計

在第二個範例中,我們用以下簡單的程式碼來打造一個可以用按鈕控制的電風扇。

在程式中,我們用一個switch的布林變數紀錄開關的狀態,我們希望使用開關時,每次按下開關再放開,switch的狀態就會切換成相反的狀態。

注意到我們在以下的程式碼中會多加一些延遲,例如sleep(0.5),這是為了要確保可以正確的判斷到一次的開關按壓。

ceiling-fan.py

 

from microbit import *

switch = False

while True:
    if pin12.read_digital() is 1:
        while pin12.read_digital() is 1:
            sleep(0.5)
        switch = not switch
        if switch:
            pin16.write_digital(1)
            print("Turn ON")
        else:
            pin16.write_digital(0)
            print("Turn OFF")

 

3.地震警報器

 

在第三個範例中我們將實做一個安裝在小屋的地震警報器。

為了要偵測到小屋的晃動,我們使用一個傾斜感測器,並在每一次的迴圈中,觀察一小斷時間中的傾斜變化。

如果說屋子靜止不動的話,隨著時間的傾斜變化量應該是完全是零,所以我們只要去計算一段時間的變化是否為零的話,就能推出此時是否有地震的發生。

 

而如果偵測到有地震發生的話,程式會播放一段音樂作為地震的警報,播放音樂的方式直接使用Micro Python內建的music函式庫,music函式庫預設輸出聲音為0號腳位,驅動蜂鳴器發出聲音。

 

如果想自己設計音樂的話,不妨去以下網址查看micro python的範例(https://microbit-micropython.readthedocs.io/en/0.9/music.html),裡面有介紹如何用指定的音符做特定的旋律。

alarm.py

from microbit import *
import music

status = pin8.read_digital()

def detect_shake():
    old_tilt_status = pin8.read_digital()
    sleep(0.1)
    new_tilt_status = pin8.read_digital()
    return abs(new_tilt_status - old_tilt_status)

while True:
    counter = 0
    timer = running_time()
    shake = detect_shake()
    while (running_time() - timer) <= 500:
        shake += detect_shake()
        counter += 1

    status = shake/counter
    print(status)

    if status is not 0.0:
        print("Alarm!!!")
        music.play(music.DADADADUM)

 

範例影片:

 

相關文章:

 

 

[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範例影片。

 

相關文章:

[ 電路設計軟體Multisim Blue ] 設計一個簡易電源供應器

我們購買小電壓、電流的電子產品時,電子產品的電源線常常使用USB線,累積下來有好多的USB線,希望將這些USB線常常使用USB線,作為我們電子小專題的可插拔式電源。

作者/攝影  豐智
時間  2-3小時
成本約200元
難度  * * *
材料表

今天跟大家分享的作品,電源供應器,平常實驗的時候、或者做電子作品的時候需要外接電源,我們來分享這個模組,大家做各式各樣的作品時,也可以這篇文章了解電源基本要用的功能

我們購買小電壓電流的電子產品時,常常使用USB線作為電子產品的電源線,累積下來有好多好多的USB線,希望夠再次利用這些USB線作為我們電子小專題的電源

 

我們常常拿到的USB線有這機種。USB-TypeA、USB-TypeB、USB-TypeC、MiniUSB線、MicroUSB。各位可以依照家裡多餘的線買對應的接頭。

 

我們設計電源供應器希望能夠

  • 做電子實驗時可以在麵包板上外接電源
  • 作各種小專題把這個模組加上去,用USB線供電

 

這次設計的簡易型電源供應器有幾個注意事項

  • 限制最高電流
  • 超過最高的電壓電流保險
  • 避免忽然插上USB線時,瞬間電壓電流過高
  • 避免忽然拔掉電源,瞬間無供應電
  • 輸入輸出電源的接頭

 

1、限制最高電流

為什麼要限制最高電流?一般電子產品使用的電子元件、晶片,在說明文件裡會告知電子元件/晶片可以使用的電壓電流範圍。一般的電子商城,販賣電子元件時會提供數據手冊(Datasheet)或使用規範,如果你是直接到電子零件店購買,也可以詢問電子零件的廠牌型號,在網路上尋找資料手冊。

以下圖為例,我在網路商城(連結)購買一個MicroUSB接頭,這個接頭的販賣時有相關使用規範,額定電流值為1.8A,如果使用平板電腦的電源供應器(2A~3A),超過該電子元件的額定電流,使用時極有可能發生電子元件燒壞等狀況。

1、 網路購買電子元件,使用規範

2、點擊Datasheet檢查資料手冊的使用規範

2、超過最高的電流保險

Step1:選擇保險絲

設計的人會注意自己做品使用時的注意事項,但天有不測風雲,自己也會有忘記、或者其他人使用時不小心接上超過額定電流的電源供應器,這時候可以使用保險絲,超過電流值的時候,保險絲會先燒斷,讓電路變成一個斷掉的迴路,避免波及其他的電子元件。最近很流行的Arduino開發板,相關的感測器模組、電子晶片大多額定電流在1A,故我們這裡選用1A的保險絲。

為了可以依照不同使用狀況,限定最高電流,我們這裡使用可拆拔的玻璃管保險絲。

3、 1A的玻璃管保險絲-資料連結

 

Step2:接著在MultiSIM BLUE選擇1A保險絲

1、首先選擇[Place]→[Component]

接著選[Mouser Database]→[Power]→[FUSE_Cylindrical_Littelfuse_Cartridge_213]→[1A]

2、這裡使用[Mouser Database]資料庫,它的特徵可以透過右下角的[Hyperlink]點選網址,觀看實際對應的電子零件資料手冊、使用規範、價格、庫存等資訊,這個保險絲的實際長度是20mm。

4、 在軟體中選擇1A保險絲

5、 對應的實體保險絲

 

Step3:選擇保險絲座兩個

選擇[Place]→[Component]

接著選[Mouser Database]→[Power]→[FUSE_Holder_Littelfuse_Clip]→[01110512Z]

6、 在軟體中選擇保險絲座

7、對應的實體保險絲座

3、4、避免忽然插上USB線時,瞬間電壓電流過高,忽然拔掉電源,瞬間無供應電

各位可以嘗試使用:RC充放電路,RC指的是電阻(Resistor)與電容(Capacitor)。

 

充電:

如下圖,當電源供應器另一方接上馬達,接上5V1A的USB線(VCC1)的瞬間,不僅會供電給馬達,同時會分散電流到電阻與電容,當電容充飽電之後,電容會相當於無限大的電阻值,所有的電壓電流都會使用在馬達上。

充電的時間會是多長呢?這次選擇的電阻是1K歐姆=1000歐姆,電解電容16V,100uF(微法拉)=0.0001F(法拉),充電時間的公式T=RC,充電所需時間為0.1秒,想降低充電時間可以降低電阻或降低電容容量喔。

8、 充電電路

 

放電:

我們拔開5V1A的USB線之後,電容儲存的電荷會供給馬達轉動,直到電容儲存的電用完。

9、放電電路

 

Step1:選擇電容

選擇[Place]→[Component]

接著選[Master Database]→[CAP_ELECTROLIT]→[100uF]→[IPC-2221A/2222/CAPPR200-500X1100]

 

10、選擇100uF電容

 

Step2:選擇電阻

選擇[Place]→[Component]

接著選[Master Database]→[RESISTOR]→[1K]→[IPC-2221A/2222/RES900-300X200]

11、選擇1K電阻

 

5、輸入輸出電源的接頭

這次輸入電源的USB線選用最近很流行的ArduinoUNO USB接頭,USB Type-B接頭。

12、實體USB Type-B接頭

 

這次輸出電源選用端子台,這種端子台底部有2個針腳(Pin),圖片上方有螺絲孔,使用螺絲起子鬆開螺絲後,中間的固定座便會鬆開,鎖緊螺絲中間的固定座則會鎖緊。

13、實體端子台

14、使用螺絲鎖緊/放開端子台

 

Step1:尋找替代的USB針腳

在軟體USB Type-B接頭目前沒有Component,我們以2X2的排針替代USB Type-B腳位

選擇[Place]→[Component]

接著選[Mouser Database]→[Connectors]→[HEADER_PIN_Double_Row_TE_Connectivity]→[102973-2]

15、 取代USB Type-B選擇2X2接頭

 

Step2:更改USB針腳名稱

1、為了方便識別USB Type-B的5V與GND,點擊剛剛的2X2接頭,點選右鍵選擇[Properties]→[Label]→更改[RefDes]名稱為USB Type B。

2、接著更改[RefDes]名稱為1 is GND 2 is 5V

16、 更改標籤名稱

17、取代USB Type-B的5V、GND

 

3、接著顯示每隻腳位的編號,選擇[Display]→[Use component specific visibility settings]→勾選[Show footprint pin names]

18、 顯示腳位號碼

19、 完成圖示

 

Step3:新增端子台並修改端子台名稱

選擇[Place]→[Component]

接著選[Mouser Database]→[Connectors]→[CONN_SCREW_TERM_Phoenix_Contact]→[1715721]

20、新增兩個針腳的端子台

點擊剛剛的端子台,點選右鍵選擇[Properties]→[Label]→更改[RefDes]名稱為Terminal Block。

21、 更改端子台名稱

 

Step4:新增VCC、GND

1、選擇[Place]→[Component]

接著選[MasterDatabase]→[All families]→搜尋[VCC]

2、接著選[MasterDatabase]→[All families]→搜尋[Ground]

3、完成後所有的電子元件如下圖:

22、 總共使用的電子零件

 

Step5:接出RC 充放電路

根據剛剛說明的RC充放電路,將思路轉換成USB電源供應器,下圖左方代表USB 接頭,可依個人喜好更換USB接頭的類型。左方則是端子台,你可以透過端子台為各種電子小專題供應電源。

23、 電源供應器充放電電路圖

 

在MultiSIM BLUE完成的電路圖如下,請大家檢查看看是否一致

24、電源供應器充放電電路圖2

6、使用電路模擬軟體測量端子台電壓

1、在MultiSIM BLUE中有模擬電路的功能,可以對電路測量電壓、電流、訊號波形等測量,這次要模擬端子台(Terminal Block)是否有5V電壓輸出。

2、選擇[Simulate]→[Instruments]→[Multimeter]。

小提醒:在MultiSIM BLUE右方的工具列,也可以電選這些測量工具。

25、 開啟MultiSIM BLUE 模擬功能

3、[Multimeter]相當於電子專題不可或許的小幫手-三用電表,可以測量電流、直流電、交流電、電阻值等數值。

26、 使用Multimeter測量

 

4、測量電壓方法與三用電表相同,量測待測物電壓需要與待測物並聯,請從[XMM1]拉線與端子台進行並聯。

27 將Multimeter與端子台接線並聯

5、選擇[Simulate]→[Run](或點擊F5,或點擊軟體上方工具列快捷鍵)即可執行模擬,對[XMM1]點擊兩次後,畫面會顯示量測到的電壓值,若沒有量測到5V電壓,請檢查電路是否問題。

28 量測端子台電壓

 

將電路圖的資料轉換成電路板

在MultisimBlue上繪製完電路圖之後,我們將電路圖轉換成PCB繪圖軟體檔案。

點選[Transfer]→ [Transfer to Ultiboard]→[Transfer to Ultiboard Component Evaluator14.0]

29、電路圖轉電路板

轉換完成後,MultisimBlue會幫助我們開啟PCB軟體:[Ultibaord Component Evaluator Mouser Electronic Edition],電路圖電子元件間的接線,在PCB軟體會將轉換成預拉線,如下圖。

30電路板與預拉線

 

進行電路板布局

Step1將電子元件移至左下角,整理線路

請將電子元件全部移到左下角,靠近左下角的原點,我們可以使用[Ctrl+R]對電子元件旋轉,盡量建少每條線之間互相交叉,重疊。USB Type B線的接頭、負責輸出電壓電流的端子台,盡量靠近邊界,沒有其他電子元件阻擋。

31 移至左下角的原點並整理元件

 

Step2設定玻璃管保險絲距離

下圖是玻璃管保險絲加上兩個保險絲座,本次選用的玻璃管保險絲長度為20mm,可以使用軟體上方、左方的刻度表量測,保持兩個保險絲座的距離為20mm,也留17~20mm給USB接頭。

33、保險絲座與USB接頭距離

 

Step3使用資料手冊設定USB Type B距離

參考我們購買的接頭廠商與型號下載資料手冊-連結,下圖是USB Type B的資料手冊,我們可以透過手冊了解USB接頭的尺寸資料

34、 下載資料手冊

 

根據下圖的USB接頭俯視、側視圖片,我們得知USB接頭總長為16.5mm,有四隻針腳與左右兩個大腳座,你可以決定如何移動腳座,腳座左側有10.28mm的空間,也可以讓USB接頭超過一半的空間暴露在電路板之外。(以下資料圖片源自貿澤電子商城)

35、 USB接頭俯視尺寸

36、 USB接頭側視尺寸

37、 USB接頭前視尺寸

38、 USB接頭底座針腳尺寸

這裡設計USB接頭前後長度留18mm,左右寬度留下20mm。如有興趣,也可以為左右兩方的大腳座設定焊接的孔位,做為固定USB腳座的支點喔。

39、 USB接頭長寬設定

 

Step4、編輯Board Outline

1、將滑鼠移至左方的[Design Toolbox]工具列對[Board Outline]點擊兩次,可以對黃色線的板框刪除、縮小放大。

40、Board Outline

2、在軟體上方的點選[Edit]→[Selection filter]→[Enable selecting other objects],可以編輯電子元件以外的物件

41、編輯電子元件以外的物件

 

Step5、更改電子元件的位置

1、安排完電子元件後,可以點選[View 3D],觀看電子元件的3D顯示圖。

42、View3D

2、安排電子元件時,可以把電子元件更換到另外一面,我們稱電路板正面為[Copper Top]、背面為[Copper Bottom] ,你也可以選擇每一面代表的顏色。(Top預設為綠色、Bottom預設為紅色),請將所有的線路、焊接孔位在一面、電子元件在另一面。

43、選擇Copper Top

44、更換電子元件板面位置

45、電路板布局3D圖

 

進行電路板布線

Step1、使用自動布線

選擇右上方的[Start/resume autorouter]或使用快捷鍵(Ctrl + Shift + 8)進行自動布線

46、自動布線

 

Step2、整理布線

這次的作品比較容易,整理布線時首先注意兩點,可以避免走線路徑產生一些不必要的電池輻射(1)線需要轉彎時,轉彎角度應該大於90度(2)轉彎需要再轉彎時,應多走一些距離再轉彎。

47、整理布線

 

Step3 設定走線的路徑

電源供應的電流越高,走線的線寬需要越寬,一般在攝氏35度的狀況下,1A的電流線寬至少要大於0.2mm、2A至少大於0.3mm、3A至少大於1mm。

A、選擇想加寬的走線後滑鼠右鍵,點選[Properties],出現下圖的[Trace Properties]。

B、選擇[General]→到[Measurements]將寬度[Width]調整為2mm。

48、設定走線路徑寬度

49、5V路徑加寬度

 

Step4 設定Dril與PAD

為了使焊接更容易,鑽頭的鑽孔點正確,請依照下列步驟。

1、點選[PAD],左上方選項可以選擇PAD的形狀,為了焊接方便,我們要把PAD的面積變大,但不能碰到相鄰的PAD的或走線。

A、選擇形狀Shape:

選擇[Rectangle]→設定長度[Length]為1.5mm或2mm。

B、選擇大小Size:

選擇[Pad diameter]→設定直徑為2mm或4mm。

C、選擇鑽孔大小Hole:

選擇[Dril diameter]→設定直徑為1.2mm。鑽孔大小請依照使用者的鑽刀大小做設定。

50、設定Dril與PAD

 

3、PAD與Dril設定後的參考圖片

51、設定合適的Dril與PAD

Step4 Power plane

Power plane可以選擇一種線路,大範圍留下銅箔,一般會留給接地面(Ground),與Ground連接的接點會變成與一大片銅箔相連。

選擇[Place]→[Power plane]→Net選項選擇[0]

52、對Ground線路進行Power plane

53、Top板面上的電路

54、Bottom板面上的電路

 

相關文章:

[App Inventor IoT] LinkIt 7697使用BLE(藍牙4.0)傳送光感測器數值

作者/攝影  袁佑緣
時間  1小時
成本
  • 約900元
難度  * *
材料表
  • LinkIt 7697
  • LinkIt 7697擴充板
  • Grove光感測器
  • micro usb線
  • 電腦

本文章教各位讀者如何用手機撰寫App Inventor的應用程式,並透過Buletooth Low Energy來得到遠端LinkIt 7697的光感測器讀值。

 

App Inventor Extension 安裝

請先進到App Inventor的網站,並建立一個專案,在左下角Extension的部份,點選import extension,如下圖。

並把從MIT App Inventor Extensions網站(http://appinventor.mit.edu/extensions/)上的BLE套件裝上去。

如果讀者想要直接取用本範例的aia檔也可以,這樣就不需要再手動安裝Extension,因為已經包含在aia檔中了。

 

本範例的aia檔請到此處下載-連結

 

 

App Ineventor 程式設計 

首先請確認您有按照前面的步驟將BLE元件新增App Inventor中,如下圖。

接下來請看到Desginer的部份,Connect按鈕是用來連接到指定藍牙MAC位址的7697,連上之後就會變成Disconnect按鈕,可以用來斷掉連接的藍牙。而最底下的有一個label元件用來顯示感應器的數值。

接下來看到後台的Blocks端,首先我們要先定義一個addr的變數,用來指定要連接的LinkIt 7697的MAC address,至於這個MAC address會根據每一塊不同的板子而有所不同,請讀者按照待會Arduino程式設計的部份所顯示的MAC Adress填入正確的位址。

再來當按鈕connect按下去之後,就會嘗試連上指定MAC address的控制板,如果成功的話,按鈕就會切換到Disconnect,以等待下一次使用者按下時就會斷線。

 

如果連接成功的話,應用程式的標題就會切換成Connected,反之則顯示Unconnected。

接下來是本範例的重點部份,如果此刻的狀態是正確連接的話(也就是按鈕是顯示用來Disconnect的狀態),Clock元件每隔一段時間就會啟動一次接收BLE訊息的服務,而這個服務會透過指定的Service跟Characteristic讀到7697上的光感測器數值(提醒讀者這邊的UUID務必確認跟Arduino程式碼端的設定一樣喔),最後當App讀到BLE的Int值時(when BluetoothLE1.IntValueRead),就會將數值顯示在Label元件上,讓使用者可以在手機螢幕上看到光感值!

 

LinkIt 7697 程式設計

請打開Arduino IDE,並確定您的控制板在編輯器中切換成7697,再上傳以下的程式碼到7697上。

本範例的ino檔請到此處下載-連結

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

int item;

LBLEService AService("19B10010-E8F2-537E-4F6C-D104768A1214");
LBLECharacteristicInt ARead("19B10011-E8F2-537E-4F6C-D104768A1214", LBLE_READ | LBLE_WRITE);

void setup()
{
  Serial.begin(9600);
  LBLE.begin();
  while (!LBLE.ready()) { delay(100); }
  Serial.println("BLE ready");

  Serial.print("Device Address = [");
  Serial.print(LBLE.getDeviceAddress());
  Serial.println("]");

  AService.addAttribute(ARead);

  LBLEPeripheral.addService(AService);
  LBLEPeripheral.begin();
  LBLEAdvertisementData advertisement;
  advertisement.configAsConnectableDevice("BLE Ana");
  LBLEPeripheral.advertise(advertisement);


}


void loop()
{
  item = analogRead(A0);
  Serial.println(item);
  ARead.setValue(item);
  delay(1000);
}

成功上傳本隻程式碼到7697上後,請打開Serial Monitor,7697將會印出這塊板子的MAC Address,請務必記得把這段位址修改到App Inventor端的addr變數上喔。

 

 

範例影片

 

相關文章:

[ App Inventor IoT ] LinkIt 7697使用 BLE(藍牙4.0)控制伺服馬達

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

作者/攝影  袁佑緣
時間  1小時
成本
  • 約800元
難度  * *
材料表
  • LinkIt 7697*1
  • micro usb線*1
  • 伺服馬達*1
  • 電腦*1
  • Android手機*1

本文章教各位讀者如何用手機撰寫App Inventor的應用程式,並透過Buletooth Low Energy來遙控LinkIt 7697的伺服馬達。

App Inventor Extension 安裝 

請先進到App Inventor的網站,並建立一個專案,在左下角Extension的部份,點選import extension,如下圖。

並把從MIT App Inventor Extensions網站(http://appinventor.mit.edu/extensions/)上的BLE套件裝上去。

如果讀者想要直接取用本範例的aia檔也可以,這樣就不需要再手動安裝Extension,因為已經包含在aia檔中了。

 

本範例的aia檔請到此處下載-連結

 

App Ineventor 程式設計 

首先請確認您有按照前面的步驟將BLE元件新增App Inventor中,如下圖。

接下來請看到Desginer的部份,首先在第一行有TextBox元件,用來顯示現在控制的伺服馬達角度,接下來有兩個按鈕,左邊的connect按鈕主要是用來連線到7697,右邊的Disconnect則是斷線,最後,在最下面有一個滑桿,可以用拖曳來控制馬達的角度(注意因為這邊控制的伺服馬達可控角度為0~180度,所以在Slider元件上要設定最大值為180最小值為0)。

接下來看到後台的Blocks端,首先我們要先定義一個addr的變數,用來指定要連接的LinkIt 7697的mac address,至於這個mac address會根據每一塊不同的板子而有所不同,請讀者按照待會Arduino程式設計的部份所顯示的MAC Adress填入正確的位址。

再來當按鈕connect按下去之後,就會嘗試連上指定mac address的控制板,如果成功的話,滑桿跟計時器就會被啟動。

而斷線的部份則跟連線差不多,只是Enabled跟Disabled的元件會相反。

接下來是本範例的重點部份,Clock元件每隔一段時間就會啟動一次傳送BLE訊息的服務,而這個服務會將滑桿上此刻的數值先轉成整數後透過指定的Service跟Characteristic送出,而在這邊的UUID務必確認跟Arduino程式碼端的設定一樣,7697才能成功接收到數值喔!

LinkIt 7697 程式設計

 請打開Arduino IDE,並確定您的控制板在編輯器中切換成7697,再上傳以下的程式碼到7697上。 本範例的ino檔請到此處下載-連結

 

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

Servo my_servo;
int servo_position = 90;

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


void setup() {


  //Initialize serial and wait for port to open:
  Serial.begin(9600);

  // to check if USR button is pressed
  pinMode(6, INPUT);

  my_servo.attach(10);
  my_servo.write(servo_position);

  // Initialize BLE subsystem
  LBLE.begin();
  while (!LBLE.ready()) {
    delay(100);
  }
  Serial.println("BLE ready");

  Serial.print("Device Address = [");
  Serial.print(LBLE.getDeviceAddress());
  Serial.println("]");

  // configure our advertisement data.
  // In this case, we simply create an advertisement that represents an
  // connectable device with a device name
  LBLEAdvertisementData advertisement;
  advertisement.configAsConnectableDevice("BLE Servo");

  // 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 Servo");

  // Add characteristics into servoService
  servoService.addAttribute(positionCharacteristic);

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

  // start the GATT server - it is now 
  // available to connect
  LBLEPeripheral.begin();

  // start advertisment
  LBLEPeripheral.advertise(advertisement);
}

void loop() {
  delay(300);

  Serial.print("conected=");
  Serial.println(LBLEPeripheral.connected());

  if (digitalRead(6))
  {
    Serial.println("disconnect all!");
    LBLEPeripheral.disconnectAll();
  }

  if (positionCharacteristic.isWritten()) {
    servo_position = positionCharacteristic.getValue();
    Serial.println(servo_position);
    my_servo.write(servo_position);
  }


}

成功上傳本隻程式碼到7697上後,請打開Serial Monitor,7697將會印出這塊板子的MAC Address,請務必記得把這段位址修改到App Inventor端的addr變數上喔。

範例影片:

 

相關文章:

[ 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來得少多了,但使用流程也因此簡化許多,功能上大致上還是可以滿足我們從雲端控制板子腳位或顯示板子資料等兩大訴求。請根據大家的使用需求來選用合適的雲服務。

 

相關文章:

[MIT App Inventor募資計畫] iOS平台即將推出!

撰寫/攝影曾吉弘

阿吉老師來MIT擔任交換學者已經一個月了,看到這邊真的有一群非常優秀的人很努力地在傳達對於教育上的堅持,提供好的開發平台也是一種堅持。俗話說的好,錢非萬能,沒錢卻萬萬不能。很高興一來美國就參與到MIT App Inventor的募資計畫,目標是十萬美金,本文編寫時是12000美金左右,12%。

 

愈簡單使用的東西,下面要做的東西就愈多。

 

由Hal Abelson教授帶領的App Inventor團隊從2011年開始著手把App Inventor從Google搬過來並重新開發App Inventor 2,舊版的/zip code還能轉成新版.aia檔。後續又把底層整個抽掉改用Blockly來實作,這些都是上層看不到的東西,力求讓大家使用起來的感覺都保持一致。

上層元件包含測試中的背景服務、map與machine learning、開發板整合(我主要就是做這個),到2018 Q1即將推出的iOS平台,沒有一個是簡單的東西。有在寫行動裝置app的人就知道要出一個跨平台的開發工具真的不好搞,更何況,Android / iOS 年年都推新的作業系統,對於開發者來說真是喜樂參半。

無形的成本很容易被低估。例如App Inventor 中文學習網,幾乎都是用夜深人靜的時候在寫的,有時候突然想到一個點子我就會先記在手機或是記事本中,後續趕快找時間做出來變成一篇文章放上去。

App Inventor 中文學習網每週的流量都很高,期中期末考之前會達到高峰。我接過罵人的信(真的用罵的,很不客氣)說文章很多錯,code不會動(其實大概只有不到10% 是真的寫錯)或說太深奧看不懂之類的;也接過國小學生的感謝信:”謝謝阿吉叔叔,我媽媽說這個網站很棒”,雖然不太懂這個小朋友到底要講什麼,但還是很感動啦。

 

如果我今天也來募資一下,不知道多少朋友會支持。

教育談錢傷感情,誰說的?開發板一片都知道拿500塊出來買,那為什麼要期待別人”免費”幫忙看code?

有時候想想,自己半夜在寫這些東西不知為何?我寫這些技術文章,不等於我要24小時回答問題哩(書中錯誤不在此列,CAVEDU對於出版品一向是勇於負責,認錯到底) 好像還是因為覺得App Inventor 很好,CAVEDU再怎樣也是有EDU三個字,教育的初衷我們會堅持下去。

碎碎念完畢,來看看這次MIT募資案的等級吧。金額不限,只要有贊助就可以列名 donor wall (我有看到有人捐 0.01美金…   應該是按錯吧),在此列出$100美金以上的項目:

 

  • $100   Digital Poster (特製數位海報檔,捐獻者列名於海報與感謝頁)
  • $250   Beta Test (可提早使用/測試 App Inventor iOS,感謝頁外加數位獎章、Bee app與列名數位海報檔)
  • $500   Signed Book (Structure and Interpretation of Computer Programs實體簽名書一本(Hal Abelson and Gerald Jay Sussman, MIT Press, 1996)、App Inventor馬克杯與上述項目
  • $1,500 Education Kit (實體App Inventor蜜蜂機器人一隻,適用於物聯網教學。App Inventor馬克杯與上述項目
  • $10,000   Meet the Team 與開發小組共進晚餐,App Inventor全員實體簽名海報與所有上述項目(旅費要自己出啦~)

 

以下是App Inventor Bee robot示意圖,是不是很可愛呢?

[App Inventor] Microbit磁力感測器控制小蜜蜂圖示

本文章教各位讀者如何用手機撰寫App Inventor的應用程式,並透過Buletooth Low Energy 來取得 Micro:bit 磁力感測器訊號,讓app上的小圖示飛來飛去。

作者/攝影  曾吉弘
時間  1小時
成本
難度  * * * *
材料表
  • 個人電腦
  • App Inventor開發環境
  • 支援BLE的Android手機
  • BBC Micro:bit開發板

 

本文要介紹如何藉由最近非常熱門的BBC Micro:bit開發板上的磁力感測器來控制App畫面上的小圖示轉動。Micro:bit板子上已經具備了BLE藍牙通訊功能,搭配app Inventor寫好的micro:bit extesion,就能有更多互動的效果。

 

範例 aia檔下載請按我

 

藍牙配對

 

Micro:bit端設定:

  1. 同時按住Microbit 正面A、B按鍵,不要放掉
  2. 按住A、B鍵時,把背面的Reset 鍵按下後再放開。
  3. 這時應該可以看到 “PAIRING MODE!” 以跑馬燈方式出現在Microbit LED 螢幕上,若看到這訊息,便可以放開A、B鍵。
  4. PAIRING MODE! 結束後,會看到一個圖形出現在Microbit LED 螢幕上,不同的Microbit 出現的圖案也不同,這是Microbit 不同裝置獨特的”簽名” (Signature) 。

5.這時候的Microbit 已經準備好跟其他裝置配對,請看以下影片教學

 

 

 

Android手機端設定:

  1. 進入Android手機的設定–>藍牙
  2. 確認Micro:bit 已進入配對模式
  3. 當Micro:bit上的‘PAIRING MODE!’ 顯示完,搜尋(每隻Android手機這個選項的文字不一定相同,但意思差不多),應該會看到類似 micro:bit [XXXXX]的選項,其中XXXXX 會根據每片micro:bit而不同。點選該裝置來配對。

4.micro:bit 會出現向左的箭頭,然後Android裝置上會跳出畫面要求輸入配對PIN碼的視窗。

5.按住Micro:bit 的按鍵A ,這時microbit 會連續出現六個數字,這就是配對碼。

6.回到Android裝置上,輸入這六個數字。如果Microbit 出現[V],代表配對成功。如果是[X]代表沒成功,請再試一次。

 

編寫程式來取得Micro:bit磁力感測器

匯入BLE 與 micro:bit extension

 

請登入MIT App Inventor官方網站,建立新專案,在Designer葉面中點選Palette左下角的Extension,再點選”Import extension“與”URL:

  1. 貼入以下兩個 extension link:
  2. 請加入 Microbit_Magnetometer這個元件,這是一個非可視元件。並把它的 BluetoothDevice 屬性設為 “BluetoothLE1″。這步驟很容易忘記,別漏掉了
  3. 加入四個按鈕放入 horizontalArrangement元件中,分別用於掃描、停止掃描連線與斷線
  4. 加入1個顯示訊息用的label,用於顯示連線狀態
  5. 加入一個 ListVeiw,當掃描到鄰近的BLE裝置時會顯示在這裡 (到此與MIT所提供的基礎連線測試程式相同)
  6. 加入一個Canvas,寬高皆為320像素
  7. 在Canvas中加入一個ImageSprite,使用任何您喜歡的圖案都可以,在此使用MIT App Inventor新的小蜜蜂logo。
  8. 最後加入4個顯示訊息用的label,用於顯示連線狀態、X、Y、Z軸與方位角(bearing)

Blocks頁面

  1. 掃描與連線

在此的做法都差不多,先點選ScanButton來掃描鄰近可用的BLE裝置(以本專案來說目標是micro:bit,但當然也會出現其他裝置例如手機筆電之類的)。找到裝置之後就會出現在畫面中的ListView中,選取micro:bit後點選ConnectButton就可以連線(BluetoothLE.Connect指令)。

  1. 連線成功後開始更新磁力感測器值

在此設定更新速度(reporting period) 為20ms,並要求micro:bit開始回報方位角與各軸磁力資料更新。

  1. 顯示磁力偵測值並控制ImageSprite

Microbit_Magnetometer1.MagnetometerBearingReceivedMagnetometerDataReceived事件中,我們取出各參數並顯示於對應的Label。並用X、Z軸數值來控制ImageSprite的X. Y座標,您可以改為其他的軸向資料或用於控制其他的效果,很多效果都可以嘗試。

斷線

斷線時會呼叫 bluetoothLE元件來中斷藍牙連線,確認斷線之後則顯示相關訊息。

完工了!來試試看吧。請確認您的Micro:bit與Android已經配對好了。按下按鈕應該可以看到畫面上有一些數字不斷跳動,試著拿個小磁鐵在Micro:bit附近晃晃(別拿太強的,弄壞我不負責喔),看看數字與小圖案的變化。試試看用 Micro:bit搭配 App Inventor 做出更多功能吧

 

相關文章:

 

 

完成如下圖:

 

[LinkIt 7697] WiFi 控制RGB三色LED

本文章教各位讀者如何用手機撰寫App Inventor的應用程式,並透過Wi-Fi 來控制LinkIt 7697開發板上所接的 RGB 三色LED燈。在此會把7697作為 web server,App Inventor則是透過 IP 搭配指定字元來與它互動。

作者/攝影  曾吉弘
時間  3小時
成本
難度  * * * *
材料表
  • 個人電腦
  • LinkIt 7697 開發板
  • RGB LED (共陰)
  • 或三顆不同顏色的LED

本文要介紹如何將LinkIt 7697 作為一個簡易的web server (修改自MTK原廠範例),可透過網頁與App Inventor 來控制它。CAVEDU 2017年已經執行了超過30場的 LinkIt 7697研習,請參考我們的教學投影片,也歡迎找我們去上課啦~

LinkIt 7697超詳細教學投影片請按我

硬體組裝

請將LinkIt 7697與共陰RGB LED接上麵包板後,按照以下對應來接線:

RGB LEDLinkIt 7697
RP11 (D11)
GP9
BP7 (也是板載的USR LED)
GND任一GND即可

 

完成如下圖

App Inventor

請登入MIT App Inventor之後,建立一個新專案。或直接App Inventor中文學習網匯入本專案原始檔,唯一要修改的地方就是LinkIt 7697於您所指定網路所取得的IP位址。

Designer

  1. 新增一個HorizontalArrangement,其中放入一個按鈕與Label,按鈕是用於設定IP,label則是用於顯示各種訊息。
  2. 新增一個Textbox,Text設為空,Hint則設為”check 7697 ip in serial monitor”,用於輸入7697的實際IP
  3. 新增一個TableArrangement,寬度設為Fill parent,高度為200像素。Row=2。Column=3。接著放入五個按鈕,寬度各為33%,高度則為100像素。這些分別用於讓RGB LED亮紅色(R)、綠色(G)、藍色(B)、白色(W)與熄滅。
  4. 新增一個

 

完成後如下圖:

STEP1 IP變數與設定IP按鈕

 

在此宣告一個變數,內容為”http://192.168.1.73”,這是LinkIt 7697於您所指定網路中所取得的IP。後續會把這個變數值用於Web元件的Url屬性。如果您只有一片LinkIt 7697或已經確定其IP的話,可以在此把它寫死不用修改。

不過為了方便起見,我們可以透過Textbox來設定新的IP,這在您現場有多片LinkIt 7697要控制時很方便。按下Button_setIP按鈕,會先檢查Textbox是為空,如果已輸入內容就將設定結果顯示於Label,否則將顯示錯誤訊息於Label。

STEP2   副程式用於設定URL與顯示訊息

在此宣告一個副程式來管理每次按下按鈕時所發送的字元與顯示訊息。請新增一個procedure,並點選藍色方塊來新增參數,點選副程式與參數名稱即可修改名稱。在此副程式名稱改為sendData,參數名稱為message / command

在sendData副程式中,我們會把送進來的參數分別用於7697的網址(組合結果:http://192.168.1.73/R,不同字元對應不同動作)與要顯示的訊息。最後再呼叫Web.Get來呼叫LinkIt 7697所產生的網址即可。

STEP3   各顏色燈光按鈕

這樣做程式是否變的很清爽呢?每個按鈕的差別只在於參數不同而已,當然如果我們要發送/W出去的話,LinkIt 7697也要有對應的程式才行。簡列如下:

Button_R(紅燈):Red 與 /R

Button_G(綠燈):Green 與 /G

Button_B(藍燈):Blue 與 /B

Button_W(白燈):white 與 /R

Button_off(紅燈):Red 與 /o   (小寫的o~)

LinkIt 7697Wifi範例:

本範例修改自LinkIt 7697的SimpleWebServerWifi範例(就是多加幾個字元而已),重點段落

1.連上指定網路

while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to Network named: ");
    Serial.println(ssid);                   // print the network name (SSID);

    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);
  }
  server.begin();                           // start the web server on port 80
  printWifiStatus();                        // you're connected now, so print out the status

2.於7697簡易網頁中網頁顯示訊息,您可在7697所產生的網頁上編寫簡易的html。在此使用超連結可以直接點選。當然目標是透過App Inventor來發送囉。

client.print("Click <a href=\"/R\">here</a> to light red<br>");
client.print("Click <a href=\"/G\">here</a> to light green<br>");
client.print("Click <a href=\"/B\">here</a> to light blue<br>");
client.print("Click <a href=\"/W\">here</a> to light white<br>");
client.print("Click <a href=\"/o\">here</a> to light off<br>");

3.檢查網址並呼叫自定義函式來控制LED。如果我們檢查到某次client request(手機或透過網頁點選)的結尾等於我們所指定的字元,就呼叫led()函式,並透過參數來決定哪一個顏色亮起。1,0,0就是紅色,0,0,1是藍色等。

 

在此我們並沒有調整每一種顏色的亮度,所以只有亮暗兩種狀態,您可以思考一下如何透過這樣的架構把參數送進來給analogWrite()函式來調整RGB LED的亮度,例如(128, 130, 255),這樣顏色的變化會更繽紛喔!

// Check client request
        if (currentLine.startsWith("GET /R")) {  // GET /R to light red
          led(1,0,0);     
        }
//其餘省略

void led(int R, int G, int B) {
  digitalWrite(11, R);
  digitalWrite(9, G);
  digitalWrite(7, B);
}

操作

請先確認7697端程式已經執行,並開啟Serial Monitor來看7697的IP為何。將App Inventor中的ip變數值改好之後執行(由於本範例並非使用藍牙,所以模擬器也可執行)。

確認好IP之後,先開啟瀏覽器,您所使用的裝置需與7697位於同一個網段之下才行喔,如以下的192.168.1.73。

開啟app吧,設定IP成功畫面如下圖左,點選各個按鈕可以看到畫面右上角的label會顯示對應的訊息,您的RGB LED順利亮起來了嗎?

 

Simple:13

/*
  WiFi 7697 LED control
  If the IP address of your shield is yourAddress:
  http://yourAddress/R to light red
  http://yourAddress/G to light green
  http://yourAddress/B to light blue
  http://yourAddress/W to light white
  http://yourAddress/o to turn off LED

  Circuit:
    LinkIt 7697 HDK
    RGB LED (common cathode) 
    R - LinkIt D11
    G - LinkIt D9
    B - LinkIt D7

  created 25 Nov 2012
  by Tom Igoe
  modified 3 Nov 2017
  by CAVEDU
*/
#include <LWiFi.h>

char ssid[] = "ssid";      //  your network SSID (name)
char pass[] = "pass";   // your network password
int keyIndex = 0;                 // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;
WiFiServer server(80);

void setup() {
  Serial.begin(9600);      // initialize serial communication
  pinMode(LED_BUILTIN, OUTPUT);      // set the LED pin mode
  pinMode(11, OUTPUT);  //R
  pinMode(9, OUTPUT);   //G
  pinMode(7, OUTPUT);   //B

  // attempt to connect to Wifi network:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to Network named: ");
    Serial.println(ssid);                   // print the network name (SSID);

    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
    status = WiFi.begin(ssid, pass);
  }
  server.begin();                           // start the web server on port 80
  printWifiStatus();                        // you're connected now, so print out the status
}


void loop() {
  WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.println("new client");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            // the content of the HTTP response follows the header:
            client.print("Click <a href=\"/R\">here</a> to light red<br>");
            client.print("Click <a href=\"/G\">here</a> to light green<br>");
            client.print("Click <a href=\"/B\">here</a> to light blue<br>");
            client.print("Click <a href=\"/W\">here</a> to light white<br>");
            client.print("Click <a href=\"/o\">here</a> to light off<br>");

            // The HTTP response ends with another blank line:
            client.println();
            // break out of the while loop:
            break;
          } else {    // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check client request
        if (currentLine.startsWith("GET /R")) {  // GET /F to light red
          led(1,0,0);     
        }
        if (currentLine.startsWith("GET /G")) {  // GET /G to light green
          led(0,1,0); 
        }
        if (currentLine.startsWith("GET /B")) {  // GET /B to light blue
          led(0,0,1);
        }
        if (currentLine.startsWith("GET /W")) {  // GET /W to light white
          led(1,1,1);
        }
        if (currentLine.startsWith("GET /O")) {  // GET /O to light off
          led(0,0,0);
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
  // print where to go in a browser:
  Serial.print("To see this page in action, open a browser to http://");
  Serial.println(ip);
}

void led(int R, int G, int B) {
  digitalWrite(11, R);
  digitalWrite(9, G);
  digitalWrite(7, B);
}

 

相關文章:

[Micro:bit ] I/O腳位控制

本文要介紹BBC Micro:bit上的I/O腳位,讀取類比輸入腳位的變化之後來控制開發板上的LED matrix。做出類似長條圖的效果。

作者/攝影  曾吉弘
時間  3小時
成本
難度  * *
材料表
  • 個人電腦
  • BBC Micro:bit開發板
  • LED x1
  • 麵包板 x1
  • 跳線 x2

Micro:bit I/O腳位介紹

Microbit除了明顯的五個腳位(原廠稱為pad)之外,另外還有十多隻腳位,功能定義如下圖。在使用上就如同Arduino或其他的開發板一樣,數位I/O,類比I/O(PWM)、I2C與SPI功能,該有的都有。

在使用上,我們可以用鱷魚夾去夾住pad (0, 1 ,2, 3V GND這五個大的pad),但比較小的腳位在操作上就不是很方便,因為Microbit端建議使用DFRobot BOSON kit for Micro:bit,或是Seeed StudioGrove Inventor kit for micro:bit。如下圖是DFRobot BOSON kit for Micro:bit,您可以看到常用的腳位都做好防呆接頭,其他的腳位也有母座,直接接杜邦線就可以使用了。如果想要用Micro:bit來輸出音效的朋友,左下角的音源接頭,您一定會喜歡的啦。

硬體接線

請將可變電阻先插上麵包板,接著將中間腳位接到Micro:bit0號腳位(#0 pad),接著一側接地(GND)一側接電。

 

請注意Miro:bitGND腳位相當多,但在此使用比較好接的GND pad

Micro:bit程式

寫一個簡單的程式,按下A按鈕之後,會不斷讀取P0類比腳位的狀態(0~1023),如果P0<300的話,亮起 LED matrx 第一列,反之亮起1~4列。您可以自由修改這個判斷值與呈現的效果。

Javascript code

 

有興趣的朋友也可以轉成JavaScript來比較看看,慢慢就會進步喔

input.onButtonPressed(Button.A, () => {
   while (true) {
       if (pins.analogReadPin(AnalogPin.P0) < 300) {
           basic.showLeds(`
               . . . . .
               . . . . .
               . . . . .
               . . . . .
               # # # # #
               `)
       } else {
           basic.showLeds(`
               . . . . .
               # # # # #
               # # # # #
               # # # # #
               # # # # #
               `)
       }
       basic.pause(100)
   }
})

完工了!來試試看吧。確認腳位都沒接錯之後,請慢慢轉動可變電阻,看看LED matrix有沒有變化吧。

 

相關文章:

 

【臺北市職能發展學院 X CAVEDU教育團隊】人工智能服務與Opendata大數據專題實作​-學員錄取名單

 

主辦單位:臺北市職能發展學院

培訓單位:翰尼斯企業有限公司

學員錄取名單:

正取

陳O銓李O漢粘O詠
沈O財李O熹周O和
紀O如黃O乖楊O誌
蔡O志陳O奇翁O堂
林O源穆O澤O豪
郭O龍陳O桐黃O逸
蘇O聖陳O謙許O斌
丁O濠孫O文李O殷
胡O瑞林O緯周O杰
平O鈞陳O峰

上課地點:台北市中山區長安東路一段18號6F (長安東路 / 林森北路交叉口附近)


注意事項:

1.第一次上課請遞交學員資料卡、職能進修契約書,1吋大頭照(2張)、身份證正反面影本。

2.受訓期間膳宿自理,受訓期滿全期訓練成績合格者,由本單位發給結訓證書。於進修課程期間,除公假、病假、喪假外,其餘請假事由一律以事假認定。未依規定辦理請假時,均以曠課論。扣除公假及喪假外,請假時數累積達全期課程總時數1/5(含)以上者、曠課時數達全期課程時數1/10(含)以上者或參訓期間行為不檢,情節重大者,勒令退訓。

3.已報名繳費學員因故無法參訓,得於開訓前申請退還所繳費用,未於開訓前申辦者,已繳交之訓練費用,除該班次停辦外,一概不予退還。

 

更多課程詳情,請參閱CAVEDU教育團隊首頁(http://www.cavedu.com)。

[App Inventor IoT] 使用BLE控制LinkIt 7697 LED燈

 

本文章教各位讀者如何用手機撰寫App Inventor的應用程式,並透過Buletooth Low Energy來遙控LinkIt 7697的的LED燈。

作者/攝影  袁佑緣
時間  1小時
成本
難度  * *
材料表
  • LinkIt 7697
  • micro usb線
  • 電腦
  • Android手機

 

App Inventor Extension 安裝

請先進到App Inventor的網站,並建立一個專案,在左下角Extension的部份,點選import extension,如下圖。

並把從MIT App Inventor Extensions網站(http://appinventor.mit.edu/extensions/)上的BLE套件裝上去。

如果讀者想要直接取用本範例的aia檔也可以,這樣就不需要再手動安裝Extension,因為已經包含在aia檔中了。

 

本範例的aia檔請到此處下載(https://drive.google.com/open?id=0B0HNqd_8V0OlNjJDTGx0dVNKOTg)。

(建議先下載後重新上傳到app inventor tw的檔案庫上)

 

App Ineventor 程式設計

首先請確認您有按照前面的步驟將BLE元件新增App Inventor中,如下圖。

接下來請看到Desginer的部份,connect按鈕主要是用來連線到7697的,而下面有兩個按鈕,分別用來控制LED燈的ON跟OFF。

接下來看到後台的Blocks端,首先我們要先定義一個addr的變數,用來指定要連接的LinkIt 7697的mac address,至於這個mac address會根據每一塊不同的板子而有所不同,請讀者按照待會Arduino程式設計的部份所顯示的MAC Adress填入正確的位址。

再來當按鈕connect按下去之後,就會嘗試連上指定mac address的控制板,如果成功的話就,按鈕就會切換到Disconnect,以等待下一次使用者按下時,就會斷線。

至於定義連線時與斷線時的功能有哪些,則是用下面的when block來決定,只有成功連線時,才能夠控制控制LED的開關。

接下來是本範例的重點部份,當按下ON/OFF開關時,會透過BLE元件的WriteIntValue來傳送訊息給7697,並且是已經指定好service跟characteristic的uuid了,而這個uuid其實是跟Arduino端裡面寫的UUID是一致的,詳情請看下面的範例程式碼。

 

而我們送出的整數數值1或者是0則分別代表LED是要亮或者是暗。

 

LinkIt 7697 程式設計

本範例程式可以在Arduino IDE的範例code上找到,請先確定您的控制板在編輯器中切換成7697,再點選Files->Examlpes->LBLE->SimplePeripheral。

/*
  This example configures LinkIt 7697 to act as a simple GATT server with 1 characteristic.

  To use it, open AppInventor project:

    * 

  Build & install it on Android id

  created Mar 2017
*/
#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() {

  // Initialize LED pin
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

  //Initialize serial and wait for port to open:
  Serial.begin(9600);

  // to check if USR button is pressed
  pinMode(6, INPUT);

  // Initialize BLE subsystem
  LBLE.begin();
  while (!LBLE.ready()) {
    delay(100);
  }
  Serial.println("BLE ready");

  Serial.print("Device Address = [");
  Serial.print(LBLE.getDeviceAddress());
  Serial.println("]");

  // configure our advertisement data.
  // 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);

  // start the GATT server - it is now 
  // available to connect
  LBLEPeripheral.begin();

  // start advertisment
  LBLEPeripheral.advertise(advertisement);
}

void loop() {
  delay(1000);

  Serial.print("conected=");
  Serial.println(LBLEPeripheral.connected());

  if (digitalRead(6))
  {
    Serial.println("disconnect all!");
    LBLEPeripheral.disconnectAll();
  }

  if (switchCharacteristic.isWritten()) {
    const char value = switchCharacteristic.getValue();
    switch (value) {
      case 1:
        digitalWrite(LED_BUILTIN, HIGH);
        break;
      case 0:
        digitalWrite(LED_BUILTIN, LOW);
        break;
      default:
        Serial.println("Unknown value written");
        break;
    }
  }


}

成功上傳本隻程式碼到7697上後,請打開Serial Monitor,7697將會印出這塊板子的MAC Address,請務必記得把這段位址修改到App Inventor端的addr變數上喔。

範例影片

([Appinventor ]使用手機BLE控制7697 LED燈)

 

相關文章:

 

 

[ 電路設計軟體Multisim Blue ] 花朵、小雞、金魚造型LED燈設計

最近我的同事對摺紙產生興趣,於是拿了些手邊的電子零件與水銀電池,洗成一塊電路板做成小吊飾。希望對設計電路板有興趣,但又覺得很難不敢靠近的同學們,可以參考這篇文章看看喔

作者/攝影  豐智/偉伶
時間  2Hr
成本 100元以內
難度  * * *
材料表
  • 水銀電池扣*1
  • 1/4W 220歐姆電阻*1
  • RGB七彩LED燈*1
  • 滑動開關*1

閱讀本篇文章如果有什麼不清楚的地方可以參考看看這幾篇文章

 

今天跟大家分享的是造型LED燈,透過摺紙寶典,我們希望能讓基本的LED燈可以添增更多的趣味,這次搭配摺紙金魚、花朵、小雞,希望能帶來更多變化。

摺紙的部分,我們參考下列的摺紙連結,各位也可以設計各式各樣的摺紙造型做裝飾喔。

 

1、摺紙世界-禮盒裝飾花連結

2、ORIGAMI-折り紙 摺紙教學 –Fish連結

3、超簡単折り紙 雄鶏です連結

 

 

希望能設計出搭配各種勞作的小電路是這次的設計目標,設計一個電路作品,總共分為下列幾個步驟。

  • 繪製電路圖、確定使用各項電子元件的材料、數量、元件的大小
  • 將電路圖的資料轉換成電路板
  • 進行電路板布局
  • 進行電路板布線

我們來看看吧

1、繪製電路圖

Step1:我們首先要確認預想的電路圖,以及使用到的電子元件,下圖是作品的電路。

造型燈電路圖.jpg

 

我們這次使用的電子元件有:LED燈、220歐姆電阻、滑動開關(三隻腳)

 

 

Step2、確認過電路圖與材料後,接著開啟Multisim Blue繪製電路圖,今天我們快速的找到這些元件,如果想要複習軟體操作的人可以看這篇:[電路設計軟體Multisim Blue]電路繪製-基本LED電路篇

搜尋電子元件:在軟體上方的選項[Place]à[Component]

選擇電子元件[component]

1、選擇三個腳位的開關,這裡使用排針做取代,排針腳位之間的距離為2.54mm

開啟[Component]之後選擇:[Mouser Database]à[Connectors]à [HEADER_PIN_Single_Row_Molex]

選擇3pin 2.54mm排針

 

2.選擇電阻

開啟[Component]之後選擇:[Master Database]à[All groups]à[RESISTOR]à[220]

選擇220歐姆電阻

 

3.選擇LED燈

開啟[Component]之後選擇:[Master Database]à[Diodes]à[LED]à[LED_red]

選擇方法與法一法二相同

 

4.選擇GND、VCC

開啟[Component]之後選擇:[Master Database]à[Sources]à[POWER_SOURCES]à[Ground]、[VCC]

 

所有的電路符號

 

Step3 比照電路圖進行繪製

1、LED燈是否能亮起來,取決於開讓下列哪一條電路導通,當開關往下拉時,LED燈、電阻、電池形成一個迴路。 開關往上拉時,電池的正電沒有接到任何一個迴路,形成斷路。

導通的迴路

2、按照電路圖在Multisim Blue上將電子元件連接起來,將滑鼠移至電子元件其中一個端點,點擊滑鼠左鍵,接著將線拖曳至另一個電子元件的端點,再點擊一次左鍵,你可以拖曳看看電子元件,剛剛的線不會斷掉,會隨著電子元件延伸,代表線是成功連起來。

元件端點的連接

 

3、接線完成後的圖

電路完成圖

 

4、這次使用的電池是焊接比較容易使用的電池扣,這是分享使用Header的一些心得,只要確定好兩個焊接端點的距離,便可以畫出電路圖

 

開啟[Component]之後選擇:[Mouser Database]à[Connectors]à [HEADER_PIN_Single_Row_TE_Connectivity]à[10297-1]

新增單一腳位的排針

分別在GND、VCC接線

電路完成圖

2、將電路圖的資料轉換成電路板

 

在MultisimBlue上繪製完電路圖之後,我們將電路圖轉換成PCB繪圖軟體檔案。

點選[Transfer]à [Transfer to Ultiboard]à[Transfer to Ultiboard Component Evaluator14.0]

電路圖轉電路板

轉換完成後,MultisimBlue會幫助我們開啟PCB軟體:[Ultibaord Component Evaluator Mouser Electronic Edition],電路圖電子元件間的接線,在PCB軟體會將轉換成預拉線,如下圖。

電路板與元件預拉線

電路板與元件預拉線

3、進行電路板布局

這次目標用電路板雕刻機切出一個直徑3cm圓形的電路板

 

Step1將電子元件移至左下角

各位在電路圖上可以看到一個黃色的方框,我們稱為[Board Outline],左下角有一個圓形十字架的圖示,PCB設計板完成後,如果使用電路板雕刻機,我們發現這圖示是電路板雕刻機停下來的原點,為了之後的檔案可以方便使用,請將電子元件全部移到左下角,靠近原點。

你在左邊與上面看到刻度表,只要將滑鼠移至刻度表點擊左鍵,刻度表會出現箭頭與虛線,告訴你箭頭與板框之間的距離,記得把距離單位選成mm喔。

使用刻度表與丈量

 

Step2在左邊與上面的刻度表各拉兩個,標示出3cmX3cm的範圍

元件布局:標示3cmx3cm

 

Step3、編輯Board Outline

1、將滑鼠移至左方的[Design Toolbox]工具列對[Board Outline]點擊兩次,可以對黃色線的板框刪除、縮小放大。

 

Board Outline

 

2、在軟體上方的點選[Edit]à[Selection filter]à[Enable selecting other objects],可以編輯電子元件以外的物件

編輯電子元件以外的物件

 

Step4、畫出一個圓形的Board Outline

  • 點選原本的板框並刪除

點選板框

刪除板框

2. 在黑色的區域點擊右鍵選擇[Graphics]à[Circle]

畫出圓形

 

3、畫出一個圓形Board Outline

畫出圓形

 

Step5、更改電子元件的位置

1、安排完電子元件後,可以點選[View 3D],觀看電子元件的3D顯示圖

View3D

2、安排電子元件時,可以把電子元件更換到另外一面,我們稱電路板正面為[Copper Top]、背面為[Copper Bottom] ,你也可以選擇每一面代表的顏色。(Top預設為綠色、Bottom預設為紅色)

選擇Copper Top

 

3.更換電子元件的板面位置時,首先點選要更換的電子元件,這裡使用LED燈,再點選右上角的[Swap layer],更換的LED顏色便會更改為紅色,代表LED燈更換到背面了

更換電子元件板面位置

電路板布局3DA

電路板布局3DB

 

Step6、丈量水銀電池扣的位置

  • 下圖是水銀電池扣,經過測量長度為24mm、寬度22mm,針腳之間的距離為20mm。再電路板的規劃中,我們可以使用上方與左方的刻度表劃出24x22mm的電池扣空間,在空間之外放置其他的元件。

水銀電池扣尺寸

 

4、進行電路板布線

Step1、使用自動布線

元件與元件之間的預拉線,可以用自動布線規畫最佳的走線路徑,是相當便利的功能,如果你的作品有數百條預拉線,讓軟體幫你布線可以節省更多時間。

選擇右上方的[Start/resume autorouter]或使用快捷鍵(Ctrl + Shift + 8)

自動布線

 

 

Step2、整理布線

這次的作品比較容易,整理布線時首先注意兩點,可以避免走線路徑產生一些不必要的電池輻射(1)線需要轉彎時,轉彎角度應該大於90度(2)轉彎需要再轉彎時,應多走一些距離再轉彎

整理布線

 

Step3 設定Dril與PAD

1、Dril常被稱為鑽孔,顧名思義是使用鑽頭貫穿電路放置需要貫穿固定的電子元件,PAD常被稱為焊盤,是預留作為焊接點的地方。下圖藍色的部份便是PAD,滑鼠左鍵點擊兩次後可以直接設定。

點選PAD

 

2、點選[PAD],左上方選項可以選擇PAD的形狀,為了焊接方便,我們要把PAD的面積變大,但不能碰到相鄰的PAD的或走線。

A、選擇形狀Shape:

選擇[Rectangle]à設定長度[Length]為2mm。

B、選擇大小Size:

選擇[Pad diameter]à設定直徑為2mm。

C、選擇鑽孔大小Hole:

選擇[Dril diameter]à設定直徑為1.2mm。鑽孔大小請依照使用者的鑽刀大小做設定。

設定DrilPAD

 

3、PAD與Dril設定後的參考圖片

設定合適的DrilPAD

 

Step4 設定走線的路徑

設計電路板時,線徑的大小與電磁干擾成反比,線的長度與電磁干擾成正比為了降低不必要的電磁干擾,將線徑加寬。

A、選擇想加寬的走線後滑鼠右鍵,點選[Properties],出現下圖的[Trace Properties]。

B、選擇[General]à到[Measurements]將寬度[Width]調整為2mm。

設定走線路徑寬度

 

線徑加寬設定畫面

路徑加寬度

 

5、完成畫面

這是完成畫面,走線也可以使用[SWAP Switch],將指定的走線換到另外一面

走線於Top板面上

走線於Bottom板面上A

Bottom板面上B

 

完成之後大家可以搭配各種造型的摺紙

 

相關文章:

 

 

 

[App Inventor+Microbit小專題 ] 按鈕控制畫面小球

作者/攝影  曾吉弘
時間  3小時
成本
難度  * * * *
材料表
  • 個人電腦
  • App Inventor開發環境
  • 支援BLE的Android手機
  • BBC Micro:bit開發板

本文要介紹如何透過BBC Micro:bit開發板上的按鈕來控制App Inventor畫面上的小球左右移動,碰到畫面邊緣還會在Micro:bit LED matrix 上顯示對應的字樣。

 

範例 aia檔下載請按我

 

藍牙配對

 

Micro:bit端設定:

  1. 同時按住Microbit 正面A、B按鍵,不要放掉
  2. 按住A、B鍵時,把背面的Reset 鍵按下後再放開。
  3. 這時應該可以看到 “PAIRING MODE!” 以跑馬燈方式出現在Microbit LED 螢幕上,若看到這訊息,便可以放開A、B鍵。
  4. PAIRING MODE! 結束後,會看到一個圖形出現在Microbit LED 螢幕上,不同的Microbit 出現的圖案也不同,這是Microbit 不同裝置獨特的”簽名” (Signature) 。

  1. 這時候的Microbit 已經準備好跟其他裝置配對,請看以下影片教學

 

 

 

Android手機端設定:

  1. 進入Android手機的設定–>藍牙
  2. 確認Micro:bit 已進入配對模式
  3. 當Micro:bit上的‘PAIRING MODE!’ 顯示完,搜尋(每隻Android手機這個選項的文字不一定相同,但意思差不多),應該會看到類似 micro:bit [XXXXX]的選項,其中XXXXX 會根據每片micro:bit而不同。點選該裝置來配對。

4.micro:bit 會出現向左的箭頭,然後Android裝置上會跳出畫面要求輸入配對PIN碼的視窗。

5.按住Micro:bit 的按鍵A ,這時microbit 會連續出現六個數字,這就是配對碼。

6.回到Android裝置上,輸入這六個數字。如果Microbit 出現[V],代表配對成功。如果是[X]代表沒成功,請再試一次

 

編寫程式

匯入BLE 與 micro:bit extension

 

請登入MIT App Inventor官方網站,建立新專案,在Designer頁面中點選Palette左下角的Extension,再點選”Import extension“與”URL:

  1. 貼入以下兩個 extension link:

 

2. 請加入 Microbit_LedMicrobit_Button這兩個Microbit元件。兩者的BluetoothDevice 屬性設為 “BluetoothLE1″。這步驟很容易忘記,別漏掉了

  1. 加入四個按鈕放入 horizontalArrangement元件中,分別用於掃描、停止掃描連線與斷線

 

  1. 新增Canvas畫布元件(寬高各為320像素,底色隨意),再放入一個Ball元件。完成後Designer頁面如下圖(可以不用一模一樣)

Blocks頁面

 

本範例的基本概念是按下Micro:bit板子上的兩個按鈕可以控制小球左右移動,碰到Canvas邊緣會在LED矩陣上顯示對應的文字。開始吧:

STEP1: BLE連線成功後啟動Clockl元件

在BluetoothLE1.Connected事件中,首先啟動Clock.Timer(timer Interval 設為100),並顯示相關訊息,最後要求Micro:bit開始更新兩個按鈕的狀態。

STEP2:按下Micro:bit左側A按鈕

Microbit_Button1.ButtonAStateReceived事件中:

○如果按下了左側的A按鈕(Button_State_Value為true),則讓ball_X 變數值累減10。

○讓Ball1元件移動到(ball_X, 100),也就是左移10像素。

STEP3:按下Micro:bit右側B按鈕

現在看到右側的B按鈕,所做的事情幾乎一模一樣但是Ball1元件的移動方向是相反的。

Microbit_Button1.ButtonBStateReceived事件:

○如果按下了右側的B按鈕(Button_State_Value為true),則讓ball_X 變數值累加10。

○讓Ball1元件移動到(ball_X, 100),也就是右移10像素。

STEP4 Ball reached canvas’ edge

當小球碰到Canvas畫面四邊時,我們希望在Micro:bit的LED矩陣上顯示對應的文字。

Ball1.EdgeReached事件中,使用 if / else if 來檢查到底碰到了哪一邊,根據App Inventor的文件,1是北方,所以要透過Microbit_Led1.WriteLEDText指令來顯示’N’。其餘類推,請看下圖:

完工了!來試試看吧。請確認您的Micro:bit與Android已經配對好了。按下Microbit板子上的按鈕應該讓畫面上的小球左右移動,試試看讓小球去撞牆吧,看看有沒有顯示對應的文字。試試看用 Micro:bit LED 搭配 App Inventor 做出更多功能吧

 

 

相關文章:

[ Micro:bit開箱文] 手勢辨識Grove也有Micro:bit的擴充板套件了Grove Inventor Kit

Micro:bit 為英國廣播公司(BBC) 為推廣學齡兒童程式邏輯教育給所推出的簡潔版卡式開發硬體;外形小巧便於攜帶,在程式教學上的特點有著簡單好上手的介面,硬體上有內含幾款感測器可供單獨使用,以及其可擴充性接腳的設計可將其教育應用的觸角更加延伸。

作者/攝影  林德昀
時間  拆開包裝紙的時間
成本 約NT:1,900
難度  * * *
材料表
  • Grove Inventor Kit

本套件由創客界知名的 Seeed 為 Micro:bit 所推出符合 Grove 標準的模組化套件,一般在物聯網的學習上通常使用的麵包板及杜邦線會有較多接線上的出錯機會,而對於硬體較不熟悉的軟體初學者若使用此套件學習可事先排除很多上述的問題而可更直接專注於程式學習上。

本套件包含:

  1. 擴充母板
  2. 迷你喇叭模組
  3. 角度感測模組
  4. 超音波感測器模組
  5. 光感測器模組
  6. 防水三色發光二極體條
  7. 手勢感應器模組 (筆者認為最有可玩性的模組)
  8. 4 位數字顯示器
  9. 紅光 LED 模組
  10. micro USB 線
  11. 五色鱷魚夾線各2條 (黑、白、紅、綠、黃)
  12. 使用手冊

 

手勢辨識

Micro:bit 上 5×5 LEDs 顯示手勢方向

 

以手勢控制彩虹燈走向

(程式實作部分請期待另篇應用教學文)

 

1.擴充母板

將Micro:bit 的擴充腳位拉出,有給 Grove 4-pin 接頭×4, 以及可供鱷魚夾或香焦棒使用的接點:P0,P1,P2,P8,P12,P13,及3.3V和GND,左方還有PWR的電源指示LED,及僅使用於供電使用的Micro USB接頭 (無法寫入程式);右方中間有廷伸用的接頭目前尚未有其資料,待有新資訊後補充。

 

下圖為Micro:bit 放入後週邊使用其他配線的示意圖

  1. 迷你喇叭模組

可由此喇叭發出汽車,門鈴⋯⋯等,經由不同的頻率的輪入訊號,可得出多樣變化的聲音;此模組中有可供調整輪出音量的可變電阻。

 

  1. 角度感測模組

由10k 歐姆可變電阻組成的角度感測模組,變化角度可由0~300度。可在學習專案中控制音量或馬達轉速⋯⋯等。

 

4.超音波感測器模組

可由此模組以非接觸的方式測量距離,可學習依據不同的距離變化將變量經由Micro:bit轉化為光或聲音的不同變化。

 

5.光感測器模組

可檢測出光度的變化而輸出相對應的訊號,可學習依照訊號強弱的不同而控制LED閃爍⋯⋯等應用。

 

  1. 防水三色發光二極體條

由30顆3色LED 所組成1公尺長的LED 條,每一LED 可由程式獨立控制顯示不同色彩,其封裝具有防水性,可使用於戶外而無需擔心下雨淋溼的影響。

 

7.手勢感應器模組

具有識別 上、下、左、右、前、後、順時鐘、反時鐘及揮手共9種手勢的感測模組。其感測範圍於前方5~15公分,視角60度內的區域內。由於未有詳細資料,筆者猜其工作原理可能為以紅外光加上脈波調變及都卜勒效應所作的感測器。可由本模組實作手勢操作各項目應用,如切換音樂,調整音量,開關燈⋯⋯等。

 

脈波調變:以脈波的形態將訊號改變為所需要的波形,創客界常用的PWM即為一種工作時間寬度上的脈波調變;在實際生活中,各遙控器不相互干擾也是一種脈波調變的應用。

 

都卜勒效應:當接近或遠離時,會對觀察者造成測量頻率的變化;如火車接近時的鳴笛聲會較尖銳,而遠離時會較低沉。

 

  1. 四位數字顯示器

可於學習專案中用作顯示時間或實驗數值。

 

  1. 紅光 LED 模組

需注意LED腳位,若不亮時請檢查是否接反。

  1. 使用手冊

內含12種對於以上模組的基礎程式應用

 

相關文章: