Перейти к содержимому

Raspberry Pi (Linux)

Семейство Raspberry Pi выполняет скрипты Python для цепи на холсте. В отличие от плат микроконтроллеров, здесь нечего компилировать: вы пишете скрипт, нажимаете Run, и Velxio выбирает один из двух движков для его выполнения. Ни один из движков не является рабочим столом Raspberry Pi OS, поэтому прочитайте эту страницу, прежде чем предполагать, что руководство, написанное для реального оборудования, заработает без изменений. Большинство из них работают: таблицы ниже были проверены на живом продукте, часть за частью, 19 и 20 сентября 2026 года.

Плата Профиль CPU
Raspberry Pi Zero / 1 / 2 Класс ARM Cortex-A7
Raspberry Pi 3 Cortex-A53
Raspberry Pi 4 Cortex-A72
Raspberry Pi 5 Cortex-A76

Любой может разместить Pi на холсте и собрать цепь вокруг него. Для запуска нужен платный план или одна из трёх бесплатных пробных сессий по 15 минут, которые получает каждая учётная запись для семейства Pi (см. планы). Если в проекте нет ничего, что Pi может выполнить, например скетч Arduino .ino на плате Pi, об этом сообщается до того, как будет потрачена пробная сессия.

Raspberry Pi 5 на холсте Velxio

Движок по умолчанию. Ваш скрипт выполняется на интерпретаторе Python, скомпилированном в WebAssembly внутри вкладки, запускается за несколько секунд и не требует ничего от серверов Velxio. Запись в выводы напрямую достигает холста, поэтому светодиод загорается в момент выполнения led.on(). I2C, SPI и 1-Wire присутствуют в виде файлов устройств, которые есть у Pi (/dev/i2c-1, /dev/spidev0.0, дерево /sys/bus/w1/devices), обслуживаемых частями, подключёнными на холсте, поэтому настоящие smbus2, w1thermsensor и Adafruit Blinka работают без изменений.

Это обычный интерпретатор, а не операционная система: здесь нет оболочки, нет subprocess, нет сырых сокетов. Скрипт, который запрашивает что-то из этого, перенаправляется в движок Linux; чип движка на панели инструментов показывает, какой движок будет запущен, а когда это Linux — файл и строку, которые этого потребовали.

Настоящая гостевая система Linux, загруженная в QEMU (-M virt, с профилем CPU вашей платы), доступ к которой осуществляется через последовательную консоль в рабочей области. Будьте точны в том, чем она является:

  • Alpine Linux, а не Raspberry Pi OS. python3 и pip установлены; apt, raspi-config, рабочий стол и инструменты прошивки Pi отсутствуют.
  • Нет сети изнутри гостевой системы, намеренно. Ничто внутри не может достичь PyPI; пакеты, объявленные проектом в requirements.txt, доступны для импорта в момент загрузки гостевой системы, а сам pip работает офлайн с локальным хранилищем колёс (см. ниже).
  • Шинные интерфейсы разъёмов — это настоящие файлы устройств. /dev/i2c-0, /dev/i2c-1, /dev/spidev0.0 и /dev/spidev0.1 отвечают на те же системные вызовы, что и на Pi, поэтому библиотека, которая открывает их сама (Adafruit Blinka), программа на C или ваш собственный код ioctl взаимодействуют с частями на холсте. Адрес, который никто не занимает, завершается ошибкой OSError: [Errno 121] Remote I/O error, как на реальном оборудовании.
  • smbus2 и spidev — это оригинальные пакеты, а не заменители Velxio: import smbus2 даёт вам настоящий smbus2, import spidev — скомпилированный py-spidev, и оба проходят через эти узлы устройств. Поэтому правила ядра применяются так же, как на плате. Блочная передача SMBus длиннее 32 байт завершается ошибкой, а не тихо укорачивается, а открытие несуществующей шины, например SMBus(2), вызывает исключение при вызове открытия, а не при первом чтении.
  • UART разъёма — это настоящий последовательный порт. /dev/serial0 (также /dev/ttyAMA0 и /dev/ttyS0) — это подлинный tty, управляемый неизменённым pyserial: serial.tools.list_ports, select() на порту и cat /dev/serial0 работают, а байты идут к тому, что подключено к GPIO14 и GPIO15 на холсте.
  • 1-Wire присутствует в виде дерева sysfs, которое есть у Pi. DS18B20 на GPIO4 появляется под /sys/bus/w1/devices/28-*/ с w1_slave и temperature, поэтому cat, читатели в стиле w1thermsensor и ваш собственный код работают (dtoverlay=w1-gpio,gpiopin=N в config.txt проекта переносит вывод).
  • libcamera-jpeg, rpicam-jpeg, rpicam-still и libcamera-still делают снимок с части-камеры на холсте так, как скрипт вызывает их через subprocess. Изображение — это тестовый шаблон части, если только вы не разрешите гостевой системе использовать вашу веб-камеру, что Velxio запрашивает при первой попытке программы сделать снимок (см. ниже).
  • У GPIO есть настоящее символьное устройство. /dev/gpiochip0 присутствует, как и устаревший /sys/class/gpio, поверх RPi.GPIO и gpiozero. По-прежнему нет /dev/gpiomem, поэтому pigpio, которому нужны регистры периферии, не с чем взаимодействовать (см. ниже).
  • Загрузка занимает примерно 20–30 секунд, дольше, когда сервер занят; оверлей “Booting” отслеживает её. Гостевая сессия завершается не позднее чем через 2 часа.
  • Гостевая система запускает script.py из вашего проекта при загрузке. Назовите свой главный файл так в режиме Linux (движок instant запускает первый найденный .py).

Кнопка Linux terminal в рабочей области закрепляет этот движок на остаток сессии, когда вам нужна оболочка, например чтобы просмотреть файлы или запустить скрипт вручную. Выбор не сохраняется вместе с проектом: откройте его завтра, и Run вернётся к ответу детектора. Всё, что может выполнить движок instant, работает быстрее без него.

Гостевая система регистрирует символьное устройство GPIO с собственной идентичностью Pi, поэтому современный стек, которому учат документация Bookworm и Pi 5, работает здесь. gpiodetect отвечает:

gpiochip0 [pinctrl-bcm2835] (54 lines)

Инструменты установлены (gpiodetect, gpioinfo, gpioget, gpioset, gpiomon), и линия, которой они управляют, достигает части, подключённой к этому выводу на холсте.

Образ поставляется с libgpiod версии 1, поэтому пишите команды в стиле версии 1: чип — это позиционный аргумент, а не опция --chip.

Окно терминала
gpioset gpiochip0 17=1 # drive GPIO17 high
gpioget gpiochip0 5 # read GPIO5, prints 0 or 1
gpiomon gpiochip0 5 # print edges on GPIO5 as they arrive

Написание версии 2 (gpioset --chip gpiochip0 17=1) не понимается. Если руководство его использует, уберите опцию и передайте чип отдельно.

Привязки Python также предустановлены, опять же с API версии 1:

import gpiod
chip = gpiod.Chip("gpiochip0")
line = chip.get_line(17)
line.request(consumer="velxio", type=gpiod.LINE_REQ_DIR_OUT)
line.set_value(1)

RPi.GPIO и gpiozero этим не затрагиваются и по-прежнему остаются самым коротким способом написать скрипт. Устаревший интерфейс sysfs под /sys/class/gpio тоже работает, поэтому старое руководство, которое экспортирует вывод записью в файлы, делает то, что обещает. Чего по-прежнему нет, так это /dev/gpiomem, а вместе с ним и pigpio: эта библиотека напрямую отображает регистры периферии, а здесь отображать нечего.

У движка instant нет символьного устройства: в вашем браузере GPIO — это RPi.GPIO, gpiozero или Blinka.

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

В первый раз, когда программа запрашивает снимок в движке Linux с частью-камерой в режиме веб-камеры, Velxio спрашивает, можно ли использовать для этого вашу настоящую веб-камеру. Он вынужден спрашивать из-за того, где выполняется код: в движке instant кадры никогда не покидают вашу машину, тогда как гостевая система Linux работает на серверах Velxio, поэтому разрешение означает, что кадры отправляются туда.

  • Ответьте нет, и инструменты продолжат возвращать тестовый шаблон. Ничего не сломается, и ни один скрипт не придётся менять.
  • Ответьте да, и снимки будут с вашей настоящей веб-камеры, только для этой сессии страницы. Ответ не сохраняется в проекте и не запоминается после перезагрузки, поэтому в следующий раз при открытии страницы вас спросят снова.

picamera2 — другое дело: это по-прежнему модуль движка instant. В гостевой системе Linux делайте снимки с помощью инструментов командной строки.

Каждая строка — это один скрипт, написанный так, как его пишет руководство по Pi, запущенный на живом продукте с частью, подключённой на холсте, на Raspberry Pi 4. Строки с дисплеями проверяются на самом холсте: панель должна загореться, а не только скрипт завершиться.

Что Библиотека, которую использует скрипт Instant Linux
Светодиод и кнопка gpiozero Да Да
Светодиод из оболочки gpioset (libgpiod 1) Нет Да
Серводвигатель (PWM) gpiozero.Servo Да Да
Акселерометр MPU6050 smbus2 Да Да
Часы реального времени DS3231 smbus2 Да Да
Датчик давления BMP280 smbus2 Да Да
Датчик температуры и влажности SHT31 smbus2 Да Да
16-канальный драйвер PWM PCA9685 smbus2 Да Да
АЦП ADS1115 smbus2 Да Да
ЖК-дисплей 16x2, плата расширения I2C smbus2 или RPLCD.i2c Да Да
ЖК-дисплей 16x2, параллельный (RS, E, D4–D7) RPLCD.gpio Да Да
OLED SSD1306 smbus2 Да Да
OLED SSD1306 luma.oled Да Да
OLED SSD1306 Adafruit Blinka + adafruit_ssd1306 Да Да
TFT ILI9341 spidev Да Да
Карта microSD (режим SPI) spidev Да Да
Температурный датчик DS18B20 1-Wire sysfs, w1thermsensor Да Да
Модуль GPS на UART разъёма pyserial на /dev/serial0 Да Да
Электронная бумага 7.5” (UC8179) spidev + RPi.GPIO, драйвер в стиле Waveshare Да Да
Потенциометр напрямую на GPIO Нет (см. ниже) Нет

Строки с OLED и ЖК-дисплеем также были запущены на Raspberry Pi Zero в движке Linux, который представляет собой 32-битную гостевую систему с собственным образом.

  • Аналоговый вход на GPIO. У Raspberry Pi нет АЦП, в том числе на реальном оборудовании. Потенциометр, фоторезистор или датчик пульса, подключённые напрямую к GPIO, всегда читаются только как высокий или низкий уровень, и консоль выполнения сообщает об этом. Поставьте ADS1115 (I2C) или MCP3008 (SPI) между датчиком и Pi, точно так же, как вы сделали бы на стенде; оба есть в каталоге, а в галерее есть пример MCP3008 с потенциометром.
  • picamera2 в движке Linux. В движке instant он использует вашу веб-камеру, потому что скрипт выполняется в вашем браузере. В гостевой системе снимки вместо этого делаются через rpicam-jpeg и его аналоги, поверх тестового шаблона или поверх вашей веб-камеры, как только вы это разрешите (см. выше).
  • Драйвер электронной бумаги, который отправляет изображение не туда. На панели UC8179 (7.5”) команда 0x10 — это предыдущее изображение, а 0x13 — то, которое показывает стекло. Драйвер, который пишет только 0x10, получает здесь пустое обновление, точно как на реальной панели, и монитор последовательного порта (терминал Linux в этом движке) объясняет почему. Вывод BUSY тоже следует за контроллером: LOW, пока панель UltraChip работает, HIGH на SSD168x.
  • pigpio и /dev/gpiomem. pigpio достигает выводов, отображая регистры периферии, и ни один движок не даёт ему этого отображения. Используйте RPi.GPIO, gpiozero или, в движке Linux, libgpiod (см. выше).
  • libgpiod / gpiod в движке instant. Символьное устройство — это особенность движка Linux; в браузере нет /dev/gpiochip0, который можно было бы открыть.
  • Скрипт, скопированный из руководства по MicroPython. import machine, from gpio_lcd import GpioLcd и подобные существуют на Pico или ESP32, но не на плате, которая выполняет полный Python. Консоль вместо предложения установить пакет называет эквивалент для Pi (gpiozero, RPLCD, luma.oled, w1thermsensor).
  • PyTorch, TensorFlow. Гигабайты, и здесь нечем их ускорять. Они отклоняются с этим объяснением.

Оба движка поставляются со стандартной библиотекой. “Предустановлен” означает, что он работает уже с строки import, без requirements.txt, так же как Raspberry Pi OS имеет свои аппаратные библиотеки в образе.

Модуль Instant (браузер) Linux (гостевая система)
RPi.GPIO Предустановлен Предустановлен
gpiozero Предустановлен Предустановлен (2.0.1)
gpiod (libgpiod 1) Нет символьного устройства в браузере Предустановлен, вместе с инструментами gpio*
smbus2 / smbus Предустановлен (настоящая библиотека) Предустановлен (настоящая библиотека)
spidev Предустановлен Предустановлен (скомпилированный py-spidev)
serial (pyserial) Только пути UART Pi Настоящий pyserial 3.5 на настоящем tty
w1thermsensor Предустановлен Через requirements.txt (дерево 1-Wire присутствует)
luma.core, luma.oled, luma.lcd Предустановлен Предустановлен
RPLCD Предустановлен Предустановлен
ST7789 Предустановлен Предустановлен
board, busio, digitalio (Adafruit Blinka) Предустановлен Предустановлен
adafruit_ssd1306, adafruit_rgb_display Предустановлен Предустановлен
PIL (Pillow), numpy Предустановлен Предустановлен (Pillow 10.3, numpy 1.25)
cv2 (OpenCV) Да Нет (нет сборки для гостевой системы)
picamera2 Да, поверх вашей веб-камеры Нет (используйте rpicam-jpeg / libcamera-jpeg)
velxio_screen Да Да
requests / urllib Да, через прокси-сервер исходящего трафика Velxio со списком разрешённых Нет сети
Всё остальное Через requirements.txt Через requirements.txt

Шрифты DejaVu находятся в гостевой системе по пути, который использует Raspberry Pi OS (/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf), потому что руководства по дисплеям жёстко прописывают его.

from luma.core.interface.serial import i2c
from luma.core.render import canvas
from luma.oled.device import ssd1306
import time
device = ssd1306(i2c(port=1, address=0x3C))
with canvas(device) as draw:
draw.text((10, 20), "Hello from a Pi", fill="white")
# luma clears the panel when the script ends, as it does on hardware,
# so keep the script alive for as long as the text should stay up.
while True:
time.sleep(1)

Добавьте файл requirements.txt рядом с вашим скриптом, по одному пакету на строку; Velxio разрешает его перед запуском и сообщает вам в консоли выполнения, что он установил. Когда скрипт импортирует отсутствующий пакет, консоль предлагает строку для добавления, а кнопка записывает её за вас. Какой движок может принять пакет, зависит от того, как он собран:

  • Чистый пакет Python (колесо py3-none-any) работает в обоих движках.
  • Пакет с скомпилированным кодом работает в движке instant, когда его поставляет среда выполнения браузера (среди прочих numpy, pillow, opencv-python, scikit-learn), и в движке Linux только если у PyPI есть для него колесо musl aarch64 (такие есть у numpy, pandas, scipy и psutil). Пакеты, которые публикуют только колёса glibc manylinux, не могут быть установлены в гостевой системе.
  • На Raspberry Pi Zero, 1 или 2 гостевая система 32-битная, и у PyPI почти нет для неё скомпилированных колёс: там оставайтесь с тем, что предустановлено, или с чистыми пакетами Python.
  • Имена, которые гостевая система уже предоставляет (RPi.GPIO, smbus2, spidev, pyserial, gpiozero, gpiod), никогда не загружаются, поэтому requirements.txt из руководства, где они перечислены, не причиняет вреда.

Колёса учитываются в той же квоте хранилища, что и библиотеки Arduino.

Вам никогда не придётся это делать. То, что объявлено в requirements.txt, доступно для импорта в момент загрузки гостевой системы, вообще без шага установки. Настоящая команда тоже работает, для тех, кто следует руководству, где она прописана:

Окно терминала
python3 -m venv --system-site-packages ~/.venv
~/.venv/bin/pip install -r requirements.txt

У гостевой системы нет сети, поэтому pip разрешает зависимости из локального хранилища колёс, которое поставляется с пакетами проекта; он устанавливает то, что объявлено в проекте, и не может обратиться к PyPI за чем-либо ещё.

Знайте, чего это стоит, прежде чем начинать, и не принимайте тишину за зависание: на эмулируемом CPU создание виртуального окружения с pip занимает около четырёх минут (около шести секунд без него), а сама установка — около половины минуты. Ожидание не даёт вам ничего, чего у вас уже не было, поскольку объявленные вами пакеты уже импортированы к моменту появления приглашения. Оно существует для тех случаев, когда вам нужен настоящий рабочий процесс.

Системный Python помечен как управляемый извне (PEP 668), точно как на Raspberry Pi OS Bookworm, поэтому простой pip install вне виртуального окружения отказывает с тем же сообщением, что и на плате.

Панель файлов в рабочей области Pi загружает скрипты и файлы данных в проект; в режиме Linux они копируются в домашний каталог гостевой системы перед запуском script.py.

Образовательный SBC от DFRobot (плата Linux со встроенным сенсорным экраном) работает на тех же двух движках, со своими модулями pinpong и unihiker вместо библиотек Pi. Это платная плата со своими тремя пробными сессиями; найдите её в списке выбора рядом с семейством Pi.

Графика холста и полная карта выводов каждой платы, сгенерированные из симулятора:

Raspberry Pi 3 (графика также для Zero/1/2) · Raspberry Pi 4 · Raspberry Pi 5 · UNIHIKER M10