Raspberry Pi Pico W: инструкция, программирование на MicroPython / C++ и документация

Используйте платформу Raspberry Pi Pico W для создания электронных гаджетов, метеостанций, роботов и других изобретений. Плата программируется на языке MicroPython или C++ и отлично подойдёт как начинающим мейкерам, так и опытным разработчикам.

Платформа Raspberry Pi Pico W поставляется в двух вариантах исполнения:

Программирование на MicroPython

Рассмотрим программирование Raspberry Pi Pico W на языке MicroPython с помощью ПК на OS Windows.

Подключение и настройка

  1. На этом всё, можно смело переходить к примерам работы.

Рассмотрим несколько примеров работы программирования Pico Wi-Fi на MicroPython.

Маячок

Для начала мигнём встроенным светодиодом LED на плате.

В Raspberry Pi Pico W встроенный светодиод подключен не к микроконтроллеру RP2040, а к чипу беспроводной связи CYW43439 к пину WL_GPIO0. Для удобного доступа к управлению светодиодом используйте обозначение LED.

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

Код для MicroPython

raspberry-pi-pico-w-example-micropython-blink.py
# Библиотека для работы с пинами ввода-вывода
from machine import Pin
# Библиотека для работы с временем
import time
 
# Светодиод в режим выхода
# на чипе беспроводной связи CYW43439 на пине 0
led = Pin('LED', Pin.OUT)
 
while True:
    # Зажигаем светодиод
    led.value(1)
    # Ждём 1 секунду
    time.sleep(1)
    # Гасим светодиод
    led.value(0)
    # Ждём 1 секунду
    time.sleep(1)

После запуска скрипта, светодиод начнёт мигать раз в секунду.

Гирлянда

Главная фишка Пико — возможность программируемого ввода-вывода через блоки PIO, на которых можно реализовать произвольный интерфейс. В следующем примере заставим Pico рулить светодиодами WS2812.

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

Схема устройства

Код для MicroPython

Для работы примера скачайте и установите библиотеку MicroPython Neopixel Pi Pico.

raspberry-pi-pico-w-example-micropython-ws2812-rainbow.py
# Библиотека для работы с временем
import time
# Библиотека для работы со светодиодами WS2812
from neopixel import Neopixel
 
# Номер пина, к которому подключена матрица WS2812
led_pin = 11
# Количество светодиодов
led_count = 16
 
# Создаём объект для работы со светодиодной матрицей
strip = Neopixel(led_count, 0, led_pin, "GRB")
 
# Создаём фиксированные цвета
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
off = (0, 0, 0)
 
colors = (red, green, blue, off)
 
# Устанавливаем яркость светодиодов
# Диапазон значений от 0 до 255
strip.brightness(40)
 
while True:
    # Перебираем цвета
    for color in colors:
        # Перебираем светодиоды
        for i in range(led_count):
            #Выставляем цвет светодиода
            strip.set_pixel(i, color)
            # Ждём 100 мс
            time.sleep(0.1)
            # Обновляем изменения
            strip.show()

После прошивки управляющей платформы, вы увидите заполнение по очереди каждого светодиода матрицы из красного, зелёного и синего цветов.

Вывод информации на дисплей

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

Схема устройства

Код для MicroPython

Для работы примера скачайте и установите библиотеку MicroPython ST7032

raspberry-pi-pico-w-example-micropython-lcd-1602.py
# Библиотека для работы с пинами ввода-вывода
from machine import Pin, I2C
# Библиотека для работы дисплеем на чипе ST7032
from ST7032 import ST7032
 
# Номер пина, к которому подключена подсветка дисплея
lcd_led_pin = 11
# Пин подсветки в режим выхода
lcd_led = Pin(lcd_led_pin, Pin.OUT)
# Включаем подсветку
lcd_led.value(1)
 
# Создаём I²C соединение
i2c=I2C(0, scl=Pin(1), sda=Pin(0), freq=100000)
# Создаём объект для работы с дисплеем
lcd = ST7032(i2c)
 
# Очищаем экран
lcd.clear()
# Устанавливаем контрастность
lcd.setContrast(15)
 
# Устанавливаем курсор в колонку 0, строку 0
lcd.setCursor(0, 0)
lcd.print('Hello, world!')
# Устанавливаем курсор в колонку 0, строку 1
lcd.setCursor(0, 1)
lcd.print('Pico chip RP2040')

После прошивки управляющей платформы, на дисплее отобразится приветствующий текст.

WebClient

WebServer

Программирование на С++ через Arduino IDE

Рассмотрим программирование Raspberry Pi Pico W на языке C++ в среде Arduino IDE с помощью ПК на OS Windows.

На текущий момент официальное ядро Arduino Mbed OS RP2040 Boards подерживает только плату Raspberry Pi Pico, которая выпускается без модуля CYW43439 с поддержкой Wi-Fi и Bluetooth. Это накладывает ограничения на использования из среды Arduino IDE скетчи с использованием беспроводных технологий, а также управления встроенным светодиодом, который также подключён чипу CYW43439. Все примеры ниже будут использовать плату без техноголий Wi-Fi и Bluetooth.

Мы в компании Амперка уверены, что в будущем разработчики Arduino добавят поддержку Raspberry Pi Pico W в ядро. Для самых пытливых советуем использовать сторонее ядро arduino-pico с полной поддержкой платы Raspberry Pi W.

Подключение и настройка

  1. По умолчанию среда Arduino IDE настроена только на AVR-платы. Для работы с платформой Raspberry Pi Pico — добавьте в менеджере плат поддержку платформ Arduino Mbed OS RP2040 Boards.
  2. В Arduino IDE выберите плату Raspberry Pi Pico: Инструменты Плата Arduino Mbed OS RP2040 Boards Raspberry Pi Pico
  3. В Arduino IDE выберите COM-порт: Инструменты Порт COMx, где x — номер текущего порта.
  4. Это значит всё получилось и можно смело переходить к примерам работы.

Рассмотрим несколько примеров работы программирования Pico на C++ через Arduino IDE.

Маячок

Для начала подключим светодиод к 15 пину платы Raspbeery Pi Pico W и заставим его мигать.

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

Схема устройства

Код для Arduino

raspberry-pi-pico-example-arduino-blink.ino
// Даём имя встроенному светодиоду на 15 пине
constexpr uint8_t LED_PIN = 15;
 
void setup() {
  // Настраиваем пин со светодиодом в режим выхода
  pinMode(LED_PIN, OUTPUT);
}
 
void loop() {
  // Зажигаем светодиод
  digitalWrite(LED_PIN, HIGH);
  // Ждём 1 секунду
  delay(1000);
  // Гасим светодиод 
  digitalWrite(LED_PIN, LOW);
  // Ждём 1 секунду
  delay(1000);
}

После прошивки скетча, светодиод начнёт мигать раз в секунду.

Гирлянда

Интересная фишка Pico W — возможность программируемого ввода-вывода через блоки PIO, на которых можно реализовать произвольный интерфейс. В следующем примере заставим Pico рулить светодиодами WS2812.

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

Схема устройства

Код для Arduino

Для работы примера скачайте и установите библиотеку Adafruit NeoPixel.

raspberry-pi-pico-w-example-arduino-ws2812-rainbow.ino
// Библиотека для работы со светодиодами WS2812
#include <Adafruit_NeoPixel.h>
 
// Номер пина, к которому подключена матрица WS2812
constexpr uint8_t LED_PIN = 11;
 
// Количество светодиодов в матрице
constexpr uint8_t LED_COUNT = 16;
 
// Создаём объект для работы со светодиодной матрицей
Adafruit_NeoPixel matrix = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
 
void setup() {
  // Инициализация матрицы
  matrix.begin();
  // Устанавливаем яркость светодиодов
  // Диапазон значений от 0 до 255
  matrix.setBrightness(40);
}
 
void loop() {
  // Заполняем матрицу по сегментам «бегущий огонь» красного цвета
  colorWipe(matrix.Color(255, 0, 0), 100);
  // Заполняем матрицу по сегментам «бегущий огонь» зелёного цвета
  colorWipe(matrix.Color(0, 255, 0), 100);
  // Заполняем матрицу по сегментам «бегущий огонь» синего цвета
  colorWipe(matrix.Color(0, 0, 255), 100);
  // Гасим матрицу по сегментам «бегущая тень»
  colorWipe(matrix.Color(0, 0, 0), 100);
}
 
// Функция заполнения каждого сегмента
void colorWipe(uint32_t c, uint8_t wait) {
  for (uint16_t i = 0; i < matrix.numPixels(); i++) {
    // Заполняем текущий сегмент выбранным цветом
    matrix.setPixelColor(i, c);
    matrix.show();
    // Ждём
    delay(wait);
  }
}

После прошивки управляющей платформы, вы увидите заполнение по очереди каждого светодиода матрицы из красного, зелёного и синего цветов.

Вывод информации на дисплей

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

Схема устройства

Код для Arduino

Для работы примера скачайте и установите библиотеку TroykaTextLCD.

raspberry-pi-pico-w-example-arduino-lcd-1602.ino
// Библиотека для работы с дисплеем
#include <TroykaTextLCD.h>
 
// Номер пина, к которому подключена подсветка дисплея
constexpr uint8_t LCD_LED_PIN = 15;
 
// Создаём объект I²C и передаём ему номера пинов SDA и SCL
MbedI2C i2c(0, 1);
// Создаём объект для работы с дисплеем
// передаём ему объект I²C, I²C-адрес и пин подсветки
TroykaTextLCD lcd(&i2c, 0x3E, LCD_LED_PIN);
 
 
void setup() {
  // Устанавливаем количество столбцов и строк экрана
  lcd.begin(16, 2);
  // Устанавливаем контрастность в диапазоне от 0 до 63
  lcd.setContrast(45);
  // Устанавливаем яркость в диапазоне от 0 до 255
  lcd.setBrightness(255);
  // Устанавливаем курсор в колонку 0, строку 0
  lcd.setCursor(0, 0);
  // Печатаем первую строку
  lcd.print("Hello, world!");
  // Устанавливаем курсор в колонку 0, строку 1
  lcd.setCursor(0, 1);
  // Печатаем вторую строку
  lcd.print("Pico chip RP2040");
}
 
void loop() {
}

После прошивки управляющей платформы, на дисплее отобразится приветствующий текст.

Запись загрузчика

  1. Перетяните файл с прошивкой методом Drag-and-drop в устройство Flash-накопителя с именем RPI-RP2.
  2. Переподключите питание на плате.

Режимы загрузки

Raspberry Pi Pico поддерживает два метода загрузки: штатный режим и режим загрузчика.

Штатный режим

Платформа загружается с внешней Flash-памяти, распаянной на плате Raspberry Pi Pico. В диспетчере устройств OS Windows плата отображается как виртуальный COM-порт с именем Устройство с последовательным интерфейсом USB.

Активация режима происходит простым подключением плате по USB.

Режим загрузчика

Платформа загружается с внутренней памяти микроконтроллера RP2040. В диспетчере устройств OS Windows плата отображается как съёмный накопитель с именем RPI-RP2. Режим служит для загрузки прошивки в формате UF2 простым перемещением файла с одного носителя на другой.

Активация режима происходит с помощью кнопки BOOTSEL:

  1. Зажмите кнопку BOOTSEL.
  2. Подключите плату к компьютеру по USB.
  3. Отпустите кнопку BOOTSEL.

Элементы платы

Микроконтроллер RP2040

Платформа Pi Pico Wi-Fi выполнена на чипе собственной разработки RP2040 от компании Raspberry Pi Foundation. Кристалл содержит двухъядерный процессор на архитектуре ARM Cortex M0+ с тактовой частотой до 133 МГц. На RP2040 также расположились часы реального времени, датчик температуры и оперативная память на 264 КБ.

Чип CYW43439

За беспроводную передачу данных отвечает чип CYW43439 для обмена данными по воздуху в диапазоне 2,4 ГГц по Wi-Fi и Bluetooth. Чип CYW43439 связан с основным контроллером RP2040 по интерфейсу SPI.

Внешняя Flash-память

Внешняя Flash-память распаяная на отдельном чипе W25Q16JVUXIQ объёмом 2 МБ.

Порт micro-USB

Разъём USB Micro предназначен для прошивки и питания платформы Raspberry Pi Pico W. Для подключения к ПК понадобится кабель USB (A — Micro USB).

Светодиодная индикация

Пользовательский светодиод на 0 пине чипа с CYW43439. При задании значения высокого уровня светодиод включается, при низком – выключается.

Не путайте:

Преобразователь напряжения

На плате расположен универсальный преобразователь питания SMPS (Switch Mode Power Supply) на чипе RT6150-33GQW, который обеспечивает питание микроконтроллера RP2040 и другой логики платы.

Диапазон входного напряжения — от 1,8 до 5,5 вольт: при низком входном напряжении регулятор поднимет питание до 3,3 вольт, а при высоком — понизит до 3,3 вольт. Максимальный выходной ток 800 мА. Выходное напряжение с регулятора можно снять с пина 3V3(OUT).

Кнопка BOOTSEL

На плате Pi Pico расположена кнопка, которая служит для перевода платформы в режим загрузчика.

Распиновка

В описании контактов будем использовать нумерацию GPx, где x — номер контакта.

Пины питания

Имя пина Описание
VBUS Входной пин для внешнего источника питания с напряжением ровно 5 В. Дублирует питание от USB. Линия VBUS связана с линией VSYS через обратный диод.
VBUS = 5 В → VSYS = 5 В, VSYS = 5 В → VBUS ≠ 5 В.
VSYS Входной пин для внешнего источника питания с напряжением от 1,8 до 5,5 В. Питание поступает на универсальный DC-DC преобразователь, который при низком входном напряжении поднимет питание до 3,3 вольт, а при высоком — понизит до 3,3 вольт. Максимальный выходной ток 800 мА.
3V3_EN Входной пин для управления DC-DC преобразователем. При высоком уровне регулятор включён и соотвествено плата включена, при низком уровне регулятор отключён и плата выключена.
По умолчанию 3V3_EN подтянут через резистор к линии питания VSYS, для отключения регулятора замкните контакт 3V3_EN на низкий уровень.
3V3_OUT Выходной пин с DC-DC преобразователя с напряжением 3,3 В и максимальным током 800 мА.
ADC_REF Входной пин для внешнего опорного напряжения АЦП, относительно которого происходят аналоговые измерения.
GND Общая земля.
AGND Общая аналоговая земля, которая является эталоном при использовании АЦП.

Пины ввода-вывода

Категория пинов Количество пинов Используемые пины Описание
Пины ввода-вывода GPIO 26 0 – 22, 26 – 28 Пины могут быть настроены как вход или выход. Логический уровень единицы — 3,3 В, нуля — 0 В. На вход можно подавать сигнал до 5 В.
ШИМ / PWM 26
(16 одновременно)
0 – 22, 26 – 28 Позволяют выводить аналоговое напряжение в виде ШИМ-сигнала. Разрядность ШИМ — 16 бит.
АЦП / ADC 3 26–28 Позволяют представить аналоговое напряжение в цифровом виде. Диапазон входного напряжения — от 0 до 3,3 В. Разрядность АЦП — 12 бит.
Интерфейс Количество / Название Используемые пины Описание
I²C I²C0 SDA0 — 4 (0, 8, 12, 16, 20, 24, 28)
SCL0 — 5 (1, 9, 13, 17, 21, 25, 29)
Для общения с периферией по интерфейсу I²C.
I²C1 SDA1 — 26 (2, 6, 10, 14, 18, 22)
SCL1 — 27 (3, 7, 11, 15, 19, 23, 27)
SPI SPI0 SCK0 — 18 (2, 6, 22)
TX0 — 19 (3, 7, 23)
RX0 — 16 (0, 4, 20)
CS0 — 17 (1, 5, 21)
Для общения с периферией по интерфейсу SPI.
SPI1 SCK1 — 14 (10, 26)
TX1 — 15 (11, 27)
RX1 — 12 (8, 24, 28)
CS1 — 13 (9, 25, 29)
Serial / UART UART0 RX0 — 1 (13, 17, 29)
TX0 — 0 (12, 16, 28)
Для общения с периферией по интерфейсу UART.
UART1 RX1 — 9 (5, 21, 25)
TX1 — 8 (4, 20, 24)

Принципиальная схема

Габаритные чертежи

Размеры Pico (без ног)

Размеры Pico (с ногами)

Характеристики

  • Микроконтроллер: RP2040
  • Ядро: 2× ARM Cortex-M0+ (32 бита)
  • Тактовая частота: 133 МГц
  • Flash-память: 2 МБ
  • SRAM-память: 264 КБ
  • Контакты ввода-вывода: 26
  • Контакты с АЦП: 3
  • Разрядность АЦП: 12 бит
  • Контакты с ШИМ: 16
  • Разрядность ШИМ: 16 бит
  • Контакты с программируемым PIO: 8
  • Каналы DMA: 12
  • Аппаратные интерфейсы:
    • 2× UART
    • 2× I²C
    • 2× SPI
    • 2× PIO
  • Модуль связи: Infineon CYW43439
    • Встроенная антенна ABRACON
    • Wi-Fi 802.11 b/g/n
    • Bluetooth v5.2
  • Встроенные периферийные устройства:
    • Часы реального времени (RTC)
    • Датчик температуры
  • Напряжение логических уровней: 3,3 В
  • Входное напряжение питания:
    • Через USB: 5 В
    • Через пин VSYS: 1,8–5,5 В
  • Габариты платы (без ног): 52,7×21×3,6 мм
  • Габариты платы (с ногами): 52,7×21×12,3 мм

Ресурсы

Магазин

Полезные статьи

Файлы