Беспроводная связь между двумя Raspberry Pi Pico W

Беспроводная связь между двумя Raspberry Pi Pico W

В этом руководстве мы заставим один Raspberry Pi Pico W отправлять случайные значения RGB (красный, зелёный, синий) другой плате Pico W! Это очень простой проект для знакомства с WiFi-связью на MicroPython, который может стать основой для самых разных проектов.

В проекте обе платы Pico W подключаются к домашней WiFi-сети: одна работает как сервер, а другая — как клиент.

Тони придумал это руководство, экспериментируя со своими платами Pico W вскоре после выхода нового беспроводного Pico.


Небольшое замечание — это, пожалуй, не лучший первый проект, если вы ещё не работали с Pico раньше. Для разминки и знакомства Raspberry Pi предлагает отличное Руководство по началу работы , а книга «Get Started with MicroPython on Raspberry Pi Pico» тоже хорошо подойдёт!


Что вам понадобится

  • 2 x платы Raspberry Pi Pico W

  • 2 x кабеля USB — Micro-USB

  • Редактор Thonny, установленный на вашем ПК

  • Имя вашей WiFi-сети (SSID) и пароль

Описание системы

Вкратце

  • Обе платы Pico W подключаются к вашей WiFi-сети

  • Pico W №1 запускает небольшой веб-сервер, который принимает запросы и отправляет ответы плате Pico W №2

  • Pico W №2 непрерывно посылает запросы к веб-серверу на Pico W №1 и получает ответы обратно

Как это работает?

Обе платы Pico получают SSID и пароль вашей WiFi-сети. На первой Pico W поднимается очень простой веб-сервер, который ждёт запросов от второй Pico W. Для простоты мы не разбираем запросы, а обрабатываем их все одинаково. Мы просто генерируем три значения от 0 до 255 включительно, представляющих красную, зелёную и синюю составляющие цвета.

Первая Pico упаковывает их в строку, разделённую запятыми, и отправляет её в качестве ответа второй Pico W. Программа печатает свой локальный адрес после подключения к сети. Этот адрес нужно записать, так как он используется второй Pico W для запроса данных.

Вторая Pico W многократно отправляет запросы к веб-серверу и получает обратно строку с данными, которая затем распаковывается в три значения цвета и отображается.

В целях безопасности мы сохраняем SSID и пароль в отдельном файле-библиотеке, чтобы они не были видны в основном коде программы.

Настройка

1. Установите UF2-файл для Pico W

Сначала убедитесь, что на обеих ваших платах Pico установлен последний UF2-файл Raspberry Pi MicroPython (версия, специфичная для Pico W). UF2-файлы доступны здесь.

Чтобы установить его на Pico, удерживайте кнопку BOOTSEL при подключении платы к USB-порту. Ваша Pico должна отобразиться как устройство хранения данных (как диск), после чего просто перетащите на него UF2-файл. Это установит прошивку на плату. После завершения Pico автоматически перезагрузится и будет готова к использованию.

Пока что отключите обе платы и читайте дальше.

UF2-файл для Pico W

2. Настройте Thonny

Чтобы немного упростить работу, мы можем настроить Thonny так, чтобы можно было открыть сразу два окна Thonny (два экземпляра) одновременно, что позволит иметь отдельное окно Thonny для каждой Pico.

Для этого откройте Thonny и перейдите в Tools > Options > General и снимите галочку «Allow only single Thonny instance».

Несколько экземпляров Thonny

Теперь перезапустите Thonny и подключите обе платы Pico W. Выберите Run > Select Interpreter и выберите первый доступный COM-порт.

COM-порт в Thonny

Далее откройте второй экземпляр Thonny (просто снова запустите программу из обычного меню). Повторите тот же процесс и выберите другой COM-порт.

Теперь у вас запущены два окна Thonny, по одному для каждой Pico W!

3. Установите PyStone Lowmem

Теперь нужно установить несколько пакетов на обе платы.

Сначала пакет micropython-pystone_lowmem. В Thonny перейдите в Tools > Manage Packages и найдите micropython-pystone_lowmem.

Нажмите на верхний результат, как показано ниже, и установите его.

pystone lowmem

Затем нужно установить urequests тем же способом (проигнорируйте любые предупреждения):

urequests

Теперь в окне REPL Thonny (Read Evaluate Print Loop) попробуйте выполнить следующее в командной строке (сначала потребуется сохранить, о чём программа напомнит):

import pystone_lowmem
pystone_lowmem.main()

Вы должны увидеть что-то похожее на это:

Вывод pystone

Теперь повторите те же шаги для второй Pico в другом окне Thonny, так как обе платы должны быть настроены одинаково, чтобы проект работал.

4. Создайте библиотеку Secret

Создайте новое окно программы в обоих окнах Thonny и скопируйте следующие строки:

ssid = 'SSID'
password = 'PASSWORD'

Вставьте значения своей WiFi-сети между одинарными кавычками и сохраните программу на обеих платах под именем secret.py.

Создание веб-сервера (Pico №1)

Эта программа настраивает простой веб-сервер (на Pico №1), который генерирует значения RGB и отправляет их по запросу.

Скопируйте приведённый ниже код в новое окно Thonny на первой плате Pico W, затем сохраните его как server.py.

# Webserver to send RGB data
# Tony Goodhew 5 July 2022
import network
import socket
import time
from machine import Pin, ADC
from secret import ssid,password
import random
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)

# Wait for connect or fail
max_wait = 10
while max_wait > 0:
    if wlan.status() < 0 or wlan.status() >= 3:
        break
    max_wait -= 1
    print('waiting for connection...')
    time.sleep(1)

# Handle connection error
if wlan.status() != 3:
    raise RuntimeError('network connection failed')
else:
    print('connected')
    status = wlan.ifconfig()
    print( 'ip = ' + status[0] )

# Open socket
addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()
s.bind(addr)
s.listen(1)

print('listening on', addr)

# Listen for connections
while True:
    try:
        cl, addr = s.accept()
        print('client connected from', addr)
        request = cl.recv(1024)
        print(request)
        # Do not unpack request
        # We reply to any request the same way
        # Generate 3 values to send back
        r = random.randint(0,255)
        g = random.randint(0,255)
        b = random.randint(0,255)
        # Join to make a simple string with commas as separators
        rgb = str(r) + "," + str(g) + ","+str(b)

        response = rgb # This is what we send in reply

        cl.send(response)
        print("Sent:" + rgb)
        cl.close()

    except OSError as e:
        cl.close()
        print('connection closed')

Теперь запустите программу в Thonny, и она покажет вам IP-адрес. Запишите его, затем перейдите к Pico №2 для настройки программы клиента.

IP-адрес сервера

Создание программы клиента (Pico №2)

Эта программа клиента запрашивает данные с веб-сервера, распаковывает их на три составляющих и выводит на экран.

Скопируйте приведённый ниже код в новое окно Thonny на второй плате Pico W, но перед сохранением обновите IP-адрес на IP-адрес вашего сервера Pico №1. Найдите строку ниже и измените её, указав правильный IP-адрес:

ai = socket.getaddrinfo("192.168.1.27", 80) # Address of Web Server

После обновления сохраните файл как client.py на Pico.

# Program to read RGB values from a local Pico Web Server
# Tony Goodhew 5th July 2022
# Connect to network
import network
import time
from secret import ssid, password
import socket

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
while not wlan.isconnected() and wlan.status() >= 0:
    print("Waiting to connect:")
    time.sleep(1)

# Should be connected and have an IP address
wlan.status() # 3 == success
wlan.ifconfig()
print(wlan.ifconfig())

while True:
    ai = socket.getaddrinfo("192.168.0.15", 80) # Address of Web Server
    addr = ai[0][-1]

    # Create a socket and make a HTTP request
    s = socket.socket() # Open socket
    s.connect(addr)
    s.send(b"GET Data") # Send request
    ss=str(s.recv(512)) # Store reply
    # Print what we received
    print(ss)
    # Split into RGB components
    l = len(ss)
    ss = ss[2:l-1]     # Strip to essentials
    p = ss.find(",")   # Find first comma
    r = int(ss[0:p])   # Extract RED value
    ss = ss[p+1:]      # Remove red part
    p = ss.find(",")   # Find comma separator
    g = int(ss[0:p])   # Extract GREEN value
    b = int(ss[p+1:])  # Extract BLUE value
    print(r,g,b)       # Print RGB values
    print()
    # Set RGB LED here
    s.close()          # Close socket
    time.sleep(0.2)    # wait

Запустите проект!

Сервер на Pico №1 должен уже работать, поэтому теперь запустите файл клиента на вашей второй плате Pico W.

Вы должны увидеть вывод, похожий на пример ниже, в Thonny на вашей клиентской плате Pico, со значениями RGB, которые выводятся одно за другим:

Вывод клиента в Thonny

Мы запускали эти скрипты вручную, но, например, вы могли бы сохранить программу веб-сервера на первую Pico W под именем main.py, чтобы она запускалась при включении питания.

Что попробовать дальше

  • Подключите 3 потенциометра к веб-серверу для подачи данных

  • Управляйте 3 светодиодами или RGB-светодиодом с помощью данных, полученных клиентом

  • Передавайте данные с датчика (например, температуру и влажность) с сервера на клиент

  • Разнесите Pico подальше, чтобы проверить дальность действия WiFi-соединения

Об авторе

Эту статью написал Тони Гудхью (Tony Goodhew). Тони — учитель информатики на пенсии, начавший программировать ещё в 1968 году, когда это называлось «написание программ» — он начинал с FORTRAN IV на IBM 1130! Активный участник сообщества Raspberry Pi, главные интересы которого сейчас — программирование на MicroPython, путешествия и фотография.