延續上一篇貼文,本文將補充藍牙模組的AT命令模式與設定方法。
藍牙模組的兩種操作模式
- 自動連線(automatic connection),又稱為透通模式( transparent communication)。
- 命令回應(order-response),又稱為AT模式(AT mode)。
平時使用的「自動連線」模式只是把RxD腳傳入的資料,轉成藍牙無線訊號傳遞出去;或者將接收到的無線資料,從TxD腳傳給Arduino,模組本身不會解讀資料,也不接受控制。
操控藍牙模組的指令統稱AT命令(AT-command)。AT命令並非透過藍牙無線傳輸,而是模組的TxD和RxD接腳。藍牙模組只有在AT模式,才能接收AT命令。
HC-05與HC-06藍牙模組進入AT模式的方法
HC-06模組在與其他裝置連線之前,都處於AT模式狀態;換句話說,只要一通電,HC-06模組就進入AT模式。HC-06的AT命令,採用9600bps的速率傳送。
通電後,在尚未與裝置連線之前,HC-06板子上的LED將不停地閃爍;一旦與其他藍牙裝置連線(如:手機或電腦),LED將維持點亮狀態。
讓HC-05模組進入AT模式,需要在通電之前,先把KEY腳位(藍牙模組本身的34腳)接在高電位(通常指3.3V,但是接5V也行)。如此,一通電,它就進入AT模式。
在尚未與裝置連線之前,HC-05板子上的LED將快速閃爍;若進入AT模式,LED將慢速閃爍(兩秒閃爍一次)。HC-05的AT命令,採用38400bps的速率傳送。
筆者購買的HC-05板子上面有一個按鍵,根據廠商提供的電路,這個按鍵接在藍牙模組的34腳:
所以先按著板子上的開關,再通電,即可讓此藍牙模組進入AT模式(通電之後,即可放開開關)。
HC-06模組的AT命令
根據廠商提供的AT命令說明書,筆者購買的HC-06藍牙模組支援下列AT指令(這個模組規定,AT命令一定要大寫,有些模組不區分大小寫):
常用的AT指令有兩個:
- AT+NAME:設定模組的識別名稱。
- AT+PIN:更改配對密碼。假如你不想讓其他人輕易地連接到你的藍牙裝置,可以透過這個AT命令修改配對密碼。
HC-06模組的預設名稱就是“HC-06”,於多人、多組藍牙一起實驗的場合,在電腦或手機上探索藍牙裝置時,將會發現許多叫做“HC-06”的裝置。
為了方便實驗者連接到自己的藍牙設備,可以事先用AT命令替每一個模組設定不同的名字,例如,bt01, bt02, bt03,…(註:一般最多允許32個英∕數字)。
透過Arduino的序列埠設定藍牙模組的AT命令
除了使用現成的USB轉TTL序列模組來設定AT命令(請參閱「執行AT命令(AT-command)修改藍牙模組的資料傳輸速率」),也能使用Arduino板來操作。
本節將撰寫一個簡易程式,把我們在電腦上敲入的AT命令,轉發給接在Arduino上的藍牙模組。
同樣地,藍牙模組的回應訊息也會轉發到電腦的序列埠。請編譯底下的程式並上傳到Arduino板:
#include <SoftwareSerial.h> // 引用程式庫 // 定義連接藍牙模組的序列埠 SoftwareSerial BT(8, 9); // 接收腳, 傳送腳 char val; // 儲存接收資料的變數 void setup() { Serial.begin(9600); // 與電腦序列埠連線 Serial.println("BT is ready!"); // 設定藍牙模組的連線速率 // 如果是HC-05,請改成38400 BT.begin(9600); } void loop() { // 若收到「序列埠監控視窗」的資料,則送到藍牙模組 if (Serial.available()) { val = Serial.read(); BT.print(val); } // 若收到藍牙模組的資料,則送到「序列埠監控視窗」 if (BT.available()) { val = BT.read(); Serial.print(val); } }
在HC-05與HC-06藍牙模組上執行AT命令
程式上傳完畢後,開啟Arduino的「序列埠監控視窗」,HC-06模組的AT指令不需要加上行結尾字元,下圖是執行“AT+VERSION”命令,查看韌體版本的結果:
下圖是執行“AT+NAMEsix”,將模組的識別名稱改成“six”的結果:
HC-05模組的AT指令需要加上\n\r行結尾,下圖是執行“AT+VERSION”命令,查看韌體版本的結果:
根據廠商的AT命令參考手冊,此HC-05模組有個查閱識別名稱的命令:“AT+NAME?”,然而,我手上這個模組對此命令沒有反應。但是從Windows 7的藍牙「新增裝置」畫面看得出,此藍牙模組的預設名稱是“HC-05”:
HC-05模組修改識別名稱的AT命令是:”AT+NAME=識別名稱”,設定成功後,它將傳回“OK”,將模組識別名稱改成“five”的操作畫面如下:
再次於Windows 7系統執行藍牙「新增裝置」,可看到模組的名稱已經改變了:
你好,我想請問:我用的是arduino DUE這塊板子,不過似乎相容的IDE 1.5.8 BETA ,似乎無法使用 SoftwareSerial這個程式庫,請問有甚麼可以解決的辦法嗎?
hi 小施:
Arduino Due控制板內建4個序列埠(請參閱Arduino Due的官方產品頁說明),因此不太需要用到SoftwareSerial程式庫。內建的序列埠識別名稱與腳位分別是:
序列埠程式的寫法都一樣,只是更換識別名稱罷了,例如,底下的敘述將能初始化Serial2,並輸出 “hello”字串:
thanks,
jeffrey
你好,我了解老師的意思了,謝謝老師~
我是arduino的新手,想請問如果把老師提供的範例code使用在DUE這塊板子上,要如何修改呢?
假設藍牙模組接在Arduino Due的Serial 2(16和17腳),請上傳底下的程式測試看看:
thanks,
jeffrey
赵老师,您好,我同样是采用的ARDUINO DUE这款板子,HC 05模组同您的是一样的,按住按钮进去AT MODE.之前找了很多资料,但AT MODE仍旧还是调试不通,输入AT 指令什么都不能返回。请问大约是哪方面的问题呢?
有没有可能是蓝牙模块,连接34脚和Vcc的按键故障或者焊接不良呢?不知你是否有用电表测量过,当按键按下时,第34脚和Vcc是相连的;倘使Key脚有和Vcc相连,但却无法进入AT模式,那我就不知问题出在哪儿了…
thanks,
jeffrey
你好!!
首先先稱讚你這本書寫的真的粉好~~
再來就是我遇到的問題了~~
我手邊有的藍芽模組與課本上的不一樣
是HM-12系列的~~
但我就是不知道該怎麼進入AT模式~~
在網路上我是有找到相關的規格說明書~~
但還是沒有用~~
不知大大是否有相關的方法可協助~~
hi 小宇:
感謝你的讚賞~
我找到的HM-12藍牙模組資料來自這一家公司,根據他們的技術文件說明,模組的預設鮑率是115200,KEY腳位於模組的23腳、AT指令需大寫、指令後面不加 \r\n 字元。
我手邊沒有這個模組,所以無法實際測試…
thanks,
jeffrey
謝謝回覆~~
請問我用可變電阻輸入UNO藍牙送出PWM,
再用另一片UNO藍牙接收PWM輸出LED.
接收會顯示ascii為什麼?
hi lin:
PWM的數值範圍是0~1023,請問你有將PWM數據拆成兩個byte傳送嗎?你可以參閱11-16頁「動手做11-3」傳送整數資料的說明,並改寫程式碼。
have fun!
jeffrey
你好:
想請問一下,我買的也是與你相同型號HC-06,當我在Arduino的「序列埠監控視窗」,下達“AT+VERSION”命令,查看韌體時,監控視窗沒有任何回應,其他命令也都沒有任何回應.
請問這是那理要注意的呢!
hi chen:
若只輸入”AT”也沒反應嗎?請跟廠商索取規格書,確認進入AT命令模式的方法。
thanks,
jeffrey
謝謝老師的回覆,
請問老師會再出進階的應用書籍嗎?
如果有或計劃中是否能告知.
謝謝.
有計劃,但是依我的龜速,大約明年年中吧~
thanks,
jeffrey
老師你好:
我有個問題,老師能幫我解下列疑惑
關於第一板書中10-40頁,表10-7頁,我從網路下載TIP120 DataSheet
Symbol Parameter Test Condition Min. Typ. Max. Units
VBE(on) * Base-Emitter On Voltage VCE = 3V, IC = 3A 2.5 V
我理解的當:VCE=3V,IC=3A, VBE最大MAX=2.5V, 如果VCE不是此條件時,VBE還會是2.5V?
我不知我這樣理解有錯?
hi jxchen:
TIP120電晶體的規格書第3頁的「典型特性(Typical characteristics)」單元,右上角有一張這樣的圖表:
垂直線條是Vbe和Vce的電壓值,水平線條是Ic的電流值,從中可看出Vbe和Vce會隨著Ic電流值增減。例如,當Ic為3A時,Vce約1V;Ic為0.4A時,Vce約0.75V。
thanks,
jeffrey
感謝老師教導與回覆
不客氣~
thanks,
jeffrey
趙老師您好:
在本範例中,我使用UNO板時,測試都正常.
但當我換成MEGA2560時,程式為什麼就不能用呢?
趙老師:
MEGA2560 port number如下:
Serial 1: 19 (RX) and 18 (TX); Serial 2: 17 (RX) and 16 (TX); Serial 3: 15 (RX) and 14 (TX).
所以我有改寫成以下設定值:
SoftwareSerial BT(19, 18); // 接收腳, 傳送腳
其他沒變,但仍是無法運作,是否還有那裡要修正呢?
hi chen:
MEGA2560板子上的serial1, serial2和serial3,並不需要透過SoftwareSerial程式庫引用。
就像UNO預設的Serial一樣,直接引用即可:
thanks,
jeffrey
謝謝老師指導
現在可以了..
趙老師:
您在書本第十二章中有提到irsend.sendRaw()的使用,
我依書中所提的方式,搖控家中DVD播放器時可順利開關機.
但當我想搖控家中HITACHI冷氣時,卻無法順序啟動,這是那裡出現問題呢?
unsigned int AIRpowerRec[]={3400,1650,500,1200,450,450,500,400,500,450,450,500,450,450,450,450,500,450,450,450,500,450,450,450,500,450,450,1200,450,450,500,450,450,450,500,450,450,450,500,450,450,450,450,450,500,450,450,450,500,450,450,450,500,400,500,450,500,450,450,450,450,450,500,1200,450,450,500,1150,500,1200,500,1200,450,1200,450,1200,500,1150,500,450,500,1200,450,1200,500,1200,450,1200,500,1150,500,1200,450,1200,500,1200,450,1200,500};
irsend.sendRaw(AIRpowerRec,99,38);
是載波頻率指定錯了嗎?
因為各家廠商採用的紅外線載波頻率和通訊格式都不盡相同,我也不確定,但是你可以參考一下這個留言。
good luck!
jeffrey
老師您好
剛開始接觸Arduino,也拜讀了老師的書,寫得很好受益良多。
關於藍芽的應用有些問題想請教。
裝置:
Arduino UNO板
Microchip提供的藍芽模組 Arduino擴充板 APP-ESS14-2
(datasheet :http://www.microchip.com.tw/Data_CD/EVM%20Board/APP-ESS14-2.zip )
廠商有提供一段code是用在uC32的板子上 如下。
看書上提到UNO板只有一個序列埠,使用這塊APP-ESS14-2擴充板是否需要使用SoftwareSerial程式庫?
老師可以指導一下,如何寫一個簡單個code與這塊APP-ESS14-2板子溝通嗎?
感謝老師!
#define KitLED 2 // APP-ESS14-2 : D8
#define KitWakeupHardware 11 // APP-ESS14-2
#define KitWakeupSoftware 12 // APP-ESS14-2
#define CMD_MLDP 13 // APP-ESS14-2
void setup()
{
pinMode(PIN_LED1, OUTPUT);
pinMode(PIN_LED2, OUTPUT);
pinMode(KitLED, OUTPUT);
pinMode(KitWakeupHardware, OUTPUT);
pinMode(KitWakeupSoftware, OUTPUT);
pinMode(CMD_MLDP, OUTPUT);
Serial1.begin(115200);
}
void loop()
{
digitalWrite(KitWakeupHardware, HIGH);
digitalWrite(KitWakeupSoftware, HIGH);
digitalWrite(CMD_MLDP, LOW);
Serial1.print(“SF,2\r\n”);
Serial1.print(“SR,30000800\r\n”);
Serial1.print(“R,1\r”);
digitalWrite(CMD_MLDP, HIGH);
while(1)
{
digitalWrite(PIN_LED2, HIGH);
digitalWrite(KitLED, HIGH);
delay(500);
digitalWrite(PIN_LED2, LOW);
digitalWrite(KitLED, LOW);
delay(500);
Serial1.print(“This Message from ChipKIT uC32!\r\n”);
}
}
hi percent:
我看了那塊藍牙板的電路圖,藍牙晶片的RX和TX接腳,分別位在CON1插座的5和6腳,所以你可以透過SoftwareSerial程式庫連接這兩個腳位,進行藍牙序列通訊。
thanks,
jeffrey
老師您好
謝謝您的回覆。
剛剛有詢問廠商,廠商說這塊擴充板的工作電壓為3V,無法直接搭接在UNO板上,而要搭接在UNO 32的板子上。
如果我還是想要使用UNO板去控制這塊藍芽擴充板,可以直接從UNO的3.3V輸出給藍芽擴充板的CON4插座上的2腳,UNO板的GND給藍芽擴充板的CON4插座上的3腳嗎?
然後再把藍牙晶片的RX和TX接腳 接給UNO,這樣進行藍芽序列通訊嗎?
你購買的藍牙擴充板的工作電壓是3.3V,可以接UNO的3.3V接腳;TX腳建議串接一個1K歐姆電阻。
thanks,
jeffrey
請問老師有E-MAil嗎?
我把你網路上的程式寫到我arduino內部去然後再com8內輸入AT他會出現OK
但是我控制的程式加入你給的程式輸入AT他就不顯示OK了~~請問何解呢?
AT命令僅用於設定藍牙模組的參數;進行序列通訊時,藍牙模組無法接收AT命令,而且HC-05的AT模式和透通模式採用的傳輸速率不一樣,透通模式通常是用9600bps速率。
thanks,
jeffrey
老師您好:
我的Mega2560板子上接了很多感應模組,如DHT22 / 人體紅外線感應模組 / 超音波距離感應模組等等,這些感應器的程式碼常會為了取得正確的電壓值或必要的需求,須要使用到delay()的function();這様的結果造成Loop中會有很多段程式碼(感應模組)都在使用delay(),雖然每一段時間都不長,但產生了一個問題.因板子上我有裝一個輕觸按鈕,
boolean SWbutton1=digitalRead(SW1);
每當按鈕被按下時, (它的作用為relay on或off),結果都須要在長時間的按下而Loop中的程式碼剛好執行到這行程式碼才會被觸發,是否能像電腦鍵盤輸入一樣,每個被按下的按鍵不管按下的時間長短都不會因Loop尚未執行到而被漏掉的方法呢?
謝謝
hi chen:
你可以用比較時間差的方式來避免這個問題,詳細請參閱13-39頁的程式說明。
thanks,
jeffrey
謝謝老師的回答..
老師您好︰
我是用MEGA 2560 跟HC-06 (四腳版本) 的,不知為何我的手機寫著已配對,但想按下連線卻沒有反應,HC-06上的LED只是一直在閃…早陣子還是成功連線並以APP傳輸資料…可是現在卻不行,朋友試過用類似Bluetooth Terminal之類的APP卻成功連上,請問老師您知道原因嗎?
hi catherine:
我覺得要先釐清問題出在哪個環節,如果也可以用電腦連結HC-06並傳送數據,那就得檢查Android端的程式碼;如果可能,也請替換另一個模組測試看看……抱歉沒幫上忙。
thanks,
jeffrey
您好,
我照著教學步驟來操作
但是當我輸入AT指令時
回傳的卻是
AT 得到回應是 �
AT+VERSION 回應 �+�˽�Y�.8
AT+NAMEsix 回應 }�ѹ����
AT+PIN1234 回應��A%9�
等等都是亂碼….
我用電腦藍芽看得到此藍芽裝置
但是輸入密碼連結後
一開始電腦顯示已連結,可是HC-06還是一直在閃燈,過幾秒後電腦就顯示未連結了
使用arduino UNO
接腳:RXD連第9接腳 TXD連第8接腳
請問該如何解決呢?
hi yan:
序列埠監控視窗顯示亂碼,通常是資料傳輸速率錯誤所導致:但是你的藍牙控制板在與電腦連線後,無故斷線,如果不是電腦驅動程式的問題(註:我以前在電腦上連接Wii把手時,就出現過連線問題),那也許是藍牙模組本身是不良品,遇到這種情況,只好拿另一款同規格的模組執行同樣的程式來比對結果。
thanks,
jeffrey
筆者您好:
敝人是以藍芽HC-06與Arduino UNO連接,
線路也照文中描述所配置,
在將Arduino以usb線插入電腦通電後,
HC-06的LED燈開始閃爍紅燈,
並且Arduino已上傳您文中所提供的code,
code中的連線速率均為9600,
而敝人用Android手機開啟藍芽並搜尋裝置時,
確實有在清單中看到”HC-06″;
然而以win7 電腦在”新增裝置”那裡卻一直無法搜尋到HC-06;
簡而言之就是手機搜的到,電腦卻搜不到的情況,
請問此問題該怎麼解決,感謝
hi luckycrow:
假如你的Win7系統無法搜尋到任何藍牙裝置,請嘗試這個老外提供的方法:
1. 按下「開始」,在搜尋欄位輸入”services.msc”。
2. 按下Enter鍵之後,系統將開啟「服務」工具程式。
3. 從「服務」程式的主畫面,找到並雙按”Bluetooth Support Service”。
4. 如果藍牙的「服務狀態」不是「執行中」,請按下「啟動」。
5. 「啟動類型」選項,選擇「自動」。
6. 按一下「登入」頁籤,「登入身份」選擇「本機系統帳戶」。
thanks,
jeffrey
我是Arduino超級新手
有點笨沒有任何基礎,也看不懂原文手冊
目前在做大學專題,其中一個部分卡住,已經爬了許多文
還是看不懂或找不到想要的資訊,已經束手無策了,希望
可以幫忙我一下,雖然問題可能
很低級哈哈….
我用Arduino 做藍芽接收
主是用HC-05 從是HC-06都設定好了 BAUD都是9600
問題是在我用兩塊Uno傳值接收都正常
用uno的板和nano的板傳值也正常,唯獨
把一塊uno改成leonardor(“接收端”)就接收不到了
有用超極終端機Accessport RS-232 接第三pin Tx接腳
接一條電線出來插在leonardo的Rx接腳,用監控看一樣收不到值
因為我要做滑鼠的功能,用uno要進入DFU改韌體那邊我完全不會
爬文也看不懂,所以找到leonardo 有Mouse的參數,對我來說比較
好上手,所以我一塊一定要用leonardo的板
我傳值的程式碼:uno,nano的板子
#include
SoftwareSerial BT(0,1);
void setup()
{
Serial.begin(9600); // 啟動serial通訊埠
BT.begin(9600);
}
void loop()
{
BT.println(‘t’);
//delay(1000);
Serial.println(‘q’);
// delay(1000);
}
接收端的程式碼:leonardo的板子
#include
SoftwareSerial BT(0, 1);
void setup()
{
Serial.begin(9600); // 啟動serial通訊埠
BT.begin(9600);
}
void loop()
{
if (BT.available())
{
h=(BT.read());
Serial.println(h);
}
}
}
有去查過uno跟leonardo的差異
可是只看到什麼新舊差別或硬體差異
uno沒有Serial1之類的
可是也不知道那個是幹嘛的
希望可以幫我解決
uno可以藍芽傳值到leonardo的問題
硬體跟軟體可以詳細地告訴我
硬體
hi 阿豪:
1. SoftwareSerial不要設在0和1腳。
2. Leonardo板子的序列埠通訊程式,請在setup()函式加入底下的while迴圈:
thanks,
jeffrey
我今天有把接腳改在8,9過了
至於那個while迴圈我也有試過,只不過我是打while(!Serial1){;}
不知道有沒有差別,同時我有把leonardo那塊的程式每個有Serial的字都改成Serial1,我是參考這個網站的http://www.geek-workshop.com/forum.php?mod=viewthread&tid=8732
老師的方法我明天再去實驗室試一次看看
謝謝老師😁😁
while(!Serial1){;}
以及
while(!Serial1){
;
}
是完全相同的敘述,只是分成數行來寫。Leonardo的Serial1用在序列連接數位0和1腳的場合。
good luck!
jeffrey
我忘了說,我參考了那個網站還是沒做出來
今天試了在setup()函式加入底下的while(!Serial1){;}
可以讓nano,uno成功傳值給leonardo了,萬分感激老師>.<"
不過還有兩個小疑問
第一個問題是:
我傳值的程式碼:uno,nano的板子
#include
SoftwareSerial BT(0,1);
void setup()
{
Serial.begin(9600); // 啟動serial通訊埠
BT.begin(9600);
}
void loop()
{
BT.println(‘t’);
//delay(1000);
Serial.println(‘q’);
// delay(1000);
}
我void loop()那邊裡面是打BT.println(‘t’);和Serial.println(‘q’);
為什麼leonardo藍芽接收到的值是q,而不是t呀,照理說Serial.println(‘q’);這段程式碼不是給自己在監控看的嗎,BT.println(‘t’);這段才是藍芽發送的資料
第二個問題是:
我傳值的部分要傳的數據是超音波接收到的值
可能會有3位數或2位數或一位數:(Ex:257,93,3,等……..(單位公分))
可是聽說藍芽一次只能傳送一個字元
要怎麼解決。
我接收端那塊版子
要根據超音波的值動作,
例如
大於100cm要做動作1
小於100cm要做動作2
所以可能會接收到1~3位數的值
問題是要怎麼讓接收端接收到1~3位數去動作
1. 那是因為你的藍牙序列通訊模組是接在UNO板的0和1腳,如同我昨天的回覆,SoftwareSerial不應該使用0和1腳;如果你要使用0和1腳,那就不需要使用SoftwareSerial程式庫了,詳細說明請參閱書本5-18頁的「動手做5-1」以及14-10頁的「動手做14-1」。
2. 你可以把接收到的字元組成字串並轉換成數字,相關說明請參閱10-10頁「動手做10-3」,以及11-16頁「動手做11-3」。
thanks,
jeffrey
第一個問題已解決,感謝老師
是哪一本書呀 ,要去哪裡購買
《超圖解Arduino互動設計入門》,書店及露天網拍均有販售,謝謝!
thanks,
jeffrey
老師您好:
我目前在嘗試將兩塊arduino 以藍芽連接
因此我希望能夠用arduino 自己的code來進入at mode
不知道這樣的要求是可行的嗎?
可行,但是如上文所述,藍牙板在通電之前,KEY腳必須處於高電位。所以你可能需要設計一個電路來切換藍牙的電源,請參閱我之前的這一篇留言。
thanks,
jeffrey
你好请问你的那种很好看的图是用什么软件画的?
徒手用Adobe Flash畫的。
thanks,
jeffrey
老師我現在做專題遇到困難我用的是Colorduino,這塊板子上面有ATMega328可以獨立運作,他身上也有接出RX、TX 接角,我想用他連接藍芽,請問我該怎麼設定連結。(這是我參考的網站https://123led.wordpress.com/colorduino/、http://wiki.iteadstudio.com/Colorduino_V1.4)
hi yen:
我大致瀏覽你提供的網頁文件,Colorduino提供序列埠和I2C介面,所以你可以把藍牙模組接在序列埠,程式就不需要使用SoftwareSerial,直接透過Serial物件通訊即可。
thanks,
jeffrey
老師請問大概要怎麼寫Serial
我要一次連結4個Colorduino要怎麼用1對多連線
我看了一下Itead Studio的簡體中文產品說明頁,Colorduino控制板採用的點矩陣驅動IC是點晶科技的DM163,根據它的技術文件,它有Serial Out接腳,所以可以串接多個顯示器。
因為每個驅動IC的運作方式以及資料格式都不太一樣,最好是問問廠商有沒有現成的程式庫可用,否則你可能要自己研讀技術文件和Colorduino的線路圖,才能明瞭如何控制它。
thanks,
jeffrey
老師你好:
抱歉請問一下
我都接通也可以利用MAC去連接到ARDUINO的藍芽了
可是為什麼 他無法長時間連結?
大約過個10秒左右就會自動斷聯了
hi vincent:
我在Mac上也遇過類似的問題,Apple的原廠藍牙鍵盤在持續使用數小時或者睡眠之後喚醒,連線就中斷了,後來執行這個Script就解決藍牙鍵盤的問題。但是HC-05模組的問題我就不清楚了。
thanks,
jeffrey
謝謝老師
我查些資料 發現很多人都有這種問題 MAC配對藍芽後 過不久在藍牙配對的視窗會自動跳回未連線
但是燈號不變 所以可能是MAC藍芽使用者介面那邊的問題
非常謝謝老師
老師你好
我使用的電腦是MAC,作業系統是OSX。沒有另外裝windows系統。
使用的開發版是Arduino UNO,藍芽模組是HC-10
程式碼都是依照老師網站上的,也成功寫入到板子裡面。
序列軸監控視窗也有出現「BT is ready!」
不過輸入任何AT指令都沒有反應,完全沒有頭緒問題是出在哪裡…
麻煩老師幫我解答了…謝謝老師
hi peter:
我沒有接觸過HC-10,請跟廠商索取相關技術文件,確認讓藍牙模組進入AT命令所需連接的腳位(如:Key接高電位),以及通訊速率。
thanks,
jeffrey
您好,由於我們做專題用到Seeeduino ADK板子,搭配用Seeed BLE shield
照您上面說的打了一樣的程式碼卻沒有回應?
可以教我如何修正嗎?
hi 阿成:
請參閱Seeed BLE shield的技術文件。
thanks,
jeffrey
老師您好,我已經完成上面所說的步驟,在序列埠設定也可以設定藍牙模組的AT命令,但是用手機一直收尋不到我的藍芽模組,請問老師:有可能是什麼原因造成收尋不到。我的藍芽模組是HC-05 手機是ZENFONE。
hi lin:
手機探索不到藍牙模組,跟AT命令設定沒有太大關聯,請將模組的工作模式改成Slave,如果再無法被手機探索,請換支手機或者用電腦測試。
thanks,
jeffrey
老師您好
我目前剛接觸HC06,想請問老師一個問題
HC06可否使用AT指令改變EDR呢?
我想利用AT指令改Class1、 Class2或 Class3可行嗎?
或是利用其他方式改變傳輸距離。
請老師給點建議,感謝老師
hi kora:
我所購買的HC-06模組,只有上述的AT命令可用。
提高傳輸距離,主要是要改變天線和訊號放大器電路設計,跟AT指令沒什麼關係。
thanks,
jeffrey
老師您好,請問您我想做一個用藍芽控制的家電中心,而我在這位作者的網站上找到這一串程式
(附上網址)
http://blog.xuite.net/chycahock/EDA/225989778-%E7%94%A8%E6%89%8B%E6%A9%9FApp%E9%81%99%E6%8E%A7%E5%AE%B6%E9%9B%BB%E9%96%8B%E9%97%9C
程式如下:
#include
#define MAX_BTCMDLEN 128
#define BTSW_TV 7 // pin7 當 BlueTooth Switch for TV
#define BTSW_Sound 6 // pin6 當 BlueTooth Switch for Sound
#define BTSW_Room 5 // pin5 當 BlueTooth Switch for Room
#define BTSW_Fan 4 // pin4 當 BlueTooth Switch for Fan
// 建立一個軟體模擬的序列port
SoftwareSerial BT(10,11); // HC-06/TX–>PIN10(Arduino/RX), HC-06/RX–>PIN11(Arduino/TX);
byte btCmdBuff[MAX_BTCMDLEN]; // up to 128 bytes BT command received from the Android system
int btCmdLen = 0; // received BT command length
void setup() {
//Serial.begin(38400); // serial port for debugging
BT.begin(38400); // 建立藍芽軟體串列埠
pinMode(BTSW_TV,OUTPUT); // 設定電視開關
pinMode(BTSW_Sound,OUTPUT); // 設定音響開關
pinMode(BTSW_Room,OUTPUT); // 設定房間開關
pinMode(BTSW_Fan,OUTPUT); // 設定風扇開關
digitalWrite(BTSW_TV,LOW);
digitalWrite(BTSW_Sound,LOW);
digitalWrite(BTSW_Room,LOW);
digitalWrite(BTSW_Fan,LOW);
}
void loop() {
listenBTCmd();
//showBTCmd(); // for debugging
executeBTCmd();
}
void executeBTCmd() {
char cmd[MAX_BTCMDLEN];
if ( btCmdLen>0 ) {
sprintf(cmd,”%s”,btCmdBuff);
//Serial.println(cmd);
if ( strcmp(“tv,on”,cmd)==0 ) {
digitalWrite(BTSW_TV,HIGH);
}
if ( strcmp(“tv,off”,cmd)==0 ) {
digitalWrite(BTSW_TV,LOW);
}
if ( strcmp(“sound,on”,cmd)==0 ) {
digitalWrite(BTSW_Sound,HIGH);
}
if ( strcmp(“sound,off”,cmd)==0 ) {
digitalWrite(BTSW_Sound,LOW);
}
if ( strcmp(“room,on”,cmd)==0 ) {
digitalWrite(BTSW_Room,HIGH);
}
if ( strcmp(“room,off”,cmd)==0 ) {
digitalWrite(BTSW_Room,LOW);
}
if ( strcmp(“fan,on”,cmd)==0 ) {
digitalWrite(BTSW_Fan,HIGH);
}
if ( strcmp(“fan,off”,cmd)==0 ) {
digitalWrite(BTSW_Fan,LOW);
}
}
}
void listenBTCmd() {
char tmp;
btCmdLen = 0;
memset(btCmdBuff,0,MAX_BTCMDLEN);
while( BT.available()>0 ) {
if( (tmp=BT.read())==’O’ ){
btCmdLen = 0;
}
btCmdBuff[(btCmdLen++)%MAX_BTCMDLEN] = tmp;
}
}
void showBTCmd() {
char cmd[MAX_BTCMDLEN];
if ( btCmdLen>0 ) {
sprintf(cmd,”%s”,btCmdBuff);
Serial.println(cmd);
}
}
這位作者是用APP連接藍芽,我也依樣畫葫蘆,但發生了一些問題
我是使用UNO板,但我的藍芽模組是HC-05 (34腳有按鈕的),也照老師上面做AT指令(但不知道改甚麼,幾乎都原廠設定)
我連接手機的時候也都OK,配對成功,HC-05有變成慢速閃爍,但我在APP端輸入tv,on之類的指令,LED就是不會亮
我是想連接繼電器做一個家電控制中心在家裡玩(家裡很小,想說無聊),也讓父母驚奇一下
但我的程式底子並不是非常好,我找了很多文章也不知道怎麼改或是哪裡有錯
我是使用麵包板跟杜邦線連接Arduino,但沒有公對母的杜邦線,所以藍芽是插在麵包版上
可不可以麻煩老師協助我,謝謝
1. 除非你要修改藍牙的參數(例如:藍牙的識別名稱或連線速率),否則買回來就能直接安裝使用,不需要執行AT命令。
2. 剛開始練習程式設計時,建議先從簡單、容易解決的問題下手。像你提到的App,那是別人寫好的,程式碼究竟如何運作,我們可能摸不著頭緒;Arduino部份也是一堆控制碼。
書本第14章的用手機藍牙操控機械昆蟲,其實也可以改成燈光或其他電器的藍牙開關控制器。書本裡的App範例包含前進、後退、左轉、右轉和停止等「開關」控制,你可以先從控制單一開關著手,了解整個程式的運作邏輯之後,再嘗試加入其他開關控制。
have fun!
jeffrey
老師您好,
最近正在做學校的專題,內容是使用app inventor 2 經由藍芽控制arduino的led,不過遇到一些瓶頸,希望能夠透過你們的專業來幫我解答。
我們有最主要的兩個功能
基本的開關燈以及使用slider調整led燈的亮度
總共有3個slider,2顆led燈
slider1是用來同步控制2顆led燈亮度
slider2是用來控制第一顆
slider3是用來控制第二顆
使用UNO 板 HC-05藍芽模組
程式碼如下
#include
SoftwareSerial BT(8, 9);
String mystring;
void setup() {
Serial.begin(9600);
Serial.println(“BT is ready!”);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
BT.begin(9600);
}
void loop() {
while (BT.available())
mystring = BT.readString();
{
if (mystring==”O”){
digitalWrite(13, HIGH);
digitalWrite(12, HIGH);
}
else if (mystring==”P”){
digitalWrite(13, LOW);
digitalWrite(12, LOW);
}
else if (mystring==”Q”){
digitalWrite(12, HIGH);
}
else if (mystring==”S”){
digitalWrite(12, LOW);
}
else if (mystring==”T”){
digitalWrite(13, HIGH);
}
else if(mystring==”U”){
digitalWrite(13, LOW);
}
}
}
↑這是控制開關的程式碼,但使用起來會有大約1秒的延遲,原先是使用char、switch case來寫,不會有延遲也一切正常,不過為了配合slider的使用所以改用string、if else,就開始會延遲。
#include
SoftwareSerial BT(8, 9);
String mystring,val;
int value = -1;
void setup() {
Serial.begin(9600);
Serial.println(“BT is ready!”);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
BT.begin(9600);
}
void loop() {
while (BT.available())
mystring = BT.readString();
val=mystring.substring(0,1);
value=mystring.substring(1).toInt();
Serial.println(val) ;
Serial.println(mystring) ;
if (value >= 0)
{
if (val==”A”){
analogWrite(10,value);
analogWrite(11,value);
value = -1;
}
if (val==”L”){
analogWrite(10,value);
value = -1;
}
if (val==”R”){
analogWrite(11,value);
value = -1;
}
}
}
↑這是參考網路上的程式碼,也是我們整個環節很大的問題,一樣會延遲,雖然會依照著%數越大led就越亮的規律,但在0%時led燈不會全滅,會微亮,slider也只能使用點按的方式調整而不能使用拖拉的方式,否則傳入的數字會亂跳。
有參考過http://blog.cavedu.com/programming-language/appinventor/appinventorandarduinowithbluetooth2/,但礙於看不太懂程式碼內容,所以不知道怎麼樣從1顆led變成3顆led,只好尋找其他方式試試看。
至於AI2經藍芽傳送的資料如下
slider1是傳送A(%) EX:slider調為50%的時候會接收到A50的數值
slider2是傳送L(%) EX:slider調為50%的時候會接收到L50的數值
slider3是傳送R(%) EX:slider調為50%的時候會接收到R50的數值
之後把兩個程式碼組合起來之後會有種衝突的感覺,卡在這部分好幾天了,不知道是否有哪裡需要修改或是需要使用其他的函式去執行?
想請問,我有兩個 HC-06 ,打AT+NAMEOOO可以修改名稱,兩個都有回傳OKsetname。
可是打AT+PIN1111,一個有更改成功、有回傳值,一個沒有任何回傳值,密碼也沒有被更改成功,這到底是什麼原因呢?
hi vivian:
相同的模組,一個可以更改成功,另一個不行…呃…我會把另一個給忘了,我覺得它是不良品。
thanks,
jeffrey
請問如果要使用手機上的app與自己組的其他晶片做藍芽傳輸,
而不使用Arduino,
不知道有推薦哪款Android app嗎?
因為自己有找了幾款,
只是不太知道app是怎麼做傳輸的,
也找不到使用教學,不知道是不是還要輸入什麼指令。
hi sky:
我不太了解你的用意,你是說在兩個Android設備(如:手機和平板)之間,傳遞資料嗎?還是要透過藍牙控制另一個Android裝置?
thanks,
jeffrey
想利用Android設備去控制另一個藍芽裝置,
那個藍芽裝置只是要接收資料,送到晶片裡而已,
後續的晶片接收部份是寫好了,
只是我不知道怎麼利用Android設備將資料送到HC-06上讓他接收傳輸出去,
例如我可以在手機上輸入1,利用HC-06讓他傳送到晶片內,
晶片接收到之後就由其他裝置顯示1 之類的,
目前是卡在接好了RX TX等等腳位,
不過不知道怎麼通過手機藍芽,
將資料傳到HC-06讓他傳送到晶片內,謝謝。
了解,請在Google Play上搜尋”Bluetooth Terminal”(藍牙終端機)。安裝之後,即可透過它向已經配對連線的藍牙序列裝置發送訊息。
thanks,
jeffrey
因為我本來是用 RS232 的UART模組,將資料從電腦送到晶片,
想說改用手機藍芽傳輸,目前使用的是HC-06的藍芽模組,
本來接RS232傳輸的地方就改接 HC-06的4個腳,
不過去下載了app 看起來是有連接到藍芽上,
只是在app輸入資料傳送後好像沒反應,
像是去下載的這幾種app
https://goo.gl/4qxYBO
https://goo.gl/PqdrVq
https://goo.gl/vV0WPe 之類的,
大概就是想要將資料從手機利用藍芽傳送到HC-06裝置上。
我有下載”Bluetooth Terminal”(藍牙終端機),
上面好像也有好幾種版本,
我有設定只要有收到資料,就算資料錯誤也會顯示,
所以可能應該不是格式錯誤,
感覺是資料都沒有傳輸過去,
那些Bluetooth Terminal 的app是還要另外打指令才能傳送,
或是想傳1 就直接輸入1 發送就好?
不知道在手機app上是不是也要打AT+…等等的指令,
雖然我也有試過不過也沒反應,
還是AT+…的指令是Arduino用的,
手機的app不用?
測試藍牙序列模組最簡單的方法,就是將模組的TxD和RxD腳相連,然後再開啟手機上的Bluetooth Terminal(我用的是這個App)。
當你發送字元或字串之後,App下半部的視窗將會顯示相同的訊息,代表藍牙模組有將收到的訊息返送回來。
除非你要設置藍牙模組的參數,否則並不需要進入AT模式。
thanks,
jeffrey
照您說的方法試了一下,
的確有接收到傳回來的訊息,
所以想說可能是不是因為HC-06傳送的訊號和我用 RS232所傳的訊號模式或格式不同,
所以無法接收到正確資料,
我目前用的晶片主要是HIN232接RS232的,
然後將資料傳送到dspic30f4011,
是想要將RS232連接電腦的改成使用藍芽傳輸,
不知道您對這晶片了不了解,可能是什麼原因晶片接收不到藍芽傳輸的資料?
謝謝。
問題不在硬體(請確認藍牙的TxD是接在dspic30f4011單晶片的RxD腳),請調整藍牙的傳輸速率試試看。
have fun!
jeffrey
調整設定有辦法用手機app直接改嗎?
還是一定要從電腦上安裝那個軟體才能?
我試過直接從app打AT之類的好像都沒反應,
不知道有什麼方法可以比較快速的直接調整速率設定?
謝謝。
請參閱上文說明,讓藍牙進入AT命令模式。AT命令一定要從藍牙的TxD和RxD連線輸入,不能透過無線傳輸。
thanks,
jeffrey
老師您好
請問HC-06設定完成後
是否還需要接Uno版呢?
想把HC-06獨立出來
單獨接Power supply
靠手機傳輸訊號
由TxD傳輸邏輯訊號
hi james:
不需要,藍牙模組可單獨使用。
have fun!
jeffrey
謝謝老師指導:)
請問一下,這個送出的資料型態是哪種?
char float 還是其他的?
是8 bits 32 bits之類的?
謝謝解答?
資料類型是char。
thanks,
jeffrey
SoftwareSerial BT(2,4); // 接收腳, 傳送腳(自己做的arduino板子,所以不是10,11)
void setup() {
Serial.begin(9600);
BT.begin(38400); //HC-05
}
void loop() {
int insize,i=0;
if (BT.available()) {
insize = (BT.available()); //接收多少訊息
Serial.print(“availible_size=”);
Serial.print(sizeof(BT.available()));
Serial.print(“\\”);
Serial.print(insize);
Serial.print(” read_size=”);
Serial.println(sizeof(BT.read()));
for (i=0;i<insize;i++) {
Serial.print(cmmd[i]=char(BT.read()));
Serial.print("\\");
Serial.print(cmmmd[i]=char(BT.read()));
Serial.print(",");
}
Serial.print(strlen(cmmd));
Serial.print("\n");
for(i=0;i<insize;i++){
Serial.print(cmmd[i]);
Serial.print(",");
}
Serial.print("\n");
監控視窗:
availible_size=2\5 read_size=2
\0, \0,正方形\255,正方形\255,正方形\255,0 //(0是strlen)
, , ,正方形,正方形,
想請問老師,傳的值是不固定長度的字串,可是cmmd都是看不見或框框、cmmmd有數字可是不是英文字母
這樣是因為(2,4)腳位的問題,還是監控視窗顯示不出來,還是HC-05壞掉
然後每次insize都不一樣大小(假設傳的都是"P,"),sizeof永遠都是2(可是"PA,"也是2),不知道為什麼?
char cmmd;
byte cmmmd[20];
\0, \0, \255,正方形\255,正方形\255,0 //(0是strlen)
, , ,正方形,正方形,
監控視窗打錯,更正
hi peter:
請參閱「Arduino序列埠通訊程式Serial.read()讀取到 ÿ 字元的補充說明」這篇貼文,因為你的程式透過(BT.available())讀取字元時,並非全部字串都已傳入微控器,所以程式無法讀取到正確的字串長度。
thanks,
jeffrey
運用了課本的範例程式做了一個藍芽遙控車的程式, 卻出現不常見的 ERROR, 希望老師可以協助
cArduino: 1.6.8 (Windows 7), Board: “Arduino Robot Control”
E:\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.cpp: In member function ‘void SoftwareSerial::begin(long int)’:
E:\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.cpp:319:36: error: ‘digitalPinToPCICR’ was not declared in this scope
if (digitalPinToPCICR(_receivePin)) {
^
In file included from e:\arduino\hardware\tools\avr\avr\include\avr\io.h:99:0,
from e:\arduino\hardware\tools\avr\avr\include\avr\interrupt.h:38,
from E:\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.cpp:41:
E:\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.cpp:360:76: error: ‘digitalPinToPCICRbit’ was not declared in this scope
*digitalPinToPCICR(_receivePin) |= _BV(digitalPinToPCICRbit(_receivePin));
^
E:\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.cpp:363:51: error: ‘digitalPinToPCMSK’ was not declared in this scope
_pcint_maskreg = digitalPinToPCMSK(_receivePin);
^
In file included from e:\arduino\hardware\tools\avr\avr\include\avr\io.h:99:0,
from e:\arduino\hardware\tools\avr\avr\include\avr\interrupt.h:38,
from E:\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.cpp:41:
E:\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial.cpp:364:60: error: ‘digitalPinToPCMSKbit’ was not declared in this scope
_pcint_maskvalue = _BV(digitalPinToPCMSKbit(_receivePin));
^
exit status 1
Error compiling for board Arduino Robot Control.
This report would have more information with
“Show verbose output during compilation”
option enabled in File -> Preferences.
原始檔案下載連結 : https://drive.google.com/file/d/0B6XPU7Xyt3NnSjNVM0lfbVF1YTg/view?usp=sharing
hi steven:
從錯誤訊息最後一部份看來,是因為你的開發板是Arduino Robot Control,看樣子SoftwareSerial程式庫不支援這個板子。
thanks,
jeffrey
您好老師, 我使用了網上一個範例關於用Bluetooth Terminal 來控制led 開關, 但輸入任何指令都沒有回應. 希望老師幫忙 指導 哪些地方出現問題
以下是範例及出現問題的情況.
#include
SoftwareSerial BT(15, 14);
void setup()
{
pinMode(9, OUTPUT);
BT.begin(9600);
}
char a;
void loop()
{
if (BT.available())
{
a=(BT.read());
if (a==’1′)
{
digitalWrite(9, HIGH);
BT.println(“LED on”);
}
if (a==’2′)
{
digitalWrite(9, LOW);
BT.println(“LED off”);
}
}
}
C:\Users\user\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.7\libraries\SoftwareSerial\SoftwareSerial.cpp:375:6: warning: always_inline function might not be inlinable [-Wattributes]
void SoftwareSerial::setRxIntMsk(bool enable)
^
C:\Users\user\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.7\libraries\SoftwareSerial\SoftwareSerial.cpp:121:6: warning: always_inline function might not be inlinable [-Wattributes]
void SoftwareSerial::recv()
請問你用的是什麼板子?建議安裝最新版(目前是1.16.11)再測試看看,它改善了一些軟體bug。
thanks,
jeffrey
現在使用Arduino Mega 2560, IDE1.6.9 (win8) 感謝老師指導
根據SoftwareSerial程式庫裡的註解,Mega 2560只有這些能用於「接收」:
Not all pins on the Mega and Mega 2560 support change interrupts,so only the following can be used for RX:
10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
請把你程式中的15改成13試試看。
也請參閱這一篇留言,Mega 2560板子並不需要使用SoftwareSerial程式庫。
thanks,
jeffrey
我再試試看 十分感謝老師的指導
老師您好, 感謝你之前的指導, 再想向老師請教 如何在Bluetooth Terminal 輸入 password= 1234 來控制led 開關
char pass [4]={‘1′,’2′,’3′,’4’};
void loop()
{
if (BT.available())
{
for(int i=0; i<4; i++)
{
pass [i] = BT.read();
}
if (pass == 1234)
{
digitalWrite(9, HIGH);
BT.println("LED on");
}
}
}
不敢當~我之前也沒講什麼…透過序列埠數值控制開關的例子,請參閱書本17-23頁的調光器程式碼。
thanks,
jeffrey
您好:
請問藍芽模組(HC-06)連結到arduino板上接電之後,也確定可以執行AT command得相關設定,但無法與手機(安卓)連結,手機顯示拒絕配對要求,請問這是哪裡出了問題,再請您幫忙指導,謝謝!
可能是Android系統軟體或App的問題,請問你有在電腦上配對成功過嗎?也請用不同的手機嘗試看看。
thanks,
jeffrey
老師您好,看完後尚未實作,但想請問如果將arduino上的接腳改成0,1用tx, rx是否可行?
可以。
thanks,
jeffrey
老师你好!
我使用的是HC05系列,按照您的指点成功进入了AT模式,灯慢闪,但是在串口检测器中写入 AT指令却无法得到反馈,我的结束符也选到 Both NL and CR.请问可能的原因是什么呢?
hi vincent:
請檢查傳送和接收腳是否接對,也許換個速率試試看。
thanks,
jeffrey
好喜欢你的配图!能告诉我是怎么画的吗?
我是用Adobe Flash軟件,搭配鼠標(偶爾用Surface Pro平板的Wacom筆)徒手繪製的。
thanks,
jeffrey
老師您好
我的HC-05有成功進入AT系統
傳輸指令 藍芽系統也都有回應
但手機藍芽遲遲都搜尋不到
請問要怎麼解決 謝謝
呃…聽起來是換新手機的好藉口…請問用其他手機也是同樣的情況嗎?
thanks,
jeffrey
老师您好!想问下您有没有HC-06蓝牙模块休眠或者说省电的资料,我是利用的Arduino UNO R3单片机控制的。
麻烦老师了~~谢谢您!
藍芽模塊的省電功能,應該由藍牙芯片自行控制,Arduino無法介入,或許可以替模塊做一個電源開關,從Arduino開啟或切斷模塊的電源。
thanks,
jeffrey
趙老師你好
我目前在做藍芽跟溫溼度感測器的連接
因為我真的是新手
我目前卡在我不太會寫
把溫溼度感測器所得到的數據傳到藍芽的程式
有請老師解救
你所謂卡在不太會寫,是指哪個環節的程式?因為藍牙有傳送端和接收端,按照你的描述,傳送端是Arduino;接收端可能是手機App、電腦或者另一個Arduino。
你應該釐清問題,先解決一小部份,像讀取溫濕度值,接著處理序列埠通訊,如此,你的問題就解決大半了。
have fun!
jeffrey
老師你好
可以請教個問題嗎
最近在做專題 藍芽喇叭
不太了解Arduino的寫法
我做完了藍芽控制 而且也可以正常使用
還要寫個音頻模塊的程式
可是找不到相關資料
請問可以教一下如何寫嗎 謝謝
控制音頻模塊指的是下一首、上一首、播放、暫停…之類的功能嗎?
這些控制功能模塊不是都有提供嗎?為何還需要Arduino?
thanks,
jeffrey
老师你好 我想问一下 昨天hc-05模块进入at模式还能修改 今天进入at模式就什么都不能修改了 是哪里出了问题呢
抱歉,这我不清楚。
thanks,
jeffrey
老師你好
我想要用HC-05藍芽模組透過SPP經由Arduino Uno與windows 系統連結
系統架構如下敘述
1. Sensor 模組,經由控制晶片,透過I2C bus, 與Arduino Uno連結(Pin A4, A5)
2. 而在Arduino Uno與windows 系統連結部分,則是經藍芽的SPP(serial port profile)做無線連結
3. windows 端則有一個App透過藍芽SPP與arduino連結
可我目前遇到一點小問題,就是HC-05藍芽模組無法與windows 系統連結
基本上,如果用USB上的Virtual Com port, Windows 端的App則可收到Sensor 模組傳來的控制訊號
可是用HC-05藍芽模組卻無法成功,相關訊息如下:
1. HC-05藍芽模組的設定為 slave, baudrate 等為9600, 1, 0, 且可與系統配對成功並產生兩組 Virtual Com port(com10 連出, com11 連入)
2. 在用藍芽連結時,將windows 端App的PortName改為com11,執行App時,com port可成功被打開(無錯誤訊息),但卻接收不到任何訊號
3. 程式碼如下:
Windows端
myport = new SerialPort();
myport.BaudRate = 9600;
myport.PortName = “com11”; //port_name_tb.Text;
myport.Parity = Parity.None;
myport.DataBits = 8;
myport.StopBits = StopBits.One;
myport.DataReceived += myport_DataReceived;
try
{
myport.Open();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, “Error”);
}
Arduino 端
SoftwareSerial BTSerial(10, 11); // Bluetooth Rx Tx on Arduino
void setup() {
// Open serial communication
Serial.begin(9600); //usb virtual com port
BTSerial.begin(9600);//BT virtual com port
// initial I2C
Wire.begin();
// initial color sensor
WriteByte(COLOR_SENSOR_DEVICE_ID, SYSTEM_CONTROL, SW_RESET);
WriteByte(COLOR_SENSOR_DEVICE_ID, MODE_CONTROL2, RGBC_EN);
WriteByte(COLOR_SENSOR_DEVICE_ID, MODE_CONTROL3, FUNCTION_EN);
WriteByte(INTERRUPT, MODE_CONTROL3, INT_ENABLE);
delay(200);
}
void loop() {
if(GetBTNStatus())
getRGB();
}
int GetBTNStatus()
{
int reading = digitalRead(BUTTON);
// If the switch changed, due to noise or pressing:
if (reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}
if ((millis() – lastDebounceTime) > debounceDelay) {
// if the button state has changed:
if (reading != buttonState) {
buttonState = reading;
}
}
// save the reading. Next time through the loop,
// it’ll be the lastButtonState:
// Serial.println(String(“”)+ “ButtonState: ” + lastButtonState);
lastButtonState = reading;
return lastButtonState;
}
void getRGB()
{
RGB[0] = ReadByte(COLOR_SENSOR_DEVICE_ID, RED_DATA_MSB);
RGB[1] = ReadByte(COLOR_SENSOR_DEVICE_ID, GREEN_DATA_MSB);
RGB[2] = ReadByte(COLOR_SENSOR_DEVICE_ID, BLUE_DATA_MSB);
Serial.println(String(“”)+ RGB[0] + “,” + RGB[1] + “,” + RGB[2]);//送給USB Uart的控制訊號,可被Winapp接收
BTSerial.println(String(“”)+ RGB[0] + “,” + RGB[1] + “,” + RGB[2]);//送給BT Uart的控制訊號,無法被Win app接收
delay(200);
}
請問你有先使用其他序列通訊軟體,例如AccessPort或者Android手機的Serial Terminal,測試能與藍牙模組通訊嗎?
thanks,
jeffrey
老師您好,不好意思我想跟您請教一下,我目前使用的hc-05在剛買回來的時候輸入AT,都會正常回傳OK,但自從我改變了他的鮑率,它回傳的OK都會少O或是少K,這樣在操作上還能正常運作嗎?要如何才能讓輸入AT時回傳的值變回OK。
請問修改鮑率之後,你有修改Arduino程式中的序列連線設定,用新的鮑率連接嗎?你可以參考這篇回應提到的AT命令規格書,將HC-05重設為出廠設定值。
thanks,
jeffrey