Cytron Technologies

Giờ làm việc: 8:00 - 17:00

Thứ 2 - Thứ 6 (trừ ngày lễ)

Hotline 0362917357 

Lập trình Raspberry Pi Pico W Cơ Bản

Raspberry Pi Pico W là phiên bản nâng cấp của Raspberry Pi Pico với kết nối không dây (WiFi & Bluetooth). Trong bài viết này, chúng ta sẽ tìm hiểu cách lập trình Raspberry Pi Pico W qua các ví dụ cơ bản: kết nối Pico W tới mạng WiFi, biến nó trở thành một web server để điều khiển đèn LED trên bo mạch (digital output) với trình duyệt cũng như hiển thị dữ liệu từ cảm biến nhiệt độ.

Nếu bạn muốn trải nghiệm ngay chương trình mẫu, bạn có thể tìm thấy nó tại đây.

Cài Thonny Python IDE

Chúng ta sẽ lập trình Raspberry Pi Pico W với Thonny. Nếu chưa có sẵn, bạn có thể nhấn vào đây để tải và cài đặt.

Cài đặt Raspberry Pi Pico W

Đầu tiên, bạn cần tải firmware cho Raspberry Pi Pico W tại https://rpf.io/pico-w-firmware

Sau đó nối một đầu cáp USB micro B tới Raspberry Pi Pico W

Tiếp theo, nhấn và giữ nút BOOTSEL trên Pico W

Và nối đầu USB còn lại vào máy tính, laptop hoặc Raspberry Pi (Pi 3/ Pi 4/ Pi 400)

Lúc này Raspberry Pi Pico W sẽ xuất hiện dưới dạng một ổ đĩa trên máy tính. Hãy kéo và thả firmware bạn mới tải về vào ổ đĩa, Pico W sẽ tự khởi động lại.

Tiếp theo, hãy mở ứng dụng Thonny để lập trình. Hãy kiểm tra xem thử bạn đã chọn đúng thiết bị là Raspberry Pi Pico chưa nhé

Để lập trình Raspberry Pi Pico W, chúng ta sẽ sử dụng thư viện picozero. Bạn có thể vào Tools > Manage packages để tìm và cài nó

Gõ tên thư viện là picozero và nhấn “Search on PyPI” để bắt đầu tìm kiếm
Sau đó nhấn Install để cài đặt thư viện

Kết nối Raspberry Pi Pico W tới mạng WiFi

Chương trình mẫu này sẽ kết nối Raspberry Pi Pico W tới mạng WiFi cũng như khai báo một số bộ thư viện liên quan. Hãy copy chương trình mẫu và dán vào ứng dụng Thonny. Bạn đừng quên thay đổi thông tin SSID (tên WiFi) và mật khẩu WiFi cho đúng. Sau đó lưu đoạn code dưới tên web_server.py (Chọn lưu trên máy tính – This computer)

import network
import socket
from time import sleep
from picozero import pico_temp_sensor, pico_led
import machine

ssid = 'NAME OF YOUR WIFI NETWORK'
password = 'YOUR SECRET PASSWORD'

def connect():
    #Connect to WLAN
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(ssid, password)
    while wlan.isconnected() == False:
        print('Waiting for connection...')
        sleep(1)
    print(wlan.ifconfig())

try:
    connect()
except KeyboardInterrupt:
    machine.reset()

Khi chạy thử chương trình, nếu may mắn bạn sẽ thấy thông báo kết nối thành công như bên dưới. Nếu xảy ra lỗi, bạn cần kiểm tra lại tên WiFi và mật khẩu.

Waiting for connection...
Waiting for connection...
Waiting for connection...
Waiting for connection...
Waiting for connection...
('192.168.1.143', '255.255.255.0', '192.168.1.254', '192.168.1.254')

Ở đây, 192.168.1.143 chính là địa chỉ IP của Raspberry Pi Pico W. Thật ra bạn không cần in toàn bộ thông tin từ wlan.ifconfig(). Chúng ta chỉ cần dùng lệnh fstring để lọc lấy địa chỉ IP mà thôi.

Lúc này bạn có thể chỉnh sửa đoạn code như sau:

def connect():
    #Connect to WLAN
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(ssid, password)
    while wlan.isconnected() == False:
        print('Waiting for connection...')
        sleep(1)
    ip = wlan.ifconfig()[0]
    print(f'Connected on {ip}')
    return ip


try:
    ip = connect()
except KeyboardInterrupt:
    machine.reset()

Tạo socket (kết nối)

Socket có thể hiểu nôm na là một kết nối từ thiết bị đầu cuối tới máy chủ. Bạn có thể tìm hiểu thêm về network socket tại đây.

Hãy thêm các dòng code sau vào file.

def open_socket(ip):
    # Open a socket
    address = (ip, 80)
    connection = socket.socket()
    connection.bind(address)
    connection.listen(1)
    return connection


try:
    ip = connect()
    connection = open_socket(ip)
except KeyboardInterrupt:
    machine.reset()

Bạn lưu ý là chương trình cần kết thúc bằng try. Có nghĩa là toàn bộ phần code bên dưới phải luôn nằm ở cuối chương trình.

try:
    ip = connect()
    connection = open_socket(ip)
except KeyboardInterrupt:
    machine.reset()

Tạo trang web quản lý Pico W

Tại ứng dụng Thonny, hãy tạo một file với tên index1.html, sau đó dán đoạn code mẫu này lên trình soạn thảo và lưu nó trên máy tính.

<!DOCTYPE html>
<html>
<body>
<form action="./lighton">
<input type="submit" value="Light on" />
</form>
<form action="./lightoff">
<input type="submit" value="Light off" />
</form>
<p>LED is {state}</p>
<p>Temperature is {temperature}</p>
</body>
</html>

Khi mở file này bằng trình duyệt, bạn sẽ thấy một giao diện như thế này

Nãy giờ chúng ta chỉ thử nghiệm trang web. Bây giờ hãy copy toàn bộ code html và dán vào file web_server.py.

def webpage(temperature, state):
    #Template HTML
    html = f"""
            <!DOCTYPE html>
            <html>
            <form action="./lighton">
            <input type="submit" value="Light on" />
            </form>
            <form action="./lightoff">
            <input type="submit" value="Light off" />
            </form>
            <p>LED is {state}</p>
            <p>Temperature is {temperature}</p>
            </body>
            </html>
            """
    return str(html)

Tại bước này chúng ta chưa thể kiểm tra trang web vì web server vẫn chưa kích hoạt. Hãy di chuyển sang bước kế tiếp.

Chạy web server trên Raspberry Pi Pico W

Hãy thêm các dòng code sau vào file web_server.py để kích hoạt web server:

def serve(connection):
    #Start a web server
    state = 'OFF'
    pico_led.off()
    temperature = 0
    while True:
        client = connection.accept()[0]
        request = client.recv(1024)
        request = str(request)
        try:
            request = request.split()[1]
        except IndexError:
            pass
        if request == '/lighton?':
            pico_led.on()
            state = 'ON'
        elif request =='/lightoff?':
            pico_led.off()
            state = 'OFF'
        temperature = pico_temp_sensor.temp
        html = webpage(temperature, state)
        client.send(html)
        client.close()

try:
    ip = connect()
    connection = open_socket(ip)
    serve(connection)
except KeyboardInterrupt:
    machine.reset()

Hãy mở trình duyệt và truy cập trang web với địa chỉ IP của Raspberry Pi Pico W. Trong ví dụ này, địa chỉ IP là 192.168.1.143

Lúc này bạn sẽ có thể điều khiển đèn LED trên bo mạch Raspberry Pi Pico W cũng như đọc nhiệt độ từ cảm biến trên bo mạch.

Đoạn code mẫu hoàn chỉnh

Nếu bạn cảm thấy hướng dẫn từng bước tốn quá nhiều thời gian, hãy sử dụng đoạn code mẫu hoàn chỉnh này. Bạn chỉ cần copy toàn bộ các dòng lệnh, dán vào Thonny Python IDE và lưu trên Raspberry Pi Pico W hoặc máy tính để thực thi.

import network
import socket
from time import sleep
from picozero import pico_temp_sensor, pico_led
import machine

ssid = 'NAME OF YOUR WIFI NETWORK'
password = 'YOUR SECRET PASSWORD'

def connect():
    #Connect to WLAN
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(ssid, password)
    while wlan.isconnected() == False:
        print('Waiting for connection...')
        sleep(1)
    ip = wlan.ifconfig()[0]
    print(f'Connected on {ip}')
    return ip

def open_socket(ip):
    # Open a socket
    address = (ip, 80)
    connection = socket.socket()
    connection.bind(address)
    connection.listen(1)
    return connection

def webpage(temperature, state):
    #Template HTML
    html = f"""
            <!DOCTYPE html>
            <html>
            <form action="./lighton">
            <input type="submit" value="Light on" />
            </form>
            <form action="./lightoff">
            <input type="submit" value="Light off" />
            </form>
            <p>LED is {state}</p>
            <p>Temperature is {temperature}</p>
            </body>
            </html>
            """
    return str(html)
    
def serve(connection):
    #Start a web server
    state = 'OFF'
    pico_led.off()
    temperature = 0
    while True:
        client = connection.accept()[0]
        request = client.recv(1024)
        request = str(request)
        try:
            request = request.split()[1]
        except IndexError:
            pass
        if request == '/lighton?':
            pico_led.on()
            state = 'ON'
        elif request =='/lightoff?':
            pico_led.off()
            state = 'OFF'
        temperature = pico_temp_sensor.temp
        html = webpage(temperature, state)
        client.send(html)
        client.close()
   
try:
    ip = connect()
    connection = open_socket(ip)
    serve(connection)
except KeyboardInterrupt:
    machine.reset()

Lời kết

Cytron đã chia sẻ với bạn hướng dẫn lập trình Raspberry Pi Pico W cơ bản. Bạn có thể tham khảo bài viết bằng tiếng Anh tại trang dự án của Raspberry Pi.

Chúc bạn thành công!

Theo dõi
Thông báo của
guest
2 Comments
Mới nhất
Cũ nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận
thanh phú
thanh phú
5 tháng trước

cảm ơn add nhiều

Thai van
Thai van
1 năm trước

Cảm ơn vì bài viết hữu ích này , nhờ bài viết này mà mình biết raspberry pico w của mình bị lỗi