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 W — начало работы с Wi-Fi MicroPython

Впервые работаете с 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.

Raspberry Pi Pico Wi-Fi станция

Поскольку роутер также подключён к интернету, мы можем запрашивать информацию из интернета с помощью нашей платы, например, данные из API (данные о погоде и т.д.), публиковать данные на онлайн-платформах, использовать иконки и изображения из интернета на страницах нашего веб-сервера или подключать JavaScript-библиотеки.

Однако в некоторых случаях поблизости может не быть роутера для подключения Raspberry Pi Pico. В такой ситуации вы можете настроить свою плату в качестве точки доступа.

Точка доступа (AP)

Когда ваш Pico настроен как точка доступа (AP), другие устройства (такие как смартфон, планшет или компьютер) могут подключаться к нему без необходимости в роутере; Pico создаёт собственную Wi-Fi сеть. В отличие от роутера, точка доступа не подключается далее к проводной сети или интернету, поэтому вы не сможете получить доступ к внешним библиотекам, публиковать показания датчиков в облаке или использовать такие сервисы, как электронная почта.

Raspberry Pi Pico в качестве точки доступа

Интерфейсы станции и точки доступа

Существует модуль 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())

Просмотреть исходный код

После запуска этого примера вы должны получить примерно следующее.

Rpi Pico — проверка интерфейсов Wi-Fi станции и точки доступа

На данный момент у вас нет ни одного активного интерфейса.


Сканирование ближайших 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, канал.

RPi Pico — сканирование Wi-Fi сетей

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 — подключение к сети и получение 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
Команда ipconfig

Она вернёт нужную вам информацию: IP-адрес шлюза (IP-адрес вашего роутера) и маску подсети.

Детали WLAN — ipconfig

В моём случае маска подсети — 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.

Raspberry Pi Pico — установка статического IP-адреса

Заключение

Это руководство было кратким введением в работу с Wi-Fi на Raspberry Pi Pico, программируемом с помощью MicroPython. Надеемся, что вы найдёте его полезным.

Вам также могут быть интересны другие руководства, связанные с Wi-Fi на Raspberry Pi Pico: