• Interfacing Bluetooth Module HC-06 with PIC Microcontroller - Giao tiếp Mô-đun Bluetooth HC-06 với Vi điều khiển PIC

QC

Interfacing Bluetooth Module HC-06 with PIC Microcontroller - Giao tiếp Mô-đun Bluetooth HC-06 với Vi điều khiển PIC

 



Trong hướng dẫn này, chúng ta sẽ tìm hiểu Cách thực hiện các dự án PIC không dây bằng cách kết nối Mô-đun Bluetooth (HC-06). Trong hướng dẫn trước, chúng ta đã học Cách sử dụng mô-đun USART trong Vi điều khiển PIC và thiết lập giao tiếp giữa PIC và Máy tính. Nếu bạn là người mới bắt đầu thì hãy xem tại đây để xem tất cả các Hướng dẫn PIC của chúng tôi, nơi chúng tôi đã bắt đầu từ đầu, như học MPLAB và XC8, giao tiếp LED, LCD, sử dụng Bộ hẹn giờ, ADC, PWM, v.v.


Ở đây, chúng tôi đã sử dụng mô-đun Bluetooth phổ biến HC-06. Sử dụng mô-đun này, chúng tôi có thể nhận và gửi thông tin không dây từ MCU PIC của chúng tôi tới một ứng dụng di động hoặc máy tính. Giao tiếp giữa PIC và HC-06 được thiết lập bằng cách sử dụng mô-đun USART có trong Vi điều khiển PIC. Bạn cũng có thể sử dụng HC-05. Chúng tôi lại hoạt động trên cùng một chế độ 8-bit Không đồng bộ, nhưng lần này chúng tôi sẽ sửa đổi mã của mình một chút để nó hoạt động với mô-đun Bluetooth. Do đó, học trước hướng dẫn của UART là một lợi thế bổ sung cho dự án này.


Trong hướng dẫn này, chúng tôi sẽ bật tắt đèn LED bằng cách gửi lệnh bật hoặc tắt từ điện thoại thông minh của chúng tôi. Chúng tôi sẽ sử dụng một ứng dụng Android có tên Bluetooth Terminal có thể gửi và nhận dữ liệu qua Bluetooth. Nếu chúng tôi gửi biểu tượng ‘1’ từ ứng dụng, đèn sẽ được BẬT trong bảng PIC và chúng tôi sẽ nhận được xác nhận trở lại điện thoại rằng đèn đã được bật. Tương tự, chúng ta có thể gửi ‘0’ từ điện thoại để tắt nó đi. Bằng cách này, chúng ta có thể điều khiển đèn LED trên bo mạch PIC của mình, tương tự như hướng dẫn UART nhưng bây giờ không dây. Chương trình hoàn chỉnh và Video chi tiết được đưa ra ở cuối hướng dẫn này.


Sơ đồ khối cơ bản để thiết lập được hiển thị bên dưới.


Requirements:

Hardware:

  • PIC16F877A Perf Board
  • HC-05 or HC-06 Bluetooth Module
  • Computer (for programming )
  • Mobile Phone
  • PICkit 3 Programmer

Software:

  • MPLABX
  • Bluetooth Terminal (Mobile Application)

Mô-đun Bluetooth HC-06:


Bluetooth có thể hoạt động ở hai chế độ sau:


Chế độ lệnh

Chế độ hoạt động

Trong Chế độ lệnh, chúng tôi sẽ có thể định cấu hình các thuộc tính Bluetooth như tên của tín hiệu Bluetooth, mật khẩu của nó, tốc độ truyền hoạt động, v.v. Chế độ Điều hành là chế độ mà chúng tôi có thể gửi và nhận dữ liệu giữa Vi điều khiển PIC và mô-đun Bluetooth. Do đó, trong hướng dẫn này, chúng tôi sẽ chỉ đùa giỡn với Chế độ điều hành. Chế độ Lệnh sẽ được để ở cài đặt mặc định. Tên Thiết bị sẽ là HC-05 (Tôi đang sử dụng HC-06) và mật khẩu sẽ là 0000 hoặc 1234 và quan trọng nhất là tốc độ truyền mặc định cho tất cả các mô-đun Bluetooth sẽ là 9600.



Mô-đun hoạt động trên nguồn cung cấp 5V và các chân tín hiệu hoạt động trên 3.3V, do đó, bộ điều chỉnh 3.3V có trong chính mô-đun. Do đó chúng ta không cần phải lo lắng về điều đó. Trong số sáu chân chỉ có bốn chân sẽ được sử dụng trong Chế độ vận hành. Bảng kết nối pin được hiển thị bên dưới

S.NoPin on HC-05/HC-06Pin name on MCUPin number in PIC
1VccVdd31st pin
2VccGnd32nd pin
3TxRC6/Tx/CK25th pin
4RxRC7/Rx/DT26th pin
5StateNCNC
6EN (Enable)NCNC


Programming PIC Microcontroller for Bluetooth Communication:

Giống như tất cả các mô-đun (ADC, Bộ hẹn giờ, PWM), chúng ta cũng nên khởi tạo mô-đun Bluetooth của mình. Quá trình khởi tạo sẽ tương tự như khởi tạo UART nhưng chúng tôi cần thực hiện một số thay đổi để Bluetooth hoạt động hoàn hảo với MCU PIC16F877A của chúng tôi. Hãy xác định các bit cấu hình và bắt đầu với chức năng khởi tạo Bluetooth.


Khởi tạo Bluetooth:


Hầu hết tất cả các mô-đun Bluetooth trên thị trường đều hoạt động ở tốc độ truyền là 9600, điều rất quan trọng là phải đặt tốc độ truyền của bạn giống như tốc độ truyền của mô-đun Bluetooth hoạt động, ở đây chúng tôi đặt SPBRG = 129 vì chúng tôi đang hoạt động ở tần số xung nhịp 20Mhz với 9600 dưới dạng tốc độ truyền. Do đó, quá trình khởi tạo trên sẽ chỉ hoạt động đối với các mô-đun Bluetooth hoạt động ở tốc độ truyền 9600. Cũng bắt buộc phải bật BRGH bit tốc độ truyền tốc độ cao. Điều này sẽ giúp thiết lập tốc độ truyền chính xác.

//******Initialize Bluetooth using USART********//
void Initialize_Bluetooth()
{
   //Set the pins of RX and TX//
    TRISC6=1;
    TRISC7=1;
    
  //Set the baud rate using the look up table in datasheet(pg114)//
    BRGH=1;      //Always use high speed baud rate with Bluetooth else it wont work
    SPBRG  =129;
    
    //Turn on Asyc. Serial Port//
    SYNC=0;
    SPEN=1;
    
    //Set 8-bit reception and transmission
    RX9=0;
    TX9=0;

   //Enable transmission and reception//
    TXEN=1; 
    CREN=1; 
    
    //Enable global and ph. interrupts//
    GIE = 1;
    PEIE= 1;
  
    //Enable interrupts for Tx. and Rx.//
    RCIE=1;
    TXIE=1;
}
//___________BT initialized_____________//

Nếu bạn có mô-đun BT hoạt động ở tốc độ truyền khác, thì bạn có thể tham khảo bảng tra cứu bên dưới để tìm ra giá trị của bạn cho SPBRG.





Tải dữ liệu vào Bluetooth:


Sau khi chức năng được khởi tạo, chúng tôi có ba chức năng trong chương trình của mình để gửi và nhận dữ liệu từ Bluetooth. Không giống như UART, chúng tôi có một số điều cần xem xét ở đây trước khi chúng tôi có thể truyền hoặc nhận dữ liệu. Mô-đun Bluetooth có bộ đệm Truyền và Nhận bên trong nó, dữ liệu được gửi đến nó sẽ được lưu trữ trong bộ đệm Tx. Dữ liệu này sẽ không được phát (gửi trực tuyến) trừ khi một dấu xuống dòng được gửi đến mô-đun. Do đó, để truyền dữ liệu, chúng ta phải tải bộ đệm Rx của BT và sau đó phát nó bằng cách sử dụng ký tự xuống dòng.


Công việc trên có thể dễ dàng đạt được bằng cách sử dụng các chức năng sau. Hàm dưới đây có thể được sử dụng khi chúng ta chỉ phải tải một ký tự vào bộ đệm Rx. Chúng tôi tải dữ liệu vào thanh ghi TXREG và đợi cho đến khi nó được xử lý bằng cách kiểm tra trên cờ TXIF và TRMT bằng cách sử dụng các vòng lặp while.

//Function to load the Bluetooth Rx. buffer with one char.//
void BT_load_char(char byte)  
{
    TXREG = byte;
    while(!TXIF);  
    while(!TRMT);
}
//End of function//


Chức năng dưới đây được sử dụng để tải một chuỗi vào bộ đệm Rx của mô-đun Bluetooth. Chuỗi được chia thành các ký tự và mỗi ký tự được gửi đến hàm BT_load_char ().

//Function to Load Bluetooth Rx. buffer with string//
void BT_load_string(char* string)
{
    while(*string)
    BT_load_char(*string++);
}
//End of function/

Truyền dữ liệu qua Bluetooth:


Cho đến bây giờ chúng tôi mới truyền thông tin vào bộ đệm Rx của mô-đun HC-05. Bây giờ chúng ta phải hướng dẫn nó phát dữ liệu qua mạng bằng cách sử dụng chức năng này.

//Function to broadcast data from RX. buffer//
void broadcast_BT()
{
  TXREG = 13;  
  __delay_ms(500);
}
//End of function//

Trong chức năng này, chúng tôi gửi một giá trị 13 vào thanh ghi TXREG. Giá trị 13 này không là gì ngoài giá trị thập phân tương đương cho dòng xuống (tham khảo biểu đồ ASCII). Sau đó, một độ trễ nhỏ được tạo ra để chương trình phát sóng bắt đầu.


Đọc dữ liệu từ Bluetooth:


Tương tự như UART, chức năng dưới đây được sử dụng để đọc dữ liệu từ Bluetooth

//Function to get a char from Rx.buffer of BT//
char BT_get_char(void)   
{
    if(OERR) // check for over run error 
    {
        CREN = 0;
        CREN = 1; //Reset CREN
    }
    
    if(RCIF==1) //if the user has sent a char return the char (ASCII value)
    {
    while(!RCIF);  
    return RCREG;
    }
    else //if user has sent no message return 0
        return 0;
}
//End of function/


Nếu người dùng đã gửi một dữ liệu, hàm này sẽ trả về dữ liệu cụ thể đó có thể được lưu trong một biến và được xử lý. Nếu người dùng chưa gửi bất cứ thứ gì, hàm sẽ trả về số không.


Chức năng chính:


Chúng tôi đã sử dụng tất cả các hàm được giải thích ở trên bên trong hoặc hàm chính. Chúng tôi gửi một số thông báo giới thiệu và sau đó đợi người dùng gửi một số giá trị dựa trên đó chúng tôi chuyển đổi đèn LED ĐỎ được kết nối với chân RB3 trên bảng Perf của chúng tôi.


void main(void)
{
    //Scope variable declarations//
    int get_value;
    //End of variable declaration//
   
    //I/O Declarations//
    TRISB3=0;
    //End of I/O declaration//
   
   Initialize_Bluetooth(); //lets get our bluetooth ready for action
    
   //Show some introductory message once on power up//
   BT_load_string("Bluetooth Initialized and Ready");
   broadcast_BT();
   BT_load_string("Press 1 to turn ON LED");
   broadcast_BT();
   BT_load_string("Press 0 to turn OFF LED");
   broadcast_BT();
   //End of message//
    
    while(1) //The infinite lop
    {   
        
    get_value = BT_get_char(); //Read the char. received via BT
    
    //If we receive a '0'//
        if (get_value=='0')
          {
             RB3=0; 
             BT_load_string("LED turned OFF");
             broadcast_BT();
          }
       
    //If we receive a '1'//   
        if (get_value=='1')
          {
             RB3=1;
             BT_load_string("LED turned ON");
             broadcast_BT();
          }      
    }
}

Circuit Diagram and Hardware Setup:

Kết nối mạch cho dự án này rất đơn giản, chúng ta chỉ cần cấp nguồn cho mô-đun Bluetooth và kết nối Tx với chân thứ 26 của PIC và Rx với chân thứ 25 của PIC như được hiển thị trong sơ đồ mạch bên dưới:




Bây giờ chúng ta hãy tiến hành phần cứng. Sau khi kết nối được thực hiện, nó sẽ trông giống như thế này.



Điều khiển đèn LED bằng Ứng dụng di động Bluetooth:

Bây giờ hãy để chúng tôi chuẩn bị ứng dụng Android của chúng tôi. Tải xuống ứng dụng có tên Bluetooth Terminal từ App store hoặc sử dụng liên kết này. Sau khi ứng dụng được tải xuống và cài đặt, hãy bật bảng hiệu suất PIC của bạn mà chúng tôi đang sử dụng kể từ đầu. Đèn LED nhỏ trên Mô-đun Bluetooth của bạn sẽ nhấp nháy để cho biết rằng nó đã được bật nguồn và đang tích cực tìm kiếm điện thoại để thiết lập kết nối.


Bây giờ, hãy vào Cài đặt Bluetooth của điện thoại và tìm kiếm thiết bị Bluetooth mới, bạn sẽ có thể thấy tên HC-05 hoặc HC-06 dựa trên mô-đun của bạn. Tôi đang sử dụng HC-06 do đó điện thoại của tôi hiển thị màn hình sau. Sau đó, hãy thử ghép nối với nó và nó sẽ yêu cầu mật khẩu. Nhập mật khẩu là 1234 (đối với một số có thể là 0000) và bấm OK như hình bên dưới.




Sau khi phân tích cú pháp thành công, hãy mở ứng dụng Bluetooth Terminal mà chúng ta vừa cài đặt. Vào tùy chọn cài đặt và chọn “Kết nối thiết bị - Bảo mật” như hình dưới đây. Thao tác này sẽ mở ra một hộp bật lên, nơi tất cả các thiết bị được ghép nối của chúng tôi sẽ được liệt kê như hình dưới đây. Chọn mô-đun HC-05 hoặc HC-06.




Sau khi kết nối được thiết lập, đèn trên mô-đun Bluetooth nhấp nháy cho đến nay phải không đổi để cho biết rằng nó đã kết nối thành công với điện thoại di động của bạn. Và chúng tôi sẽ nhận được thông báo giới thiệu từ Chương trình của chúng tôi như hình dưới đây.


Bây giờ nhấn ‘1’ để bật đèn LED và nhấn ‘0’ để tắt đèn. Quá trình làm việc hoàn chỉnh sẽ được hiển thị trong Video. Màn hình điện thoại di động của bạn sẽ trông giống như hình bên dưới.



// CONFIG
#pragma config FOSC = HS       // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF       // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = OFF        // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = OFF        // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
//End of CONFIG registers

#define _XTAL_FREQ 20000000
#include<xc.h>

//******Initialize Bluetooth using USART********//
void Initialize_Bluetooth()
{
   //Set the pins of RX and TX//
    TRISC6=1;
    TRISC7=1;
    
  //Set the baud rate using the look up table in datasheet(pg114)//
    BRGH=1;      //Always use high speed baud rate with Bluetooth else it wont work
    SPBRG  =129;
    
    //Turn on Asyc. Serial Port//
    SYNC=0;
    SPEN=1;
    
    //Set 8-bit reception and transmission
    RX9=0;
    TX9=0;

   //Enable transmission and reception//
    TXEN=1; 
    CREN=1; 
    
    //Enable global and ph. interrupts//
    GIE = 1;
    PEIE= 1;
  
    //Enable interrupts for Tx. and Rx.//
    RCIE=1;
    TXIE=1;
}
//___________BT initialized_____________//

//Function to load the Bluetooth Rx. buffer with one char.//
void BT_load_char(char byte)  
{
    TXREG = byte;
    while(!TXIF);  
    while(!TRMT);
}
//End of function//

//Function to Load Bluetooth Rx. buffer with string//
void BT_load_string(char* string)
{
    while(*string)
    BT_load_char(*string++);
}
//End of function//

//Function to broadcast data from RX. buffer//
void broadcast_BT()
{
  TXREG = 13;  
  __delay_ms(500);
}
//End of function//

//Function to get a char from Rx.buffer of BT//
char BT_get_char(void)   
{
    if(OERR) // check for over run error 
    {
        CREN = 0;
        CREN = 1; //Reset CREN
    }
    
    if(RCIF==1) //if the user has sent a char return the char (ASCII value)
    {
    while(!RCIF);  
    return RCREG;
    }
    else //if user has sent no message return 0
        return 0;
}
//End of function/

void main(void)
{
    //Scope variable declarations//
    int get_value;
    //End of variable declaration//
   
    //I/O Declarations//
    TRISB3=0;
    //End of I/O declaration//
   
   Initialize_Bluetooth(); //lets get our bluetooth ready for action
    
   //Show some introductory message once on power up//
   BT_load_string("Bluetooth Initialized and Ready");
   broadcast_BT();
   BT_load_string("Press 1 to turn ON LED");
   broadcast_BT();
   BT_load_string("Press 0 to turn OFF LED");
   broadcast_BT();
   //End of message//
    
    while(1) //The infinite lop
    {   
        
    get_value = BT_get_char(); //Read the char. received via BT
    
    //If we receive a '0'//
        if (get_value=='0')
          {
             RB3=0; 
             BT_load_string("LED turned OFF");
             broadcast_BT();
          }
       
    //If we receive a '1'//   
        if (get_value=='1')
          {
             RB3=1;
             BT_load_string("LED turned ON");
             broadcast_BT();
          }      
    }
}


Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...