Cytron Technologies
Giờ làm việc: 8:00 - 17:00
Thứ 2 - Thứ 6 (trừ ngày lễ)
Hotline 0362917357
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.
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.
Đầ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ó
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()
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ạ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.
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.
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()
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!
cảm ơn add nhiều
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