Phan Vu Hoang gửi vào
- 86617 lượt xem
Module bluetooth đã và đang là một lựa chọn hiệu quả cho việc phát triển những dự án điều khiển và giao tiếp từ xa. Tuy nhiên, việc thiết lập một module bluetooth cho đúng nhu cầu đôi khi lại khá khó khăn, vậy nên hy vọng bài viết sau đây sẽ phần nào có ích cho những ai mới bước đầu tìm hiểu về module bluetooth.
Chuẩn bị
Hiển nhiên là bạn sẽ cần một module bluetooth, trong bài viết này mình sẽ sử dụng module HC-06. Hầu hết các module khác sẽ có cách hoạt động tương tự.
Tiếp theo, các bạn sẽ cần một thiết bị để giao tiếp với module này, vì HC-06 giao tiếp qua phương thức serial (Tx, Rx) nên chúng ta có hai lựa chọn: dùng một microcontroller (ví dụ Arduino) hoặc một thiết bị chuyển tín hiệu từ USB sang TTL (ví dụ PL2303).
Giao tiếp qua Arduino
Phần đông chúng ta hẳn sẽ không có sẵn một module USB-to-TTL trong tay, vậy thì cách đơn giản hơn là sử dụng Arduino để giao tiếp với module bluetooth thông qua cổng serial. Chúng ta hãy cùng xem cách làm!
Kết nối:
Module HC-06 có 4 chân, chúng ta sẽ kết nối với Arduino theo bảng sau:
HC-06 pin | Arduino pin |
Vcc | 5V |
GND | GND |
Tx | 6 |
Rx | 7 |
Lưu ý quan trọng:
- Tx và Rx của HC-06 có thể kết nối với hầu hết các digital pins của Arduino, không nhất thiết phải dùng pin 6 và pin 7 như trong bảng trên. Tuy nhiên, trong một số bài hướng dẫn, các bạn sẽ thấy Tx được nối vào pin 0 (tức Arduino Rx) và Rx được nối vào pin 1 (tức Arduino Tx). Điều này là rất không nên, bởi lẽ với một số phiên bản Arduino, Rx và Tx được nối với cổng USB hoặc một số chức năng khác, và thường sẽ khiến cho việc upload code xảy ra lỗi.
- Trên một số module HC-06, Tx và Rx sử dụng tín hiệu 3.3V, trong khi cổng tín hiệu của Arduino thường là 5V, hãy lưu ý điều này trước khi bạn cắm nguồn. Một mạch chia điện thế đơn giản có thể giải quyết vấn đề này.
Cùng code nào:
Các bạn có thể load sketch sau vào Arduino và chạy thử, mình sẽ giải thích code dưới đây:
#include <SoftwareSerial.h> #define TX_PIN 7 #define RX_PIN 6 SoftwareSerial bluetooth(RX_PIN, TX_PIN); int baudRate[] = {300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200}; void setup() { Serial.begin(9600); while (!Serial) {} Serial.println("Configuring, please wait..."); for (int i = 0 ; i < 9 ; i++) { bluetooth.begin(baudRate[i]); String cmd = "AT+BAUD4"; bluetooth.print(cmd); bluetooth.flush(); delay(100); } bluetooth.begin(9600); Serial.println("Config done"); while (!bluetooth) {} Serial.println("Enter AT commands:"); } void loop() { if (bluetooth.available()) { Serial.write(bluetooth.read()); } if (Serial.available()) { bluetooth.write(Serial.read()); } }
Đoạn code này nghĩa là sao vậy???
Trước hết, hãy cùng làm quen với thư viện SoftwareSerial, nó cho phép ta sử dụng bất cứ cổng digital nào của Arduino để giao tiếp theo phương thức serial. Hãy đọc để biết thêm chi tiết: https://www.arduino.cc/en/Reference/SoftwareSerial
Tiếp theo, để có thể giao tiếp, chúng ta phải đồng bộ tốc độ giao tiếp (baud rate) giữa Arduino và bluetooth module. Thường thì ta sẽ sử dụng baud rate = 9600 bps (bits per second), và cấu hình mặc định của hầu hết các module bluetooth cũng vậy. Tuy nhiên, hãy hình dung nếu bạn nhận được một con HC-06 từ ai đó, và họ đã thiết lập lại tốc độ truyền tín hiệu mà bạn không biết, làm sao bạn có thể giao tiếp với nó được đây? Mình có một trick nho nhỏ cho vấn đề này, đó chính là vòng lặp for ở đầu chương trình, chúng ta sẽ quét qua mọi tốc độ có thể, và gửi một lệnh AT+BAUD4 tương ứng với việc thiết lập lại tốc độ ở 9600bps (lưu ý rằng câu lệnh có thể khác nhau tùy theo module). Nhờ thế, sau khi kết thúc vòng lặp, module sẽ được thiết lập lại về tốc độ ban đầu.
Cuối cùng, làm sao để gửi câu lệnh? Rất đơn giản, ở đoạn code trên, mình đã sử dụng cách nhập câu lệnh bằng tay thông qua Serial Monitor của Arduino IDE (đó đó cái hình kính lúp bên góc trên bên phải đó). Bất cứ câu lệnh nào bạn gõ vào sẽ được chuyển qua USB đến Arduino và được copy từ Arduino tới HC-06, sau đó HC-06 sẽ trả lời lại và cũng được Arduino copy tới cổng USB tới chúng ta. Đây cũng là một lý do nữa để không cắm trực tiếp TxRx của bluetooth module vào TxRx của Arduino, bạn đoán ra chưa? Chúng ta cần TxRx của Arduino để có thể nhập câu lệnh bằng tay. Tất nhiên bạn có thể nhập lệnh thẳng trực tiếp qua sketch Arduino, ví dụ: bluetooth.print("AT+BAUD4"), nhưng cá nhân mình thấy để thiết lập ban đầu thì nhập lệnh bằng tay sẽ hiệu quả hơn nhiều.
Nếu câu lệnh của các bạn được nhập đúng, HC-06 sẽ trả lời và thông tin sẽ được hiện trực tiếp trên của sổ Serial Monitor. Tiếp sau đây, mình sẽ giới thiệu một số câu lệnh AT thông dụng.
Một số câu lệnh AT thông dụng
Nhiều bluetooth module thông dụng sử dụng câu lệnh AT để thiết lập (tất nhiên có một số module sẽ có câu lệnh khác, nhưng cách thức hoạt động thường là như nhau). Câu lệnh AT sẽ được gửi đi theo cú pháp AT+[command][param] và nếu câu lệnh chính xác, module sẽ trả lời theo cấu trúc OK[something]. Sau đây là một số câu lệnh thông dụng nhất (list đầy đủ hơn có thể được tìm thấy dễ dàng trên internet):
Lệnh | Trả lời | Hiệu ứng | Lưu ý |
AT | OK | Kiểm tra kết nối | Không đổi |
AT+VERSION | OKlinvorV1.6 | Kiểm tra phiên bản | Thay đổi tùy module |
AT+BAUD4 | OK9600 | Thiết lập tốc độ thành 9600 | Có thể thay 4 thành 1-7 |
AT+PIN0000 | OKsetPIN | Thiết lập pin code thành 0000 | Có thể thay đổi tùy ý |
AT+NAMExyz | OKsetname | Thay đổi tên thành xyz | Có thể thay đổi tùy ý |
Bạn không muốn dùng Arduino?
Nếu không muốn dùng Arduino và bạn có sẵn trong tay một module USB-to-TTL, đơn giản bạn chỉ cần kết nối chúng lại với máy tính và dùng một phần mềm như Putty hoặc Smartty để nhập câu lệnh trực tiếp qua cổng USB. Hoặc nếu muốn tiến xa hơn, các bạn có thể tham khảo dự án của mình tại đây, mình dùng một chương trình java để gửi và nhận lệnh từ bluetooth module qua cổng serial (cũng là một cách tốt để học thêm về java): https://github.com/Ventilateur/BluetoothConfiguration
Những lưu ý cần nhớ
- Không nên kết nối trực tiếp bluetooth vào cổng Tx Rx mặc định của Arduino. Tuy nhiên nếu các bạn có một con Arduino Mega hoặc bất cứ microcontroller nào có nhiều hơn một cổng serial (mình hiện tại đang dùng một con Teensy 3.2), các bạn có thể dùng nó.
- Để ý cổng tín hiệu Tx Rx của module dùng 3.3V hay 5V.
- Tx pin của module phải nối vào pin mà các bạn chọn làm Rx với SoftwareSerial, và ngược lại, Rx của module nối vào Tx. Thực ra điều này rất logic vì khi module gửi (Tx) thì Arduino phải nhận (Rx) và ngược lại.
- SoftwareSerial không chạy tốt lắm ở tốc độ cao, 9600bps - 57600bps là ổn, dù sao module HC-06 cũng chỉ chạy ở cao nhất là 57600bps.
- Nếu bạn gửi lệnh qua sketch Arduino, nên để một chút thời gian chờ giữa các câu lệnh, hãy dùng lệnh delay() vì đôi khi chúng ta có thể gặp phải những module phản ứng hơi chậm.
Kết luận
Voila voila! Vậy là các bạn đã biết làm thế nào để thiết lập một module bluetooth rồi! Hy vọng sau bài viết này các bạn sẽ có thể thiết lập bluetooth một cách đúng đắn. Mọi ý kiến đóng góp đều được hoan nghênh, nếu có bất cứ vấn đề gì hãy gửi mail cho mình hoặc comment bên dưới, cảm ơn các bạn đã đọc bài! ^^