Hướng dẫn thiết lập chi tiết cho module bluetooth - Cái nhìn sắc nét hơn về module Bluetooth

Mô tả dự án: 

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! ^^

lên
28 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Đôi điều về IMU (Inertial Measurement Unit) - Cảm biến góc quay + cảm biến gia tốc

Hầu như bất cứ ai trong chúng ta đều có trong tay một chiếc điện thoại smartphone (rất xin lỗi các bạn không dùng) và chắc cũng đã từng chơi qua những game đòi hỏi phải nghiêng và quay điện thoại (đặc biệt là đua xe). Vậy đã bao giờ bạn tự hỏi làm sao một chiếc điện thoại có thể biết khi nào nó bị nghiêng? Dĩ nhiên là không phải do nó thông minh rồi. Trên thực tế, bên trong một chiếc smartphone thường sẽ có một con chip nhỏ gọi là IMU (Inertial Measurement Unit) dùng để đo những chuyển động này. Trong bài viết dưới đây, mình sẽ giới thiệu tới các bạn những điều cơ bản về IMU. Ồ, và với những ai hứng thú, một module IMU loại thông thường có giá không hề đắt, các bạn có thể mua về và tự làm cho mình những dự án thật cool!

lên
23 thành viên đã đánh giá bài viết này hữu ích.