HC-05 Bluetooth ส่วนใหญ่จะใช้งานด้านการสื่อสารหรือส่งข้อมูลเป็นหลัก เพราะ HC-05 สามารถทำงานได้ 2 โหมด เป็น Server หรือ Client ได้ เราสามารถประยุกต์ใช้ Bluetooth Module มาเป็นช่องทางในควบคุมอุปกรณ์ระหว่างมือถือกับ Arduino โดยหลักการง่ายๆ ของการใช้ Bluetooth คือต้องมีการ pair อุปกรณ์เข้าหากัน คุณก็สามารถสั่งงานผ่าน Mobile App ได้
เตรียมอุปกรณ์ดังนี้
1. บอร์ด Arduino UNO R3 พร้อม สาย USB Port
2. Bluetooth (HC-05 Master+Slave)
3. Jumper (F2M) cable wire 40pcs 10 cm 2.54mm Female to Male
(สายเชื่อมต่อ ผู้-เมีย 5 เส้น)
เชื่อมต่อ HC-05 Bluetooth กับ Arduino UNO ดังภาพ
เมื่อเชื่อมต่อเสร็จ จะได้ตามภาพด้านล่าง
เชื่อม USB Port ต่อเข้ากับคอมพิวเตอร์
เปิดโปรแกรม Arduino (IDE) เขียน โค้ดดังนี้
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(9, 10);
void setup()
{
pinMode(8, OUTPUT);
digitalWrite(8, HIGH);
Serial.begin(9600);
BTSerial.begin(9600);
delay(1000);
Serial.println("Enter AT commands:");
}
void loop()
{
if (BTSerial.available())
Serial.write(BTSerial.read());
if (Serial.available())
BTSerial.write(Serial.read());
}
Verify แล้ว Upload โค้ด ลงไปในบอร์ด Arduino UNO R3
อธิบายการทำงาน จากตัวอย่าง Source Code ด้านบน
ก่อนอื่นต้องทำความรู้จักกับ ไลบรารี่ ฟังก์ชัน (Library Function) ในภาษา C ไลบรารี่ เป็นฟังก์ชันสำหรับการทำงานหนึ่งๆ ที่ผู้พัฒนา ได้ทำการพัฒนามาเตรียมไว้ให้เราเรียกใช้ มีผลดีคือลดเวลาในการพัฒนา โปรแกรมคอมพิวเตอร์ของเราครับ ไลบรารี่ ฟังก์ชัน ของภาษา C จะเก็บอยู่ใน ไฟล์นามสกุล.h หรือที่เรียกว่า เฮดเดอร์ไฟล์ (Header File) อย่างเช่น stdio.h math.h การเรียกใช้ ไลบรารี่ ฟังก์ชัน เราต้องรู้ว่า ฟังก์ชัน ที่ต้องการอยู่ในไฟล์ใด จากนั้นทำการ #include ไฟล์นั้นไว้ในส่วนหัวของโปรแกรม และ ไลบรารี่ ฟังก์ชัน (Library Function) ของ Arduino เองก็มีผู้พัฒนาไว้ให้เราอย่างมากมายแล้วเช่น SoftwareSerial.h เป็น ฟังก์ชัน ที่เกี่ยวกับ การติดต่อสื่อสารกับ USB Port (Serial Port หรือ พอร์ตอนุกรม) ของ บอร์ด Arduino เป็นต้น
#include <SoftwareSerial.h> // ให้คอมไพเลอร์นำเฮดเดอร์ไฟล์ (Library Function) ชื่อ SoftwareSerial.h เข้ามาร่วมในการประมวลผลด้วย
SoftwareSerial BTSerial(9, 10); //ตั้งให้ขา 9 และ 10 ให้เป็น RX, TX โดยใช้ชื่อว่า BTSerial
void setup() //ฟังก์ชันส่วนนี้จะทำงานครั้งแรก เพียงครั้งเดียวเท่านั้น
{ //เริ่มการทำงานของฟังก์ชัน setup
pinMode(8, OUTPUT); //ตั้งค่าให้ ดิจิตอล ขา 8 เป็นโหมดเอาท์พุท
digitalWrite(8, HIGH); //ตั้งค่าให้ ดิจิตอล ขา 8 สถานะ มี ไฟ 5 โวลต์
Serial.begin(9600); //ตั้งค่าความเร็วในการรับ-ส่งข้อมูล ค่ามาตรฐาน คือ 9600
BTSerial.begin(9600); //ตั้งค่าความเร็วในการรับ-ส่งข้อมูล ค่ามาตรฐาน คือ 9600
delay(1000); //ตั้งค่าให้รอ 1 วินาที (1 Millisecond เท่ากับ 1/1000 ของวินาที)
Serial.println("Enter AT commands:"); //ให้แสดงคำที่อยู่ในเครื่องหมายคำพูด ""
} //สิ้นสุดการทำงานของฟังก์ชัน setup
void loop() //ฟังก์ชันส่วนนี้จะทำงานซ้ำ วนลูป ไปเรื่อยๆ
{ //เริ่มการทำงานของฟังก์ชัน loop
if (BTSerial.available()) //ถ้า BTSerial มีข้อมูลเข้ามา
Serial.write(BTSerial.read()); // พอร์ต Serial ส่งค่าที่รับจากพอร์ต BTSerial ออกมา
if (Serial.available()) //ถ้า Serial มีข้อมูลเข้ามา
BTSerial.write(Serial.read()); // พอร์ต BTSerial ส่งค่าที่รับจากพอร์ต Serial ออกมา
} //สิ้นสุดการทำงานของฟังก์ชัน loop แต่ให้กลับไปทำงานใหม่
เพิ่มเติมการเรียนรู้ ภาษา C
ประโยค if แบบง่าย
ประโยค if แบบง่าย 1 ทางเลือก คือ การเขียนประโยค if ที่มีการตรวจสอบเงื่อนไขเพียงหนึ่งทางเลือก คือ ถ้าเงื่อนไขเป็นจริง จะทำงานในส่วนของคำสั่งที่กำหนด แต่ถ้าเงื่อนไขเป็นเท็จ จะข้ามการทำงานของคำสั่งดังกล่าวไป ดังรูปแบบข้างล่างนี้
จากภาพ แสดงให้เห็นว่า ถ้า เงื่อนไขหรือค่าของนิพจน์ที่ตรวจสอบ เป็นจริง ก็จะเลือกกระทำชุดคำสั่งหนึ่งแล้วไปกระทำตามคำสั่งต่อไป แต่ถ้าค่าของนิพจน์ เป็นเท็จ ก็ไม่ทำ ชุดคำสั่งใด ๆ ในทางเลือกเลย แต่ให้ไปทำชุดประโยคคำสั่งต่อไป
ตัวอย่างตามโค้ดด้านบน เช่น
if (BTSerial.available()) //ถ้า BTSerial มีข้อมูลเข้ามา = จริง จะทำงานบรรทัดต่อไป , ถ้าไม่มี ก็จะ = เท็จ คือไม่ต้องทำงาน ให้ข้ามไป ครับ
สรุปการทำงานของ โปรแกรม นี้ คือ รับคำสั่ง AT-COMMAND จากช่องป้อนข้อมูล ของ Serial Monitor การทำงานจะเริ่มจากคำสั่งที่เขียน ไว้ในไฟล์ SoftwareSerial.h ร่วมกับ คำสั่งที่เราเขียนเพิ่มเข้าไป เพื่อตรวจสอบการทำงาน ของ Bluetooth แล้วส่งผลลัพธ์ กลับมาแสดงผลด้านล่าง ของช่องป้อนข้อมูล
AT-COMMAND คือ ชุดคำสั่งมาตรฐาน ที่สามารถใช้ติดต่อสื่อสารกับอุปกรณ์สื่อสารต่างๆ เช่น โมเด็ม หรือ อุปกรณ์ DTE (Data Terminal Equipment) เพื่อโต้ตอบตั้งค่าหรือสั่งงานอุปกรณ์เหล่านั้น ให้ทำงานตามที่ต้องการ
ต่อนะครับ เมื่อ Upload เสร็จ ให้เปิด Serial Monitor ขึ้นมา โดยไปที่ Tools -> Serial Monitor
ในช่อง Serial Monitor ทางขวาด้านล่างจะมีช่องค่า Baudrate เลือกค่าที่ถูกต้องในตามโปรแกรม ค่า ปกติเราจะใช้ค่า 9600 และเลือก Both NL & CR ดังรูป
พิมพ์ AT แล้วกด Send หรือ Enter จะมีคำว่า OK แสดงออกมาให้เห็นดังภาพ
พิมพ์ AT+ROLE? แล้วกด Send เพื่อตรวจสอบให้แน่ชัดว่าเป็น Slave Mode (โหมดรอรับคำสั่ง) ค่าที่แสดงออกมาจะเป็น +ROLE:0 ก็แสดงว่า HC-05 Bluetooth ของเรานั้น พร้อมใช้งานแล้วครับ
หมายเหตุ : หากไม่มีการตอบสนอง ให้ตรวจสอบการต่อสายต่าง ๆ ตรวจสอบที่ตัว HC-05 ลองกดที่ปุ่ม BUTTON SWITCH ของ HC-05 หากยังไม่มีการตอบสนอง ให้ปิดหน้าต่าง Serial Monitor แล้วลองอีกครั้ง
ถ้า HC-05 องเราพร้อมใช้งานแล้ว ลองเปิดบลูทูธ ที่ โทรศัพท์มือถือของเรา (ระบบปฏิบัติการ แอนดรอยด์) ก็จะพบ HC-05 ของเราทำงานอยู่
เมื่อเชื่อมต่อเข้าไป ถ้าเป็นครั้งแรก ก็จะถามรหัสผ่าน ให้ ใส่ 1234 -> ตกลง
หน้าจอก็จะแสดง HC-05 ของเรา เชื่อมต่อกับ โทรศัพท์มือถือของเรา สำเร็จ พร้อมที่จะรับคำสั่ง จาก Mobile App แอนดรอยด์ ต่อไป
1. บอร์ด Arduino UNO R3 พร้อม สาย USB Port
2. Bluetooth (HC-05 Master+Slave)
3. Jumper (F2M) cable wire 40pcs 10 cm 2.54mm Female to Male
(สายเชื่อมต่อ ผู้-เมีย 5 เส้น)
เชื่อมต่อ HC-05 Bluetooth กับ Arduino UNO ดังภาพ
UNO <---> HC-05
5V <---> VCC
GND <---> GND
8 <---> EN
9 <---> TXD
10 <---> RXD
เมื่อเชื่อมต่อเสร็จ จะได้ตามภาพด้านล่าง
เชื่อม USB Port ต่อเข้ากับคอมพิวเตอร์
เปิดโปรแกรม Arduino (IDE) เขียน โค้ดดังนี้
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(9, 10);
void setup()
{
pinMode(8, OUTPUT);
digitalWrite(8, HIGH);
Serial.begin(9600);
BTSerial.begin(9600);
delay(1000);
Serial.println("Enter AT commands:");
}
void loop()
{
if (BTSerial.available())
Serial.write(BTSerial.read());
if (Serial.available())
BTSerial.write(Serial.read());
}
Verify แล้ว Upload โค้ด ลงไปในบอร์ด Arduino UNO R3
อธิบายการทำงาน จากตัวอย่าง Source Code ด้านบน
ก่อนอื่นต้องทำความรู้จักกับ ไลบรารี่ ฟังก์ชัน (Library Function) ในภาษา C ไลบรารี่ เป็นฟังก์ชันสำหรับการทำงานหนึ่งๆ ที่ผู้พัฒนา ได้ทำการพัฒนามาเตรียมไว้ให้เราเรียกใช้ มีผลดีคือลดเวลาในการพัฒนา โปรแกรมคอมพิวเตอร์ของเราครับ ไลบรารี่ ฟังก์ชัน ของภาษา C จะเก็บอยู่ใน ไฟล์นามสกุล.h หรือที่เรียกว่า เฮดเดอร์ไฟล์ (Header File) อย่างเช่น stdio.h math.h การเรียกใช้ ไลบรารี่ ฟังก์ชัน เราต้องรู้ว่า ฟังก์ชัน ที่ต้องการอยู่ในไฟล์ใด จากนั้นทำการ #include ไฟล์นั้นไว้ในส่วนหัวของโปรแกรม และ ไลบรารี่ ฟังก์ชัน (Library Function) ของ Arduino เองก็มีผู้พัฒนาไว้ให้เราอย่างมากมายแล้วเช่น SoftwareSerial.h เป็น ฟังก์ชัน ที่เกี่ยวกับ การติดต่อสื่อสารกับ USB Port (Serial Port หรือ พอร์ตอนุกรม) ของ บอร์ด Arduino เป็นต้น
#include <SoftwareSerial.h> // ให้คอมไพเลอร์นำเฮดเดอร์ไฟล์ (Library Function) ชื่อ SoftwareSerial.h เข้ามาร่วมในการประมวลผลด้วย
SoftwareSerial BTSerial(9, 10); //ตั้งให้ขา 9 และ 10 ให้เป็น RX, TX โดยใช้ชื่อว่า BTSerial
void setup() //ฟังก์ชันส่วนนี้จะทำงานครั้งแรก เพียงครั้งเดียวเท่านั้น
{ //เริ่มการทำงานของฟังก์ชัน setup
pinMode(8, OUTPUT); //ตั้งค่าให้ ดิจิตอล ขา 8 เป็นโหมดเอาท์พุท
digitalWrite(8, HIGH); //ตั้งค่าให้ ดิจิตอล ขา 8 สถานะ มี ไฟ 5 โวลต์
Serial.begin(9600); //ตั้งค่าความเร็วในการรับ-ส่งข้อมูล ค่ามาตรฐาน คือ 9600
BTSerial.begin(9600); //ตั้งค่าความเร็วในการรับ-ส่งข้อมูล ค่ามาตรฐาน คือ 9600
delay(1000); //ตั้งค่าให้รอ 1 วินาที (1 Millisecond เท่ากับ 1/1000 ของวินาที)
Serial.println("Enter AT commands:"); //ให้แสดงคำที่อยู่ในเครื่องหมายคำพูด ""
} //สิ้นสุดการทำงานของฟังก์ชัน setup
void loop() //ฟังก์ชันส่วนนี้จะทำงานซ้ำ วนลูป ไปเรื่อยๆ
{ //เริ่มการทำงานของฟังก์ชัน loop
if (BTSerial.available()) //ถ้า BTSerial มีข้อมูลเข้ามา
Serial.write(BTSerial.read()); // พอร์ต Serial ส่งค่าที่รับจากพอร์ต BTSerial ออกมา
if (Serial.available()) //ถ้า Serial มีข้อมูลเข้ามา
BTSerial.write(Serial.read()); // พอร์ต BTSerial ส่งค่าที่รับจากพอร์ต Serial ออกมา
} //สิ้นสุดการทำงานของฟังก์ชัน loop แต่ให้กลับไปทำงานใหม่
เพิ่มเติมการเรียนรู้ ภาษา C
ประโยค if แบบง่าย
จากภาพ แสดงให้เห็นว่า ถ้า เงื่อนไขหรือค่าของนิพจน์ที่ตรวจสอบ เป็นจริง ก็จะเลือกกระทำชุดคำสั่งหนึ่งแล้วไปกระทำตามคำสั่งต่อไป แต่ถ้าค่าของนิพจน์ เป็นเท็จ ก็ไม่ทำ ชุดคำสั่งใด ๆ ในทางเลือกเลย แต่ให้ไปทำชุดประโยคคำสั่งต่อไป
ตัวอย่างตามโค้ดด้านบน เช่น
if (BTSerial.available()) //ถ้า BTSerial มีข้อมูลเข้ามา = จริง จะทำงานบรรทัดต่อไป , ถ้าไม่มี ก็จะ = เท็จ คือไม่ต้องทำงาน ให้ข้ามไป ครับ
สรุปการทำงานของ โปรแกรม นี้ คือ รับคำสั่ง AT-COMMAND จากช่องป้อนข้อมูล ของ Serial Monitor การทำงานจะเริ่มจากคำสั่งที่เขียน ไว้ในไฟล์ SoftwareSerial.h ร่วมกับ คำสั่งที่เราเขียนเพิ่มเข้าไป เพื่อตรวจสอบการทำงาน ของ Bluetooth แล้วส่งผลลัพธ์ กลับมาแสดงผลด้านล่าง ของช่องป้อนข้อมูล
AT-COMMAND คือ ชุดคำสั่งมาตรฐาน ที่สามารถใช้ติดต่อสื่อสารกับอุปกรณ์สื่อสารต่างๆ เช่น โมเด็ม หรือ อุปกรณ์ DTE (Data Terminal Equipment) เพื่อโต้ตอบตั้งค่าหรือสั่งงานอุปกรณ์เหล่านั้น ให้ทำงานตามที่ต้องการ
ต่อนะครับ เมื่อ Upload เสร็จ ให้เปิด Serial Monitor ขึ้นมา โดยไปที่ Tools -> Serial Monitor
ในช่อง Serial Monitor ทางขวาด้านล่างจะมีช่องค่า Baudrate เลือกค่าที่ถูกต้องในตามโปรแกรม ค่า ปกติเราจะใช้ค่า 9600 และเลือก Both NL & CR ดังรูป
พิมพ์ AT+ROLE? แล้วกด Send เพื่อตรวจสอบให้แน่ชัดว่าเป็น Slave Mode (โหมดรอรับคำสั่ง) ค่าที่แสดงออกมาจะเป็น +ROLE:0 ก็แสดงว่า HC-05 Bluetooth ของเรานั้น พร้อมใช้งานแล้วครับ
ถ้า HC-05 องเราพร้อมใช้งานแล้ว ลองเปิดบลูทูธ ที่ โทรศัพท์มือถือของเรา (ระบบปฏิบัติการ แอนดรอยด์) ก็จะพบ HC-05 ของเราทำงานอยู่
เมื่อเชื่อมต่อเข้าไป ถ้าเป็นครั้งแรก ก็จะถามรหัสผ่าน ให้ ใส่ 1234 -> ตกลง
หน้าจอก็จะแสดง HC-05 ของเรา เชื่อมต่อกับ โทรศัพท์มือถือของเรา สำเร็จ พร้อมที่จะรับคำสั่ง จาก Mobile App แอนดรอยด์ ต่อไป