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

От блоков к Arduino C++: шпаргалка с MicroPython

Шпаргалка для перехода от блочного кода к Arduino C++: 34 строки с блоками, их кодом на C++ и MicroPython, частые ошибки, метод из 4 шагов и одна программа в трёх видах.

Самый быстрый путь от блочного кода к Arduino C++ — держать рядом таблицу на одну страницу, где видно, в какую строку настоящего кода превращается каждый блок. Короткий ответ: блоки — не новый язык, а наглядная форма строк Arduino C++. Блок «настроить пин 13 как OUTPUT» — это строка pinMode(13, OUTPUT);, блок «ждать 1000 мс» — delay(1000);, а блок «если … то» — конструкция if. В таблице ниже рядом стоят настоящие подписи блоков из приложения BlueGrays, их код на Arduino C++ и код на MicroPython для Raspberry Pi Pico.

Эта страница — не урок, а справочный лист. Таблицу можно распечатать, положить у стола и сверяться с ней, глядя на блоки проекта: какая строка соответствует какому блоку. После таблицы идут самые частые ошибки при переходе, метод из четырёх шагов, чтобы оставить блоки позади, и одна и та же программа в виде блоков, на C++ и на MicroPython. Пример компилируется в Arduino IDE и запускается на Pico через Thonny.

Если хочется изучить блоки шаг за шагом, есть серия От блоков к коду: что такое блочный код, мигание светодиодом на блоках, блок «если», циклы и переменные и чтение датчиков блоками и на MicroPython. Эта статья собирает все эти уроки в одну таблицу.
Блоки проекта «Настройка частоты зуммера»: глобальные переменные, четыре пина кнопок как INPUT в настройке, блоки «если» внутри «повторять всегда», блоки ограничения и воспроизведения звука
Блоки проекта «Настройка частоты зуммера». Все блоки из таблицы — объявить, настроить как INPUT, прочитать пин, установить, ограничить, играть и остановить звук — есть в этой одной программе.

Перед чтением таблицы: четыре различия между тремя формами

Блоки, C++ и MicroPython выражают одну и ту же идею, но правила записи у них разные. Именно на этих четырёх различиях спотыкаются чаще всего. Первое — структура: программа на Arduino C++ состоит из двух частей, setup() и loop(), а в блоках они выглядят как «настройка (один раз)» и «повторять всегда». В MicroPython отдельной настройки нет: файл выполняется один раз сверху вниз, а повторяющаяся часть пишется внутри цикла while True:. Второе — типы: в C++ у каждой переменной указан тип (int, float, bool), в блоках это вариант «объявить целое (int)», а в Python тип вообще не пишется.

Третье различие — диапазоны чисел. На Arduino Uno аналоговое чтение даёт 0–1023, а PWM — 0–255; на ESP32 аналоговое чтение доходит до 0–4095; на Pico MicroPython выдаёт и показания, и заполнение PWM в диапазоне 0–65535. Поэтому порог нельзя просто перенести с одной платы на другую. Четвёртое различие — единица времени: delay() принимает миллисекунды, а time.sleep() — секунды. Полсекунды — это delay(500) в C++ и time.sleep(0.5) в MicroPython. Если держать в голове эти четыре правила, большинство строк таблицы встанут на место сами собой.

  • Числа в таблице — примеры: там, где в блоке стоит 13, в твоём проекте может быть 7, и число в строке кода меняется вместе с ним.
  • Пины в столбце MicroPython — это номера GP на Pico (GP14, GP15, GP26). Они не обязаны совпадать с номерами пинов Uno; сверяйся со схемой.
  • Строки с пометкой «Блока для Pico нет» означают, что в проектах на Pico этот блок не используется; код MicroPython, делающий то же самое, всё равно приведён.
  • ESP32 тоже программируется на Arduino C++, так что столбец C++ подходит и для неё; отличаются только аналоговый диапазон и некоторые номера пинов.

Таблица соответствия: блоки, Arduino C++ и MicroPython

Таблица разбита на 12 групп: структура программы, пины, время, условия, циклы, переменные, математика, последовательный порт, аналог и PWM, звук, сервопривод и датчик. Текст в столбце «Блок» — это подписи, напечатанные на блоках в приложении, а «…» и «?» обозначают гнездо, куда вставляется другой блок. Если в строке больше одного блока, они разделены точкой.

ГруппаБлок (подпись в приложении)Arduino C++MicroPython (Pico)
Структуранастройка (один раз)void setup() { … }Строки перед while True:
Структураповторять всегдаvoid loop() { … }while True: (тело с отступом в 4 пробела)
Структураглобальные переменные (в начале)Начало файла, до setup()Первые строки после import
Структурафункция blinkTwicevoid blinkTwice() { … } · вызов: blinkTwice();def blinkTwice(): · вызов: blinkTwice()
Пинынастроить пин 13 как OUTPUTpinMode(13, OUTPUT);led = Pin(15, Pin.OUT)
Пинынастроить пин 2 как INPUT_PULLUPpinMode(2, INPUT_PULLUP);btn = Pin(14, Pin.IN, Pin.PULL_UP)
Пинызаписать HIGH в пин 13 · записать LOW в пин 13digitalWrite(13, HIGH); · digitalWrite(13, LOW);led.value(1) · led.value(0) (вкл / выкл)
Пиныпрочитать пин 2digitalRead(2) → HIGH (1) или LOW (0)btn.value() → 1 или 0
Пины (только Pico)пин led : GP 14 , OUTPUT · включить (on) / выключить (off) пин ledТо же, что pinMode() + digitalWrite()led = Pin(14, Pin.OUT) · led.on() / led.off() (вкл / выкл)
Времяждать 1000 мс · ждать 0.5 с (Pico)delay(1000); · delay(500);time.sleep_ms(1000) (мс) · time.sleep(0.5) (с)
Времяждать 10 мксdelayMicroseconds(10);time.sleep_us(10)
Времямиллисекунд с запускаmillis() (тип unsigned long)time.ticks_ms()
Условияесли … то … иначе если … иначе …if (…) { … } else if (…) { … } else { … }if …: · elif …: · else:
Условия? = ? (≠, <, ≤, >, ≥)== != < <= > >=== != < <= > >=
Условия? и ? · ? или ? · не ?&& · || · !xand · or · not x
Циклыповторить 3 разаfor (int i = 0; i < 3; i++) { … }for i in range(3):
Циклысчитать с i от 0 до 5 через 1for (i = 0; i <= 5; i++) (5 включительно, 6 проходов)for i in range(0, 6): (6 не входит)
Циклыповторять, покаwhile (…) { … }while …:
Циклывыйти из циклаbreak;break
Переменныеобъявить целое (int) delayTime = 60int delayTime = 60;delayTime = 60 (тип не пишется)
Переменныеобъявить дробное (float) voltage = 0.0float voltage = 0.0;voltage = 0.0
Переменныеустановить x в 0 · увеличить x на 1x = 0; · x += 1; (или x++;)x = 0 · x += 1 (x++ не существует)
Переменныемассив 2 3 4 · элемент 0 из ledPinsint ledPins[] = {2, 3, 4}; · ledPins[0]ledPins = [2, 3, 4] · ledPins[0]
Математика1 + 1 (а также −, ×, ÷)+ - * / · с двумя int 7 / 2 = 3+ - * / · 7 / 2 = 3.5, целочисленное деление 7 // 2 = 3
Математикаостаток от 10 ÷ 310 % 310 % 3
Математикапреобразовать x : 0 – 1023 → 0 – 255map(x, 0, 1023, 0, 255)Готовой нет; пишется функция arduino_map()
Математикаограничить 50 снизу 0 сверху 100constrain(50, 0, 100)min(max(50, 0), 100)
Последовательный портзапустить порт на 9600 бодSerial.begin(9600);Не нужно, print() идёт через USB
Последовательный портвывести в порт … новая строка · без переносаSerial.println(x); · Serial.print(x);print(x) · print(x, end="") (без переноса)
Аналог и PWMаналоговое чтение A0analogRead(A0) → 0–1023 (на ESP32 0–4095)ADC(26).read_u16() → 0–65535
Аналог и PWMзаписать PWM 128 в пин 9 · PWM led : GP 14 , частота 1000 Hz (Pico)analogWrite(9, 128); (0–255)led = PWM(Pin(14)) · led.freq(1000) · led.duty_u16(32768) (заполнение 0–65535)
Звукиграть 440 Hz на пине 8 · остановить звук на пине 8tone(8, 440); · noTone(8);Блока для Pico нет: bz = PWM(Pin(16)) · bz.freq(440) · bz.duty_u16(32768) · остановить: bz.duty_u16(0)
Сервоприводподключить серво myServo к пину 9 · повернуть серво myServo на 90 градусов#include <Servo.h> · Servo myServo; · myServo.attach(9); · myServo.write(90); (поворот на 90°)Блока для Pico нет: s = PWM(Pin(16)) · s.freq(50) · s.duty_ns(1500000) (примерно 90°)
Датчикдлина импульса HIGH на пине 12 (мкс)pulseIn(12, HIGH)machine.time_pulse_us(Pin(12, Pin.IN), 1)

Некоторые строки на первый взгляд выглядят один в один, но требуют внимания. В «считать с i от 0 до 5» число 5 входит в диапазон, и цикл выполняется 6 раз; поэтому в C++ пишут <= вместо <, а в Python нужен range(0, 6), потому что range не включает своё конечное число. Блок деления — тоже ловушка: при делении двух целых чисел C++ отбрасывает дробную часть, и 7 / 2 даёт 3, а Python даёт 3.5. Чтобы получить целочисленное деление, как в C++, в Python используют //. Функция map() за блоком «преобразовать x» в MicroPython не встроена; в примере ниже то же вычисление делает функция arduino_map() из двух строк.

При переходе с Arduino на Pico пересчитывай пороги и напряжения. Порог освещённости 400 на Uno соответствует примерно 25600 на Pico (400 × 65535 / 1023). Pico работает от 3,3 V: питай делители датчиков от пина 3V3(OUT) и никогда не подавай 5 V на пины GPIO или ADC.

Как вложенные блоки превращаются в код?

Знать отдельные блоки мало; настоящий навык — превращать вложенные блоки в одну строку. Для этого различай две формы. Блоки, которые стоят друг под другом и имеют выступ на краю, — это команды, и каждая из них становится строкой кода. Овальные или заострённые блоки, которые вставляются в гнездо другого блока, — это значения; в коде они стоят внутри скобок, справа от знака равенства или внутри условия. Строки ниже взяты из бесплатного проекта «Настройка частоты зуммера»: четыре кнопки включают и выключают звук, повышают и понижают его частоту, а она удерживается в пределах от 50 до 5000 Hz.

Блок («Настройка частоты зуммера»)Строка C++Правило чтения
установить state в 1state = 1;Каждый блок-команда, стоящий под другим, — это одна строка, и она заканчивается точкой с запятой.
если (прочитать пин btnOn = HIGH) то …if (digitalRead(btnOn) == HIGH) { … }Овальный блок-значение попадает внутрь скобок; сравнение = в блоке превращается в коде в ==.
установить frequency в (frequency + 50)frequency = frequency + 50;Сначала вычисляется внутренний блок, и его результат передаётся внешнему.
установить frequency в (ограничить frequency снизу 50 сверху 5000)frequency = constrain(frequency, 50, 5000); (от 50 до 5000)Пустые гнёзда блока — это аргументы через запятую в коде.
играть frequency Hz на пине buzzerPintone(buzzerPin, frequency);Порядок в коде фиксирован: сначала пин, потом значение. Порядок слов в блоке может меняться от языка к языку.
если (state = 1) то … иначе …if (state == 1) { … } else { … }Блоки в разъёме «то» идут в первые { }, блоки в разъёме «иначе» — в else { }.

Пока читаешь эту таблицу, выработай одну привычку: сначала переводи самый внутренний блок, а потом двигайся наружу. В «установить frequency в (ограничить frequency снизу 50 сверху 5000)» самая внутренняя часть — constrain(frequency, 50, 5000), а внешний блок «установить» оборачивает её в frequency = …. Блок-значение не может быть отдельной строкой: если поставить после него точку с запятой и оставить так, компилятор может и не возразить, но результат никуда не сохранится.

Частые ошибки при переходе от блоков к коду

Блочный редактор не даёт совершить большинство этих ошибок: форма деталей не позволяет им встать не на своё место. В коде этой защиты нет, поэтому в первые недели почти все сталкиваются с ошибками ниже. Сообщения об ошибках приходят на английском, но шаблонов у них немного, и после пары встреч их уже узнаёшь.

ОшибкаПризнакКак правильно
Нет точки с запятой в конце строки«expected ';' before …» (ожидается «;» перед …); компилятор часто указывает на строку нижеЗаканчивай каждую команду знаком ;. После строк if, for и while ; не ставится.
Не хватает фигурной скобки или есть лишняя«expected '}' at end of input» (ожидается «}» в конце) или код выполняется не там, где нужноКаждой { нужна своя }. Ctrl+T («Автоформатирование», Auto Format) в Arduino IDE исправляет отступы, и пропущенную скобку сразу видно.
= в условииif (state = 1) всегда истинно и к тому же записывает в state единицу; в Python — SyntaxErrorСравнение — ==, присваивание — =. Сравнение = в блоке в коде всегда превращается в ==.
Дробное значение в intint volt = 3.7; сохраняет 3; 5 / 2 даёт 2Для дробных значений используй float, а при делении запиши одно из чисел как 5.0.
Неверное ожидание от digitalReadif (digitalRead(2) == 5) никогда не срабатывает; с кнопкой на подтяжке логика обратнаяdigitalRead возвращает только HIGH (1) или LOW (0). С INPUT_PULLUP нажатая кнопка читается как LOW.
Путаница с заглавными и строчными буквами'digitalwrite' was not declared in this scope (не объявлено в этой области видимости); в Python — NameErrordigitalWrite, pinMode и Serial пишутся буква в букву. В Python True и False начинаются с заглавной буквы.
Цикл со счётом переведён на один проход корочеЦикл, который в блоках выполняется 6 раз, в коде выполняется 5 раз; последний светодиод так и не загорается«от 0 до 5» включает конец: в C++ i <= 5, в Python range(0, 6).
Сбитые отступы в PythonIndentationError или строка, которая оказалась вне циклаНачинай каждую строку под while и if с одних и тех же 4 пробелов; не смешивай табуляцию и пробелы.
Время в Python принимается за миллисекундыtime.sleep(500) ждёт больше 8 минутПиши time.sleep(0.5) или time.sleep_ms(500).
Привычки из C++ переносятся в PythonSyntaxError из-за x++, && или ; в конце строкиВ Python используются x += 1, and, or; знака конца строки нет.
Когда компилятор указывает на строку, всегда смотри и на строку над ней. Пропущенную точку с запятой или незакрытую скобку компилятор часто замечает на строку ниже настоящей проблемы. Если сразу выдаётся несколько ошибок, исправь только первую и скомпилируй заново: остальные часто оказываются эхом первой.

Как оставить блоки позади: метод из 4 шагов

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

  1. Читай параллельно. Открой блоки и код проекта одновременно и пальцем сопоставь каждый блок с его строкой в коде. На этом шаге держи таблицу рядом. Цель: каждую строку кода связать с блоком.
  2. Спрячь блоки и угадай. Сначала посмотри на блоки, потом выключи блочный вид и, не глядя в код, напиши на бумаге C++ для этих блоков. Затем сравни с настоящим кодом. Попробуй и наоборот: прочитай код и угадай блоки.
  3. Измени значение в коде. Перенеси код на компьютер и измени всего одно число: увеличь паузу со 100 до 500 или порог с 400 до 600. Загрузи код в плату и посмотри на разницу своими глазами. Если появилась ошибка компиляции, вернись к таблице ошибок выше.
  4. Напиши новую строку. Добавь строку, которой нет в блоках: Serial.println(), который выводит значение в монитор порта, второй светодиод или if, который работает с кнопкой. Теперь это уже не перевод блоков, а прямое написание кода.

Для каждого шага в серии есть подходящий урок. Для первого шага хорошо начать с таблицы «блок — строка» в статье мигание светодиодом на блоках. Для работы с условиями и циклами на втором и третьем шагах смотри блок «если» и циклы и переменные. Если впереди переход на MicroPython на Pico, в статье от блоков к MicroPython разобрана и установка Thonny. Чтобы растянуть переход на несколько недель в классе, 8-недельный план по робототехнике и программированию даёт готовый порядок.

Блоки и код рядом в приложении BlueGrays

Чаще всего эта таблица пригодится, когда переходишь туда-обратно между блоками и кодом настоящего проекта. В приложении BlueGrays блочный вид есть у более чем 100 проектов; в более чем 30 бесплатных проектах блоки тоже открыты, а в проектах Premium блоки открываются с Premium. Блоки нужны для чтения: в приложении их нельзя редактировать, и в плату они не загружаются. В плату всегда идёт настоящий код; его берут кнопкой Копировать или Копировать ссылку, чтобы открыть на компьютере, и вставляют в Arduino IDE, а для Pico — в Thonny.

  • Показать блоками: включи этот переключатель рядом с исходным кодом на странице проекта, и та же программа появится в виде картинки из блоков на языке приложения. Нажми на картинку, чтобы открыть её на весь экран; выключая и включая переключатель, как раз и отрабатываешь первый и второй шаги.
  • Разбор блоков: при включённом блочном виде вкладка «Разбор кода» получает это название. Программа делится на шаги, у каждого — своя часть и пояснение. Задание «Твоя очередь» в конце — готовое упражнение для четвёртого шага.
  • Справочник по коду: каждая из 36 карточек в разделе «Учёба» (18 по Arduino C++, 18 по MicroPython) показывает свой пример тремя способами на вкладках Блоки, Arduino и MicroPython. Если нужна какая-то строка таблицы подробнее, открой соответствующую карточку.
  • Проекты с блоками: этот вариант в «Фильтре» в разделе «Обзор › Проекты» показывает только проекты с блочным видом, и выбрать проект для перехода становится проще.

Как устроен справочник по коду, мы рассказали в статье о справочнике по коду, а разделы «Разбор кода» и «Твоя очередь» — в руководстве по разбору кода. Если нужно объяснение каждой команды по отдельности, рядом с этой таблицей хорошо работает список команд Arduino.

Одна программа в трёх видах: ночник, который тускнеет при свете

Чтобы увидеть таблицу в деле, соберём небольшую программу. LDR измеряет освещённость; пока в комнате светло, светодиод выключен, а по мере того как темнеет, он постепенно разгорается. Программа использует блоки переменной, аналогового чтения, условия, преобразования, PWM, последовательного порта и ожидания, так что больше половины таблицы встречается в одном примере. Идея основана на бесплатном проекте «Ночник на LDR»; там светодиод просто включается или выключается, а здесь PWM делает его тусклее. Подключение LDR можно посмотреть и на схеме проекта «Измерение освещённости с LDR».

ПодключениеArduino UnoRaspberry Pi Pico
Ножка 1 LDR5V3V3(OUT), физический пин 36
Ножка 2 LDR + один конец резистора 10 kΩ (средняя точка)A0GP26 / ADC0, физический пин 31
Другой конец резистора 10 kΩGNDGND, физический пин 38
Длинная ножка светодиода (через резистор 220 Ω)D9 (PWM-пин)GP15, физический пин 20
Короткая ножка светодиодаGNDGND, физический пин 18
Показание освещённости / диапазон PWM0–1023 / 0–2550–65535 / 0–65535

Сначала блочная версия. С подписями из приложения программа состоит из блоков ниже; каждый пункт соответствует одной или нескольким строкам кода C++, который идёт следом:

  1. глобальные переменные (в начале): объявить целое (int) lightValue = 0 и объявить целое (int) brightness = 0
  2. настройка (один раз): запустить порт на 9600 бод, затем настроить пин 9 как OUTPUT
  3. повторять всегда: установить lightValue в (аналоговое чтение A0)
  4. если (lightValue < 400) то: установить brightness в (преобразовать lightValue : 0 – 400 → 255 – 0); иначе: установить brightness в 0
  5. записать PWM brightness в пин 9
  6. вывести в порт «Light: » без переноса, вывести в порт lightValue без переноса, вывести в порт « PWM: » без переноса, вывести в порт brightness новая строка
  7. ждать 200 мс
C++ (Arduino IDE)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   Işığa göre kısılan gece lambası / Dimming night light
4// ─────────────────────────────────────────
5
6int lightValue = 0;   // LDR okuması / LDR reading (0-1023)
7int brightness = 0;   // LED parlaklığı / LED brightness (0-255)
8
9void setup() {
10  Serial.begin(9600);   // Seri port 9600 baud / Serial at 9600 baud
11  pinMode(9, OUTPUT);   // LED, PWM pini D9 / LED on PWM pin D9
12}
13
14void loop() {
15  lightValue = analogRead(A0);   // Az ışık = küçük değer / Little light = small value
16
17  if (lightValue < 400) {
18    // Karanlık arttıkça LED parlar / The darker it gets, the brighter the LED
19    brightness = map(lightValue, 0, 400, 255, 0);
20  } else {
21    brightness = 0;   // Oda aydınlık, LED kapalı / Room is bright, LED off
22  }
23
24  analogWrite(9, brightness);   // PWM 0-255 / PWM 0-255
25
26  Serial.print("Light: ");
27  Serial.print(lightValue);
28  Serial.print("  PWM: ");
29  Serial.println(brightness);
30
31  delay(200);   // 0,2 sn bekle / Wait 0.2 s
32}
33
MicroPython
1# ─────────────────────────────────────────
2#   BlueGrays · bluegrays.com
3#   Işığa göre kısılan gece lambası / Dimming night light
4# ─────────────────────────────────────────
5from machine import Pin, ADC, PWM
6import time
7
8ldr = ADC(26)                # GP26 = ADC0 / GP26 = ADC0
9led = PWM(Pin(15))           # LED, GP15 / LED on GP15
10led.freq(1000)               # PWM frekansı 1000 Hz / PWM frequency 1000 Hz
11
12THRESHOLD = 25600            # Uno'daki 400'ün karşılığı / Same as 400 on the Uno
13
14
15def arduino_map(x, in_min, in_max, out_min, out_max):
16    # Arduino map() ile aynı hesap / Same math as Arduino map()
17    return (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
18
19
20while True:
21    light_value = ldr.read_u16()          # 0-65535 / 0-65535
22
23    if light_value < THRESHOLD:
24        # Karanlık arttıkça LED parlar / The darker it gets, the brighter the LED
25        brightness = arduino_map(light_value, 0, THRESHOLD, 65535, 0)
26    else:
27        brightness = 0                    # Oda aydınlık, LED kapalı / Room is bright, LED off
28
29    led.duty_u16(brightness)              # PWM 0-65535 / PWM 0-65535
30
31    print("Light:", light_value, " PWM:", brightness)
32
33    time.sleep(0.2)                       # 0,2 sn bekle / Wait 0.2 s
34

Сравни две программы построчно, и все различия из таблицы станут видны. setup() из C++ в Python превращается в строки перед while True, а Serial.begin() исчезает. Вместо analogRead(A0) появляется ADC(26).read_u16(), и диапазон растёт с 0–1023 до 0–65535; поэтому порог равен 25600, а не 400. Вместо analogWrite(9, …) сначала создаётся объект PWM, и яркость задаётся через duty_u16() от 0 до 65535. Поскольку map() не встроена, пишется функция arduino_map(); целочисленное деление // внутри неё соответствует целочисленному делению в C++. Один print() заменяет четыре отдельных вызова Serial.print(), а delay(200) превращается в time.sleep(0.2).

Попробуй третий шаг на этом примере прямо сейчас: на Uno подними порог с 400 до 600, чтобы светодиод начинал светиться раньше. Чтобы сделать то же изменение на Pico, задай THRESHOLD примерно 38400. Следи за значением Light в мониторе порта (9600 бод) или в окне Shell в Thonny, чтобы подобрать порог под свою комнату.

Переход от блочного кода к Arduino C++ — это не столько заучивание нового, сколько узнавание письменной формы уже знакомых блоков. Держи эту таблицу рядом, в каждом проекте сначала читай блоки и код параллельно, а потом спрячь блоки и напиши код без подсказок. Чтобы увидеть эти строки в настоящих проектах, открой в приложении BlueGrays проект с блочным видом и переключайся между двумя формами одной программы с помощью Показать блоками.

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

Что изучать после блочного кода: C++ или Python?

Выбирай по плате, которая есть под рукой. Большинство проектов для Arduino Uno и ESP32 пишутся на Arduino C++, а на Raspberry Pi Pico распространён MicroPython. Логика блоков в обоих одинакова, поэтому после одного языка перейти на другой гораздо быстрее.

Сколько времени занимает переход от блочного кода к коду Arduino?

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

Можно ли программировать Arduino Uno на Python?

Arduino Uno не может запускать MicroPython; её программируют на C++ в Arduino IDE. Для MicroPython нужна более мощная плата, например Raspberry Pi Pico. Зато можно отправлять команды на Uno через последовательный порт из программы на Python, запущенной на компьютере.

Можно ли редактировать блоки в BlueGrays и загружать их в плату?

Нет. Блоки в BlueGrays нужны, чтобы читать и понимать код; в приложении их нельзя редактировать, и в плату они не загружаются. В плату всегда загружается настоящий код проекта через Arduino IDE или Thonny.

Программа из блоков — это настоящий код?

Блоки — наглядная форма настоящего кода; каждый блок соответствует одной или нескольким строкам кода. В проектах BlueGrays с блочным видом блоки и загружаемый код на Arduino C++ или MicroPython описывают одну и ту же программу.

Почему digitalRead возвращает 1 или 0 и HIGH — это то же самое, что 1?

Да, в Arduino HIGH равно 1, а LOW равно 0, и digitalRead возвращает только одно из этих двух значений. Кнопка, подключённая с INPUT_PULLUP, читается как LOW, пока нажата, и как HIGH, когда отпущена. В MicroPython pin.value() тоже даёт 1 или 0.

Все проекты
Настройка частоты зуммера
#14Средний

Настройка частоты зуммера

Ты управляешь звуком зуммера четырьмя кнопками: одна включает звук, другая выключает, а две оставшиеся делают его выше или ниже. Удерживай кнопку вверх или вниз, и высота звука меняется шаг за шагом,

4.6(69)
118
Ночник на LDR
#12Новичок

Ночник на LDR

Маленький ночник, который сам включается, когда темнеет, и гаснет, когда наступает утро. Датчик освещённости измеряет, насколько светло в комнате, и Arduino включает светодиод, когда достаточно темно,

4.8(102)
205
Измерение освещённости с LDR
#11Новичок

Измерение освещённости с LDR

Хочешь увидеть яркость своей комнаты в виде числа? LDR — маленькая деталь, реагирующая на свет, — измеряет освещённость вокруг, а Arduino каждые полсекунды выводит значение на экран компьютера. Закрой

4.6(81)
139
Управление светодиодом кнопкой (удержание)
#9Новичок

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

Как дверной звонок: свет горит, пока ты нажимаешь, и гаснет, когда отпускаешь. Arduino всё время слушает кнопку; пока она нажата, светодиод горит, а как только ты убираешь палец, он гаснет. Эта просте

4.8(113)
229
Включение и выключение светодиода кнопкой (вкл/выкл)
#10Новичок

Включение и выключение светодиода кнопкой (вкл/выкл)

Нажми кнопку один раз — свет загорится, нажми ещё раз — погаснет, совсем как выключатель в твоей комнате. Arduino замечает каждое нажатие и переводит светодиод в противоположное состояние, выжидая кор

4.8(100)
167
Бегущие огни с регулируемой скоростью
#7Средний

Бегущие огни с регулируемой скоростью

Шесть светодиодов загораются друг за другом, и кажется, что свет бежит от одного края к другому. Поверни ручку потенциометра, и скорость этого бега сразу меняется: в одну сторону свет мчится, в другую

4.6(72)
146
Измерение расстояния HC-SR04 (вывод в порт)
#27Новичок

Измерение расстояния HC-SR04 (вывод в порт)

Датчик HC-SR04 работает совсем как летучая мышь, которая находит дорогу в темноте: он посылает звук, которого ты не слышишь, слушает эхо и измеряет, насколько далеко предмет перед ним. Arduino каждые

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

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

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

4.5(2)
7