Tag Archives: bluetooth

[雙A計畫]藍牙模組(HC05、HC06)常見的指令使用教學

在教到藍牙之間的通訊的課時,常常會搞錯藍牙型號,想寫這篇文跟大家分享,市面上常用的HC-05和HC-06外觀幾乎一樣,不知道如何對藍牙鮑率做設定,想深入研究可以來看看喔。

作者/攝影  許鈺莨
時間  30分鐘
成本
  • 600~800
難度  * * *
材料表
  • 藍牙模組HC-05*1
  • 藍牙模組HC-06*1
  • USB TO TTL線*1
  • Arduino UNO*1

在按照本文中步驟操作時,請讀者一定要購買時請先與商家進行確認以下幾點:

  • 藍牙型號是HC-05還是HC-06
  • 若是已經確認藍牙型號後,請再與商家確認出廠預設鮑率是9600、38400…..等。

如果以上兩點都已確認過,在做藍牙相關設定時會比較快上手,但一切以商家給的文件為主。

接下來教大家如何快速辨別我們買的藍牙是型號是HC-05還是HC-06,還有藍牙指令設定,所以針對以下幾個部分,我以Keyes藍牙的 HC-05和HC-06做範例:
(本文參考instructable藍牙文件、Retun的Blog)

 

  1. 藍牙HC-05和用Arduino UNO 板設定AT指令教學
  2. [進階設定]HC-05主動模式和手機藍牙連線
  3. 藍牙HC-06和用Arduino UNO 板設定AT指令教學
  4. 藍牙HC-05 USB轉TTL模組設定AT指令教學
  5. 藍牙HC-06 USB轉TTL模組設定AT指令教學

1.藍牙HC-05和Arduino UNO 板設定AT指令教學(適合課堂上多人使用)

如果看見藍牙有六隻針腳時,就可能是型號HC-05的藍牙,但是還是要依照以下步驟實際接線測試或與商家確認藍牙型號。

 

設定HC-05的AT指令之前,先與Arduino UNO接線,請先將Arduino的RESET和Arduino的GND接在一起,使得Arduino成為重置模式再依照下方依序接線:

藍牙Arduino UNO
KEY(or En)3.3V
VCC5V
GNDGND
TXDTXD
RXDRXD
STATE不用接

接完線後,將Arduino UNO 用USB連接到電腦,選擇該板子的COM Port,按下Serial Monitor,由於這是Keyes藍牙HC-05的鮑率出廠時預設為38400,所以Serial Monitor的鮑率要選38400,另外一個選項要選NL&CR,即可下AT指令,大小寫不拘。
用藍牙HC-05的好處就是如果設成別的鮑率,之後如果忘記了,在Serial Monitor還是可以固定選38400,再用「AT+UART?」指令查詢,或是設定成別的鮑率。

輸入AT指令第一次會出現ERROR:(0),第二次輸入AT出現OK,即可進入AT模式。

因為HC-05為主從一體(Slave & Master)藍牙,指令多達36種,所以接下來會告訴各位常用的指令。

如果你和我一樣是講師在課堂上教學的話,則一開始這裡有兩個步驟非常重要:

  1. 查詢HC-05 address
  2. 知道自己藍牙的address後改名字

因為在上藍牙通訊時,如果只有兩三位同學的話,還可以一個一個連address測試,但是10幾、20幾位同時在課堂上連線時會搞混,會不知道是不是會連到自己的藍牙,所以要先查出自己藍牙的address的指令,再改藍牙名字。

 

  • 查詢HC-05 address: 「AT+ADDR?」

  • 改名字為CAVEDU: 「AT+NAME=CAVEDU」

  • 查名字 :         「AT+NAME?(確認是否改對)」

  • 改鮑率為9600 : 「AT+UART=9600,0,0」

  • 查鮑率: 「AT+UART? 」

如果改完鮑率請把藍牙電源拔掉再重新接上,再把KEY腳位接上3.3V,新的鮑率設定才會生效

 

  • 設定配對密碼為1234: 「AT+ PSWD=1234」

HC-05還有設定主動模式(Master)的功能,指令如下:

 

  • 設定被動模式: 「AT+ROLE=0」

  • 查詢主/從模式:         「AT+ROLE? 」

  • 設定主動模式: 「AT+ROLE=1」

  • 預設出廠模式: 「AT+ORGL」

如上圖所示,設成出廠模式時,可以用前面所知的AT指令可以查到所有的狀態,包括名字、鮑率、密碼皆已回復。如果之前設成主端(Master),後來也會回復設成從端(Slave)。

 

 

 

  1. [進階設定]HC-05主動模式和手機藍牙連線

既然已經知道如何手動下AT指令設定HC-05為主動模式的話,接下來試著跟手機藍牙連線吧!

既然要和手機連線的話,手機裡就必須先安裝有接收藍牙字串的APP,我是用Android系統的手機,Google paly商店可以搜尋名字為「Bluetooth Terminal」的APP,而在IPHONE的App store也可以搜尋得到一樣名稱的APP,這款APP可以和HC-05雙向溝通。

 

而如何知道手機的藍牙位址,可以由 :設定→關於手機→狀態,知道訊息。

再上一個段落已經知道如何設定HC-05的主動模式了,所以這節以主動連到手機藍牙位址為主。

下列敘述完整步驟,從設定主動模式開始:

 

Step1:切換至主動模式。

輸入指令「AT+ROLE=1」,收到回應「OK」,表示藍牙模組已進入主動模式。

 

Step2:確認藍牙模式。

輸入指令「AT+ROLE?」,收到回應「+ROLE:1」、「OK」,表示當前藍牙為主動模式。

 

Step3:指定藍牙連線至手機連接模式。

輸入指令「AT+CMODE=0」,收到回應「OK」,表示藍牙將連線至手機。

 

Step4:重啟藍牙。

輸入指令「AT+RESET」,收到回應「OK」,表示藍牙重置。

 

Step5:初始化SPP 函式庫。

輸入指令「AT+INIT」,收到回應「OK」,表示藍牙SPP函式庫已初始化。

 

Step6:設定詢問模式。

輸入指令「AT+INQM=1,9,48」,收到回應「OK」

1:RSSI信號強度指示。

9:可以搜尋9個藍牙設備。

48:搜尋時間為48*1.28秒=61.44秒內。

 

Step7:開始詢問,將搜尋周遭藍牙裝置。

輸入指令「AT+INQ」,收到回應「+INQ:12:34:567890:1F1F,7FFF」(該參數為藍牙Address,不同模組Address亦不同)、「OK」。

 

Step8:結束詢問。

輸入指令「AT+INQC」,收到回應「OK」,需要再次輸入指令「AT+STATE?」確認藍牙狀態,若藍牙回應為「+STATE:INQUIRING」、「OK」,代表藍牙未結束詢問,必須回Step4重啟藍牙和Step5初始化SPP 函式庫後,輸入指令「AT+STATE?」,回應為「+STATE: INITIALIZED」,才能成功連線手機藍牙。

 

Step9:綁定連線手機藍牙Address。

輸入指令「AT+BIND=1234,56,abcdef」(在此裝置Address以12:34:56:ab:cd:ef為例),收到回應「OK」。

 

Step10:和手機藍牙連線。

輸入指令「AT+LINK=1234,56,abcdef」

連線後,手機會出現輸入配對密碼1234,表示配對成功,之後就都不需要配對。

當配對成功後,接下來開啟Bluetooth Terminal,先按下「send」後,會出現之前配對成功的裝置清單,選擇之後即可雙向溝通。

下列是配對成功,HC-05和手機雙向溝通的畫面:

3.藍牙HC-06和用Arduino UNO 板設定AT指令教學(適合個人使用)

 

目前的HC-06藍牙會有四條針腳居多,分別是VCC、GND、TX、RX,以下是HC-06的正反面:

HC-06正面                                                                                                          HC-06反面

在設AT指令前,也是先與Arduino UNO接線,只需要接四條線。

和前面HC-05方法一樣,要先將Arduino UNO 的RESET和自己的GND接線,再和HC-06接在一起。

藍牙Arduino UNO
VCC5V
GNDGND
TXDTXD
RXDRXD

 

HC-06出廠後多半都已經設定為從端(Slave),而AT指令只有少數的指令如:密碼、鮑率、姓名….等,以下Arduino UNO Serial monitor示範AT指令,所有AT指令皆要大寫:

 

  • AT測試,回應OK

和HC-05不同的是,因為Keyes的HC-06出廠時預設為9600,所以Serial monitor的鮑率選項要選9600,選擇「沒有行結尾」或「No line ending」。

測試成功後,接下來就是設定其他的AT指令:

 

  • 查詢版本: 「AT+VERSION」

  • 設定名字為CAVEDU02: 「AT+NAMECAVEDU02」

  • 設定密碼為1234: 「AT+PIN1234」

  • 設定鮑率為9600: 「AT+BAUD4」
編號鮑率備註
11200設定鮑率為1200
22400設定鮑率為2400
34800設定鮑率為4800
49600設定鮑率為9600(原廠預設)
519200設定鮑率為19200
638400設定鮑率為38400
757600設定鮑率為57600
8115200設定鮑率為115200

與前篇HC-05最大的不同點是,假設你鮑率已經設成9600,若想要改鮑率或改名時,則你的Serial monitor的鮑率選項要選9600才能成功下AT指令;如果你鮑率已經設成38400,則你的Serial monitor的鮑率選項要選38400才能成功。也就是說,當你設定好之後就要記住自己鮑率是設定多少,否則就要每個鮑率去試試看,不像HC-05有固定鮑率為38400可以容易設定,這也是HC-06最大的缺點。

 

那麼問題來了,大家有沒有發現HC-06的AT指令比較少,並沒有像HC-05一樣有查詢address指令,那上課時怎麼辦呢?

個人較好的做法是在上課前先一一設定藍牙名字,上課時學員們才不會連到別人的藍牙。

因此我的建議是,HC-05和HC-06價錢如果差不多的話,可以買HC-05有較多的AT指令設定,上課時學員既可以學習去查address指令,又可以不會搞混連線到別人的藍牙,重點是老師就不用在上課前花時間設定所有學員的藍牙名稱。

 

  1. 藍牙HC-05 USB轉TTL模組設定AT指令教學

如果沒有Arduino UNO板,則用USB 轉TTL模組也是可以設定AT指令,那麼要在哪裡設定AT指令呢?

其實只要能夠讀取COM Port,使用任何一種終端機軟體皆可,如Putty、RealTerm….等等,我是使用AI的 CH430G USB 轉TTL模組,和使用AccessPort這個終端機軟體。

USB 轉TTL模組

 

AcessPort終端機

在使用AcessPort終端機前,HC-05先與USB 轉TTL模組接線:

USB TO TTLHC-05
3.3VKEY(or En)
5VVCC
GNDGND
RXDTXD
TXDRXD

 

接線時要注意是和USB 轉TTL模組連接,USB 轉TTL模組TXD和HC-05的RXD互接;

USB 轉TTL模組RXD和HC-05的TXD互接。

 

再將USB 轉TTL模組插入電腦USB時,會自動安裝驅動程式:

驅動安裝好了之後,需來到裝置管理員查COM Port,這也是和藍牙溝通的COM Port,所以在AcessPort終端機要選同一個 COM Port。

打開AcessPort終端機後按齒輪圖示 ,設定好鮑率9600和COM Port:

再按下電源圖示 ,就可以設定HC-05 AT指令,AT指令請參考「1.分辨藍牙HC-05和Arduino UNO 板設定AT指令教學」。

並在下方發送區輸入AT指令後要先按下鍵盤Enter後再按下「發送數據」即可,以下方圖示表示:

5.藍牙HC-06 USB轉TTL模組設定AT指令教學

USB 轉TTL模組和HC-06接線圖:

要注意的一點是,USB 轉TTL模組的TX要接HC-06的RX;USB 轉TTL模組的RX要接HC-06的TX。

USB TO TTLHC-06
5.0VVCC
GNDGND
RXDTXD
TXDRXD

 

AT指令和前面一致,請參考「2.分辨藍牙HC-06和用Arduino UNO 板設定AT指令教學」

並在下方發送區輸入AT指令後按下「發送數據」即可,以下方圖示表示:

 

相關文章:

 

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

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

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

LinkIt 7697的BLE

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

*BLE peripheral 與 Central   001

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

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

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

 

7697作為Central

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

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

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

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

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

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

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

 

File > Examples > LBLE > ScanPeripherals

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

LBLECentral scanner;

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

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

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

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

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

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

void loop() {
  delay(3000);

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

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

 

7697作為iBeacon

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

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

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

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

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

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

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

File > Examples > LBLE > BeaconAdvertisement

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

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

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

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

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

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

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

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

7697作為peripheral

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

 

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

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

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

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

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

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

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

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

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

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

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

 

File > Examples > LBLE > SimplePeripheral

 

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

 

Serial.println(LBLE.getDeviceAddress());

 

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

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

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

  Serial.begin(9600);

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

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

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

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

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

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

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

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

Android端(App Inventor)

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

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

 

Designer 頁面

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

 

Blocks 頁面

STEP1:

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

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

STEP2:

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

STEP3  :

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

 

STEP4  :

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

操作

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

 

相關文章:

[101專題計畫分享] Arduino101(Genuino 101)&App Inventor – RGB LED控制

本文延伸自 App Inventor 中文學習網的[取得像素顏色]範例,將觸碰點的RGB值經由藍牙丟給Arduino 101 去點亮 RGB 燈,您可以擴充多顆RGB LED或其他彩色模組來達到更有趣的效果,可以說是極簡易版的 Philip HUE 照明系統喔!

本範例使用 Arduino 101,如果您是使用HC05 06 這類型的藍牙模組,則需使用 App Inventor 的 BluetoothClient元件,兩者不可混用。

程式碼請由此下載

 

作者/攝影  曾吉弘
時間  3~4小時
成本
  • Arduino 101 $1575 (購買連結)
  • RGB LED模組(本範例使用共陰) $30~50
  • 跳線  (一綑單芯線,$100左右,也可以買公公/公母杜邦線)
  • 400孔麵包板 ($80~100)
難度  * * * * *
材料表
  • 個人電腦 (作業系統可用 Windows, Mac OSX 與 Linux,本範例使用 Windows 7)
  • Arduino 101開發板
  • RGB LED模組(本範例使用共陰)

本文將介紹如何取得觸碰點的 RGB 參數之後透過 BLE 送給 Arduino 101 來點亮 RGB LED。

先來看影片吧

App Inventor

Designer

  • 使用 Canvas 來取得觸碰點座標。
  • 兩個連線斷線用的按鈕:Btn_Connect /  Btn_DisConnect
  • 三個用來呈現RGB值的 Slider (無法拖動)
  • BletoothLE:處理BLE通訊
  • Clock:定期要求 BluetoothLE 將資料(RGB參數)發送給 Arduino 101

Blocks

1.初始化

宣告相關變數,其中addr 代表您所要連線之Arduino 101 藍牙位址,印在板子背面。程式初始化時,要求BluetoothLE元件開始掃瞄。

2.連線與斷線

按下連線按鈕,BluetoothLE元件對指定位址裝置(Arduino 101)連線,並設定相關畫面元件是否可操作,並顯示”Connected”於螢幕狀態列。

斷線則剛好相反,斷開與Arduino 101之BLE連線之後將相關畫面元件恢復原狀,這樣才能重新操作。

 

3.滑動手指取得觸碰點RGB參數

使用 Ball.Dragged 事件,當拖動這個小球(代表您手指的位置)時,會執行以下動作:

  1. 清除畫面
  2. 將該觸碰點的GetPixelColor結果顯示在Canvas上,會是一個相當大的負整數後續使用select list item 去解出來之後就會是 0~255 的整數了。
  3. Ball 移動到觸碰點位置
  4. 使用select list item 搭配 split 指令去分別取得該點的紅色、綠色與藍色值,顯示於Label上即可。

接著在 Ball.Dragged 事件的下半,分別更新每一個 Slider 的指針位置(ThumbPosition)以及更新 r g b 三個變數的內容為該觸碰點的 r g b 顏色強度,準備要發送出去囉!
如果您覺得這裡的程式碼相當冗長的話,可以用一個副程式包起來讓主程式流程更簡潔易讀。

4.發送訊號

使用 Clock 元件每1秒鐘觸發一次 Clock.Timer事件,其中會使用 BluetoothLE.WriteIntValue 將 r g b 值的組合結果發送出去,例如 (128, 34, 255) 的組合結果就是 128034255,Arduino 收到之後再拆解即可。
Clock.Timer 事件的1秒鐘您可以自行修改為較小的數字,看看是否有比較好的操作體驗。

 

Arduino 101 code

重點在於 line 53~67 之間的if (LEDStatus.written())判斷式中,使用 incom = LEDStatus.value(); 來取得 App Inventor 送過來的整數值,並以 1000 為單位來拆開並顯示於 Serial Monitor,最後使用 analogWrite 指令去控制對應的 RGB LED 腳位就完成囉!

#include <CurieBLE.h>
#include <stdlib.h>
#define LEDr 6
#define LEDg 5
#define LEDb 3

BLEPeripheral blePeripheral;  // BLE Peripheral Device (the board you're programming)
BLEService ControlLED("19B10010-E8F2-537E-4F6C-D104768A1214"); // BLE AnalogRead Service

// BLE LED Switch Characteristic - custom 128-bit UUID, read and writable by central
BLEUnsignedIntCharacteristic LEDStatus("19B10011-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite  );

int incom = 0;
int r, g, b ;

void setup() {
  Serial.begin(9600);
  // set Light pin to output mode
  // set advertised local name and service UUID:
  blePeripheral.setLocalName("ControlLED");
  blePeripheral.setAdvertisedServiceUuid(ControlLED.uuid());

  // add service and characteristic:
  blePeripheral.addAttribute(ControlLED);
  blePeripheral.addAttribute(LEDStatus);

  // begin advertising BLE Light service:
  blePeripheral.begin();

  Serial.println("BLE RGBLED control.");

  pinMode(LEDr, OUTPUT);
  pinMode(LEDg, OUTPUT);
  pinMode(LEDb, OUTPUT);

}

void loop() {
  // listen for BLE peripherals to connect:

  BLECentral central = blePeripheral.central();
  // if a central is connected to peripheral:
  if (central) {
    Serial.print("Connected to central: ");
    // print the central's MAC address:
    Serial.println(central.address());


    // while the central is still connected to peripheral:
    while (central.connected()) {
      //Serial.println(LEDStatus.written());
      if (LEDStatus.written())
      {
        incom = LEDStatus.value();//110225101
        r = incom / 1000000 ;//110
        g = (incom / 1000 - r * 1000) ; //110225-110000=225
        b = (incom - r * 1000000 - g * 1000) ; //110225101-110000000-2250000=101
        Serial.println(incom);
        Serial.println(r);
        Serial.println(g);
        Serial.println(b);
        analogWrite(LEDr, r);
        analogWrite(LEDg, g);
        analogWrite(LEDb, b);
        delay(10);
      }
    }
    digitalWrite(LEDr, LOW);
    digitalWrite(LEDg, LOW);
    digitalWrite(LEDb, LOW);
    delay(100);
  }

  // when the central disconnects, print it out:

  Serial.print(F("Disconnected from central: "));
  Serial.println(central.address());
}

 

相關文章:

161219 Genuino 101 物聯網藍牙4.0操控實作@成電創客學園,台南成功大學

內容簡介

利用Genuino 101的藍牙4.0功能,建構並操控裝置。您會學到如何自行編寫 Android手機程式來與 Genuino 101溝通,日後就能自行製作很多有趣的互動專題喔!

免費報名請按我

課程時間

12/19(一) 13:00~17:00

課程地點

成電創客學園(台南市東區大學路1號<自強校區奇美樓1樓>)

課程內容

13:00 Arduino IDE環境建置,認識Genuino 101、簡易I/O操作(LED、RGB LED、電位計、繼電器等常用電子元件)
14:00 App Inventor圖形化Android開發環境、人機介面設計、如何安裝App到手機
15:30 BLE通訊機制、App Inventor 的BLE通訊元件
16:00 按鈕控制LED亮滅、語音控制繼電器
16:50 結語

注意事項

1. 請上課同學自備電腦。
2. 由於 Genuino 101 的套件包超過100MB,因此請務必請同學根據本頁說明(https://www.arduino.cc/en/Guide/Arduino101)先安裝 Arduino IDE (1.6.x)之後再安裝 Genuino 101 SDK。
3. 同學分組時,每一組至少需要有一位有Android手機。如果擔心BLE可否執行,可透過這個 app 來檢查。
4. 若上課時間充足,可加入讀取DHT11 溫濕度感測器值並顯示於手機畫面。

[App Inventor 物聯網應用-藍牙4.0 BLE] Lesson 5 – 讀取DHT22 溫溼度模組資料

App Inventor BLE 元件教學文第五發!本專題要告訴您如何讀取DHT22 溫溼度模組資料的狀態。BLE 與樂高EV3機器人控制元件已經正式發布,請多多使用吧!實際app執行畫面如下圖,先來看執行畫面吧:

[youtube=”https://youtu.be/rs5_5-LH2JA”]

Arduino 101 是 Arduino.cc (注意不是 .org) 與 Intel 合作的最新開發板,在美國以外的區域稱為 Genuino 101

延伸閱讀:

[Make雜誌國際中文版]Arduino 101 介紹

Arduino.cc 論壇的 callbackLED 教學(手機端並非使用 App Inventor )

Arduino 101 購買連結

Arduino 101 開箱文

Arduino 101 BLE 第一課 LED閃爍

Arduino 101 BLE 第二課 LED呼吸燈(PWM)

Arduino 101 BLE 第三課 讀取類比腳位A0

Arduino 101 BLE 第四課 控制機器手臂

Continue reading

[App Inventor 物聯網應用-藍牙4.0 BLE] Lesson 2 – LED PWM呼吸燈

App Inventor BLE 元件搭配 Arduino 101 第二篇文章來囉!本系列專文是介紹如何使用 App Inventor 的 BLE (Bluetooth Low Energy) 元件搭配 Arduino 101 開發板的各種互動專題。請用 http://ble-test.appinventor.mit.edu 這個測試用伺服器來測試,實際app執行畫面如下圖,先來看執行畫面吧:

[youtube=”https://www.youtube.com/watch?v=ihMyDoxapBQ”]

 

Arduino 101 是 Arduino.cc (注意不是 .org) 與 Intel 合作的最新開發板,在美國以外的區域稱為 Genuino 101

延伸閱讀:

[Make雜誌國際中文版]Arduino 101 介紹

Arduino.cc 論壇的 callbackLED 教學(手機端並非使用 App Inventor )

Arduino 101 購買連結

Arduino 101 開箱文

Arduino 101 BLE 第一課 LED閃爍

Arduino 101 BLE 第三課 讀取類比腳位狀態

Arduino 101 BLE 第四課 控制機器手臂

Continue reading

[App Inventor 物聯網應用-藍牙4.0 BLE] Lesson 1 – LED 閃爍

話說從 MIT 回來之後一樣沒閒著,今天要介紹的是還沒正式公布的秘辛 – App Inventor 的 BLE (Bluetooth Low Energy) 元件。請用 http://ble-test.apinventor.mit.edu 這個測試用伺服器來測試,當然您得先買一片 Arduino 101才行

MIT App Inventor 之後會使用 Arduino 101 作為物聯網教學套件核心開發板,套件包還在規劃中,大家有沒有想要套件包裡面放那些東西呢?說不定可以美夢成真喔

2016-01-26-14.50.47-1024x768

 

 

Arduino 101 是 Arduino.cc (注意不是 .org) 與 Intel 合作的最新開發板,在美國以外的區域稱為 Genuino 101

延伸閱讀:

[Make雜誌國際中文版]Arduino 101 介紹

Arduino.cc 論壇的 callbackLED 教學(手機端並非使用 App Inventor )

Arduino 101 購買連結

Arduino 101 開箱文

Arduino 101 BLE 第二課 LED呼吸燈(PWM)

Arduino 101 BLE 第三課 讀取類比腳位狀態

Arduino 101 BLE 第四課 控制機器手臂

Continue reading

[開箱文] Arduino 101 / Genuino 101 – Arduino.cc 與 Intel 合作,板載藍牙 BLE 與六軸加速度計/陀螺儀

Arduino.cc 與 Intel 合作的開發板:Arduino 101 (美國) / Genuino (美國以外),板載藍牙 BLE 與六軸加速度計/陀螺儀,今天終於拿到了。我們已經開賣 ($1575),歡迎訂購喔

101 的板型與 Uno 是完全一樣的,差別在於 Uno 的 ATmega328 晶片換成了Intel® Curie™ ,也就是說 101 有兩個核心:x86 (Quark) 與 ARC (Argonaut RISC Core)。讓 101 的效能更好、功耗也更低 (3.3V),另一個就是 Curie 晶片上的 Bluetooth Low Energy 與六軸加速度計/陀螺儀。

延伸閱讀:[Make雜誌國際中文版]Arduino 101:具感測器套件且處理器為 Intel Curie的30美元控制板

接頭還是和 Uno 一樣,有種懷舊的感覺

2016-01-26 14.50.47

2016-01-26-14.51.00-1024x768

Continue reading

[雙A計劃] Part9:藍牙遙控機器手臂車

整合性的範例就來一台機器手臂遙控機器人吧,把機器手臂裝在雙馬達車體上就完工了,一樣可以透過 App Inventor 來編寫。使用多個按鈕來控制機器人的各個動作。來看看之前的雙A計畫內容:

[雙A計畫] 常見問題整理

[雙A計劃] Part0:App Inventor 透過藍牙傳送訊號給 Arduino

[雙A計劃] Part1:App Inventor 經由藍牙控制 Arduino LED 亮滅

[雙A計劃] Part2:App Inventor 經由藍牙控制 Arduino LED 漸明漸暗

[雙A計劃] Part3:Android 手機透過藍牙接收 Arduino 類比腳位狀態

[雙A計劃] Part4:App Inventor 藍牙遙控 Arduino 雙輪機器人

[雙A計劃] Part5:Paperduino 藍牙控制 LED 閃爍

[雙A計畫]Part6:Arduino 傳兩筆資料到 Android 手機

[雙A計劃] Part7:Arduino超音波感測距離回傳數值給Android手機

[雙A計劃] Part8:Android 手機對 Arduino 同時進行資料收發

範例程式請點我下載(App Inventor中文學習網檔案庫)

準備以下材料:

1 Android系統智慧型手機

2.Arduino相容開發板 (本文使用 86Duino Educake)

3.藍牙收發接收器(本系列使用JY-MCU04 或 JY-MCU05)

4.麵包板

5.MeArm 或其他相同配置的四自由度機器手臂,使用四個伺服馬達

6.雙輸出行動電源或電池

IMG_0373

台南 Maker Faire 現場展示很受歡迎喔

本範例使用 86duino Educake來製作電路,您可使用各種相容 Arduino 板子。以下是主程式流程,還需要匯入其他函式庫,在此就不列出囉,請直接下載檔案即可。

2015-12-25 13.40.54

Continue reading

[雙A計劃] Part8:Android 手機對 Arduino 同時進行資料收發

雙A計畫第八篇來了!這次我們將告訴您如何在 Android 手機端與Arduino端藉由藍牙來互傳資料,本範例可同時控制 Arduino D13 腳位的高低電位 (有個板載LED,也可以自己接一顆 LED),並在手機畫面上看到 D13 腳位的狀態(High / Low)代表資料收發都完成了。

另外,想了解雙A計畫所有內容的朋友,請參考下面的連結

[雙A計畫] 常見問題整理

       [雙A計畫] 藍芽模組(HC05/06)常用指令教學

[雙A計劃] Part0:App Inventor 透過藍牙傳送訊號給 Arduino

[雙A計劃] Part1:App Inventor 經由藍牙控制 Arduino LED 亮滅

[雙A計劃] Part2:App Inventor 經由藍牙控制 Arduino LED 漸明漸暗

[雙A計劃] Part3:Android 手機透過藍牙接收 Arduino 類比腳位狀態

[雙A計劃] Part4:App Inventor 藍牙遙控 Arduino 雙輪機器人

[雙A計劃] Part5:Paperduino 藍牙控制 LED 閃爍

[雙A計畫] Part6:Arduino 傳兩筆資料到 Android 手機

[雙A計劃] Part7:Arduino超音波感測距離回傳數值給Android手機

!!!注意!!!

如果Arduino端太頻繁去傳送LED燈的亮暗狀態給手機的話,可能會造成藍牙通訊塞車。以本範例來說,Arduino端是每100毫秒會傳送一次訊息,但是筆者有試過如果幾乎不等待,就讓Arduino端一直傳送的話,那麼在接收Android手機端的命令時就會出現0與1以外奇怪的數值喔!

程式下載請點我  (aia檔是App Inventor的專案檔,apk檔是手機端的安裝檔,直接丟到手機安裝就可以使用了, ino檔則是給Arduino執行的)


手機端程式說明,使用 App Inventor:

Designer 頁面

Screen Shot 2015-07-23 at 4.47.24 PM

請注意,本範例中的Clock1 元件的 TimeInterval 設定為10毫秒,也就是每10毫秒手機端就會去啟動藍牙接收程式,查看Arduino端的D13腳位的電位高低狀態。

這個參數您可以自由修改,如果想要做到最即時反應那就可以把時間間隔改低一點,但是在這邊提醒一下,藍牙的傳輸資料還是多多少少會有些時間延遲喔!

Blocks 頁面

Screen Shot 2015-07-23 at 4.33.18 PM

區塊元件名稱功能
藍牙列表的設定when ListPicker1.BeforePicking在藍牙連線到裝置前,先將之前配對好的藍芽裝置匯入到準備連接的列表中
藍牙連線到裝置when ListPicker1.AfterPicking選好要連接的藍牙裝置後,將藍牙列表關閉、啟動計時器開始每隔一段時間讀值,並把斷線的按鈕設定為可執行
斷線按鈕的設定when Button3.Click按下斷線後就會斷開藍牙通訊,並把按鈕配置回到一開始的狀態

按鈕發送藍牙訊號來控制 Arduino 以及定期接收 Arduino 的回傳值來改變按鈕 (Button2) 的背景顏色

Screen Shot 2015-07-23 at 4.33.55 PM

區塊元件名稱功能
藍牙遙控LED燈when Button1.Click當按下ON之後就會透過藍牙傳送”1″的訊息給Arduino,如果Arduino成功接收到的話,就會亮燈當按下OFF之後就會透過藍牙傳送”0″的訊息給Arduino,如果Arduino成功接收到的話,就會熄燈每次按下手機螢幕上的開關時,按鈕上的文字都會在”ON”、”OFF”之間做切換

 

藍牙接收LED燈狀態when Clock1.Timer每隔一段時間(本次範例使用的是10ms),就會去接收Arduino透過藍牙傳送過來的LED燈狀態如果是”1″的話,就將旁邊按鈕2的背景顏色設為亮色,代表此時燈是亮的如果是”0″的話,就將旁邊按鈕2的背景顏色設為暗色,代表此時燈是暗的

 

 

[LA計畫] App Inventor 接收 LinkIt ONE 兩筆可變電阻值,還可做磁力畫板

本文介紹如何使用 App Inventor 擷取 LinkIt ONE 上的兩筆可變電阻資料,作法與 [雙A計畫]Part6:Arduino 傳兩筆資料到 Android 手機 是一樣的,只是 LinkIt ONE 在藍牙設定上有一點點不一樣,因此寫一篇分享一下。

除了可在Android 手機畫面上看到 LinkIt ONE 兩個類比腳位變化之外,還可畫線,類似小時候的磁力畫板(啊,暴露年紀…)

本文感謝 CAVEDU 實習生施力維完成

檔案請點我下載


 

 

 

 

 

 

延伸閱讀

[雙A計畫] 常見問題整理

[雙A計劃] Part0:App Inventor 透過藍牙傳送訊號給 Arduino

[雙A計劃] Part1:App Inventor 經由藍牙控制 Arduino LED 亮滅

[雙A計劃] Part2:App Inventor 經由藍牙控制 Arduino LED 漸明漸暗

[雙A計劃] Part4:App Inventor 藍牙遙控 Arduino 雙輪機器人

[雙A計劃] Part5:Paperduino 藍牙控制 LED 閃爍

[雙A計畫]Part6:Arduino 傳兩筆資料到 Android 手機


 

 

 

程式說明

在此只列出 Clock.Timer 事件,首先送出一個 122 數字,LinkIt ONE接收到之後就會把 A0, A1 值丟給 App Inventor。變數X是 LinkIt ONE 傳來的 A0腳位值,Y則是A1.

由於 Canvas 的大小是 320  x 320,因此我們設定把 A0原本的 0~ 1023 範圍透過 map 指令轉為 0~ 320,對應到 X 軸座標。A1 則是對應到 Y 座標,最後使用 Canvas.DrawLine 指令就可以隨意畫圖囉!

01

對應的片段如下

if(LBTServer.connected()){
      a1 = analogRead(A0);
      a2 = analogRead(A1);
      a1 = map(a1,0,1023,0,320);
      a2 = map(a2,0,1023,0,320);
      Serial.printf("%d\t%d\n",a1,a2);
      if(LBTServer.read() == 122){
        BTwrite = LBTServer.write('j');
        BTwrite = LBTServer.write(a1/256);
        BTwrite = LBTServer.write(a1%256);
        BTwrite = LBTServer.write(a2/256);
        BTwrite = LBTServer.write(a2%256);
      }
      delay(10);
  }
LinkIt ONE 端透過 LBTServer 將 A0, A1 依序送出

 

 


 

 

LinkIt ONE 端完整程式

#include <LBT.h>
#include <LBTServer.h>
#define serverName "BTserverTest"
#define serverWaitTime 5

char BTwrite;
void setup() {
  Serial.begin(115200);
  while (!Serial);
  LBTServer.begin((uint8_t*)serverName);
  Serial.printf("[%s] is waiting for any client...\n",serverName);
  
  while(!LBTServer.accept(serverWaitTime)){
    Serial.println(" ... ");
  }
  Serial.println("===Connected!===");
}
int a1,a2;
void loop() {
  if(LBTServer.connected()){
      a1 = analogRead(A0);
      a2 = analogRead(A1);
      a1 = map(a1,0,1023,0,320);
      a2 = map(a2,0,1023,0,320);
      Serial.printf("%d\t%d\n",a1,a2);
      if(LBTServer.read() == 122){
        BTwrite = LBTServer.write('j');
        BTwrite = LBTServer.write(a1/256);
        BTwrite = LBTServer.write(a1%256);
        BTwrite = LBTServer.write(a2/256);
        BTwrite = LBTServer.write(a2%256);
      }
      delay(10);
  }
  else{
    Serial.println("===Disconnected!===");
    Serial.printf("[%s] is waiting for any client...\n",serverName);
    while(!LBTServer.accept(serverWaitTime)){
      Serial.println(" ... ");
    }
    Serial.println("===Connected!===");
  }
}
LinkIt ONE 送出 A0 , A1 類比腳位給 App Inventor

 

執行畫面

從 Serial Monitor 可以看到 A0, A1 目前的狀態

11713381_783552385096897_1979904894_n

轉動 A0, A1 的可變電阻就可以畫出隨意線條,是不是和磁力畫板很像呢?左側是 A0 數值,右側是 A1

 

11739516_783552328430236_792456203_n 11668094_783552338430235_89140845_n

 

150409 Arduino習作工坊 Mobile之夜

這一期的 Arduino 習作工坊已經到第四堂 Mobile 之夜了,也算是在這個系列中問題最多但也是最多朋友感興趣的主題。之後還能進一步延伸到各式物聯網的應用喔。請參考我們的雙A(App Inventor + Arduino)計畫文章

順便廣告一下:

4/07開始,每週四晚上7:00~9:00的 Arduino yun 物聯網應用 @ FutureWard未來產房

4/21 開始,每週二晚上7:00~9:00 的 LinkIt ONE 物聯網工作坊 @MakerBar Taipei

先來看上課的投影片,每堂課的投影片與程式碼都是 open 的,歡迎大家與我們一起學習。


這梯次快要把 MakerBar Taipei塞滿了

IMG_1175

話說這位同學,您的眼神好有殺氣啊

IMG_1174  IMG_1201

[雙A計畫]Part6:Arduino 傳兩筆資料到 Android 手機

大家久等了, 本篇文章告訴您如何在 Android 手機端接收兩筆 Arduino 的資料,這次是以 A0, A1 兩隻腳位來處理。本範例感謝嘉義高工張老師提供。

如果您要換成其他元件,例如數位感測器的話,做法是一樣的。請先看一下這個元件的資料範圍是多少。對於本範例的架構來說,最後就是透過藍牙傳一個陣列出去,因此重點在於您是否可先在 Serial Monitor 中看到正確的資料範圍。不過一般來說都會有讀值得範例程式,所以不用太擔心啦!

您可以擴充這個架構到 N 筆,但是筆數愈多,掉資料的機會也愈高。請自行斟酌喔!

[雙A計畫] 常見問題整理

[雙A計畫] 藍芽模組(HC05/06)常用指令教學

[雙A計劃] Part0:App Inventor 透過藍牙傳送訊號給 Arduino

[雙A計劃] Part2:App Inventor 經由藍牙控制 Arduino LED 漸明漸暗

[雙A計劃] Part3:Android 手機透過藍牙接收 Arduino 類比腳位狀態

[雙A計劃] Part4:App Inventor 藍牙遙控 Arduino 雙輪機器人

[雙A計劃] Part5:Paperduino 藍牙控制 LED 閃爍

[雙A計畫] Part6:Arduino 傳兩筆資料到 Android 手機

[雙A計劃] Part7:Arduino超音波感測距離回傳數值給Android手機

[雙A計劃] Part8:Android 手機對 Arduino 同時進行資料收發

English version

Arduino LED Blink

Arduino LED PWM

Arduino LED Blink (Arduino 101 with BLE)

Arduino LED PWM (Arduino 101 with BLE)


在撰寫程式前我們先準備以下材料:範例程式請點我下載(App Inventor中文學習網檔案庫)

材料清單:

1 Android系統智慧型手機

2.Arduino相容開發板

3.藍牙收發接收器 (本系列使用JY-MCU04 or JY-MCU05)

4. 電位計

5. 光敏電阻

6. 1k~10k 歐姆電阻,用於光敏電阻

請按照電路圖將電路接上,接了一個電位器(A0)與光敏電阻(A1)。當然啦,您也可以兩個腳位都用相同的元件,方便就好。為了不讓大家眼花,藍牙發射器另外獨立出來表示 (藍牙RX – Arduino D11, 藍牙TX – Arduino D10腳位):

未命名
A0:電位計。A1:光敏電阻
螢幕快照-2014-10-30-上午12.41.36
TX: Arduino D11, RX: Arduino D10

 


App Inventor 端程式:

由於連線斷線的做法都是差不多的,在此把連線相關指令整理如下圖。請注意Clock timer 一開始是關閉的,我們會在連線成功之後才會將其啟動來發送藍牙指令,否則會一直跳出錯誤訊息(因為還沒連線啊!)
在 Clock.timer 事件中,首先發送一個數字49給Arduino,代表”我要發資料囉!” Arduino 則是先用 BluetoothClient.ReceiveText 指令,如果讀到’a’,就接續讀取後面兩筆資料,這就是 A0 腳位的數值。請注意在此之所以要判斷 text 變數之否小於0再加上 256,是由於Arduino 的 8 bit 整數範圍是 -127 ~ 128 的緣故。
反之如果App 收到字元 ‘b‘ 就是 A1 腳位。作法同上。
接著在Clock.timer 事件最後將這兩筆數值(value_A0value_A1) 顯示於 Textbox,並且用這兩筆數值來控制 Canvas 上面的小飛機移動,快點來玩雷電遊戲吧!
螢幕快照 2015-04-05 上午1.11.29
因為資料傳輸過程中難免會遺漏,因此我們都是先抓到火車頭(就是’a’ 與 ‘b’),確定這是一筆新的資料開頭之後,再去讀取數值,否則可能會發生數值亂跳的情形。另一方面,App Inventor 在藍牙傳輸的延遲狀況較明顯,請注意喔

Arduino 端程式如下,我們把 A0 腳位的資料用 ‘a‘ 作為標頭,由於資料長度大於 1 byte ( 2的8次方),因此需要用到 2 bytes 才能把 A0 的數值範圍 (0~1023) 涵蓋進去,因此 Data[1]~Data[2] 就代表A0 腳位的資料,Data[4]~Data[5] 就是A1 腳位的資料:(Data [0] = ‘a’, Data[3] = ‘b’ 這兩個火車頭別忘記囉~)
#include <SoftwareSerial.h>
#include <Wire.h>
SoftwareSerial I2CBT(10,11); // TX:10, RX:11
byte serialA;

void setup(){ 
  Serial.begin(9600);
  I2CBT.begin(9600);
}
 
void loop (){
    byte Data[6];
    byte cmmd[20];
    int insize;
    int x=analogRead(A0);//read sensor value
    int y=analogRead(A1);//read sensor value
    serialA=I2CBT.read();
    Data[0]='a';
    Data[1]=x/256;
    Data[2]=x%256;
    Data[3]='b';
    Data[4]=y/256;
    Data[5]=y%256;
     Serial.print(x);
     Serial.print(" , ");
     Serial.println(y);
 
     if (serialA == 49){
         for(int j=0;j<5;j++)
         I2CBT.write(Data[j]);
         serialA=0;
      }
  delay(100);
}

150321 自己的Arduino自己做

3/21 星期六是自製 Arduino 的工作坊,來賓會自行焊接必要的元件到雷射切割的木板(可以客製化簽名!) 來做出一片 XXduino。這片 DIY 板子麻雀雖小,可是五臟俱全,不但有 PWM  腳位,也可以接藍牙來遙控喔!

詳細製作說明請按我,您也可以在家自己做

10313058_564941250275462_3981001481030917287_n

來看看影片吧

藍牙也沒問題!

七段顯示器

控制伺服馬達

 

150307 LinkIt ONE 物聯網研習,活動花絮來囉

3/7 週六,有許多位學員來參加我們辦的 LinkIt ONE 物聯網研習,其中有來自MediaTek Labs 的開發團隊,他們很想知道終端使用者對於這片板子的看法,也有工研院與業界的朋友一起參與,很熱鬧喔

如果您是台大的同學,今年的 hackNTU 臺大黑客松四門課程中的 IoT 物聯網課程,就是使用 LinkIt ONE 系統來帶您入門,千萬別錯過啦!

只要您手邊有板子,今天的範例都能做到,請跟著本篇完成第一個範例吧:

[LinkIt One 教學] MediaTek Cloud Sandbox 控制 LED 並檢視狀態 – 可同時用手機與網頁來操作

CAVEDU LinkIt ONE 教學文章請點我

IMG_7531_Fotor

IMG_7530

下午進行到 GPS 路徑追蹤時,先示範如何接線以及如何在 MCS 上檢視 data point

 

5F0A0384

我這張照片看起來像大法師之類的

 

5F0A0382

大家紛紛上樓去看是否順利將 GPS data 上傳到 MCS 了,都有成功喔(不過要稍等一下就是了,GPS 取得也是要時間的)。

5F0A0386

同樣的畫面,在原廠提供的 Android app 中也可以正確檢視,下圖中只看經度緯度,沒有上傳海拔,所以海拔為0喔

2015-03-07 14.45.44

 

 

 

 

 

MediaTek Labs 同仁帶來的氣象站 demo

5F0A0372

 

以下是上課花絮,大家都在愉悅(?)的 coding 與查看 API 之中度過了美好(精實)的一天喔

 

5F0A0376

2015-03-07 14.43.47 2015-03-07 14.43.31