Python kết nối với wifi Raspberry Pi

Raspberry PI Pico W đã thêm kết nối WiFi vào bộ vi điều khiển từ RPI Foundation, cho phép các dự án của chúng tôi kết nối với thế giới internet

Hướng dẫn này sẽ chỉ cho bạn cách sử dụng WiFi với Raspberry PI Pico

Với việc phát hành Raspberry PI Pico W, việc thêm mô-đun Infineon CYW4343 vào bộ vi điều khiển dựa trên RP2040 đã cho phép chúng tôi kết nối với 2. Mạng Wi-Fi 4GHz. Đó là một bước tiến lớn, vì trước sự phát triển này, chỉ một số bộ vi điều khiển có thể kết nối với kết nối WiFi và điều này giúp Pico có thể sử dụng được trong các dự án đồ vật thông minh

Theo dõi các bài đăng của peppe8o trên -> Twitter

Những gì chúng tôi cần

Như thường lệ, tôi khuyên bạn nên thêm tất cả phần cứng cần thiết vào giỏ hàng thương mại điện tử yêu thích của mình từ bây giờ để cuối cùng, bạn có thể đánh giá chi phí tổng thể và quyết định xem có nên tiếp tục dự án hay xóa chúng khỏi giỏ hàng. Vì vậy, phần cứng sẽ chỉ

  • Một máy tính thông dụng [có thể với Windows, Linux hoặc Mac]. Nó cũng có thể là bo mạch Máy tính Raspberry PI
  • Bộ vi điều khiển Raspberry PI Pico W [với cáp micro USB thông thường]

Kiểm tra giá phần cứng với các liên kết sau

Quy trình từng bước

Cài đặt chương trình cơ sở MicroPython

Trước khi bắt đầu với các ví dụ, bạn cần cài đặt chương trình cơ sở MicroPython trong Raspberry PI Pico W của mình

Đây là lưu ý cảnh báo đầu tiên. tại thời điểm viết bài này [tháng 7 năm 2022], Raspberry PI Foundation đã phải xuất bản một chương trình cơ sở cụ thể để WiFi hoạt động trên Raspberry PI Pico W. Họ đã hứa rằng các khả năng của phần sụn sẽ sớm được kết hợp với phần sụn chính thức của MicroPython. Tuy nhiên, hiện tại, việc chạy mã mạng bằng chương trình cơ sở chính thức của MicroPython sẽ dẫn đến lỗi sau khi cố gắng nhập thư viện mạng

Traceback [most recent call last]:
  File "", line 1, in 
ImportError: no module named 'network'

Dù sao đi nữa, bạn cũng có thể tham khảo hướng dẫn Các bước đầu tiên với Raspberry PI Pico cho người mới bắt đầu của tôi, vì nó cũng chỉ ra cách sử dụng Thonny [cùng một IDE mà tôi sẽ sử dụng cho hướng dẫn này]. Điều này sẽ cho phép bạn kiểm tra chương trình cơ sở chính thức của MicroPython trước khi chuyển sang RPI Foundation fork

Vì vậy, nếu bạn đã kiểm tra phần sụn chính thức gặp lỗi trên, vui lòng cài đặt phần sụn do Raspberry PI Foundation cung cấp từ họ [vui lòng chú ý chọn phần sụn cho Pico W] hoặc bạn có thể lấy một bản sao từ trang tải xuống của tôi

micropython-firmware-pico-w-290622. uf2

Tóm lại, bạn có thể cài đặt nó bằng cách

  1. nhấn nút BOOTSEL trên RPI Pico W
  2. sau đó cắm cáp USB vào PC của bạn
  3. thả nút BOOTSEL
  4. sao chép chương trình cơ sở đã tải xuống [“. uf2”] trong bộ lưu trữ xuất hiện trên máy tính của bạn [thường được gắn nhãn là “RPI-RPI2”]
  5. sau khi sao chép xong, RPI Pico sẽ tự động khởi động lại và sẵn sàng với chương trình cơ sở mới

Quét Wi-Fi

Thao tác đầu tiên là kiểm tra xem mạng WiFI của bạn có đủ tín hiệu để kết nối không. Hãy nhớ rằng Raspberry PI Pico W chỉ có thể sử dụng 2. mạng 4 GHz

Mã để thực hiện thao tác này đơn giản và ngắn gọn, vì vậy tôi đã thêm nhận xét trong mã giải thích tác vụ hàng

import network #import required module
wlan = network.WLAN[network.STA_IF] #initialize the wlan object
wlan.active[True] #activates the wlan interface
accessPoints = wlan.scan[] #perform a WiFi Access Points scan
for ap in accessPoints: #this loop prints each AP found in a single row on shell
    print[ap]

Kết quả sẽ tương tự như sau [ở đây tôi đã sử dụng ký tự “*” để ẩn mạng cá nhân của mình để bảo mật]

>>> %Run -c $EDITOR_CONTENT
[b'****er-1', b'\xac\x9e\x17k\xd6@', 2, -47, 5, 5]
[b'*********G3P4', b'\xc8Z\x9f\xdc\xa47', 11, -81, 5, 3]
[b'*********TWEB', b'\xcaZ\x9f\xdc\xa47', 11, -80, 5, 2]

Đối với mỗi điểm truy cập được phát hiện, thông tin sau NÊN được báo cáo

  • Tên điểm truy cập [SSID]
  • Mã định danh bộ dịch vụ cơ bản [BSSID]
  • Kênh mà điểm truy cập đang sử dụng
  • chỉ báo cường độ tín hiệu đã nhận [RSSI]. phép đo mức độ thiết bị của bạn có thể nghe thấy tín hiệu từ điểm truy cập hoặc bộ định tuyến [tín hiệu từ “-70” có thể sử dụng được với WiFi thông thường]
  • giao thức bảo mật. 0 -> mở;
  • Thông tin nếu Điểm truy cập bị ẩn;

Tôi đã nhập “NÊN” vì 2 giá trị cuối cùng do quá trình quét cục bộ của tôi dường như không tuân thủ với tài liệu WLAN chính thức của MicroPython… Tôi không biết liệu đó có phải là lỗi triển khai hay tôi đang đọc những giá trị này trong

Kết nối Wi-Fi

Sau khi quét các mạng WiFi và thấy rằng tín hiệu đủ để liên lạc đáng tin cậy, giờ đây chúng ta có thể bắt đầu kết nối với bộ định tuyến gia đình của mình

Mã như sau [bạn sẽ phải thay đổi các phần màu đỏ]

import network, rp2, time

# set your WiFi Country
rp2.country['IT']

wlan = network.WLAN[network.STA_IF]
wlan.active[True]

# set power mode to get WiFi power-saving off [if needed]
wlan.config[pm = 0xa11140]

wlan.connect['YourHomeSSID', 'YourSSIDPassword']

while not wlan.isconnected[] and wlan.status[] >= 0:
 print["Waiting to connect:"]
 time.sleep[1]

print[wlan.ifconfig[]]

Trong mã MicroPython, “rp2. country['IT']” đặt mã quốc gia WiFi [mã của tôi là CNTT vì tôi đang ở Ý]. Thay đổi nó thành mã quốc gia gồm 2 chữ cái của bạn để có WiFi bằng các kênh được phép ở quốc gia của bạn

“mạng lưới. config[pm = 0xa11140]” đặt chế độ nguồn WiFi cho Raspberry PI Pico W của bạn. Theo mặc định, Pico W đặt WiFi ở chế độ tiết kiệm năng lượng khiến nó kém phản hồi hơn sau một thời gian không sử dụng kết nối. Nếu bạn cần phản hồi nhanh chóng ngay cả khi hết thời gian, hãy sử dụng tính năng này để luôn bật nguồn WiFi

mạng lan. connect[] là nơi lưu thông tin đăng nhập WiFi của bạn. Nói thật, nếu bạn định sử dụng Raspberry PI Pico W trong không gian công cộng thì sẽ không an toàn khi mật khẩu WiFi được hiển thị bằng mã thuần túy và bạn sẽ cần bảo vệ kết nối nâng cao hơn [chẳng hạn như một mạng cụ thể được bảo vệ khỏi . Đối với các dự án gia đình, thông thường, đó không phải là vấn đề lớn. Hơn nữa, wlan. connect[] khởi tạo kết nối WiFi

Vòng lặp while chờ kết nối hoàn thành. Việc kiểm tra cũng được thực hiện bằng cách xác minh mạng wlan. mã trạng thái [], có thể được diễn giải bằng lược đồ sau

  • -3 -> CYW43_LINK_BADAUTH
  • -2 -> CYW43_LINK_NONET
  • -1 -> CYW43_LINK_FAIL
  • 0 -> CYW43_LINK_DOWN
  • 1 -> CYW43_LINK_THAM GIA
  • 2 -> CYW43_LINK_NOIP
  • 3 -> CYW43_LINK_UP

Cuối cùng, chúng tôi in cấu hình IP nhận được từ bộ định tuyến [bên dưới tôi hiển thị của tôi, nhưng cấu hình của bạn sẽ tương tự]

>>> %Run -c $EDITOR_CONTENT
Waiting to connect:
Waiting to connect:
Waiting to connect:
Waiting to connect:
['192.168.1.43', '255.255.255.0', '192.168.1.1', '8.8.8.8']

Kết quả cho thấy

  • ‘192. 168. 1. 43’ -> địa chỉ IP lấy từ Raspberry PI Pico W. Đây là địa chỉ mà bạn sẽ sử dụng để liên hệ với Raspberry PI Pico W
  • ‘255. 255. 255. 0’, -> mặt nạ mạng con
  • ‘192. 168. 1. 1’, -> cổng mặc định [thường là IP bộ định tuyến nhà bạn]
  • 'số 8. 8. 8. 8’ -> địa chỉ DNS

Raspberry PI Pico W của chúng tôi không được kết nối với mạng WiFi và nó có thể tương tác với thế giới

Nhận các trang/nội dung Internet với Urequests

Ví dụ đầu tiên là lấy thông tin từ các trang hoặc dịch vụ internet. Có nhiều cách khác nhau để đạt được mục tiêu này, nhưng cách đơn giản hơn là sử dụng thư viện urequests

Ví dụ này cho biết cách tải xuống một tệp chung, nhưng bạn có thể sử dụng các kết quả trong mã MicroPython của mình để quản lý các tệp văn bản/json đã nhận để lọc và điều chỉnh bất kỳ đầu vào nào

Mã này như sau

import network
import urequests

# set your WiFi Country
rp2.country['IT']
wlan = network.WLAN[network.STA_IF]
wlan.active[True]
# set power mode to get WiFi power-saving off [if needed]
wlan.config[pm = 0xa11140]
wlan.connect['YourHomeSSID', 'YourSSIDPassword']

# Make GET request
r = urequests.get["//google.com"]
print[r.content]
r.close[]

Xin lưu ý rằng bạn không thể tải xuống các trang có kích thước quá lớn so với giới hạn của bộ nhớ Raspberry PI Pico W [256KB RAM và 2MB bộ nhớ Flash]. Khi vượt quá giới hạn này, bạn sẽ gặp lỗi tương tự như sau

Traceback [most recent call last]:
  File "", line 18, in 
  File "urequests.py", line 20, in content
MemoryError: memory allocation failed, allocating 116480 bytes

Đoạn script trên sẽ trả về mã HTML cho trang được liên kết

Hiển thị các trang HTML

Ví dụ này cho thấy trường hợp ngược lại so với trường hợp trước. Raspberry PI Pico W của chúng tôi sẽ xuất bản một trang HTML đơn giản. Hơn nữa, từ trang HTML này, chúng ta sẽ có thể điều khiển bảng LED. Trong trường hợp này, chúng tôi sẽ sử dụng thư viện ổ cắm, cũng được bao gồm trong chương trình cơ sở RPI Foundation

Vui lòng bắt đầu tải xuống các tệp sau và di chuyển chúng vào bộ lưu trữ Raspberry PI Pico W của bạn

  • người làm mạng. py
  • webLed. py

người đánh lưới. mã py bao gồm một thư viện rất đơn giản để quản lý kết nối WiFi cho Raspberry PI Pico W của bạn. Nó bao gồm chức năng connectWiFi[] yêu cầu đầu vào SSID nhà riêng, mật khẩu WiFi và mã quốc gia gồm 2 chữ cái của bạn. Nó trả về trạng thái kết nối. đây là một mảng có phần tử đầu tiên là Địa chỉ IP nhận được từ Bộ định tuyến nhà của bạn. Hơn nữa, nó bổ sung khả năng quản lý kết nối tốt hơn với khả năng xử lý lỗi, như được đề xuất trong tài liệu Raspberry PI Foundation

Sử dụng chức năng tùy chỉnh như vậy, được liên kết từ một tệp bên ngoài, giúp mã của bạn sạch hơn và dễ hiểu hơn

mạng nhện. mã py là tập lệnh MicroPython để chạy trong Raspberry PI Pico W của bạn. Tất nhiên, các câu lệnh print[] sẽ hiển thị trong trình bao Thonny của bạn những gì đang xảy ra và có thể bị xóa hoặc nhận xét khi bạn không cần chúng

Khi bắt đầu, các mô-đun cần thiết được nhập

import netman
import socket
from machine import Pin

Các mô-đun mạng và rp2 không bắt buộc vì chúng được nhập bởi mô-đun netman

Sau khi tạo đối tượng LED, đối tượng đó sẽ điều khiển đèn LED bảng Raspberry PI Pico W

________số 8

chúng tôi đặt thông tin xác thực và quốc gia kết nối WiFi. Chúng tôi sử dụng các biến để có một nơi duy nhất để thay đổi chúng

country = 'IT'
ssid = 'YourHomeSSID'
password = 'YourSSIDPassword'

Bây giờ chúng tôi sử dụng mô-đun netman để khởi tạo kết nối WiFi và chúng tôi sẽ lưu trữ trạng thái kết nối trong biến “wifi_connection”

import network #import required module
wlan = network.WLAN[network.STA_IF] #initialize the wlan object
wlan.active[True] #activates the wlan interface
accessPoints = wlan.scan[] #perform a WiFi Access Points scan
for ap in accessPoints: #this loop prints each AP found in a single row on shell
    print[ap]
0

Phần tiếp theo lưu trữ mã HTML để trang của chúng tôi hiển thị trên các máy tính từ xa. Bạn có thể lưu ý rằng chúng tôi đang sử dụng điểm đánh dấu “%s” để có thể thêm trạng thái đèn LED sau này. Ngoài ra, chúng tôi cũng đang sử dụng giá trị “wifi_connection[0]” [đó là địa chỉ IP nhận được từ kết nối Wlan] để tạo liên kết nội bộ đến cùng một trang

import network #import required module
wlan = network.WLAN[network.STA_IF] #initialize the wlan object
wlan.active[True] #activates the wlan interface
accessPoints = wlan.scan[] #perform a WiFi Access Points scan
for ap in accessPoints: #this loop prints each AP found in a single row on shell
    print[ap]
1

Ổ cắm được khởi tạo và định cấu hình để liên kết tại “0. 0. 0. 0”. điều này có nghĩa là máy chủ web của chúng tôi sẽ trả lời bất kỳ yêu cầu nào từ các máy tính bên ngoài

import network #import required module
wlan = network.WLAN[network.STA_IF] #initialize the wlan object
wlan.active[True] #activates the wlan interface
accessPoints = wlan.scan[] #perform a WiFi Access Points scan
for ap in accessPoints: #this loop prints each AP found in a single row on shell
    print[ap]
2

Ở lần tải trang đầu tiên, trạng thái đèn LED có thể không nhất quán. Vì vậy, khởi tạo nó thành giá trị mặc định là một cách tốt để có cấu hình ban đầu được kiểm soát

import network #import required module
wlan = network.WLAN[network.STA_IF] #initialize the wlan object
wlan.active[True] #activates the wlan interface
accessPoints = wlan.scan[] #perform a WiFi Access Points scan
for ap in accessPoints: #this loop prints each AP found in a single row on shell
    print[ap]
3

Vòng lặp chính sẽ đợi các kết nối bên ngoài. Khi một kết nối chung đến từ máy tính, trình bao sẽ in yêu cầu [cũng hữu ích để khắc phục sự cố]

import network #import required module
wlan = network.WLAN[network.STA_IF] #initialize the wlan object
wlan.active[True] #activates the wlan interface
accessPoints = wlan.scan[] #perform a WiFi Access Points scan
for ap in accessPoints: #this loop prints each AP found in a single row on shell
    print[ap]
4

Máy chủ web này có thể trả lời để phục vụ 3 trang [URL] khác nhau. Các URL sẽ luôn bắt đầu bằng “http. //YourRpiPicoAddress” [trong đó “YourRpiPicoAddress” là địa chỉ IP Pico W của bạn, địa chỉ của tôi cho ví dụ này sẽ là 192. 168. 1. 43]. URL gốc sẽ hiển thị trạng thái đèn LED, trong khi các URL bao gồm “/light/on” hoặc “/light/off” sẽ điều khiển đèn LED, ngoài việc hiển thị cùng một đầu ra trang và trạng thái đèn LED hiện tại. Làm cho nó đơn giản hơn, với địa chỉ IP của tôi

  • http. //192. 168. 1. 43 -> điều này sẽ hiển thị trạng thái LED mà không thay đổi nó
  • http. //192. 168. 1. 43/light/on -> điều này sẽ bật nguồn đèn LED và hiển thị trạng thái đèn LED
  • http. //192. 168. 1. 43/light/off -> điều này sẽ tắt nguồn đèn LED và hiển thị trạng thái đèn LED

Chúng tôi sẽ tìm URL mà máy tính đang yêu cầu bằng cách đọc nội dung yêu cầu và tìm kiếm các chuỗi liên quan. Xin lưu ý rằng chuỗi yêu cầu đã bị cắt đối với 50 ký tự đầu tiên khi di chuyển từ trang LED BẬT và trang TẮT LED, nó sẽ theo dõi trang trước đó bằng truy vấn “Người giới thiệu” và có thể dẫn đến trạng thái không chính xác

import network #import required module
wlan = network.WLAN[network.STA_IF] #initialize the wlan object
wlan.active[True] #activates the wlan interface
accessPoints = wlan.scan[] #perform a WiFi Access Points scan
for ap in accessPoints: #this loop prints each AP found in a single row on shell
    print[ap]
5

Nếu hàm find không tìm thấy chuỗi được yêu cầu, nó sẽ trả về giá trị “-1”. Nếu điều này tìm thấy chuỗi, nó sẽ trả về vị trí liên quan dưới dạng số nguyên. Với suy nghĩ này, các câu lệnh if sau đây sẽ đặt bật/tắt đèn LED và chuỗi thông báo trạng thái liên quan đến anh ấy

import network #import required module
wlan = network.WLAN[network.STA_IF] #initialize the wlan object
wlan.active[True] #activates the wlan interface
accessPoints = wlan.scan[] #perform a WiFi Access Points scan
for ap in accessPoints: #this loop prints each AP found in a single row on shell
    print[ap]
6

Cuối cùng, trang web là máy chủ và chúng tôi cũng đóng phiên socket

import network #import required module
wlan = network.WLAN[network.STA_IF] #initialize the wlan object
wlan.active[True] #activates the wlan interface
accessPoints = wlan.scan[] #perform a WiFi Access Points scan
for ap in accessPoints: #this loop prints each AP found in a single row on shell
    print[ap]
7

Hơn nữa, phù hợp với “thử. ” câu lệnh, “ngoại lệ” cuối cùng sẽ xử lý lỗi

import network #import required module
wlan = network.WLAN[network.STA_IF] #initialize the wlan object
wlan.active[True] #activates the wlan interface
accessPoints = wlan.scan[] #perform a WiFi Access Points scan
for ap in accessPoints: #this loop prints each AP found in a single row on shell
    print[ap]
8

Trang kết quả sẽ như sau [vui lòng nhớ sử dụng địa chỉ Raspberry PI Pico W của bạn thay vì địa chỉ của tôi]. Và vâng, bạn có thể định cấu hình mã HTML theo ý muốn, như tôi đã thêm peppe8o. liên kết com. Điều này sẽ yêu cầu một chút kiến ​​thức về HTML

Tài liệu chính thức

Tài liệu chính thức để kết nối Raspberry PI Pico W của bạn có sẵn trên trang web Raspberry PI Foundation tại https. //bảng dữ liệu. mâm xôi. com/picow/kết-nối-với-internet-với-pico-w. pdf. Từ tài liệu này, tôi đã tự do thay đổi một số phần mã và tôi hy vọng bạn sẽ thích những thay đổi đó

Cái gì tiếp theo

Muốn làm nhiều hơn với Raspberry PI Pico của bạn?

Làm cách nào để kết nối với WiFi bằng Python?

Kết nối với mạng Wi-Fi mới .
Bước 1. Nhập thư viện os
Bước 2. Thiết lập cấu hình XML của Mạng Wi-Fi mới
Bước 3. Chọn mạng Wi-Fi
Bước 4. Thêm hồ sơ này vào hệ thống của bạn
Bước 5. Kết nối với mạng Wi-Fi

Raspberry Pi 4 có thể kết nối với WiFi không dây không?

Các tính năng không dây của Raspberry Pi 4 B. Ngoài Gigabit Ethernet thông suốt, Raspberry Pi 4 B còn có mạng không dây và Bluetooth tích hợp . Giống như người tiền nhiệm của nó, RPi 4 B có băng tần kép 802. 11ac\n không dây có thể chạy trên 2. 4GHz hoặc 5GHz.

Chủ Đề