Raspberry Pi Pico W: начало работы с Wi-Fi (MicroPython)
Raspberry Pi Pico W оснащён чипом Infineon CYW43439, который содержит радиомодуль 2,4 ГГц, обеспечивающий поддержку Wi-Fi 802.11n. Это руководство представляет собой введение в работу с Wi-Fi на Raspberry Pi Pico W с использованием MicroPython. Мы рассмотрим настройку Pico в качестве Wi-Fi станции и точки доступа (AP), сканирование ближайших Wi-Fi сетей, подключение Pico к вашей локальной сети и получение информации о его IP-адресе.
Впервые работаете с Raspberry Pi Pico? Начните здесь: Начало работы с Raspberry Pi Pico.
Необходимые условия — прошивка MicroPython
Для выполнения этого руководства вам необходимо установить прошивку MicroPython на плату Raspberry Pi Pico. Вам также понадобится IDE для написания и загрузки кода на плату.
Рекомендуемой IDE для работы с MicroPython на Raspberry Pi Pico является Thonny IDE. Следуйте приведённому ниже руководству, чтобы узнать, как установить Thonny IDE, прошить MicroPython и загрузить код на плату.
Wi-Fi станция и точка доступа Wi-Fi
Raspberry Pi Pico может работать в качестве Wi-Fi станции или в качестве точки доступа Wi-Fi.
Wi-Fi станция
Когда Pico настроен в качестве Wi-Fi станции, он может подключаться к другим сетям (например, к вашему роутеру — локальной сети). В этом случае роутер присваивает вашей плате уникальный IP-адрес. Вы можете взаимодействовать с Raspberry Pi Pico, используя другие устройства (станции), также подключённые к той же сети, обращаясь к локальному IP-адресу Raspberry Pi Pico.
Поскольку роутер также подключён к интернету, мы можем запрашивать информацию из интернета с помощью нашей платы, например, данные из API (данные о погоде и т.д.), публиковать данные на онлайн-платформах, использовать иконки и изображения из интернета на страницах нашего веб-сервера или подключать JavaScript-библиотеки.
Однако в некоторых случаях поблизости может не быть роутера для подключения Raspberry Pi Pico. В такой ситуации вы можете настроить свою плату в качестве точки доступа.
Точка доступа (AP)
Когда ваш Pico настроен как точка доступа (AP), другие устройства (такие как смартфон, планшет или компьютер) могут подключаться к нему без необходимости в роутере; Pico создаёт собственную Wi-Fi сеть. В отличие от роутера, точка доступа не подключается далее к проводной сети или интернету, поэтому вы не сможете получить доступ к внешним библиотекам, публиковать показания датчиков в облаке или использовать такие сервисы, как электронная почта.
Интерфейсы станции и точки доступа
Существует модуль MicroPython под названием network, который используется для настройки и управления всем, что связано с Wi-Fi. Есть два Wi-Fi интерфейса — один для станции, другой для точки доступа. Следующий пример создаёт интерфейс станции и интерфейс точки доступа и проверяет, активны ли они.
import network
sta_if = network.WLAN(network.STA_IF)
print(sta_if.active())
ap_if = network.WLAN(network.AP_IF)
print(ap_if.active())
После запуска этого примера вы должны получить примерно следующее.
На данный момент у вас нет ни одного активного интерфейса.
Сканирование ближайших Wi-Fi сетей
Чтобы просканировать ближайшие Wi-Fi сети, сначала необходимо запустить интерфейс Wi-Fi станции. Например:
# Инициализация Wi-Fi интерфейса
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
Затем мы можем использовать wlan.scan() для сканирования ближайших сетей. Эта команда возвращает список именованных кортежей, которые включают SSID, BSSID, RSSI, канал Wi-Fi и другие данные.
# Сканирование доступных Wi-Fi сетей
networks = wlan.scan()
Далее мы можем перебрать все найденные сети и вывести их информацию. Полный код приведён ниже.
import network
# Инициализация Wi-Fi интерфейса
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
# Сканирование Wi-Fi сетей
networks = wlan.scan()
# Вывод Wi-Fi сетей
print("Available WiFi Networks:")
for network_info in networks:
print(network_info)
Запустите предыдущий код на вашем Raspberry Pi Pico. Он должен вернуть список ближайших Wi-Fi сетей и соответствующую информацию. Информация о сети разделена запятыми и представлена в следующем порядке: SSID, BSSID, RSSI, канал.
RSSI — это индикатор уровня принимаемого сигнала, и он показывает, насколько силён сигнал Wi-Fi. Чем ниже значение, тем хуже сигнал.
Что касается двух последних чисел, на данный момент документация не даёт чёткого объяснения, что именно означают эти числа. Предположительно, они представляют режим аутентификации и то, скрыта ли сеть или нет. К сожалению, получаемые значения не соответствуют диапазону, указанному в документации. Таким образом, они либо означают что-то другое, либо имеется какая-то ошибка.
Подключение Raspberry Pi Pico к Wi-Fi сети
Подключение вашей платы Pico к Wi-Fi сети очень просто благодаря модулю MicroPython network. Для подключения к сети вам нужно знать SSID (имя вашей Wi-Fi сети) и пароль.
Когда устройство подключается к сети, роутер присваивает этому устройству IP-адрес. Все устройства, подключённые к сети, имеют уникальный IP-адрес. Таким образом, когда вы подключаете Raspberry Pi Pico к роутеру, он присвоит ему уникальный IP-адрес в вашей сети.
Следующий пример подключает Raspberry Pi Pico к вашей сети и выводит IP-адрес, присвоенный Pico в вашей сети.
import network
from time import sleep
# Учётные данные Wi-Fi
ssid = 'REPLACE_WITH_YOUR_SSID'
password = 'REPLACE_WITH_YOUR_PASSWORD'
# Инициализация Wi-Fi интерфейса
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
# Подключение к сети
wlan.connect(ssid, password)
# Ожидание подключения к Wi-Fi
connection_timeout = 10
while connection_timeout > 0:
if wlan.status() >= 3:
break
connection_timeout -= 1
print('Waiting for Wi-Fi connection...')
sleep(1)
# Проверка успешности подключения
if wlan.status() != 3:
raise RuntimeError('Failed to establish a network connection')
else:
print('Connection successful!')
network_info = wlan.ifconfig()
print('IP address:', network_info[0])
Как работает код
Давайте кратко рассмотрим, как работает приведённый выше код.
Импорт модуля network
Сначала необходимо импортировать модуль network.
import network
Модуль network предоставляет несколько методов для создания и управления Wi-Fi интерфейсами и подключениями.
Ввод учётных данных Wi-Fi
В следующих двух переменных необходимо указать SSID вашей сети и пароль.
# Учётные данные Wi-Fi
ssid = 'REPLACE_WITH_YOUR_SSID'
password = 'REPLACE_WITH_YOUR_PASSWORD'
Подключение к интернету
Создайте сетевой интерфейс станции и затем активируйте его.
# Инициализация Wi-Fi интерфейса
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
Затем используйте этот интерфейс для подключения к домашней сети с помощью SSID и пароля, которые вы определили ранее.
# Подключение к сети
wlan.connect(ssid, password)
Проверка статуса подключения и вывод IP-адреса
Далее мы проверим статус подключения и выведем IP-адрес при успешном подключении.
# Ожидание подключения к Wi-Fi
connection_timeout = 10
while connection_timeout > 0:
if wlan.status() >= 3:
break
connection_timeout -= 1
print('Waiting for Wi-Fi connection...')
sleep(1)
# Проверка успешности подключения
if wlan.status() != 3:
raise RuntimeError('Failed to establish a network connection')
else:
print('Connection successful!')
network_info = wlan.ifconfig()
print('IP address:', network_info[0])
Код сначала проверяет статус подключения, и если wlan.status() >= 3 (это означает, что произошло либо успешное подключение к сети, либо ошибка подключения), цикл завершается. Ожидание длится максимум 10 секунд (10 попыток, определённых в переменной connection_timeout).
Метод wlan.status(), как следует из названия, проверяет состояние Wi-Fi подключения Raspberry Pi. Этот метод возвращает целое число со следующими значениями:
0: WLAN не включён
1: WLAN в данный момент сканирует сети
2: WLAN подключается к сети
3: WLAN подключён к сети
4: WLAN не удалось подключиться к сети
Затем мы проверяем, подключён он или нет (мы знаем, что статус = 3 означает подключение). Если wlan.status() отличается от 3, значит, не удалось установить соединение.
if wlan.status() != 3:
raise RuntimeError('Failed to establish a network connection')
В противном случае это означает, что подключение прошло успешно. В случае успеха мы можем получить информацию о сети с помощью метода ifconfig(). Этот метод возвращает кортеж со следующей информацией:
network_info[0]: IP-адрес, присвоенный Pico в сети.network_info[1]: маска подсети.network_info[2]: IP-адрес шлюза.network_info[3]: IP-адрес DNS-сервера (Domain Name System).
Нам нужен только IP-адрес, поэтому мы берём первый элемент массива (network_info[0]).
else:
print('Connection successful!')
network_info = wlan.ifconfig()
print('IP address:', network_info[0])
Метод isconnected()
Вместо проверки статуса подключения, объект wlan поддерживает метод isconnected(), который возвращает True, если плата подключена к сети, или False в противном случае. Вы можете использовать этот подход вместо проверки wlan.status().
Тестирование кода
Запустите предыдущий код. Не забудьте заменить переменные ssid и password данными вашей сети.
# Учётные данные Wi-Fi
ssid = 'REPLACE_WITH_YOUR_SSID'
password = 'REPLACE_WITH_YOUR_PASSWORD'
После нескольких попыток он должен подключиться к вашей сети и отобразить IP-адрес.
Устранение неполадок
Если ваш Raspberry Pi Pico не подключается к сети:
проверьте, что вы вводите правильные SSID и пароль; пробелы и регистр символов имеют значение;
проверьте, что ваша сеть отображается при сканировании Wi-Fi сетей, которое мы выполняли ранее;
убедитесь, что Raspberry Pi Pico расположен достаточно близко к роутеру, чтобы он мог улавливать сигнал Wi-Fi.
Установка статического IP-адреса для Raspberry Pi Pico
В случае моей сети, даже если я перезагружу Raspberry Pi Pico несколько раз, мой роутер всегда будет присваивать ему один и тот же IP-адрес. Однако для некоторых других сетей это не так. В таком случае удобно иметь возможность установить статический IP-адрес для вашей платы, чтобы он не менялся при каждой перезагрузке. Кроме того, это может быть полезно для проектов, которые не подключены к компьютеру или не имеют возможности отобразить IP-адрес.
Вы можете использовать метод ifconfig объекта network.WLAN для установки статического IP-адреса.
Мы можем легко модифицировать предыдущий пример, добавив всего несколько строк для установки статического IP-адреса.
import network
import time
# Учётные данные Wi-Fi
ssid = 'REPLACE_WITH_YOUR_SSID'
password = 'REPLACE_WITH_YOUR_PASSWORD'
# Конфигурация статического IP
static_ip = '192.168.1.100' # Замените на желаемый статический IP
subnet_mask = '255.255.255.0'
gateway_ip = '192.168.1.254'
dns_server = '8.8.8.8'
# Инициализация Wi-Fi интерфейса
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
# Подключение к сети
wlan.connect(ssid, password)
# Ожидание подключения к Wi-Fi
connection_timeout = 10
while connection_timeout > 0:
if wlan.status() >= 3:
break
connection_timeout -= 1
print('Waiting for Wi-Fi connection...')
time.sleep(1)
# Установка статического IP-адреса
wlan.ifconfig((static_ip, subnet_mask, gateway_ip, dns_server))
# Проверка успешности подключения
if wlan.status() != 3:
raise RuntimeError('Failed to establish a network connection')
else:
print('Connection successful!')
network_info = wlan.ifconfig()
print('IP address:', network_info[0])
Конфигурация статического IP
Замените значения в переменных static_ip, subnet_mask, gateway_ip и dns_server на соответствующие значения для вашей сети.
# Конфигурация статического IP
static_ip = '192.168.1.100' # Замените на желаемый статический IP
subnet_mask = '255.255.255.0'
gateway_ip = '192.168.1.254'
dns_server = '8.8.8.8'
Как узнать эти значения?
Существуют различные способы получить информацию о маске подсети и IP-адресе шлюза. Самый простой способ — открыть окно терминала на компьютере и выполнить следующую команду:
На Windows:
ipconfig
На MacOS или Linux:
ifconfig
Она вернёт нужную вам информацию: IP-адрес шлюза (IP-адрес вашего роутера) и маску подсети.
В моём случае маска подсети — 255.255.255.0, а IP-адрес шлюза — 192.168.1.254.
Для DNS-сервера вы всегда можете использовать 8.8.8.8 — это публичный DNS-сервер Google.
При выборе статического IP-адреса для вашего Raspberry Pi Pico убедитесь, что этот адрес не используется другим устройством. Для этого вы можете использовать программу наподобие Angry IP Scanner (совместимую с Windows и Mac OS). Или вы можете войти в панель управления роутера и проверить, какие IP-адреса уже назначены.
Установка статического IP-адреса
После присвоения правильных значений переменным конфигурации мы можем просто использовать метод ifconfig() и передать в качестве аргументов статический IP, маску подсети, IP шлюза и DNS-сервер, в указанном порядке.
wlan.ifconfig((static_ip, subnet_mask, gateway_ip, dns_server))
Тестирование кода
После ввода учётных данных сети и желаемых настроек IP-адреса вы можете запустить код на вашем Raspberry Pi Pico.
Обратите внимание, что ему будет присвоен IP-адрес, который вы определили в коде. В нашем случае — 192.168.1.100.
Заключение
Это руководство было кратким введением в работу с Wi-Fi на Raspberry Pi Pico, программируемом с помощью MicroPython. Надеемся, что вы найдёте его полезным.
Вам также могут быть интересны другие руководства, связанные с Wi-Fi на Raspberry Pi Pico: