Giao diện Mô-đun WiFi ESP8266 với Raspberry Pi Pico

Giao diện Mô-đun WiFi ESP8266 với Raspberry Pi Pico

Mô-đun WiFi ESP8266

Vào tháng 2014 năm 01, Espressif Systems đã ra mắt mô-đun thô đầu tiên của họ được sản xuất bởi AI-Thinker phần thứ ba và mô-đun được gọi là mô-đun ESP-XNUMX.

 

Mô-đun WiFi ESP8266

ESP8266 cung cấp giải pháp WiFi tích hợp cao đáp ứng nhu cầu của các ngành công nghiệp Internet of Things như chi phí thấp, sử dụng năng lượng hiệu quả, hiệu suất đáng tin cậy và thiết kế nhỏ gọn.

Mô-đun WIFI ESP8266 về cơ bản là một giải pháp WiFi hoàn chỉnh, có ngăn xếp giao thức TCP / IP tích hợp khép kín có thể dễ dàng kết nối với vi điều khiển để truy cập vào bất kỳ mạng WiFi nào.

Chúng tôi sẽ sử dụng các lệnh gửi AT đến mô-đun ESP8266 qua UART từ Raspberry Pi Pico để định cấu hình máy chủ Web TCP.

Có rất nhiều mô-đun WiFi ESP8266 có sẵn trên thị trường, từ ESP-01 đến ESP-12. Nhưng trong hướng dẫn này, chúng tôi đang sử dụng ESP-01. Các lệnh AT giống nhau cho tất cả các mô-đun ESP này.

Sơ đồ chân mô-đun ESP-01

Mô-đun WiFi ESP8266-01 bao gồm hai hàng gồm tám chân. Sơ đồ cấu hình pin được thể hiện trong hình dưới đây:

Sơ đồ chân mô-đun ESP-01

Nó có tổng cộng 8 chân trong đó 6 chân đang hoạt động.

Nhãn

Mô tả

3.3V

Cung cấp chân 3,3 volt

GND ·

Pin nối đất

RST

Đặt lại Ghim

CH_PD/VI

Nguồn chip và bật mã pin

GPIO 0 đến 3

Giao diện UART và chân đầu vào / đầu ra

  • Pin_1, là chân GND, được kết nối trực tiếp với mặt đất để cấp nguồn cho mô-đun này.

  • Pins_2 và 3, là GPIO 2 và GPIO 0, các chân này quyết định chế độ nào mô-đun sẽ là khởi động, nói cách khác, đây là các chân được chọn ở chế độ nào.

  • Pins_4 và 5, là RX và TX, các chân này được sử dụng cho mục đích giao tiếp và lập trình mô-đun.

  • Pin_6 đó là CH_PD, nó được gọi là chân tắt nguồn chip.

  • Pin_7 đó là chân RST và chân này được sử dụng để đặt lại mô-đun.

  • Pin_8 là chân VCC được sử dụng để cấp nguồn cho mô-đun. Điện áp hoạt động của ESP-01 là 3,3 volt.

Giao diện Mô-đun Wi-Fi ESP-01 với Raspberry Pi Pico

Chúng tôi sẽ yêu cầu các thành phần sau:

  • Raspberry Pi Pico

  • Mô-đun ESP8266 ESP-01

  • Dây kết nối

  • Breadboard (không cần thiết)

Như chúng ta đã thấy ở trên, mô-đun ESP-01 bao gồm 8 chân. Tuy nhiên, chúng tôi sẽ sử dụng 5 chân để kết nối nó với bảng Raspberry Pi Pico. Chúng bao gồm các chân VCC, EN, GND, RX và TX. Các chân RX và TX của mô-đun sẽ được kết nối với các chân UART của bảng Pi Pico. Trước tiên chúng ta hãy xem xét các Chân Raspberry Pi Pi UART.

Chân Raspberry Pi Pico UART

Raspberry Pi Pico chứa hai thiết bị ngoại vi giống hệt nhau với các FIFOs 32×8 Tx và 32×12 Rx riêng biệt.

Chân Raspberry Pi Pico UART

Bảng sau liệt kê các chân GPIO cho cả hai thiết bị ngoại vi UART được tiếp xúc trên sơ đồ chân của bảng phát triển Raspberry Pi Pico.

Chân UART

Chân GPIO

UART0-TX

GP0 / GP12 / GP16

UART0-RX

GP1 / GP13 / GP17

UART1-TX

GP4/GP8

UART1-RX

GP5/GP9

Sơ đồ kết nối

Đối với hướng dẫn này, chúng tôi sẽ sử dụng các chân UART0 TX và RX của Raspberry Pi Pico. Làm theo sơ đồ kết nối bên dưới để kết nối hai thiết bị.

Raspberry Pi Pico với sơ đồ kết nối ESP-01 sử dụng UART0

Raspberry Pi Pico

ESP-01 ·

3.3V

VCC

3.3V

EN

GND ·

GND ·

GP1 (UART0 RX)

TX

GP0 (UART0 TX)

RX

Raspberry Pi Pico với ESP-01

Raspberry Pi Pico Máy chủ web MicroPython Script

Tập lệnh MicriPython sau đây của Raspberry Pi Pico gửi lệnh AT đến mô-đun ESP8266 để định cấu hình ESP8266 làm máy chủ web TCP. Chúng ta sẽ xem chi tiết của tất cả các lệnh AT trong các phần tiếp theo.

import uos

import machine

import utime

 

recv_buf="" # receive buffer global variable

 

print()

print("Machine: \t" + uos.uname()[4])

print("MicroPython: \t" + uos.uname()[3])

 

uart0 = machine.UART(0, baudrate=115200)

print(uart0)

 

def Rx_ESP_Data():

    recv=bytes()

    while uart0.any()>0:

        recv+=uart0.read(1)

    res=recv.decode('utf-8')

    return res

 

def Connect_WiFi(cmd, uart=uart0, timeout=3000):

    print("CMD: " + cmd)

    uart.write(cmd)

    utime.sleep(7.0)

    Wait_ESP_Rsp(uart, timeout)

    print()

 

def Send_AT_Cmd(cmd, uart=uart0, timeout=3000):

    print("CMD: " + cmd)

    uart.write(cmd)

    Wait_ESP_Rsp(uart, timeout)

    print()

    

def Wait_ESP_Rsp(uart=uart0, timeout=3000):

    prvMills = utime.ticks_ms()

    resp = b""

    while (utime.ticks_ms()-prvMills)<timeout:

        if uart.any():

            resp = b"".join([resp, uart.read(1)])

    print("resp:")

    try:

        print(resp.decode())

    except UnicodeError:

        print(resp)

    

Send_AT_Cmd('AT\r\n')          #Test AT startup

Send_AT_Cmd('AT+GMR\r\n')      #Check version information

Send_AT_Cmd('AT+CIPSERVER=0\r\n')      #Check version information

Send_AT_Cmd('AT+RST\r\n')      #Check version information

Send_AT_Cmd('AT+RESTORE\r\n')  #Restore Factory Default Settings

Send_AT_Cmd('AT+CWMODE?\r\n')  #Query the WiFi mode

Send_AT_Cmd('AT+CWMODE=1\r\n') #Set the WiFi mode = Station mode

Send_AT_Cmd('AT+CWMODE?\r\n')  #Query the WiFi mode again

#Send_AT_Cmd('AT+CWLAP\r\n', timeout=10000) #List available APs

Connect_WiFi('AT+CWJAP="HUAWEI-u67E","4uF77R2n"\r\n', timeout=5000) #Connect to AP

Send_AT_Cmd('AT+CIFSR\r\n')    #Obtain the Local IP Address

utime.sleep(3.0)

Send_AT_Cmd('AT+CIPMUX=1\r\n')    #Obtain the Local IP Address

utime.sleep(1.0)

Send_AT_Cmd('AT+CIPSERVER=1,80\r\n')    #Obtain the Local IP Address

utime.sleep(1.0)

print ('Starting connection to ESP8266...')

while True:

    res =""

    res=Rx_ESP_Data()

    utime.sleep(2.0)

    if '+IPD' in res: # if the buffer contains IPD(a connection), then respond with HTML handshake

        id_index = res.find('+IPD')

        print("resp:")

        print(res)

        connection_id =  res[id_index+5]

        print("connectionId:" + connection_id)

        print ('! Incoming connection - sending webpage')

        uart0.write('AT+CIPSEND='+connection_id+',200'+'\r\n')  #Send a HTTP response then a webpage as bytes the 108 is the amount of bytes you are sending, change this if you change the data sent below

        utime.sleep(1.0)

        uart0.write('HTTP/1.1 200 OK'+'\r\n')

        uart0.write('Content-Type: text/html'+'\r\n')

        uart0.write('Connection: close'+'\r\n')

        uart0.write(''+'\r\n')

        uart0.write('<!DOCTYPE HTML>'+'\r\n')

        uart0.write('<html>'+'\r\n')

        uart0.write('<body><center><h1>Raspberry Pi Pico Web Server</h1></center>'+'\r\n')

        uart0.write('<center><h2>Microcontrollerslab.com</h2></center>'+'\r\n')

        uart0.write('</body></html>'+'\r\n')

        utime.sleep(4.0)

        Send_AT_Cmd('AT+CIPCLOSE='+ connection_id+'\r\n') # once file sent, close connection

        utime.sleep(2.0)

        recv_buf="" #reset buffer

        print ('Waiting For connection...')

Mã hoạt động như thế nào?

Chúng tôi sẽ bắt đầu bằng cách nhập mô-đun máy và mô-đun uos. Tiếp theo, chúng tôi cũng sẽ nhập mô-đun utime để kết hợp độ trễ.

import uos

import machine

import utime

Sau đó, chúng tôi sẽ in thông tin về hệ điều hành hiện tại của chúng tôi trong thiết bị đầu cuối Thonny shell. Chúng tôi sẽ uos.uname() và in phiên bản hệ điều hành và phát hành.

print()

print("Machine: \t" + uos.uname()[4])

print("MicroPython: \t" + uos.uname()[3])

Khởi tạo giao tiếp UART

Sau đó, chúng ta sẽ tạo một đối tượng uart bằng cách sử dụng UART() và chỉ định kênh UART làm tham số đầu tiên và tốc độ truyền làm tham số thứ hai. Chúng tôi đang sử dụng UART0 trong trường hợp này với tốc độ truyền 115200 cho giao tiếp uart. ESP8266 có tốc độ truyền mặc định là 115200, do đó chúng tôi sẽ sử dụng cùng một tốc độ truyền ở đây cho giao tiếp Raspberry Pi Pico UART để tạo đồng bộ hóa. Hơn nữa, chúng tôi cũng sẽ in các chi tiết UART trong thiết bị đầu cuối vỏ.

uart0 = machine.UART(0, baudrate=115200)

print(uart0)

Hàm Connect_WiFi() này được sử dụng để kết nối ESP8266 với WiFi.

def Connect_WiFi(cmd, uart=uart0, timeout=3000):

    print("CMD: " + cmd)

    uart.write(cmd)

    utime.sleep(7.0)

    Wait_ESP_Rsp(uart, timeout)

    print()

Tiếp theo, chúng ta sẽ định nghĩa ba hàm. Cái đầu tiên là Rx_ESP_Data(). Điều này đọc dữ liệu nối tiếp đang được nhận. Dữ liệu này được giải mã từ định dạng UTF-8 và được trả về.

def Rx_ESP_Data():

    recv=bytes()

    while uart0.any()>0:

        recv+=uart0.read(1)

    res=recv.decode('utf-8')

    return res

Hàm thứ hai là Send_AT_Cmd(cmd, uart=uart0, timeout=3000). Nó có ba tham số, lệnh AT, kênh UART và thời gian phản hồi. Chức năng này sẽ được sử dụng để nó gửi lệnh AT đến ESP8266 thông qua uart0. Thời gian phản hồi được đặt thành 3 giây.

def Send_AT_Cmd(cmd, uart=uart0, timeout=3000):

    print("CMD: " + cmd)

    uart.write(cmd)

    Wait_ESP_Rsp(uart, timeout)

    print()

    

Hàm Wait_ESP_Rsp(uart=uart0, timeout=3000) đợi 3 giây để nhận được phản hồi từ ESP8266. Sau khi nhận được dữ liệu từ ESP8266, nó nối các byte nhận được và in chúng trên thiết bị đầu cuối shell.

def Wait_ESP_Rsp(uart=uart0, timeout=3000):

    prvMills = utime.ticks_ms()

    resp = b""

    while (utime.ticks_ms()-prvMills)<timeout:

        if uart.any():

            resp = b"".join([resp, uart.read(1)])

    print("resp:")

    try:

        print(resp.decode())

    except UnicodeError:

        print(resp)

Lệnh AT

Bây giờ chúng ta hãy xem xét loạt lệnh AT mà chúng ta sẽ gửi qua UART0 đến ESP8266.

Send_AT_Cmd('AT\r\n')          #Test AT startup

Send_AT_Cmd('AT+GMR\r\n')      #Check version information

Send_AT_Cmd('AT+CIPSERVER=0\r\n')   

Send_AT_Cmd('AT+RST\r\n')      #Check version information

Send_AT_Cmd('AT+RESTORE\r\n')  #Restore Factory Default Settings

Send_AT_Cmd('AT+CWMODE?\r\n')  #Query the WiFi mode

Send_AT_Cmd('AT+CWMODE=1\r\n') #Set the WiFi mode = Station mode

Send_AT_Cmd('AT+CWMODE?\r\n')  #Query the WiFi mode again

Send_AT_Cmd('AT+CWJAP="HUAWEI-u67E","4uF77R2n"\r\n', timeout=5000) #Connect to AP

utime.sleep(3.0)

Send_AT_Cmd('AT+CIFSR\r\n')    #Obtain the Local IP Address

utime.sleep(3.0)

Send_AT_Cmd('AT+CIPMUX=1\r\n')    

utime.sleep(1.0)

Send_AT_Cmd('AT+CIPSERVER=1,80\r\n')    #Obtain the Local IP Address

utime.sleep(1.0)

AT: Loại lệnh này được sử dụng để kiểm tra chức năng khởi động của mô-đun WiFi. Phản hồi sẽ ổn, chống lại lệnh này nếu mọi thứ đều ổn.

Send_AT_Cmd('AT\r\n')          #Test AT startup

AT + GMR : Loại lệnh AT này được sử dụng để kiểm tra phiên bản lệnh AT và chúng tôi đã sử dụng phiên bản SDK của lệnh AT trong loại mô-đun WIFI này.

Send_AT_Cmd('AT+GMR\r\n')      #Check version information

AT + CIPSERVER = 0: Điều này cấu hình ESP8266 làm máy chủ và đặt chế độ là 0, có nghĩa là xóa máy chủ (cần phải làm theo bằng cách khởi động lại)

Send_AT_Cmd('AT+CIPSERVER=0\r\n')     

AT + RST: Loại lệnh này được sử dụng để đặt lại mô-đun WiFi khi nó ở trong tình trạng hoạt động. Phản hồi sẽ ổn, khi đặt lại mô-đun.

Send_AT_Cmd('AT+RST\r\n')   

AT + RESTORE: Loại lệnh này được sử dụng để khôi phục cài đặt gốc có nghĩa là, khi lệnh này được nhập thì tất cả các tham số sẽ tự động được đặt lại về mặc định của một người.

Send_AT_Cmd('AT+RESTORE\r\n')  #Restore Factory Default Settings

AT + CWMODE? : Loại lệnh này được sử dụng để truy vấn chế độ WiFi của ESP8266.

Send_AT_Cmd('AT+CWMODE?\r\n')  #Query the WiFi mode

AT + CWMODE = 1 : Điều này đặt chế độ WiFi của ESP8266 trong trường hợp này ở chế độ trạm.

Send_AT_Cmd('AT+CWMODE=1\r\n') #Set the WiFi mode = Station mode

AT + CWJAP = "SSID", "PASSWORD"\r\n', timeout=TIME_ms : Điều này kết nối ESP8266 với một AP có SSID và mật khẩu được cung cấp, Thời gian chờ ở đây là thời gian kết nối lại.

Connect_WiFi('AT+CWJAP="HUAWEI-u67E","4uF77R2n"\r\n', timeout=5000) #Connect to AP

AT + CIFSR: Lệnh này lấy địa chỉ IP cục bộ.

Send_AT_Cmd('AT+CIFSR\r\n')

AT + CIPMUX = 1: Lệnh này được sử dụng để kích hoạt nhiều kết nối (tối đa 4)

Send_AT_Cmd('AT+CIPMUX=1\r\n')

AT + CIPSERVER = 1: Lệnh này cấu hình ESP8266 làm máy chủ.

Send_AT_Cmd('AT+CIPSERVER=1,80\r\n')

Trong vòng lặp

Bên trong vòng lặp while, trước tiên chúng ta sẽ gọi Rx_ESP_Data() trả về dữ liệu mà ESP8266 nhận được. Điều này được lưu trong biến 'res.' Bây giờ sau khi trễ 2 giây, chúng tôi sẽ kiểm tra xem bộ đệm có chứa kết nối IPD hay không. Nếu có, hãy trả lời bằng một cái bắt tay HTML.

In phản hồi trong thiết bị đầu cuối shell.

res =""

res=Rx_ESP_Data()

print("resp:")

print(res)

Lấy ID kết nối và in nó.

id_index = res.find('+IPD')

connection_id =  res[id_index+5]

print("connectionId:" + connection_id)

Sau đó, bằng cách sử dụng đối tượng uart trên phương thức write(), chúng ta sẽ gửi các byte đến UART. Đầu tiên, chúng tôi đang viết lệnh AT: AT + CIPSEND = 'ID', 'LENGTH' Điều này sẽ đặt độ dài của dữ liệu sẽ được gửi. Tiếp theo sau độ trễ 1 giây, chúng ta sẽ viết nội dung HTML sẽ xây dựng trang web vào cổng nối tiếp. Sau đó, chúng tôi sẽ đóng nhiều kết nối khi chúng tôi đang gửi lệnh AT: AT + CIPCLOSE = 'ID'. Sau đó, chúng tôi sẽ đặt lại bộ đệm và chờ kết nối.

print ('! Incoming connection - sending webpage')

        uart0.write('AT+CIPSEND='+connection_id+',200'+'\r\n')  #Send a HTTP response then a webpage as bytes the 108 is the amount of bytes you are sending, change this if you change the data sent below

        utime.sleep(1.0)

        uart0.write('HTTP/1.1 200 OK'+'\r\n')

        uart0.write('Content-Type: text/html'+'\r\n')

        uart0.write('Connection: close'+'\r\n')

        uart0.write(''+'\r\n')

        uart0.write('<!DOCTYPE HTML>'+'\r\n')

        uart0.write('<html>'+'\r\n')

        uart0.write('<body><center><h1>Raspberry Pi Pico Web Server</h1></center>'+'\r\n')

        uart0.write('<center><h2>Microcontrollerslab.com</h2></center>'+'\r\n')

        uart0.write('</body></html>'+'\r\n')

        utime.sleep(4.0)

        Send_AT_Cmd('AT+CIPCLOSE='+ connection_id+'\r\n') # once file sent, close connection

        utime.sleep(2.0)

        recv_buf="" #reset buffer

        print ('Waiting For connection...')

Demo

Để kiểm tra tập lệnh MicroPython, hãy tải tệp main.py lên bảng của bạn và lấy địa chỉ IP để truy cập máy chủ web:

raspberry pi pico địa chỉ ip máy chủ web

Trong thiết bị đầu cuối shell của IDE, bạn sẽ có thể xem các thông báo sau:

Bây giờ hãy truy cập trình duyệt web của hệ thống của bạn và tìm kiếm với địa chỉ IP được hiển thị trong thiết bị đầu cuối shell. Trang web sẽ mở ra.

Raspberry Pi Pico với máy chủ web ESP-01

 

Bài viết cùng chuyên mục

NHANH

NHANH

Vì Đổi mới liên tục nên Nhanh hơn

ĐÚNG

ĐÚNG

Coi trọng và ưu tiên việc làm Đúng

ĐỦ

ĐỦ

Tìm và mua Đủ Đơn hàng hơn

KỊP THỜI

KỊP THỜI

Hiệu suất tối ưu bởi Kịp Thời hơn