Основы · 9 мин чтения

Что такое MicroPython? Основные команды, REPL и первые программы

Что такое MicroPython и чем он отличается от Python? REPL, machine.Pin, PWM, АЦП, I2C, ticks_ms, main.py, Thonny, mpremote, mip и настройка Pico и ESP32.

MicroPython — небольшая и быстрая реализация языка Python 3 для микроконтроллеров. После загрузки MicroPython на плату вроде Raspberry Pi Pico или ESP32 плата выполняет код Python самостоятельно: вводишь команду без этапа компиляции и сразу видишь, как загорается светодиод. Если Python тебе уже знаком по школе или работе на компьютере, тот же синтаксис поможет считывать состояние пинов, управлять моторами, собирать данные датчиков и подключаться к Wi-Fi.

В этом руководстве ты узнаешь, чем MicroPython отличается от обычного Python, как мгновенно взаимодействовать с платой через REPL и как использовать самые нужные модули: machine.Pin, PWM, ADC и I2C, с примерами кода. Затем разберём разницу между time.sleep и ticks_ms, файлы main.py и boot.py, которые выполняются при включении, загрузку файлов через Thonny и mpremote, добавление библиотек с помощью mip и установку прошивки на Pico и ESP32. В последнем разделе сравним MicroPython и Arduino C++.

Raspberry Pi Pico с MicroPython
Raspberry Pi Pico: самая простая плата для знакомства с MicroPython. Достаточно перетащить файл UF2.

Что такое MicroPython и чем он отличается от Python?

MicroPython — проект с открытым исходным кодом, который Дэмиен Джордж начал в 2013 году для небольшой платы; сегодня он поддерживает десятки микроконтроллеров. Прошивка, которую ты загружаешь на плату, содержит интерпретатор Python, основные модули и небольшую файловую систему. Сначала код на плате преобразуется в байт-код, а затем интерпретатор выполняет его шаг за шагом. В несколько сотен КБ ОЗУ невозможно вместить весь Python с компьютера, поэтому язык остаётся тем же, но большинство библиотек урезаны или вовсе отсутствуют. Зато добавлено то, чего нет в Python для компьютера: модуль machine, который даёт прямой доступ к аппаратной части.

ТемаPython (компьютер)MicroPython (плата)
Где работаетКомпьютер с гигабайтами ОЗУМикроконтроллер с сотнями КБ ОЗУ
Стандартная библиотекаОчень большая: datetime, threading, urllib...Небольшое подмножество: time, os, json, re, struct, random, math...
Пакетыnumpy, pandas и тысячи других через pipНет numpy и pandas; пакеты micropython-lib через mip
Доступ к аппаратной частиНет, нужны дополнительные библиотекиМодуль machine: Pin, PWM, ADC, I2C, SPI, UART, Timer
Числа с плавающей точкой64-битные (около 15 цифр)32-битные на Pico и ESP32 (около 7 цифр)
Времяtime.time(), datetime (функции времени в обычном Python)time.sleep_ms(), time.ticks_ms(), machine.RTC (функции времени в MicroPython)
Запуск программыЗапускаешь из командной строкиboot.py и main.py выполняются автоматически при включении

Платы, на которых работает MicroPython

ПлатаФайл прошивкиВсего ОЗУПримечание
Raspberry Pi Pico (RP2040)RPI_PICO (.uf2)264 КБСамая простая плата для старта
Raspberry Pi Pico WRPI_PICO_W (.uf2)264 КБМодуль network для Wi-Fi; прошивка обычной Pico не включает здесь Wi-Fi
Raspberry Pi Pico 2 (RP2350)RPI_PICO2 (.uf2)520 КББыстрее, больше памяти
ESP32 (WROOM)ESP32_GENERIC (.bin)520 КБ (часть использует Wi-Fi)Wi-Fi и Bluetooth; в моделях с PSRAM гораздо больше памяти
ESP8266 (NodeMCU, Wemos D1 Mini)ESP8266_GENERIC (.bin)Около 80 КБРаботает, но памяти мало; для новых проектов выбирай ESP32
Arduino Uno (ATmega328P)Нет2 КБНе поддерживает MicroPython; программируется на C++

Установка прошивки MicroPython на Pico и ESP32

  1. Pico: Удерживай кнопку BOOTSEL на плате при подключении USB-кабеля, затем отпусти. На компьютере появится диск RPI-RP2 (RP2350 для Pico 2).
  2. Скачай подходящий для платы файл .uf2 с официальной страницы загрузок MicroPython (RPI_PICO для Pico, RPI_PICO_W для Pico W) и перетащи его на этот диск.
  3. Когда копирование завершится, плата автоматически перезапустится, а диск исчезнет: MicroPython установлен. В Thonny выбери MicroPython (Raspberry Pi Pico) в разделе Инструменты › Параметры › Интерпретатор (Tools › Options › Interpreter).
  4. ESP32: Если на компьютере установлен Python, введи в командной строке pip install esptool. Подключи плату и найди её порт (например, COM3 в Windows, /dev/ttyUSB0 в Linux).
  5. Сначала сотри флеш-память командой esptool.py --chip esp32 --port COM3 erase_flash. Если плата не подключается, удерживай кнопку BOOT во время выполнения команды.
  6. Запиши прошивку командой esptool.py --chip esp32 --port COM3 --baud 460800 write_flash -z 0x1000 ESP32_GENERIC-....bin. Для ESP32-S3 и ESP32-C3 используется адрес 0x0. Пункт Thonny Install or update MicroPython (esptool) (установить или обновить MicroPython) выполняет ту же задачу через окно программы.
Установка прошивки стирает старую программу и файлы платы, включая код, загруженный через Arduino IDE. И наоборот: загрузка кода через Arduino IDE на плату с MicroPython стирает MicroPython; чтобы вернуться к нему, нужно снова установить прошивку. Если файловая система Pico повреждена или плата зависает, официальный файл flash_nuke.uf2 полностью очищает флеш-память. Пины Pico и первое подключение со снимками каждого экрана разобраны в статье «Что такое Raspberry Pi Pico».

REPL: мгновенное взаимодействие с платой

REPL (Read-Eval-Print Loop, цикл «чтение — вычисление — вывод») — командная строка, которую плата открывает через последовательный порт. Приглашение >>> в нижнем окне Оболочка (Shell) в Thonny означает, что REPL ждёт команду. Введи 1 + 1, и плата вычислит и вернёт 2; введи from machine import Pin, а затем Pin("LED", Pin.OUT).value(1), и светодиод Pico загорится в тот же момент. REPL — самый быстрый способ прочитать значение датчика, проверить правильность подключения пина или изучить работу библиотеки без ожидания компиляции и загрузки.

Сочетание клавиш или командаЧто делает
Ctrl+CОстанавливает выполняемую программу (KeyboardInterrupt) и возвращает в REPL
Ctrl+DПрограммный сброс; boot.py и main.py выполняются заново
Ctrl+EРежим вставки: вставь длинный код без нарушения отступов и запусти его сочетанием Ctrl+D
TabАвтодополнение; введи machine. и нажми Tab, чтобы увидеть всё содержимое модуля
help("modules")Выводит список всех модулей прошивки
import gc; gc.mem_free()Показывает свободное ОЗУ, доступное программе, в байтах
import os; os.listdir()Выводит список файлов на плате

Первая программа и её аналог на Arduino C++

MicroPython
1# İlk program: dahili LED'i yakıp söndür / First program: blink the onboard LED
2from machine import Pin
3import time
4
5led = Pin("LED", Pin.OUT)        # Pico ve Pico W; ESP32'de Pin(2, Pin.OUT) / Pico and Pico W; Pin(2, Pin.OUT) on ESP32
6
7while True:
8    led.value(1)                 # yak / on
9    time.sleep(0.5)              # saniye cinsinden / in seconds
10    led.value(0)                 # söndür / off
11    time.sleep(0.5)
C++ (Arduino IDE)
1// Aynı program Arduino C++ ile / The same program in Arduino C++
2void setup() {
3  pinMode(LED_BUILTIN, OUTPUT);
4}
5
6void loop() {
7  digitalWrite(LED_BUILTIN, HIGH);
8  delay(500);                    // milisaniye cinsinden / in milliseconds
9  digitalWrite(LED_BUILTIN, LOW);
10  delay(500);
11}

Обе программы выполняют одну задачу, но устроены по-разному. В MicroPython нет setup() и loop(): файл выполняется один раз сверху вниз, а бесконечный цикл ты создаёшь с помощью while True:. Вместо фигурных скобок и точек с запятой используются отступы; все строки внутри цикла должны иметь одинаковый отступ (обычно 4 пробела). Задержка тоже задаётся в других единицах: time.sleep(0.5) принимает секунды, а delay(500) в Arduino — миллисекунды. В MicroPython для миллисекунд используется time.sleep_ms(), а для микросекунд — time.sleep_us(). Основы варианта для Arduino разобраны в статье «Основы программирования Arduino».

machine.Pin: цифровой ввод и вывод

MicroPythonАналог на Arduino C++Описание
led = Pin(15, Pin.OUT)pinMode(15, OUTPUT)Настраивает пин как выход
led.value(1) или led.on()digitalWrite(15, HIGH)Устанавливает HIGH на пине; value(0) или off() устанавливает LOW
buton = Pin(14, Pin.IN, Pin.PULL_UP)pinMode(14, INPUT_PULLUP)Вход со встроенным подтягивающим резистором
buton.value()digitalRead(14)Возвращает 0 или 1
led.toggle()digitalWrite(15, !digitalRead(15))Инвертирует состояние; доступно на Pico, а на ESP32 используй value(not led.value())
buton.irq(trigger=Pin.IRQ_FALLING, handler=f) (настройка прерывания в MicroPython)attachInterrupt(..., f, FALLING)Вызывает функцию f при изменении состояния пина

time.sleep и ticks_ms: измерение времени без блокировки

time.sleep() заставляет плату полностью ждать; в это время кнопки не опрашиваются и датчики не проверяются. Для одновременного выполнения нескольких задач используй аналог подхода с millis() в Arduino: time.ticks_ms() возвращает миллисекунды с момента запуска, а time.ticks_diff(new, old) вычисляет разницу между двумя моментами времени. Важно получать разницу через ticks_diff, а не обычным вычитанием: достигнув определённого значения, счётчик переполняется, и обычное вычитание в этот момент даёт неверный результат. Код ниже мигает светодиодом без блокировки и одновременно отслеживает кнопку через прерывание (IRQ); каждое нажатие меняет частоту мигания.

MicroPython
1# delay kullanmadan iki iş: LED yanıp söner, buton kesmeyle modu değiştirir
2# Two jobs without blocking: the LED blinks, a button interrupt switches the mode
3from machine import Pin
4import time
5
6led = Pin(15, Pin.OUT)                       # LED + 220 Ω, GP15
7buton = Pin(14, Pin.IN, Pin.PULL_UP)         # buton GP14 ile GND arasında / button between GP14 and GND
8
9hizli = False
10son_basma = 0
11son_degisim = time.ticks_ms()
12
13def buton_kesme(pin):                        # kesme fonksiyonu kısa olmalı / keep the handler short
14    global hizli, son_basma
15    simdi = time.ticks_ms()
16    if time.ticks_diff(simdi, son_basma) > 200:   # 200 ms debounce / 200 ms debounce
17        son_basma = simdi
18        hizli = not hizli
19
20buton.irq(trigger=Pin.IRQ_FALLING, handler=buton_kesme)   # basınca HIGH'dan LOW'a iner / goes HIGH to LOW when pressed
21
22while True:
23    aralik = 100 if hizli else 500
24    if time.ticks_diff(time.ticks_ms(), son_degisim) >= aralik:   # taşmaya karşı güvenli / safe against wrap-around
25        son_degisim = time.ticks_ms()
26        led.value(not led.value())
27    # burada başka işler yapılabilir / other work can run here
Обработчик прерывания должен быть коротким: достаточно переключить флаг или сохранить отметку времени, а долгие задачи оставить основному циклу. Для переменных, которые меняются в прерывании, не забудь написать global в начале функции; иначе Python создаст внутри функции новую локальную переменную с тем же именем, и основной цикл не увидит изменения. Этот же подход для Arduino разобран в статье «millis и delay».

PWM: яркость, сервоприводы и звук

MicroPython
1# PWM: LED parlaklığı ve servo açısı / PWM: LED brightness and servo angle
2from machine import Pin, PWM
3import time
4
5led = PWM(Pin(15))
6led.freq(1000)                               # 1 kHz: titreme görünmez / no visible flicker
7
8for d in range(0, 65536, 2048):              # duty_u16: 0 (kapalı) ... 65535 (tam) / 0 (off) ... 65535 (full)
9    led.duty_u16(d)
10    time.sleep_ms(20)
11led.duty_u16(0)
12
13servo = PWM(Pin(16))
14servo.freq(50)                               # servolar 50 Hz (20 ms) ister / servos expect 50 Hz (20 ms)
15
16def servo_aci(derece):
17    us = 500 + derece * 2000 // 180          # 0° = 0,5 ms, 180° = 2,5 ms; servona göre ayarla / tune for your servo
18    servo.duty_ns(us * 1000)
19
20for a in (0, 90, 180, 90):
21    servo_aci(a)
22    time.sleep(1)

Объект PWM очень быстро включает и выключает пин, задавая среднюю мощность. freq() определяет, сколько раз в секунду это повторяется, а duty_u16() задаёт длительность включённого состояния числом от 0 до 65 535; 32 768 соответствует примерно 50 процентам. Такая шкала даёт гораздо меньший шаг, чем диапазон 0–255 у analogWrite в Arduino. Сервоприводам нужен сигнал 50 Hz с длительностью импульса от 0,5 до 2,5 мс; duty_ns() задаёт длительность импульса прямо в наносекундах, что значительно упрощает код сервопривода. Меняя значения freq(), можно также играть ноты на пассивном зуммере. Коэффициент заполнения и частота подробно разобраны в статье «Что такое PWM».

АЦП: чтение аналогового сигнала

MicroPython
1# ADC: potansiyometre ve Pico'nun dahili sıcaklık sensörü
2# ADC: a potentiometer and the Pico's internal temperature sensor
3from machine import ADC, Pin
4import time
5
6pot = ADC(Pin(26))                           # GP26 = ADC0; ESP32'de ADC(Pin(34)) / ADC(Pin(34)) on ESP32
7yonga = ADC(4)                               # 4. kanal: dahili sıcaklık / channel 4: internal temperature
8
9def ortalama(adc, n=16):                     # gürültüyü azalt / reduce noise
10    toplam = 0
11    for _ in range(n):
12        toplam += adc.read_u16()
13    return toplam // n
14
15while True:
16    ham = ortalama(pot)                      # 0-65535 (12 bit ölçüm 16 bite ölçeklenir) / 12-bit reading scaled to 16 bits
17    volt = ham * 3.3 / 65535
18    v_t = ortalama(yonga) * 3.3 / 65535
19    derece = 27 - (v_t - 0.706) / 0.001721   # RP2040 veri sayfasındaki formül / formula from the RP2040 datasheet
20    print("Pot: {} ({:.2f} V)  Yonga / chip: {:.1f} C".format(ham, volt, derece))
21    time.sleep(1)

read_u16() возвращает значение от 0 до 65 535 на любой плате, поэтому один и тот же код работает на Pico и ESP32. В действительности АЦП Pico 12-битный, а результат масштабируется до 16 бит. У Pico три доступных пользователю аналоговых пина: GP26 (ADC0), GP27 (ADC1) и GP28 (ADC2); четвёртый канал — датчик температуры внутри микросхемы, который измеряет температуру кристалла, а не комнаты. На ESP32 для чтения всего диапазона 0–3,3 V нужен вызов adc.atten(ADC.ATTN_11DB), а пины ADC2 нельзя использовать при включённом Wi-Fi, поэтому выбирай пины ADC1 в диапазоне GPIO 32–39. Усреднение 16 отсчётов в коде заметно уменьшает шум АЦП. Понятия разрешения и опорного напряжения разобраны в статье «Что такое АЦП».

I2C: подключение датчиков и дисплеев

MicroPython
1# I2C: hattı tara ve SSD1306 OLED'e yaz / I2C: scan the bus and write to an SSD1306 OLED
2from machine import Pin, I2C
3import ssd1306                               # önce: mpremote mip install ssd1306 / first: mpremote mip install ssd1306
4
5i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)   # Pico; ESP32'de I2C(0, sda=Pin(21), scl=Pin(22))
6adresler = i2c.scan()
7print("Bulunan / found:", [hex(a) for a in adresler])   # OLED genelde 0x3c / OLED is usually 0x3c
8
9if 0x3C in adresler:
10    oled = ssd1306.SSD1306_I2C(128, 64, i2c)
11    oled.fill(0)
12    oled.text("MicroPython", 0, 0)
13    oled.text("I2C: " + hex(adresler[0]), 0, 16)
14    oled.show()

I2C(0, sda=..., scl=...) запускает аппаратный блок I2C на выбранных пинах, а scan() возвращает список адресов всех устройств, ответивших на шине. Если датчик не работает, начни с этого сканирования: пустой список указывает на проблему с подключением, а неожиданный адрес означает, что нужно исправить адрес в коде. На Pico набор пинов для каждого блока I2C фиксирован; например, пары GP0-GP1, GP4-GP5 и GP8-GP9 подходят для I2C0, а выбор неверной пары вызывает ValueError. На ESP32 I2C можно назначить почти на любые пины. Подробности о дисплее — в статье «OLED-дисплей», а о самом протоколе — в статье «Что такое I2C».

main.py и boot.py: код, который выполняется при включении

Когда ты нажимаешь Запустить (Run) в Thonny, код выполняется только в этот момент и не сохраняется на плате; после отключения USB он исчезает. Чтобы код запускался автоматически при каждом включении платы, нужно сохранить файл на плате под именем main.py. При запуске сначала выполняется boot.py, затем main.py. Файл boot.py предназначен для разовой подготовки, например подключения к Wi-Fi или настройки часов; прошивка ESP32 создаёт его автоматически, а на Pico его обычно нет. Сама программа всегда находится в main.py. Функции из других твоих файлов можно подключить в main.py через import, а показания сохранять в файловую систему платы через open().

MicroPython
1# main.py: kart her açıldığında otomatik çalışır / runs automatically every time the board starts
2import time
3from machine import Pin
4
5time.sleep(3)                                # Ctrl+C ile durdurmak için güvenlik payı / a safety window for Ctrl+C
6led = Pin("LED", Pin.OUT)
7sayac = 0
8
9try:
10    while True:
11        sayac += 1
12        led.value(sayac % 2)
13        print("Calisiyor / running", sayac)
14        time.sleep(1)
15except KeyboardInterrupt:                    # Thonny'de Stop ya da Ctrl+C / Stop in Thonny or Ctrl+C
16    led.value(0)
17    print("Durduruldu / stopped")
Если main.py содержит непрерывный бесконечный цикл совсем без пауз, Thonny может не подключиться к плате и вывести сообщение Device is busy or does not respond (устройство занято или не отвечает). Сначала несколько раз нажми кнопку Стоп (Stop) в Thonny или попробуй Ctrl+C в оболочке. Если это не поможет, придётся запустить Pico с BOOTSEL и очистить её с помощью flash_nuke.uf2, а на ESP32 — стереть флеш-память и заново установить прошивку. Задержка в 3 секунды при запуске в примере кода даёт время остановить программу до возникновения такой ситуации.

Загрузка файлов: Thonny и mpremote

Для первых шагов проще всего использовать Thonny: напиши код, выбери Файл › Сохранить как… (File › Save as), в открывшемся окне укажи Raspberry Pi Pico или Устройство MicroPython (MicroPython device) и назови файл main.py. Открой Вид › Файлы (View › Files), чтобы увидеть рядом файлы компьютера и платы; копировать их между устройствами можно через меню правой кнопки мыши. Для тех, кто предпочитает командную строку и редактор вроде VS Code, есть официальная утилита mpremote; установи её командой pip install mpremote, и она автоматически подключится к первой найденной плате с MicroPython.

Команда mpremoteЧто делает
mpremoteПодключается к первой найденной плате и открывает REPL (выход: Ctrl+X)
mpremote lsВыводит список файлов на плате
mpremote cp main.py :main.py (команда копирования файла на плату)Копирует файл с компьютера на плату; двоеточие (:) обозначает плату
mpremote run test.py (команда запуска файла)Выполняет файл без сохранения на плате и показывает его вывод
mpremote mip install ssd1306 (команда установки библиотеки)Скачивает библиотеку через интернет компьютера и устанавливает её в папку /lib на плате
mpremote resetПерезапускает плату
mpremote connect COM3 lsПодключается к плате на указанном порту (например, /dev/ttyACM0 в macOS и Linux)

Добавление библиотек: mip

В MicroPython нет pip; вместо него используется небольшой менеджер пакетов mip. На плате с доступом в интернет, например Pico W или ESP32, сначала подключись к Wi-Fi, затем введи в REPL import mip и mip.install("ssd1306"); пакет загрузится из официального репозитория micropython-lib и попадёт в папку /lib на плате. Драйвер с GitHub тоже можно установить командой mip.install("github:user/repo"). Для Pico без Wi-Fi выполни ту же задачу с компьютера командой mpremote mip install или через меню Thonny Инструменты › Управление пакетами (Tools › Manage packages). Можно и просто скопировать на плату драйвер из одного файла (например, файл .py для датчика); если файл находится в корневой папке или в /lib, его можно загрузить через import. Шаги подключения к Wi-Fi описаны в статье «Wi-Fi на Pico W».

MicroPython или Arduino C++?

ХарактеристикаMicroPythonArduino C++
ЯзыкСинтаксис Python 3C++ и ядро Arduino
Как выполняетсяИнтерпретатор на плате выполняет байт-кодКомпилируется в машинный код на компьютере
Время до результатаМгновенно в REPL; сохранение занимает 1–2 секундыКомпиляция и загрузка при каждом изменении, 10–60 секунд
СкоростьЦиклы на чистом Python примерно в 10–100 раз медленнееСкорость машинного кода
Точность времениСборщик мусора иногда делает короткие паузыПредсказуемость до микросекунд
Файловая системаЕсть: main.py, файлы данных и настроекНет; нужна EEPROM или дополнительная библиотека
Библиотекиmicropython-lib и драйверы сообществаОгромная экосистема библиотек Arduino
ПлатыPico, ESP32, ESP8266Почти все, включая Uno, Nano и Mega
Сообщения об ошибкахПонятные сообщения с номерами строк во время выполненияОшибки компиляции; Serial.print для наблюдения за выполнением
Лучше подходит дляУчёбы, быстрых экспериментов, Wi-Fi и обработки данныхТочного отсчёта времени, плат с малым объёмом памяти, множества готовых библиотек

На практике выбор зависит от проекта. Чтение датчика и отправка данных по Wi-Fi, обслуживание веб-страницы или управление дисплеем требуют меньше строк и быстрее реализуются на MicroPython. Если нужно генерировать сигналы с микросекундной точностью, очень быстро обновлять сотни светодиодов или использовать только небольшую плату вроде Uno, преимущество у C++. Медленную функцию можно ускорить декоратором @micropython.native, а паузы сборщика мусора сократить, если не создавать новые списки и строки внутри циклов. О выборе платы также читай в статье «Arduino или ESP32».

Частые ошибки и их решения

Ошибка или симптомПричинаРешение
ImportError: no module named 'ssd1306'Библиотеки нет на платеУстанови её через mip или mpremote mip либо скопируй файл .py на плату
IndentationErrorНеодинаковые отступы, смешаны пробелы и табуляцияИспользуй 4 пробела во всём файле; Thonny делает это автоматически
OSError: [Errno 5] EIO (I2C)Устройство не отвечает: проблема с подключением, адресом или питаниемПроверь адрес через scan(), проверь SDA и SCL
ValueError: bad SCL pinВыбранные пины не относятся к этому блоку I2CВыбери правильную пару I2C0 или I2C1 по распиновке Pico
Код работает в Thonny, но не после отключения USBФайл не сохранён на плате под именем main.pyЧерез «Сохранить как…» сохрани его на плате под именем main.py
MemoryError: memory allocation failed (сообщение об ошибке: не удалось выделить память)ОЗУ заполнено: большой список, длинная строка или большой буферОбрабатывай данные частями, вызывай gc.collect(), используй bytearray
Thonny: Device is busy or does not respond (сообщение Thonny: устройство занято или не отвечает)main.py выполняет цикл без пауз или порт занят другой программойНажми «Стоп» или Ctrl+C, закрой другую программу, при необходимости сотри флеш-память

Если Python тебе уже знаком, MicroPython — кратчайший путь в мир микроконтроллеров: результат проверки пина в REPL виден мгновенно, а для чтения датчика и подключения к Wi-Fi хватает нескольких строк. После освоения основных модулей, принципа main.py и отсчёта времени без блокировки через ticks_ms твои проекты быстро становятся сложнее. В приложении BlueGrays ты найдёшь проекты для Raspberry Pi Pico со светодиодами, светофором, кнопками и PWM, с пошаговыми схемами подключения и кодом MicroPython.

Частые вопросы

Что такое MicroPython?

MicroPython — небольшая версия языка Python 3 для микроконтроллеров. Благодаря загруженной прошивке платы вроде Raspberry Pi Pico и ESP32 выполняют код Python напрямую; модуль machine даёт доступ к пинам, PWM, АЦП и I2C.

MicroPython — это то же самое, что Python?

Синтаксис одинаковый, но MicroPython — урезанное подмножество Python для компьютера. Крупных библиотек вроде numpy и pandas нет, стандартная библиотека сокращена, а числа с плавающей точкой на Pico и ESP32 32-битные. Взамен добавлен модуль machine для прямого доступа к аппаратной части.

Что лучше: MicroPython или Arduino?

Зависит от цели. MicroPython удобнее для учёбы, быстрых экспериментов и проектов с отправкой данных по Wi-Fi; Arduino C++ работает быстрее, точнее выдерживает интервалы времени и предлагает гораздо больше готовых библиотек. Pico и ESP32 можно программировать обоими способами.

Работает ли MicroPython на Arduino Uno?

Нет. У микросхемы ATmega328P на Arduino Uno всего 2 КБ ОЗУ и 32 КБ флеш-памяти, и интерпретатор MicroPython в них не помещается. Для MicroPython выбирай более мощную плату, например Raspberry Pi Pico или ESP32.

Как установить библиотеку в MicroPython?

На плате с подключением к интернету введи в REPL import mip и mip.install("package_name"). Для плат без Wi-Fi выполни то же с компьютера командой mpremote mip install package_name или через менеджер пакетов Thonny. Драйверы из одного файла также можно просто скопировать на плату.

Как сохранить код на Pico, чтобы он не пропадал?

В Thonny открой «Файл › Сохранить как…», выбери Raspberry Pi Pico и назови файл main.py. При каждом запуске платы сначала выполняется boot.py, а затем автоматически main.py; даже если отключить USB от компьютера и подключить к другому источнику 5 V, программа продолжит работать.

Все проекты
Мигание встроенным светодиодом Raspberry Pi Pico (Pico и Pico W)
#147Новичок

Мигание встроенным светодиодом Raspberry Pi Pico (Pico и Pico W)

Первый проект серии Raspberry Pi Pico! Мигаем зелёным встроенным светодиодом, чтобы проверить, что плата работает, — классический первый опыт «Hello World». НИКАКИХ внешних компонентов, только Pico и USB-кабель. Код написан на MicroPython (официальном языке, поддерживаемом Raspberry Pi Foundation). Изучи в Thonny IDE класс machine.Pin, режим Pin.OUT, методы led.on()/off() и time.sleep(). Каждое переключение видно в выводе (REPL).

5.0(1)
10
Raspberry Pi Pico: управление внешним светодиодом (макетная плата)
#148Новичок

Raspberry Pi Pico: управление внешним светодиодом (макетная плата)

Следующий шаг после встроенного светодиода Pico: подключить внешний светодиод на макетной плате и управлять им через пин GP14. В этом проекте ты узнаешь, как использовать любой пин GPIO общего назначения у Pico как выход, какая полярность у светодиода (длинная ножка = анод/+, короткая = катод/–) и зачем нужен токоограничивающий резистор (220Ω). Без резистора через светодиод пойдёт слишком большой ток, и он может сгореть. Схема очень простая: Pico GP14 → резистор 220Ω → светодиод → GND.

4.5(2)
7
Два попеременно мигающих светодиода на Pico (узор мигалки)
#149Новичок

Два попеременно мигающих светодиода на Pico (узор мигалки)

Следующий шаг после одного светодиода на Pico: два светодиода мигают попеременно по классическому узору мигалки. Когда один гаснет, другой загорается — самый простой пример согласованной работы нескольких GPIO. В этом проекте два светодиода разных цветов (красный на GP14, зелёный на GP13) меняются состояниями каждые 500ms. Метод MicroPython Pin.toggle() делает код коротким и понятным. Та же логика лежит в основе светофоров, полицейских мигалок, бегущих огней и многих светодиодных анимаций.

5.0(2)
19
Симулятор светофора на Pico (3 светодиода по очереди)
#150Новичок

Симулятор светофора на Pico (3 светодиода по очереди)

Настоящий светофор на красном, жёлтом и зелёном светодиодах — первый проект серии Pico с 3 светодиодами! Зелёный 4 с «едем», жёлтый 1,5 с «внимание», красный 3 с «стоп» и красный + жёлтый 1 с «приготовиться» (европейская схема светофора). Изучи объявление функций (def all_off()), логику конечного автомата (последовательность) и синхронизацию нескольких GPIO. Простая схема: 3 светодиода на GP11 (зелёный), GP12 (жёлтый), GP13 (красный), у каждого токоограничивающий резистор 220Ω.

4.0(1)
12
Светодиод с управлением кнопкой на Pico (удержание)
#155Новичок
Premium

Светодиод с управлением кнопкой на Pico (удержание)

Первый проект Pico с входом — чтение кнопки! Светодиод горит, пока кнопка нажата, и гаснет после отпускания. Это большой шаг после светодиодных анимаций: сигнал из внешнего мира в Pico. Изучи Pin.IN (режим входа), Pin.PULL_UP (встроенный подтягивающий резистор — стандарт для кнопок) и чтение button.value(). Светодиод на GP14, кнопка на GP2 (встроенный PULL_UP). Нажата = LOW (0), отпущена = HIGH (1) — обратная логика сначала путает, но это промышленный стандарт.

0.0(0)
11
Антидребезг кнопки на Pico: IRQ против программного опроса
#159Средний
Premium

Антидребезг кнопки на Pico: IRQ против программного опроса

Нажимаешь кнопку один раз, а код насчитывает 3–4? Это дребезг контактов — металлические контакты колеблются доли миллисекунды! Сравни в мониторе два способа подсчёта рядом: сырой опрос (ловит дребезг и считает лишнее) и IRQ + программный антидребезг (точно). Изучи физику дребезга, программный антидребезг (ticks_diff() > 50ms), регистрацию прерывания Pin.irq(), триггер IRQ_FALLING, обработчики ISR и безопасность global в ISR.

0.0(0)
12
Плавное затухание светодиода с PWM на Pico (эффект дыхания)
#160Новичок

Плавное затухание светодиода с PWM на Pico (эффект дыхания)

Светодиод больше не просто мигает — он дышит! С помощью PWM (широтно-импульсной модуляции) Raspberry Pi Pico яркость светодиода медленно растёт и медленно падает, как огонёк спящего MacBook. Изучи класс machine.PWM, duty_u16() (16-битная яркость 0–65535), частоту PWM (freq(1000) — 1000 циклов вкл/выкл в секунду, мерцания не видно), циклы range() с шагом (вверх и вниз) и почти аналоговый выход с цифрового пина.

0.0(0)
4
Смена цветов RGB-светодиода на Pico (3 канала PWM)
#161Новичок

Смена цветов RGB-светодиода на Pico (3 канала PWM)

Один светодиод — миллионы цветов! RGB-светодиод содержит 3 светодиода: красный, зелёный и синий. Если управлять каждым своим каналом PWM Pico, цвета смешиваются: красный + зелёный = жёлтый, зелёный + синий = голубой, все три = белый. Светодиод перебирает 8 цветов. Изучи несколько каналов PWM, объявление функций (def set_color(...)), смешивание RGB, перевод 8 бит → 16 бит (x257) и общий катод и общий анод.

0.0(0)
6