Tag Archives: bluetooth

Broadcom WICED Smart Sensor Tag 智慧感測器模組

Broadcom WICED Smart Sensor Tag 智慧感測器模組最近拿到手了,網路上討論也相當熱烈。官方售價為 19.99 美金,台幣600塊而已!以這樣的規格來說,好超值啊。上面就有陀螺儀、加速度計、電子指南針、氣壓、濕度與溫度感測器。另外就是有自己的開發環境,有許多現成的範例讓您可以先睹為快。

Broadcom WICED Sense – Bluetooth Smart Sensor Tag 開發環境建置

2015-01-09 18.44.39

2015-01-09 18.44.47

以下是Braodcom 為 WICED 推出的 Android app,名稱就叫做 WICED Sense。請下載來玩玩看吧。首先請將您的手機與 WICED 進行藍牙配對,完成如下圖。

2015-01-09 18.41.22

連線之後就可以在手機畫面上看到各樣數值的變化。這是原廠推出的整合性程式,如果您想要自己寫程式來抓 WICED 的某個值的話,就要請您參考上述的連結來自行安裝環境喔

2015-01-09 18.44.31

 

150206-0208 Arduino 結合 App Inventor 行動裝置結合機器人研習營@台中女中

2/6~8 晴朗的周末,與台中地區的老師們一起玩三天的 Arduino 與 App Inventor。各位老師們辛苦啦,通訊這個議題本來就要注意很多事情,要在教室使用 Arduino 來教學,在設備管理上也是一大挑戰。不過還是有這麼多積極的老師願意把更豐富的教學內容帶給學生們,真的非常感謝。

這次有三天的時間,因此有多一些時間可以講得更深入,不過還是有老師建議”濃度可以低一點…“,好的,會努力改進。

投影片請由此下載!(這是CAVEDU 的線上投影片專區,Arduino 習作工坊系列就是了)

另外也請大家參考日前整理的  [雙A計畫] 常見問題整理

DSC_4693 - 複製

以下是三天的課表,請大家參考一下~

時間第一天第二天第三天
9:00~
10:30
開場下載Arduino IDE

安裝Aduino 驅動程式

介紹各樣教學資源

App Inventor 教學人機介面設計

計算面積

組裝雙馬達車體控制機器人的動作

前進後退轉彎

10:40~
12:00
認識基礎I/O電子元件控制LED

PWM控制

影音多媒體觸碰應用

結合網路

App Inventor 與Arduino 互動:1.     控制LED

2.     接收類比腳位狀態

午餐與午休
13:10~
14:30
Arduino控制馬達

伺服機控制

認識 piezo buzzer發音電路設計

 

藍牙控制機器人動作實車操作

測試調校

14:40~
16:00
認識L293D馬達控制晶片控制直流馬達與速度安裝SimpleAudio 函式庫

音樂檔轉檔

讀取 SD卡中的音樂檔

15:40結語   賦歸

台中女中有很完整的資訊教室,每次來這邊辦研習都能深刻感受到校方的用心。來參加的學員們也是很幸福的啦

DSC_4616

DSC_4672

DSC_4684

這就是我們三天來的成果,可藉由 Android 手機進行藍牙控制的 Arduino 小機器人。

2015-02-08 13.37.49 2015-02-08 13.37.39 2015-02-08 13.24.01

App Inventor 產生 QRCODE 的範例,掃描結果就是使用者在自行輸入的結果,例如下圖中的 http://www.cavedu.com。這就就可以動態產生 QRCODE了,是不是很方便呢?

2015-02-08 10.16.48

順便介紹一下 LinkIt One 的 MCS 雲服務,3/7 歡迎參加喔

DSC_4486

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

許多朋友對於 App Inventor 透過藍牙來控制 Arduino 這個議題相當有興趣,事實上通訊這個主題一直是非常吸引人的,當然也有一定程度的難度啦…

首先整理我們雙A計畫文章總覽:

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

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

[雙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 同時進行資料收發

English version

Arduino LED Blink

Arduino LED PWM

Arduino LED Blink (Arduino 101 with BLE)

Arduino LED PWM (Arduino 101 with BLE)

就以下這兩點來說,讓大家有些基礎的概念:

1. 絕大部分的狀況,控制端(例如Android手機) 與被控端(例如 Arduino ) 的程式語言是完全不同的。

2. 牽涉到通訊與硬體就是很麻煩,錯任何一項就是不會動,所以要檢查再檢查喔!

請先參考我們的教學投影片,所有的雙A計畫範例請點我下載


補充一些常見問題如下

1. BTList 點選下去漆黑一片

手機需要先與藍牙發射器配對,我們才能用這個指令來抓到 Android 手機已配對的藍牙裝置位址(address)與名稱(name)。當然您可以直接使用藍牙發射器的 MAC address 來連線,但非常不建議這麼做,因為很容易輸入錯誤而當機。或是您很確定就是要連某片藍牙發射器的話,就把位址寫死在App Inventor 裡吧。

螢幕快照 2015-02-19 下午8.58.27

2. Serial Monitor 亂碼

請檢查鮑率。這會寫在 Arduino 程式中的這一行: Serial.begin(9600);

3. 藍牙發射器上的 LED 燈閃爍或是一直亮是什麼意思?

以 HC05, Hc06 這兩款常見的藍牙發射器來說,只要通電就會閃紅燈,代表正常啟動並可接受外來連線要求。一旦連線成功之後,

4. 藍牙發射器配對碼是什麼?

一般來說都是 1234 或 0000 。您可以透過 AT  command 來修改,但沒有必要。

5. 為什麼需要修改藍牙發射器名稱?鮑率需要改嗎?

就教室管理的角度來說,這件事很重要,否則 Android 掃描下去會看到十幾片同樣名稱的裝置,這樣就無法順利配對完成了。因此建議學校老師可以先使用 AT command (請參閱以上投影片)把藍牙發射器名稱改成 BT001, BT002 或任何好管理的名稱,再把這個名稱用標籤貼紙貼在發射器上。

鮑率一般來說不需要修改。

以上兩件事,如果您是個人使用者,周遭只有一片藍牙發射器而不容易搞混的話,就不太需要做這件事。

6. 什麼是序列通訊?

 

簡單來說,就是在同一條線上一次發送一個位元,因此是先發出去的一定先到。Arduino 端是透過I2CBT.read() 與 I2CBT.write() 來讀寫藍牙序列資料。與序列通訊對應的就是平行通訊,可以同時發送多筆資料。

補充:維基百科的序列通訊頁面

7. 為什麼在範例3 中要加入檢查碼?不加會怎麼樣?

封包傳輸過程中,會有一定的機率遺失,這與傳輸長度以及訊號強弱有關係。當然無線又比有線來的容易掉封包,因此如果掉了一個封包導致讀取位置錯誤的話,您就會感覺到資料怪怪的(例如電位器明明沒有轉動,但手機畫面的數值跳動範圍很大)。因此我們加了字元 ‘a’ 作為資料的第一段,App Inventor 每次讀到a,就知道這是一段封包的第一包(data[0]),就會接續處理後續兩筆資料(Data[1] 與 Data[2])。

至於要使用什麼字元,只要通訊兩端講好就好。重點在於哪邊是頭,以及一次要讀取多少 byte 的資料。這可以說是最基礎的通訊協定(protocol)喔!

螢幕快照 2015-02-19 下午9.31.52

另一方面,手機端會透過 Clock 元件定期發送 49 ,告訴 Arduino: [你可以把資料丟過來囉!]。Arduino 會在讀取到這筆資料後,把 Data[] 陣列送出去。我們可以將其視為基礎的握手(hand shaking)機制

螢幕快照 2015-02-19 下午9.31.41

 

 

8. 同一片藍牙發射器可以同時被多台 Android 裝置連線嗎?

無法。藍牙發射器是被控端 (slave),Android 裝置 (master)則視實際狀況可以控制多個 slave。例如兩台樂高機器人:

9. 程式無法順利執行?

這其實牽一髮動全身,大概會有幾個問題

a. 兩邊的程式沒有對應,請再次檢查程式是否正確

b. 藍牙發射器沒有先與Android 手機配對完成,請參考 1.

c. 連線失敗,請確認藍牙發射器的燈號是閃爍的紅燈。連線成功會恆亮紅燈。如果一開始就恆亮紅燈代表前一個連線還沒結束,這時候就無法被連。我們在 App Inventor 程式中是在點選之後發起連線 (BluetoothClient.Connect 指令),因此您在此會感覺到程式稍微停頓了一下,就是這時候 Android 會對藍牙發射器進行連線。

螢幕快照 2015-02-19 下午9.12.03

d. 執行程式時,可以先按一下 Arduino 的 reset 鈕讓程式強制重新啟動,確認藍牙發射器在閃紅燈,這時再執行手機 app。

最後也請大家參考 Cooper Maa 的藍牙教學,祝大家順利成功喔~

 

150204 Arduino 結合Android 藍牙控制研習@嘉義高工

再次造訪嘉義高工與許多老師見面,本日的主題是 Arduino 結合Android 藍牙控制。大家對於手機上各種感測器結合 Arduino 的應用都很有興趣。雖然每次辦研習都被參加的老師們說 “阿吉老師,你講太快了啦”,不過實在是有很多內容想要與大家分享,所以就請大家接受高濃度課程的衝擊吧!

也邀請各位老師加入 TQC App Inventor專業認證教師,台中場3/14  是全台第一場,誠摯邀請大家一起來推廣。本日的教學內容就是咱們部落格最火紅的 雙A計畫:App Inventor + Arduino 系列文章

2015-02-04 16.08.40

這就是 Arduino + HC05 藍牙發射器的樣子。HC 05 負責把藍牙訊息回傳給 Arduino。可以控制 LED 亮滅,就能控制繼電器。可以 PWM 控制 LED 漸明漸暗,就能控制壓電揚聲器、伺服馬達位置與直流馬達轉速等等。是非常實用的架構。

另一方面,手機就是根據不同的狀況來發送控制碼給 Arduino,所以在手機端可以自由修改觸發條件,例如按鈕、語音辨識甚至是手機傾斜等等。Arduino 只要單純接收指令就好。避免大家一次改兩份程式碼改到頭暈暈。

2015-02-04 15.07.22

接著是我們的投影片分享,歡迎下載或轉貼分享


來看看活動花絮吧:每次要把程式實際安裝到各自的Android裝置上都是一項大挑戰

2015-02-04 15.12.41

每次研習都會遇到許多非常厲害的老師,每每與老師們交換心得都讓我們在下一次的課程能準備得更好。

2015-02-04 14.13.47

亮面彩色封面,好豪華啊

2015-02-04 10.30.14

150131 雙A計畫 Arduino x App Inventor 藍牙遙控機器人研習 @高雄 Hito Maker

今天是 CAVEDU 與 Hito Maker 合辦的 Arduino 習作工坊最後一場,最近很多雙 A 研習哩,足見 App Inventor 結合 Arduino 的多元魅力:快速、擴充性高與趣味(最後一點真的很重要)

先祝大家新年快樂,三月之後會有更多有趣的課程到熱情的高雄喔!Arduino Yun 聽說是大家都在詢問的課程呢。

141213 Arduino習作工坊@高雄:燈光與馬達

SAMSUNG DIGITAL CAMERA

先從 Arduino 雙輪機器人開始,搭配 L293D 來控制直流馬達方向與轉速。

SAMSUNG DIGITAL CAMERA

阿吉老師深入說明 App Inventor 實際上就是透過 BluetoothClient 元件來發送字元給 Arduino,換言之今天可以用按鈕2015-01-31 17.38.36

螢幕快照 2015-01-31 下午5.37.57
不同的按鈕發送不同的字元

 

螢幕快照 2015-01-31 下午5.42.00
姿態感測器大於30度,或是語音辨識結果為”前進”時發送字元

 

SAMSUNG DIGITAL CAMERA

SAMSUNG DIGITAL CAMERA SAMSUNG DIGITAL CAMERA  SAMSUNG DIGITAL CAMERA

2015 Arduino習作計劃PLUS! @MakerBar Taipei

MakerBar與CAVEDU的Arduino習作計劃PLUS又來囉!本梯次結合12月加開的機器人之夜,一系列共五堂課,給大家最完整的Arduino習作計劃PLUS!  不僅有燈光、有動作還有無線藍牙操控,現在更多了聲音的控制,再次帶你進入有趣的控制器狂想曲。

想像一下,家中的床頭燈可以用手機直接操控明暗,或者讓機器開始走路…..

Arduino,是一種易取得且有趣的控制器平台,只要懂得基本操作,就可以自行設計生活中與周遭物品的互動方式,產生許多不同的趣味及應用。 MakerBar邀請專業的機器人教育團隊,推出一系列的輕鬆上手的Arduino習作計畫,跟著我們開始練習打造專屬的互動生活。

報名請按我!

CAVE2015_1_large

Arduino 習作五步驟:單場報名費 800元,五場合報特價3200元。(不含材料費)

1/07(三) – Arduino燈光之夜

1/14(三) – Arduino動力之夜

1/21(三) – Arduino電音之夜

1/28(三) – Arduino膜拜之夜(需自備遙控器)

2/04(三) – Arduino機器人之夜

課程介紹

1/07(三) Arduino燈光之夜 – 學習如何自由操控燈光顏色與閃爍
使用Arduino搭配單色與三色LED燈,製作出各種閃爍與呼吸燈效果,這是您踏入互動裝置藝術的第一步唷!課程當中將熟悉Arduino的基礎程式語法、電路連接方式以及如何控制燈的閃爍頻率與顏色。

1/14(三)  Arduino動力之夜 –  學習駕馭各式馬達及PWM
本課程中,您將可學會如何使用Arduino搭配馬達控制晶片來控制各種馬達,含小型直流馬達、伺服馬達與步進馬達等等,還有基礎的PWM(脈衝頻寬調變)控制方法,深入淺出,一點也不難!

1/21(三) Arduino電音之夜 – 學習利用Arduino播放音樂

學習使用Arduino播放數位聲音檔,從最基礎midi格式音檔到現今最流行的mp3檔案播放。

1/28(三) :  Arduino膜拜之夜 Mobile – 利用Arduino與手機聯結(需自備遙控器)

這次我們將透過一般家用常見的遙控器,讓它搖身一變成為與Arduino的溝通裝置,

讓你家的遙控器不僅可以遙控原有的電器產品,現在更能夠遙控你利用Arduino製作的互動LED燈與馬達!我們還會教你輕鬆開發Android Arduino互動APP:ArduinoV.S App Inventor及藍牙通訊
→使用App Inventor來編寫簡單的Android程式,透過藍牙通訊與Arduino進行互動,本次課程中將控制單色與三色LED燈的閃爍與呼吸燈效果。

2/04(三) Arduino機器人之夜 – 整合Arduino實作計劃的課程內容,學習使用Arduino控制以伺服機驅動的MeArm機器手臂,以及輪式機器人移動平台mini Car,並以藍牙或是紅外線控制。(課程中所使用的MeArm與mini Car由主辦單位提供。亦可與主辦單位預約購賣。MeArm 1,500元/Set。DFROBOT mini Car 850元/set。伺服機x4。直流馬達與輪胎x2、銅柱與螺絲、底盤。)
材料包購買

 

本活動需自備Arduino,現場有提供販售原廠Arduino uno一片800元 ,亦可自行準備相容版

各場另須材料包費用如下:

1/07(三)

燈光之夜材料包:300元(單芯線材、LED燈、電阻與麵包版一片)

1/14(三)

動力之夜材料包:500元(伺服馬達、直流DC馬達,步徑馬達與馬達驅動晶片、電池等)

1/21(三)

電音之夜材料包:500元(材料包括SD Shield、單體喇叭,電阻與電容)

1/28(三)

膜拜之夜材料包:300元(紅外線接收模組,藍牙模組與轉接線)

2/04(三)

機器人之夜材料包:400元(電池、Arduino搖桿模組X2、HC-SR04超音波感應器),另課程中須使用動力之夜與膜拜之夜的材料包。
注意事項

本課程需自備筆記型電腦,我們也將在上課該周禮拜二下午提醒大家上課相關事宜

 

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

引用網址「[paperduino]android control led」

大家好  我是偉和,本篇將會教導各位如何利用App Inventor控制Paperduino。就是先前的 Arduino 換成自製的 Paperduino,小小一片的功能也是很不錯的。

Paperduino 製作請按我(程式需使用專用的Arduino IDE)

[雙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計畫] Part6:Arduino 傳兩筆資料到 Android 手機

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

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

先來看影片:

Continue reading

141217歲末感恩 Arduino習作工坊機器人之夜

MakerBar與CAVEDU的Arduino習作計劃PLUS大受好評特別加開機器人之夜

報名網址請按我

 

Arduino,是一種易取得且有趣的控制器平台,只要懂得基本操作,就可以自行設計生活中與周遭物品的互動方式,產生許多不同的趣味及應用。 MakerBar邀請專業的機器人教育團隊,推出一系列的輕鬆上手的Arduino習作計畫,跟著我們開始練習打造專屬的互動生活。

課程介紹

整合Arduino實作計劃的課程內容,學習使用Arduino控制以伺服機驅動的MeArm機器手臂,以及輪式機器人移動平台mini Car,並以藍牙或是紅外線控制。

課程費用:800元

材料包費用:400元,請於課程當天現場繳交。(包含電池、Arduino搖桿模組X2、HC-SR04超音波感應器)另課程中須使用動力之夜膜拜之夜的材料包。

招生對象:限報名過Arduino習作計劃及Arduino習作計劃PLUS的學員

 

注意事項

1. 本課程需自備筆記型電腦。

2. 課程中所使用的MeArm與mini Car由主辦單位提供。亦可與主辦單位預約購賣。MeArm 1,500元/Set。DFROBOT mini Car 850元/set。伺服機x4。直流馬達與輪胎x2、銅柱與螺絲、底盤。

您是可以做出像這樣的機器人的喔!控制原理都是一樣的

App Inventor + Arduino 的 VFD 按讚機

系統架構:

手機取得指定粉絲專業的按讚次數之後,將個別位數透過藍牙以 byte array 方式傳送給 Arduino,再讓Arduino去驅動個別的 VFD 數字管。

最近都走有溫度的質感風~  也慶祝一下 CAVEDU Facebook 粉絲頁有2800讚囉

參考:

[App Inventor] 取得粉絲專頁按讚數 V1.0

[雙A計劃]系列專文

VFD Modular Clock IV-6 數字管時鐘

Akafugu Nixie Clock 真空管時鐘

2014-08-13 17.12.04

 

Arduino code 在此,每種 VFD 的 library 不同,要注意喔

#include <SoftwareSerial.h>
#include <Wire.h>//引用二個函式庫SoftwareSerial及Wire

SoftwareSerial I2CBT(12,13);TX/RX
#include "VFDTube.h"
#define TUBE_COUNT 4

VFDTube tube(8, 9, 10, 11, TUBE_COUNT);
// DIN on pin #4, OE on pin #5, STCP on pin #6, SHCP on pin #7,
// TUBE_COUNT stands for sections count in serial
// Pin #5 is with PWM output on UNO, so the brightness is adjustable
char cmmd[20];
int insize;
int i;
int s=56;

void setup() {
    Serial.begin(9600);
    I2CBT.begin(9600); //藍牙鮑率:9600
    tube.clear();
    tube.setBrightness(0xf0);
}

void loop() {
    tube.clear();
    //tube.setBackgroundColor((Color) ((s) / 7));
    // background color shift in every 7 seconds
    while(1){
        //讀取藍牙訊息
        if ((insize=(I2CBT.available()))>0){
        if(I2CBT.read()=='j'){
        I2CBT.readBytes(cmmd,4);
        for(i=0; i<4; i++){
            Serial.print(char(cmmd[i]));//DEC to ASCII
 	if (s & 0x01)
	   tube.printf("%01d.%01d.%01d.%01d.", cmmd[0]-48, cmmd[1]-48,cmmd[2]-48,cmmd[3]-48);
	else
            	tube.printf("%01d%01d%01d%01d",  cmmd[0]-'0',  cmmd[1]-'0', cmmd[2]-'0', cmmd[3]-'0');
           tube.display();
        }//for
        }//if==j
    }//if insize
    }//while
    ///////////////藍牙接收///////////////
}//loop
Arduino接收藍牙數字後控制 VFD

[Android 結合 Google Chart API] 機器人原地轉一圈產生雷達圖

機器人原地轉一圈之後,將超音波感測器值透過藍牙送給Android 手機,再呼叫 Google Chart API 雲端圖表功能來取得雷達圖。可以畫出非常精美的圖表。重點在於靈活應用 Google Chart API  的語法就可以囉!

直接點選以下連結就可以看到雷達圖,詳細參數設定請參閱 Google Chart API 官網或以下延伸閱讀

https://chart.googleapis.com/chart?cht=r&chs=320×320&chxt=x&chxl=0:|0|45|90|135|180|225|270|315&chd=t:60,40,30,100,76,99,22,57,80

本範例是結合樂高機器人的超音波感測器來達到簡易地圖掃描的效果,歡迎試試看。以下範例是2014年淡江大學智慧型行動裝置整合機器人控制課程的作業之一。感謝電機系周煜同學(已畢業)做出相當好的版本呢。

 

12345

[youtube=http://www.youtube.com/watch?v=DBvhrxkb24M]

延伸閱讀:

Google Chart API 教學

Google Chart 隨機產生折線圖

淡江電機 Android 機器人整合課程網站

140523淡江電機 Android 行動裝置整合機器人控制課程,期末專題展示

Code Android端

package com.example.nxtsense;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Set;
import java.util.UUID;



import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.os.Build;

public class MainActivity extends ActionBarActivity {
	private BluetoothAdapter adapter;
	private BluetoothSocket nxtSocket;
	public DataInputStream nxtDataIn;
	public DataOutputStream nxtDataOut;
    public final int MODE_CONNECT_NXT = 0, MODE_CONTROL = 1;
    private int mode;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);
        adapter = BluetoothAdapter.getDefaultAdapter();
    	if(adapter==null)
        {
        	Toast.makeText(this, "No Bluetooth adapter found", Toast.LENGTH_SHORT).show();
        	this.finish();
        }
    	if(!adapter.isEnabled())
			startActivityForResult(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), 1);
    	
    	try {
			setMode(MODE_CONNECT_NXT);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	
    	Button getvalue=(Button)findViewById(R.id.get);
    	getvalue.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				try {
					CommandNXT();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		});
        
    }

    public void CommandNXT() throws IOException{
    	String y="";
    		nxtDataOut.writeInt(1);
    		nxtDataOut.flush();
    	
    	//	int x=nxtDataIn.readInt();
    		y=String.valueOf(nxtDataIn.readInt())+","
    				+String.valueOf(nxtDataIn.readInt())+","
    				+String.valueOf(nxtDataIn.readInt())+","
    				+String.valueOf(nxtDataIn.readInt())+","
    				+String.valueOf(nxtDataIn.readInt())+","
    				+String.valueOf(nxtDataIn.readInt())+","
    				+String.valueOf(nxtDataIn.readInt());
    	
					//TextView tv=(TextView)findViewById(R.id.value);
			    	//tv.setText(String.valueOf(x));
		
    	String myURL =" https://chart.googleapis.com/chart?cht=r&chs=320x320&chxt=x&chxl=0:|0|45|90|135|180|225|270|315&chd=t:"+y;         
        WebView myBrowser=(WebView)findViewById(R.id.mybrowser);  
  
        WebSettings websettings = myBrowser.getSettings();   
        websettings.setJavaScriptEnabled(true);  
         
        myBrowser.setWebViewClient(new WebViewClient());  
  
        myBrowser.loadUrl(myURL);  	
    	
    	
    	
    }
    public void setMode(int _mode) throws IOException
    {
    	Button connect=(Button)findViewById(R.id.buttonConnect);
    	mode = _mode;
    	if(mode==MODE_CONNECT_NXT)
    	{
    		
    		connect.setOnClickListener(new Button.OnClickListener() {
    			public void onClick(View arg0) {
    				connectNxt();
    				}
            });
    	}
    	
    	else if(mode==MODE_CONTROL)
    	{
    		connect.setEnabled(false);
    	}
    	else 
    		throw new IllegalArgumentException();
    }
    
    private void connectNxt()
    {
    	if(mode!=MODE_CONNECT_NXT) //檢查模式
    		throw new IllegalArgumentException();
    	
    	String name;
    	BluetoothDevice nxt = null;
    	
    	if((name = ((EditText) findViewById(R.id.editNxtName)).getText().toString()).equals("")) //檢查是否為空字串
    	{
    		Toast.makeText(this, "Please provide the name of your NXT", Toast.LENGTH_SHORT).show();
    		return;
    	}
    	
        Set<BluetoothDevice> devicesSet = adapter.getBondedDevices(); //取得裝置清單
        
        if(devicesSet.size()==0) //找不到裝置
        {
        	Toast.makeText(this, "No devices found", Toast.LENGTH_SHORT).show();
        	return;
        }
        
        for (BluetoothDevice device : devicesSet) //搜尋裝置
        {
            if (device.getName().equals(name))
            {
            	nxt = device;
                break;
            }
        }
        
        if(nxt==null) //找不到裝置
        {
        	Toast.makeText(this, "NXT not found", Toast.LENGTH_SHORT).show();
        	return;
        }
        
        try
        {
        	//建立nxt socket
			nxtSocket = nxt.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
			nxtSocket.connect();
			nxtDataOut = new DataOutputStream(nxtSocket.getOutputStream());
			nxtDataIn = new DataInputStream(nxtSocket.getInputStream());
		}
        catch(IOException e)
		{
        	Toast.makeText(this, "Connection failure", Toast.LENGTH_SHORT).show();
        	return;
		}

    	Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();
		try {
			setMode(MODE_CONTROL);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }




   

}
Code. Android receive ultrasonic value from Lego robot

Code 機器人端使用 leJOS

import lejos.nxt.*;
import lejos.nxt.comm.*;
import lejos.util.Delay;

import java.io.*;
public class motor_control{
	public static void main(String args[]) throws IOException{
		Button.ESCAPE.addButtonListener(new ButtonListener(){
				public void buttonPressed(Button b){
					System.exit(0);
					}
				public void buttonReleased(Button b){
					
				}
		});
		System.out.println("Waiting");
		BTConnection btc = Bluetooth.waitForConnection(0, NXTConnection.RAW);
		DataInputStream dis = btc.openDataInputStream();
		DataOutputStream dos = btc.openDataOutputStream();
		System.out.println("Connected");
		UltrasonicSensor ultrasonic1 = new UltrasonicSensor(SensorPort.S2);
		int Ultrasonicvalue1;
		while(true){
			int a=dis.readInt();
			if(a==1){
				for(int i=0;i<7;i++){
					Motor.A.setSpeed(100);
					Motor.B.setSpeed(100);
					Motor.A.backward();
					Motor.B.forward();
					Delay.msDelay(822);
					Ultrasonicvalue1=ultrasonic1.getDistance();
		//	System.out.println(Ultrasonicvalue1);
			
				try {
					dos.writeInt(Ultrasonicvalue1);
					dos.flush();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			
			}
				Motor.A.setSpeed(0);
				Motor.B.setSpeed(0);
				Motor.A.backward();
				Motor.B.backward();
			}
		}
			}
}
Code. Robot send out ultrasonic value to Android (leJOS)

[RobotC] 藍牙傳輸馬達編碼器值

咱們對於 RobotC 的教學文章比較少,但淡江電機大一的基礎電機實驗下學期就是使用 RobotC 帶領學生進入 C語言與機器人控制的領域(上學期使用 NXTG圖形化軟體)

本範例是將一台 NXT 的兩個馬達(作為手把,所以不會轉動)的編碼器值透過藍牙送給另一個NXT。接收之後顯示在螢幕上。

事實上可以顯示在螢幕上,下一步就可以用這兩筆數值來控制馬達電力,遙控機器人就完成啦。請期待我們下一個範例喔!

2014-05-26 10.21.28

[youtube=http://www.youtube.com/watch?v=73oSUdFpTTY]

發送端

task main()
{
   nMotorEncoder[motorA] = 0;
   nMotorEncoder[motorB] = 0;
   while(true){ 
      wait1Msec(300);
      int my_number,my_number1; 
      my_number=nMotorEncoder[motorA];
      my_number1=nMotorEncoder[motorB];
      sendMessageWithParm(my_number,my_number1);  //將兩筆資料一起送出
}
}
發送端 - 將兩筆馬達編碼器值送出

 

接收端

task main()
{
   int message_first;
   int message_second;
   while(true)
   {
      message_first = messageParm[0]; //取出第一筆資料
      message_second = messageParm[1];  //取出第二筆資料
      if(message_first != 0 || message_second != 0)  //如果兩者任一不為零
      {
         nxtDisplayBigTextLine(2,"1: %d",message_first);
         nxtDisplayBigTextLine(4,"2: %d",message_second);
         ClearMessage();  //清除藍牙暫存區
      }
      wait1Msec(300);
   }
}
接收端 - 接收藍牙訊息之後顯示於螢幕

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

續上篇 [雙A計劃] Part0:App Inventor 傳送訊號給 Arduino,使用藍牙本篇將簡單介紹如何用手機控制Arduino上的LED 亮滅,使用 digitalWrite() 來達成。

挖,我們的雙A計畫有好多篇呢,歡迎您一篇篇都看過喔

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

[雙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相容開發板 (本文使用 Arduino MEGA2560)

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

4.麵包板

5.1個220歐姆色碼電阻

6.1顆LED

先由下圖將藍牙發射器及LED接上Arduino (藍牙RX – Arduino D11, 藍牙TX – Arduino D10腳位)

bt
藍牙TX: Arduino D10 (RX)。藍牙RX: Arduino D11 (TX) 定義於I2CBT(10,11); 語法中

 

App Inventor 編寫簡易的藍牙訊息發送程式

畫面元件很簡單,點選 BT List 之後,會顯示藍牙配對裝置清單,點選您已經配對好的藍牙裝置之後,畫面中間的按鈕就可點選。反覆點選就會送出不同的字元給Arduino 來控制LED亮滅。

螢幕快照 2014-04-04 上午12.06.35

程式說明:

STEP1:在 ListPicker1.BeforePicking事件中,將 BluetoothClient.AddressAndNames指令為 ListPicker1內容,代表點選將其內容連結到手機的已配對藍牙裝置清單。
 
STEP2:在 ListPicker1.AfterPicking事件中,確認連線成功之後,設定相關按鈕為 enabled/ disabled。

螢幕快照 2014-04-04 上午12.07.05 

STEP3:

本段程式重點當按下ON按鈕時,手機會透過 BluetoothClient元件的 SendText 指令發送一個 ‘a’ 字元給Arduino,此時按鈕的字樣會變成 “LED Turn Off”;同理當按下OFF按鈕時,手機會發送一個 ‘b’ 字元給Arduino,此時按鈕的字樣會變成 “LED Turn On”。

最後按下 Disconnect 斷線按鈕則中止藍牙連線,並將個畫面元件回復到初始狀態等候下一次連線。如下圖:

螢幕快照 2014-04-04 上午12.07.18

Arduino的CODE

#include <SoftwareSerial.h>
#include <Wire.h>

int LED = 13;
SoftwareSerial I2CBT(10,11); //定義Arduino PIN10及PIN11分別為RX及TX腳位
//請注意Arduino的TX要接藍牙模組的RX, 反之亦然

void setup() {
  Serial.begin(9600);
  I2CBT.begin(9600);//bluetooth baud rate  
  pinMode(LED, OUTPUT);    
}

void loop() {
  byte cmmd[20];
  int insize;
  while(1){
    //read message from bluetooth
    if ((insize=(I2CBT.available()))>0){
      Serial.print("input size = "); 
      Serial.println(insize);
      for (int i=0; i<insize; i++){
        Serial.print(cmmd[i]=char(I2CBT.read()));
        Serial.print("\n"); 
      }
    }
    //根據所收到訊號執行對應動作  
    switch (cmmd[0]) {
       //讀取第一個字元
    case 97: //'a'     
      digitalWrite(LED,HIGH);
      break;  

    case 98://'b'
      digitalWrite(LED,LOW);
      break;
    } //Switch
  } //while
}
App Inventor light up Arduino LED

 

NXT 接收 Android 藍牙字元 – 使用 LabVIEW

http://lab.cavedu.com/labview_nxt_bt   <- 程式碼請由此下載

使用Android 手機與樂高機器人之間藍牙互傳訊息。手機端程式使用App Inventor,機器人端則使用 LabVIEW 與 NXT-G。請由本頁最下方下載程式碼。
 
Android – App Inventor 2程式說明
 
STEP1:在 ListPicker1.BeforePicking事件中,將 BluetoothClient.AddressAndNames指令為 ListPicker1內容,代表點選將其內容連結到手機的已配對藍牙裝置清單。
STEP2:在 ListPicker1.AfterPicking事件中,確認連線成功之後,設定相關按鈕為 enabled/ disabled。
 
STEP3:按下按鈕之後,根據 message變數值的內容來發送 “a” 或 “b”。使用 NxtDirectCommand 對NXT指定的 mailbox (本例為 1號),送出 message變數值( “a” 或 “b”)。

 
NXT端程式說明 – LabVIEW
 
使用 Read NXT Mailbox (String)指令來讀取指定 mailbox 內容之後顯示在 NXT螢幕上。延遲時間為 0.5 秒。

lv3

140326 Arduino習作工坊 膜拜mobile之夜@MakerBar Taipei

3月份的  Arduino習作工坊在 3/26第三次主題: 膜拜mobile之夜, 課程圓滿地結束了。今天的課程分量比較重,因為牽涉到Android / Arduino 雙方的藍牙序列通訊,硬體與軟體的設定上都會比較複雜一點。不過大家還是順利完成了,呼呼(鬆一口氣啊)~

有興趣學習的朋友, 您只需要一台Android 手機、一片Arduino(或相容板)、一片藍牙發射器以及相關電子材料即可(麵包板、跳線、LED、可變電阻等)。請看看我們的雙A計畫教學三部曲:

[雙A計劃] App Inventor 傳送訊號給 Arduino,使用藍牙 part1

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

[雙A計劃] part3-Arduino 透過藍牙接收 AppInventor 訊息

有三位美女與八位型男參加了本次課程,  期待日後在其它的研習也能碰到大家喔!

IMG_9123

在 Arduino 上接一個可變電阻,轉動可變電阻就可在手機畫面上看到可變電阻值的變化 (0~1023

IMG_9117

有沒有傳訊成功呢?真緊張啊~

IMG_9120

來賓走秀時間

IMG_9126

IMG_9127

IMG_9128

IMG_9123IMG_9125

[樂高EV3機器人教學] 藍牙控制(雙馬達作為搖桿之比例控制)

http://lab.cavedu.com/ev3_tankcontrol <- 程式碼由此下載
上一篇 [樂高EV3機器人 – 藍牙控制(雙觸碰感測器)] 中,機器人藉由兩個觸碰感測器的狀態組合,只有四種動作,無法做到細微的操控。因此我們將EV3的馬達角度變化當成搖桿,這樣就能讓機器人有更多變化了。程式碼請由頁面下方下載,分為 Joystick 與 Car 兩個程式,您需將這兩個程式分別下載到兩台EV3主機上。先來看影片吧。
[youtube=http://youtube.com/watch?v=Lv9cO9EpZv0]
在執行程式之前,您需先將兩台 EV3 主機進行藍牙配對,執行時請先啟動 Car程式,再啟動 Joystick 程式。因為 Car 會被動接收來自 Joystick 的指令。
 
Handle:
 
兩個獨立的無窮迴圈,以上面的迴圈來說,是將把手端的左側馬達(B馬達)的角度變化,使用 Messaging 指令以數值形態發送出去。另一個迴圈也是相同的概念。在 Messaging 指令我們還可以設定這個 message 的 title,以上面的迴圈來說就是 [left],下面則是 [right]。這樣一來等於是兩條獨立的線,不會搞混。
 
請注意進入迴圈之前,我們先將馬達的角度值歸零,這時會以馬達當下的位置為0度。這個好習慣要養成喲,程式才不會把先前的累計角度值直接丟給機器人,這樣就會亂跑啦。
 
馬達的電力範圍為-100~100,我們是將馬達的角度變化直接指定為馬達電力,也就是說,JoyStick的馬達往前推70度,Car的左輪就會以電力70正轉。下圖中您看到我們有乘以 -1 ,這和您的機器人組裝有關,您說不定無需乘以 -1。
您也可以將角度變化乘以2之後再丟出去,也就是說JoyStick的馬達往後拉25度,Car的左輪就會以電力50反轉。這樣就是比例控制的最基本概念:被控端與控制端呈一個簡單比例關係(y = a * x + b)。
 
另外由Messaging指令中可看到我們指定的接收端是一台名為「EVA」的EV3主機。
 
注意:您可以在 loop 後面加一個 Wait 時間,例如等候個 0.3 秒左右,因為事實上我們不需要這麼頻繁地發送藍牙訊息,有可能會造成當機。這個數字可以自由調整來取得平衡。

手把的範例,您可隨意設計,拿得順手就好

Car:使用一般雙馬達車體即可。
 
使用一個無窮迴圈,分別把 right 與 left 接收到的內容指定給 Move Tank 指令的左右馬達轉速即可。