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

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

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

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

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

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

Примеры работы

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

Маячок

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

Что понадобится
Код для MicroPython
raspberry-pi-pico-example-micropython-blink.py
# Библиотека для работы с пинами ввода-вывода
from machine import Pin
# Библиотека для работы с временем
import time
 
# Светодиод в режим выхода на 25 пине
led = Pin(25, 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-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-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')

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

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

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

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

  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.

Маячок

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

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

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

Гирлянда

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

Что понадобится
Схема устройства

Код для Arduino

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

raspberry-pi-pico-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-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 выполнена на чипе собственной разработки RP2040 от компании Raspberry Pi Foundation. Кристалл содержит двухъядерный процессор на архитектуре ARM Cortex M0+ с тактовой частотой до 133 МГц. На RP2040 также расположились часы реального времени, датчик температуры и оперативная память на 264 КБ.

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

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

Порт micro-USB

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

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

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

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

На плате расположен универсальный преобразователь питания 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
  • Встроенные периферийные устройства:
    • Часы реального времени (RTC)
    • Датчик температуры
  • Напряжение логических уровней: 3,3 В
  • Входное напряжение питания:
    • Через USB: 5 В
    • Через пин VSYS: 1,8–5,5 В
  • Габариты платы (без ног): 52,7×21×3,6 мм
  • Габариты платы (с ногами): 52,7×21×12,3 мм

Ресурсы

Магазин

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

Документация