Trong bài viết này, chúng ta hãy thảo luận về cách giao tiếp mô-đun WIFI ESP8266 với vi điều khiển PIC. Cho đến nay, bạn có thể đang sử dụng mô-đun ESP8266 như một bộ vi điều khiển độc lập hoặc có thể đã sử dụng nó với thư viện Arduino. Tuy nhiên, khi nói đến các dự án hệ thống nhúng nặng, chúng ta cũng nên biết cách sử dụng nó với vi điều khiển PIC. Điều này sẽ giúp bạn tùy chỉnh các dự án của mình trong quan điểm thiết kế và đồng thời cũng làm cho nó rẻ.
Các mô-đun ESP8266 đi kèm với một phần sụn mặc định được tải vào nó, do đó chúng tôi có thể lập trình mô-đun bằng các lệnh AT. Các lệnh này phải được gửi qua một kênh liên lạc nối tiếp. Kênh này được thiết lập giữa PIC và mô-đun ESP8266 bằng cách sử dụng mô-đun USART trong vi điều khiển PIC. Toàn bộ quá trình làm việc sẽ được theo dõi và báo cáo cho người dùng bằng màn hình LCD 16x2. Do đó, hướng dẫn này giả định rằng bạn có một số kiến thức cơ bản về mô-đun USART trong PIC, Giao diện LCD với PIC và sử dụng lệnh AT trong ESP8266. Nếu không, bạn có thể quay lại các hướng dẫn được liên kết để tìm hiểu chúng trước.
Materials Required:
You would need the following hardware to complete this tutorial
- PIC16F877A
- 20MHz crystal oscillator
- 7805
- LM317
- ESP8266
- 16*2 LCD display
- PicKit3 programmer
- Resistors (1K,220ohm,360ohm)
- Capacitors (1uF, 0.1uF, 33pF)
- Jumper wires
- 12V Adapter to power the PIC and ESP module
Hardware:
Sơ đồ hoàn chỉnh của dự án được hiển thị ở đây bên dưới
Các sơ đồ bao gồm hai mạch điều chỉnh điện áp, một là mạch điều chỉnh + 5V được sử dụng để cấp nguồn cho vi điều khiển PIC và mạch còn lại là mạch điều chỉnh 3.3V cấp nguồn cho mô-đun ESP8266. + 5V được điều chỉnh bằng cách sử dụng 7805 (IC điều chỉnh điện áp tuyến tính). 3.3V được điều chỉnh bằng cách sử dụng LM317 (Bộ điều chỉnh điện áp biến đổi). Mô-đun ESP8266 tiêu thụ rất nhiều dòng điện (~ 800mA) do đó nếu bạn đang thiết kế bộ nguồn của riêng mình, hãy đảm bảo rằng nó có thể tạo ra dòng điện cao như vậy. Đồng thời đảm bảo rằng các chân nối đất của PIC và mô-đun ESP8266 được kết nối với nhau.
Vì vậy, bây giờ chúng ta biết rằng PIC hoạt động trên + 5V và ESP8266 hoạt động ở 3,3V volt. Để thiết lập giao tiếp USART giữa hai module này, chúng ta cần có một mạch chuyển đổi logic 5V - 3.3V như hình trên. Mạch này không có gì khác ngoài một bộ chia tiềm năng chỉ đơn giản là chuyển đổi nguồn + 5V thành 3,3V. Điều này sẽ ngăn chân RX có thể chịu được 3.3V của ESP8266 nhận được + 5V.
Tôi đã tạo các mô-đun PIC và ESP trên hai bảng hiệu suất riêng biệt, như được hiển thị trong các hướng dẫn này. Bằng cách này, tôi có thể sử dụng chúng trên toàn cầu cho nhiều dự án tương tự hơn
Phần cứng LED sử dụng PIC
Bắt đầu với ESP8266
Bạn có thể làm theo cách tương tự, hoặc xây dựng bảng mạch của riêng bạn theo phong cách của bạn hoặc chỉ cần kết nối mạch trên với bảng mạch.
Lập trình vi điều khiển PIC:
Để lập trình vi điều khiển PIC gửi “lệnh AT” nối tiếp bằng USART đến mô-đun ESP8266, chúng ta phải sử dụng một thư viện. Thư viện này sẽ giúp bạn tiết kiệm rất nhiều rắc rối, chẳng hạn như sử dụng mô-đun lệnh ESP8266 để kiểm tra từng lệnh AT và sau đó tìm cách truyền chúng đến mô-đun ESP. Thư viện này là phần mềm miễn phí ban đầu được phát triển bởi Camil Staps và sau đó nó đã được Circuit Digest cải tiến và sửa đổi để có thể sử dụng với Vi điều khiển PIC16F877A của chúng tôi. Bạn có thể tải về tại đây
Thư viện vẫn đang được phát triển, nhưng bạn có thể sử dụng hầu hết các lệnh AT quan trọng trong phần sụn ESP8266. Nếu bạn thấy thiếu bất kỳ lệnh nào bạn cần, hãy cho tôi biết trong phần bình luận và tôi sẽ cố gắng bổ sung cho bạn. Hướng dẫn này sẽ giải thích cho bạn tất cả các lệnh (cho đến nay) có thể được sử dụng thông qua thư viện này. Hơn nữa cũng sẽ hướng dẫn bạn thêm các chức năng của riêng bạn vào thư viện.
Các chức năng trong Thư viện ESP8266:
Initialize_ESP8266 (): Hàm này sẽ Khởi tạo mô-đun USART của PIC để giao tiếp với mô-đun ESP8266. Nó đặt tốc độ truyền ở 115200 và chuẩn bị chân Rx và Tx của PIC cho giao tiếp USART.
_esp8266_putch (): Hàm này được sử dụng để gửi một ký tự nối tiếp đến mô-đun ESP8266. Ví dụ: _esp8266_putch (‘a’) sẽ gửi một ký tự nối tiếp tới ESPmodule.
_esp8266_getch (): Hàm này được sử dụng để lấy một ký tự từ mô-đun ESP. Ví dụ: nếu ESP đang in “OK” và chúng tôi sử dụng char a = _esp8266_getch (). Khi đó char ‘o’ sẽ được lưu trong biến a.
ESP8266_send_string (): Hàm này là phiên bản chuỗi của _esp8266_putch (). Nó có thể gửi một chuỗi hoàn chỉnh đến mô-đun ESP8266. Ví dụ: ESP8266_send_string (“AT / r / n”) sẽ gửi lệnh “AT” đến mô-đun ESP8266.
esp8266_isStarted (): Nó được sử dụng để kiểm tra xem PIC có thể giao tiếp với mô-đun ESP hay không. Nó gửi lệnh “AT” và đợi “OK” nếu nhận được nó trả về true, nếu không nó sẽ trả về false.
esp8266_restart (): Đặt lại mô-đun ESP8266 và trả về true là đặt lại thành công và trả về false nếu không thành công.
esp8266_mode (): Được sử dụng để đặt chế độ làm việc của mô-đun ESP8266. Như chúng ta biết, nó có thể hoạt động ở ba chế độ khác nhau.
esp8266_mode(1): | Station mode |
esp8266_mode(2): | Soft AP mode |
esp8266_mode(3): | Both Station and AP mode |
esp8266_connect (): Cho phép bạn kết nối với tín hiệu wifi. Ví dụ: esp8266_connect (“home”, ”12345678”), sẽ cho phép mô-đun của bạn kết nối với tín hiệu wifi có tên home có mật khẩu là 12345678.
esp8266_disconnect (): Chức năng này ngắt kết nối mô-đun của bạn khỏi bất kỳ kết nối wifi nào đã được kết nối trước đó
esp8266_ip (): Lấy địa chỉ IP và trả về. Sử dụng chức năng này nếu bạn muốn biết địa chỉ IP của mô-đun ESP8266.
esp8266_start (): Hàm này được sử dụng để bắt đầu giao tiếp TCP hoặc UDP. Ví dụ esp8266_start ("TCP", "192.168.101.110", 80). Sẽ khởi động mạng TCP trong IP và cổng 80 đó.
esp8266_send (): Hàm này được sử dụng để gửi thông tin đến mạng TCP / UDP. Tập lệnh HTML sẽ được gửi bằng lệnh này. Sau đó, tập lệnh này sẽ xuất hiện trong địa chỉ IP mà giao tiếp đã được thiết lập trước đó.
esp8266_config_softAP (): Hàm này được sử dụng để cấu hình softAP. Ví dụ esp8266_config_softAP (“office”, ”12345678”); sẽ tạo tín hiệu Wifi có tên office và mật khẩu 12345678 sẽ được sử dụng để truy cập.
esp8266_get_stationIP (): Hàm này sẽ trả về cho bạn địa chỉ IP / MAC của các máy khách được kết nối với softAP của bạn.
Sample Program:
Bây giờ chúng ta đã hiểu các chức năng của từng lệnh trong thư viện, chúng ta hãy xem xét một chương trình mẫu nhỏ. Trong chương trình này, chúng tôi sẽ kiểm tra xem kết nối giữa ESP8266 và PIC có thành công hay không và sau đó tạo mạng WIFI (SoftAP) với tên và mật khẩu ưa thích. Chương trình hoàn chỉnh và mô phỏng tương tự sẽ được giải thích cho bạn hiểu.
Một lần nữa nếu bạn chưa đọc hướng dẫn về giao diện PIC với LCD và PIC USART của chúng tôi, vui lòng đọc trước khi tiếp tục vì chỉ khi đó nó mới có ý nghĩa đối với bạn.
Vì chúng tôi chỉ mới bắt đầu giao tiếp PIC với ESP8266, tôi đã sử dụng màn hình LCD để đảm bảo mọi thứ hoạt động bình thường.
do { Lcd_Set_Cursor(1,1); Lcd_Print_String("ESP not found"); }while (!esp8266_isStarted()); //wait till the ESP send back "OK" Lcd_Set_Cursor(1,1); Lcd_Print_String("ESP is connected"); __delay_ms(1500); Lcd_Clear();
Khi chúng tôi gửi “AT” đến mô-đun ESP8266, nó sẽ trả lời lại bằng “OK”. Điều này đảm bảo rằng mô-đun ESP8266 được kết nối thành công. Hàm esp8266_isStarted () được sử dụng tương tự. Chúng tôi gửi tín hiệu AT từ PIC và chúng tôi đợi cho đến khi mô-đun ESP hoạt động trở lại và gửi cho chúng tôi một đồng ý. Nếu chúng tôi nhận được đồng ý, chúng tôi hiển thị rằng "ESP đã được kết nối" trên màn hình LCD.
esp8266_mode(2); Lcd_Set_Cursor(1,1); Lcd_Print_String("ESP set as AP"); __delay_ms(1500); Lcd_Clear();
Các dòng mã trên được sử dụng để đặt mô-đun ESP hoạt động ở chế độ “AP mềm”. Hàm esp8266_mode (2); gửi lệnh AT “AT + CWMODE = 3” đến mô-đun và đợi mô-đun phản hồi bằng “OK”
/*Configure the AP name and Password*/ esp8266_config_softAP("CircuitDigest","619007123"); Lcd_Set_Cursor(1,1); Lcd_Print_String("AP configured"); __delay_ms(1500); Lcd_Clear(); /*AP configured*/
Đoạn mã này được sử dụng để định cấu hình softAP. Ở đây chúng tôi đã đặt tên SSID là “CircuitDigest” và mật khẩu là “619007123”. Để cho biết rằng quá trình đã hoàn tất, chúng tôi sẽ đợi mô-đun phản hồi bằng “OK” và sau đó in AP được cấu hình lên màn hình LCD.
Đó là bây giờ chúng tôi đã giao tiếp mô-đun ESP8266 với PIC MCU và đã cấu hình softAP với tên và mật khẩu mà chúng tôi chọn. Như thường lệ, hãy mô phỏng mã này và xem nó hoạt động như thế nào.
Simulation output:
Adding functions to the ESP8266 Library:
#define _XTAL_FREQ 20000000
#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7
#include <xc.h>
#include "esp8266_functions.h"
#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 = ON // 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)
//****LCD Functions Developed by Circuit Digest.***///
void Lcd_SetBit(char data_bit) //Based on the Hex value Set the Bits of the Data Lines
{
if(data_bit& 1)
D4 = 1;
else
D4 = 0;
if(data_bit& 2)
D5 = 1;
else
D5 = 0;
if(data_bit& 4)
D6 = 1;
else
D6 = 0;
if(data_bit& 8)
D7 = 1;
else
D7 = 0;
}
void Lcd_Cmd(char a)
{
RS = 0;
Lcd_SetBit(a); //Incoming Hex value
EN = 1;
__delay_ms(4);
EN = 0;
}
Lcd_Clear()
{
Lcd_Cmd(0); //Clear the LCD
Lcd_Cmd(1); //Move the curser to first position
}
void Lcd_Set_Cursor(char a, char b)
{
char temp,z,y;
if(a== 1)
{
temp = 0x80 + b - 1; //80H is used to move the curser
z = temp>>4; //Lower 8-bits
y = temp & 0x0F; //Upper 8-bits
Lcd_Cmd(z); //Set Row
Lcd_Cmd(y); //Set Column
}
else if(a== 2)
{
temp = 0xC0 + b - 1;
z = temp>>4; //Lower 8-bits
y = temp & 0x0F; //Upper 8-bits
Lcd_Cmd(z); //Set Row
Lcd_Cmd(y); //Set Column
}
}
void Lcd_Start()
{
Lcd_SetBit(0x00);
for(int i=1065244; i<=0; i--) NOP();
Lcd_Cmd(0x03);
__delay_ms(5);
Lcd_Cmd(0x03);
__delay_ms(11);
Lcd_Cmd(0x03);
Lcd_Cmd(0x02); //02H is used for Return home -> Clears the RAM and initializes the LCD
Lcd_Cmd(0x02); //02H is used for Return home -> Clears the RAM and initializes the LCD
Lcd_Cmd(0x08); //Select Row 1
Lcd_Cmd(0x00); //Clear Row 1 Display
Lcd_Cmd(0x0C); //Select Row 2
Lcd_Cmd(0x00); //Clear Row 2 Display
Lcd_Cmd(0x06);
}
void Lcd_Print_Char(char data) //Send 8-bits through 4-bit mode
{
char Lower_Nibble,Upper_Nibble;
Lower_Nibble = data&0x0F;
Upper_Nibble = data&0xF0;
RS = 1; // => RS = 1
Lcd_SetBit(Upper_Nibble>>4); //Send upper half by shifting by 4
EN = 1;
for(int i=2130483; i<=0; i--) NOP();
EN = 0;
Lcd_SetBit(Lower_Nibble); //Send Lower half
EN = 1;
for(int i=2130483; i<=0; i--) NOP();
EN = 0;
}
void Lcd_Print_String(char *a)
{
int i;
for(i=0;a[i]!='\0';i++)
Lcd_Print_Char(a[i]); //Split the string using pointers and call the Char function
}
//***End of LCD functions***//
void main()
{
TRISD = 0x00;
Lcd_Start();
Initialize_ESP8266() ;
Lcd_Set_Cursor(1,1);
Lcd_Print_String("Circuit Digest");
Lcd_Set_Cursor(2,1);
Lcd_Print_String("ESP5266 with PIC");
__delay_ms(1500);
Lcd_Clear();
/*Check if the ESP_PIC communication is successful*/
do
{
Lcd_Set_Cursor(1,1);
Lcd_Print_String("ESP not found");
}while (!esp8266_isStarted()); //wait till the ESP send back "OK"
Lcd_Set_Cursor(1,1);
Lcd_Print_String("ESP is connected");
__delay_ms(1500);
Lcd_Clear();
/*Yes ESP communication successful*/
/*Put the module in Soft AP mode*/
esp8266_mode(2);
Lcd_Set_Cursor(1,1);
Lcd_Print_String("ESP set as AP");
__delay_ms(1500);
Lcd_Clear();
/*Module set as AP */
/*Configure the AP name and Password*/
esp8266_config_softAP("CircuitDigest","619007123");
Lcd_Set_Cursor(1,1);
Lcd_Print_String("AP configured");
__delay_ms(1500);
/*AP configured*/
while(1)
{
//do nothing
}
}