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, об этом сообщается до того, как будет потрачена пробная сессия.

Два движка
Заголовок раздела «Два движка»Instant (в вашем браузере)
Заголовок раздела «Instant (в вашем браузере)»Движок по умолчанию. Ваш скрипт выполняется на интерпретаторе 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 (на серверах Velxio)
Заголовок раздела «Linux (на серверах Velxio)»Настоящая гостевая система 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 в движке Linux: gpiochip0 и libgpiod
Заголовок раздела «GPIO в движке Linux: gpiochip0 и libgpiod»Гостевая система регистрирует символьное устройство 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 highgpioget gpiochip0 5 # read GPIO5, prints 0 or 1gpiomon 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
Заголовок раздела «Камера в движке Linux»По умолчанию инструменты камеры гостевой системы возвращают тестовый шаблон части-камеры, и скрипт, делающий снимок, получает изображение, ни у кого ничего не спрашивая.
В первый раз, когда программа запрашивает снимок в движке 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. Гигабайты, и здесь нечем их ускорять. Они отклоняются с этим объяснением.
Модули Python в каждом движке
Заголовок раздела «Модули Python в каждом движке»Оба движка поставляются со стандартной библиотекой. “Предустановлен” означает, что он работает уже с строки 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 i2cfrom luma.core.render import canvasfrom 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
Заголовок раздела «Другим сторонним пакетам нужен requirements.txt»Добавьте файл 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.
Запуск pip вручную в гостевой системе Linux
Заголовок раздела «Запуск pip вручную в гостевой системе Linux»Вам никогда не придётся это делать. То, что объявлено в 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.
UNIHIKER M10
Заголовок раздела «UNIHIKER M10»Образовательный SBC от DFRobot (плата Linux со встроенным сенсорным экраном) работает на тех же двух движках, со своими модулями pinpong и unihiker вместо библиотек Pi. Это платная плата со своими тремя пробными сессиями; найдите её в списке выбора рядом с семейством Pi.
Графика плат и распиновки
Заголовок раздела «Графика плат и распиновки»Графика холста и полная карта выводов каждой платы, сгенерированные из симулятора:
Raspberry Pi 3 (графика также для Zero/1/2) · Raspberry Pi 4 · Raspberry Pi 5 · UNIHIKER M10