mBlock для Arduino: установка, режим Live, загрузка кода и блоки
mBlock и Arduino: установка mBlock 5, добавление Arduino Uno и прошивки, режим Live и режим загрузки, блоки для светодиода, кнопки и датчиков, код Arduino C, 9 заданий.
Программировать Arduino в mBlock — один из самых простых способов заставить Arduino Uno мигать светодиодом или читать кнопку и датчик, не написав ни строчки кода. mBlock 5 — бесплатная среда блочного программирования от Makeblock на основе Scratch 3.0: цветные блоки складываются, как пазл, а mBlock незаметно превращает их в код Arduino C, компилирует и загружает в плату. Ещё блоки можно сразу запускать на плате и связывать с персонажами на сцене. Поэтому mBlock — один из самых популярных инструментов на школьных уроках робототехники, в проектах для научных выставок и на первом шаге в мир Arduino.
В этом руководстве пошагово разберём, как установить mBlock на компьютер или работать с ним в браузере, как добавить и подключить Arduino Uno как устройство, как загрузить прошивку для режима Live, чем режим Live отличается от режима загрузки (Upload), какие есть блоки для светодиода, кнопки и датчиков, в какие строки Arduino C превращаются блоки, девять заданий для уроков, как перейти на Arduino IDE и как решить самые частые проблемы с подключением.

Что такое mBlock и как он работает с Arduino?
mBlock — среда программирования, построенная на основе Scratch 3.0, который разработан в MIT. Главное её отличие от Scratch в том, что кроме персонажей на экране (спрайтов) она умеет программировать и настоящее железо. В интерфейсе две отдельные вкладки: на вкладке Sprites (спрайты) программируются персонажи на сцене, а на вкладке Devices (устройства) — платы вроде Arduino, micro:bit или роботов Makeblock. При выборе устройства в палитру блоков добавляются категории для этой платы; для Arduino Uno это блоки пинов и последовательного порта. В режиме загрузки скрипт из блоков переводится в Arduino C, компилируется в машинный код и по USB записывается во флеш-память платы. Иначе говоря, mBlock делает ту же работу, что и Arduino IDE, только через блочный интерфейс, а поскольку он показывает сгенерированный код, ещё и упрощает переход к текстовому коду.
| Параметр | mBlock 5 |
|---|---|
| Разработчик | Makeblock |
| Основа | Scratch 3.0 (открывает проекты Scratch и mBlock 3) |
| Цена | Бесплатно |
| Версии | Настольная для Windows и macOS, браузерная (Chrome или Edge), приложение для Android и iOS |
| Платы Arduino | Uno, Nano, Nano (old), Mega 2560; Leonardo, Micro и Yun в настольной версии или через mLink |
| Текстовый язык | Arduino C на платах Arduino, Python на платах Makeblock и на сцене |
| Файл проекта | .mblock |
| Язык интерфейса | Десятки языков, включая русский |
Установка mBlock: настольная и веб-версия
- Открой в браузере mblock.cc и на странице загрузки (Download) скачай настольную версию mBlock 5 для своей операционной системы. На момент написания актуальная версия — V5.6; поддерживаются 64-битная Windows 7 и новее и macOS 10.12 и новее, для Mac на чипах Apple M-серии есть отдельный установщик.
- В Windows запусти установщик и следуй указаниям мастера. Если во время установки предлагается поставить драйвер CH340, соглашайся: на этом USB-UART-преобразователе работает большинство клонов Arduino, и без драйвера порт не появится.
- Если в macOS установщик не открывается, нажми на файл правой кнопкой и выбери Открыть или воспользуйся кнопкой Всё равно открыть в разделе «Конфиденциальность и безопасность» в «Системных настройках».
- Открой mBlock и выбери язык через значок глобуса в верхнем меню, например русский. После этого меню и названия блоков отображаются на этом языке.
- На школьных компьютерах, где нельзя устанавливать программы, открой ide.mblock.cc в браузере; для подключения Arduino используй свежую версию Chrome или Edge.
Долгое время веб-версия подключалась к платам через маленькую вспомогательную программу mLink. В новых версиях по умолчанию используется прямое подключение через поддержку последовательного порта в браузере: при нажатии на кнопку подключения браузер открывает окно, в нём выбирается порт Arduino — и связь установлена без установки дополнительных программ. Так работают Uno, Nano, Nano (old) и Mega 2560; платам, которые используют USB иначе, например Leonardo, Micro и Yun, по-прежнему нужен mLink. Пока mLink запущен, на панели задач виден маленький значок панды. Не держи одновременно открытыми настольную и веб-версию или две вкладки mBlock: обе пытаются занять один и тот же порт, и подключение не удаётся.
| Параметр | Настольная версия | Веб-версия |
|---|---|---|
| Установка | Нужна (Windows, macOS) | Не нужна, открывается в браузере |
| Требования к браузеру | Нет | Chrome или Edge (для поддержки последовательного порта) |
| Подключение Arduino | Достаточно USB-кабеля и драйвера | Прямое подключение или mLink |
| Leonardo, Micro, Yun | Поддерживаются | Только через mLink |
| Chromebook и Linux | Настольной версии нет | Работает в Chrome |
| Сохранение проектов | Файл .mblock на компьютере | В аккаунт или скачиванием на компьютер |
| Для школы | Стабильнее работает в медленных или ограниченных сетях | Удобна на компьютерах без прав на установку |
Добавление устройства: подключаем Arduino Uno к mBlock
- Подключи Arduino к компьютеру USB-кабелем; на плате должен загореться светодиод ON (питание).
- В mBlock перейди на вкладку Devices (устройства) под сценой. Удали устройство Makeblock, которое стоит там по умолчанию (в зависимости от версии Codey Rocky или CyberPi), крестиком в его углу.
- Нажми + Add (добавить), в открывшейся библиотеке устройств введи в поиск «Arduino», выбери Arduino Uno и нажми OK. Если нажать на звёздочку в левом верхнем углу платы, mBlock подготовит её при следующем запуске.
- Нажми Connect (подключить). На вкладке USB открывшегося окна выбери порт, который нашёл mBlock: в Windows это имя вроде COM3 или COM4, в macOS — что-то вроде /dev/cu.usbmodem… или, на платах с CH340, /dev/cu.wchusbserial…. Если порта нет в списке, поставь галочку Show all connectable devices (показать все доступные устройства).
- Ещё раз нажми Connect. Если появилось сообщение «Device connected» (устройство подключено), всё готово: в палитре блоков появятся блоки пинов и последовательного порта для Arduino.
Правильный выбор устройства — половина успеха. Неважно, оригинал это или клон: для Uno выбирай Arduino Uno, для Mega — Arduino Mega2560. На большинстве дешёвых клонов Arduino Nano стоит старый загрузчик; на таких платах загрузка с вариантом Arduino Nano не проходит, а вариант Arduino Nano (old) работает. Новые платы с другим процессором, например Arduino Uno R4, через устройство Uno в mBlock не программируются; для них сразу используй Arduino IDE. Если выбор платы ещё не сделан, прочитай статью Какую Arduino купить?, а расположение пинов Nano смотри в руководстве распиновка Arduino Nano.

Режим Live и режим загрузки: в чём разница?
Для программирования устройств в mBlock есть два режима; переключаются они тумблером на вкладке «Устройства». В режиме Live программа на самом деле выполняется на компьютере: mBlock по очереди читает каждый блок и по USB отправляет в Arduino команды вроде «включи пин 13» или «прочитай A0 и пришли результат». Для этого в Arduino должна быть специальная прошивка, которая понимает эти команды. Результат виден сразу, значения датчиков можно наблюдать на сцене и связывать Arduino со спрайтами, но как только USB-кабель отключён или mBlock закрыт, программа останавливается. В режиме загрузки блоки переводятся в Arduino C, компилируются и навсегда записываются в плату; даже без кабеля программа продолжает работать от батарейки или адаптера. В этом режиме программа должна стоять под блоком-шапкой when Arduino Uno starts up («когда Arduino Uno запускается»); события сцены, такие как зелёный флажок, на плату не переносятся.
| Параметр | Режим Live | Режим загрузки (Upload) |
|---|---|---|
| Где выполняется программа? | На компьютере, команды идут по USB | На собственном процессоре Arduino |
| Стартовый блок | События вроде when green flag clicked или нажатия клавиши | when Arduino Uno starts up |
| USB-кабель | Должен быть подключён всё время | Нужен только при загрузке |
| Программа в Arduino | Прошивка mBlock | Твоя скомпилированная программа |
| Тайминг | Медленнее и неравномернее, ведь каждая команда ходит туда и обратно по USB | Точность до миллисекунды и даже микросекунды |
| Взаимодействие со спрайтами | Напрямую через блоки переменных и сообщений (broadcast) | Только через расширение Upload Mode Broadcast на устройствах, которые его поддерживают |
| Лучше всего подходит для | Проверки, отладки, игр на сцене | Роботов, сигнализаций, готовых проектов на батарейках |
Загрузка прошивки: готовим Arduino к режиму Live
- Подключи Arduino (Connect) и переведи переключатель режима в положение Live.
- Если в плате нет прошивки mBlock, программа обычно сама предлагает её обновить. Если нет, выбери Update Firmware (обновить прошивку) в меню Setting (настройки) рядом с кнопками подключения и запусти обновление в открывшемся окне.
- Во время загрузки светодиоды TX и RX на плате часто мигают; не отключай кабель и не закрывай mBlock, пока индикатор выполнения не дойдёт до конца.
- Для проверки перетащи из блоков пинов блок set digital pin (13) output as (high) в область скриптов и нажми на него один раз. Если светодиод L на плате сразу загорелся, режим Live работает; нажми на тот же блок с вариантом (low) — и светодиод погаснет.
Базовые блоки Arduino: светодиоды, кнопки и датчики
После добавления Arduino Uno в палитре блоков рядом со знакомыми по Scratch категориями Events (события), Control (управление), Operators (операторы), Variables (переменные) и My Blocks (мои блоки) появляются категории пинов и последовательного порта для этой платы. В русском интерфейсе блоки отображаются по-русски, а в таблице ниже, чтобы не запутаться, приведены их английские названия и то, что они делают. Названия блоков в разных версиях могут немного отличаться; если нажать на любой блок правой кнопкой и выбрать Help (справка), mBlock покажет его описание. На Uno ШИМ работает только на пинах 3, 5, 6, 9, 10 и 11; полную карту пинов можно посмотреть в утилите распиновки.
| Блок (английское название) | Что делает? | Пример использования |
|---|---|---|
| when Arduino Uno starts up (когда Arduino Uno запускается) | Блок-шапка, с которого начинается программа в режиме загрузки | Любая программа, загружаемая в плату |
| set digital pin (13) output as (high) (установить цифровой пин 13 в HIGH) | Переводит пин в HIGH (5 V) или LOW (0 V) | Светодиод, активный зуммер, реле |
| read digital pin (2) (прочитать цифровой пин 2) | Читает уровень на пине как «истина» или «ложь» | Кнопка, PIR-датчик, ИК-датчик препятствий |
| read analog pin (A) (0) (прочитать аналоговый пин A0) | Превращает напряжение на пинах A0–A5 в число от 0 до 1023 | Фоторезистор (LDR), потенциометр, датчик влажности почвы |
| set pwm pin (5) output as (128) (ШИМ на пине 5 со значением 128) | Выдаёт ШИМ-сигнал от 0 до 255 | Яркость светодиода, скорость DC-мотора |
| set servo pin (9) angle as (90) (сервопривод на пине 9 на угол 90) | Поворачивает сервопривод на угол от 0 до 180 градусов | Шлагбаум на SG90, робот-манипулятор |
| play pin (8) with note (C4) for (0.25) beat (сыграть ноту До (C4) на пине 8) | Играет ноту на пассивном зуммере | Мелодия, дверной звонок |
| forever / repeat (10) / if … then … else (всегда / повторить 10 раз / если … то … иначе) | Блоки циклов и условий | Постоянная проверка, счёт, принятие решений |
| wait (1) seconds (ждать 1 секунду) | Приостанавливает программу на заданное время | Мигание, светофор |







Таблица подключения: один учебный набор для всех заданий
Собирать схему заново каждую неделю — пустая трата времени урока. Если один раз собрать на макетной плате подключение ниже, все девять заданий можно выполнить, не трогая провода. Резистор для светодиода можно проверить в калькуляторе резистора для светодиода, а напряжение, которое даёт делитель с фоторезистором, — в утилите делителя напряжения. Если эти детали в руках впервые, в статьях светодиод, кнопка, фоторезистор и сервопривод подробно объясняется подключение каждой из них.
| Деталь | Arduino Uno | ESP32 | Raspberry Pi Pico | Примечание |
|---|---|---|---|---|
| Светодиод + резистор 220 Ω | D5 | GPIO 18 | GP14 | Длинная ножка (анод) к пину, короткая — к GND |
| Кнопка + стягивающий резистор 10 kΩ | D2 | GPIO 4 | GP2 | Второй вывод кнопки — к 5V на Uno, к 3V3 на ESP32 и Pico |
| Фоторезистор + резистор 10 kΩ | A0 | GPIO 34 | GP26 (ADC0) | Фоторезистор между питанием и пином, резистор между пином и GND |
| Потенциометр (средний вывод) | A1 | GPIO 35 | GP27 (ADC1) | Крайние выводы — к питанию и GND |
| Сервопривод SG90 (сигнал) | D9 | GPIO 13 | GP16 | Красный провод — к 5 V (VIN на ESP32, VBUS на Pico), коричневый — к GND |
| Пассивный зуммер | D8 | GPIO 25 | GP15 | Второй вывод — к GND |
| HC-SR04 Trig / Echo | D11 / D12 | GPIO 26 / 27 | GP17 / GP18 | На ESP32 и Pico понизь линию Echo до 3,3 V делителем напряжения |
Первая программа: мигаем светодиодом в режиме загрузки
- Переведи переключатель режима в положение Upload (загрузка).
- Перетащи блок when Arduino Uno starts up из категории Events в область скриптов.
- Прикрепи под ним блок forever (всегда) из категории Control.
- Внутрь блока forever по порядку положи set digital pin (13) output as (high), wait (1) seconds, set digital pin (13) output as (low) и ещё один wait (1) seconds.
- Нажми Upload (загрузить). mBlock компилирует код и отправляет его в плату; через несколько секунд появится сообщение о том, что загрузка завершена.
- Светодиод L на плате начнёт мигать раз в секунду. Если отключить USB-кабель и питать плату от пауэрбанка или адаптера на 7–12 V, программа всё равно работает; варианты питания разобраны в статье Arduino от батареек.
Как блоки превращаются в код Arduino C?
В режиме загрузки нажми кнопку кода Arduino C у правого края (значок с угловыми скобками), и mBlock покажет на панели код, соответствующий блокам. Любое изменение в блоках сразу обновляет код; это самый простой способ понять, какой блок даёт какую строку. Если в программу Blink выше добавить переменную sayac (счётчик) и увеличивать её на 1 при каждом проходе, сгенерированный код будет выглядеть примерно так. Строки комментариев добавили мы; отступы и место некоторых строк, например pinMode, в разных версиях могут немного отличаться.
1// generated by mBlock5 for <your product>
2// codes make you happy
3// mBlock'un ürettiği kodun yapısı: Blink + sayaç / Structure of mBlock-generated code: Blink + counter
4
5#include <Arduino.h>
6#include <Wire.h>
7#include <SoftwareSerial.h>
8
9float sayac = 0; // mBlock değişkenleri float olur / mBlock variables become float
10
11void _loop(); // ön bildirim, Arduino IDE de ekler / forward declaration, the Arduino IDE adds it too
12
13void _delay(float seconds) { // "wait (1) seconds" bloğu / the "wait (1) seconds" block
14 long endTime = millis() + seconds * 1000;
15 while (millis() < endTime) _loop();
16}
17
18void setup() { // "when Arduino Uno starts up" altındaki bloklar / blocks under "when Arduino Uno starts up"
19 pinMode(13, OUTPUT);
20 while (1) { // "forever" bloğu / the "forever" block
21 digitalWrite(13, 1); // pin 13 HIGH: dahili L LED'i yanar / pin 13 HIGH: the built-in L LED turns on
22 _delay(1);
23 digitalWrite(13, 0); // pin 13 LOW: LED söner / pin 13 LOW: the LED turns off
24 _delay(1);
25 sayac += 1; // "change sayac by 1" bloğu / the "change sayac by 1" block
26 _loop();
27 }
28}
29
30void _loop() { // uzantıların sürekli çalışan kodu buraya eklenir / extensions add their recurring code here
31}
32
33void loop() {
34 _loop();
35}В этом коде стоит обратить внимание на четыре вещи. Во-первых, блок forever превращается не в функцию loop() Arduino, а в бесконечный цикл while(1) внутри setup(); loop() только вызывает функцию _loop(). Во-вторых, блок wait использует вместо delay() функцию _delay(); во время ожидания она продолжает вызывать _loop(), поэтому работа, которую некоторые расширения выполняют в фоне, не останавливается. В-третьих, каждая переменная, созданная в mBlock, объявляется как float (дробное число); на Uno каждая занимает 4 байта ОЗУ и может давать небольшие ошибки округления при сравнении на равенство. Например, переменная, которую увеличивают на 0,1, после десяти шагов может оказаться не ровно 1, поэтому сравнение «больше» или «меньше» надёжнее, чем «равно». В-четвёртых, библиотеки Wire и SoftwareSerial в самом начале обычно подключаются, даже если они не используются; программа всё равно работает, но может занимать чуть больше места, чем написанная вручную.
| Блок | Эквивалент в Arduino C |
|---|---|
| when Arduino Uno starts up | Код внутри void setup() { … } |
| forever (всегда) | while(1) { … _loop(); } |
| repeat (10) (повторить 10 раз) | for (int count = 0; count < 10; count++) { … } (цикл for) |
| wait (1) seconds (ждать 1 секунду) | _delay(1); |
| wait until (условие) | while (!(условие)) { _loop(); } |
| if (условие) then … else … | if (условие) { … } else { … } |
| set digital pin (13) output as (high) (HIGH на цифровой пин 13) | pinMode(13, OUTPUT); digitalWrite(13, 1); |
| read digital pin (2) (прочитать цифровой пин 2) | digitalRead(2) |
| read analog pin (A) (0) (прочитать аналоговый пин A0) | analogRead(A0) |
| set pwm pin (5) output as (128) (ШИМ на пине 5) | analogWrite(5, 128); |
| set servo pin (9) angle as (90) (угол сервопривода на пине 9) | Библиотека Servo: attach(9) и write(90) |
| set [sayac] to (0) / change [sayac] by (1) (задать / изменить sayac) | sayac = 0; / sayac += 1; |
Примеры заданий для уроков робототехники
Девять заданий ниже расположены от простого к сложному в расчёте на 40-минутные уроки, и все они выполняются на одном учебном наборе с подключением выше. Хороший подход — начинать каждое задание в режиме Live: ученики нажимают на блок и сразу видят результат, наблюдают значения датчиков на сцене и сами находят свои ошибки. Когда программа работает как задумано, перенос тех же блоков в режим загрузки и запись их в плату навсегда дают понять идею «устройства, которое работает без компьютера». Программные понятия, на которых построены эти задания, в виде текстового кода есть и в статье основы программирования Arduino.
| Урок | Задание | Используемые блоки | Изучаемое понятие |
|---|---|---|---|
| 1 | Мигающий сигнальный огонь (D13 или D5) | Блоки set digital pin, wait, forever | Последовательность действий, бесконечный цикл |
| 2 | Светофор (три светодиода на D5, D6 и D7) | Блоки set digital pin, wait | Тайминг, порядок состояний |
| 3 | Включение и выключение светодиода кнопкой | Блоки read digital pin, if … else | Ввод и вывод, условия |
| 4 | Автоматический ночник | Блок read analog pin, оператор «меньше» | Аналоговое значение, порог |
| 5 | Регулятор яркости светодиода на потенциометре | Блоки read analog pin, set pwm pin, деление | Масштабирование, ШИМ |
| 6 | Шлагбаум на сервоприводе | Блок set servo pin, умножение и деление | Пропорция, угол |
| 7 | Дверной звонок и мелодия | Блоки play pin with note, repeat | Частота, ноты, повторение |
| 8 | Парктроник (расширение HC-SR04) | Блок расширения, if … else, зуммер | Добавление расширений, измерение расстояния |
| 9 | Игра с ракеткой на сцене, управление потенциометром | Режим Live, переменная, движение спрайта | Взаимодействие железа и программы |
Самое поучительное на уроках — преобразование чисел. Потенциометр даёт значение от 0 до 1023, а ШИМ ждёт от 0 до 255, поэтому в задании 5 прочитанное значение делится на 4 (1023 ÷ 4 ≈ 255). Чтобы превратить то же значение в угол для сервопривода, из блоков операторов собирается выражение значение × 180 ÷ 1023. В задании 9 в режиме Live для Arduino составляется скрипт «when green flag clicked, forever, set [pot] to (read analog pin A1)»; у спрайта та же переменная используется в блоке set x to (pot × 480 ÷ 1023 − 240), чтобы ракетка двигалась по всей ширине сцены от −240 до 240. Если при создании переменной не отметить вариант «для всех спрайтов», устройство и спрайт не будут видеть одну и ту же переменную. Для парктроника открой «Центр расширений» кнопкой + extension (расширение) внизу палитры блоков и добавь расширение для ультразвукового датчика; большинство таких расширений делают разработчики из сообщества, поэтому названия блоков и поддерживаемые пины от расширения к расширению отличаются. Как работает датчик, рассказано в статье датчик расстояния HC-SR04, а частоты нот — в статье зуммер.
Переход на Arduino IDE: от блоков к настоящему коду
В какой-то момент блоков становится мало: с ростом программы область скриптов превращается в кашу, нужна библиотека датчика, которой нет в «Центре расширений», или хочется выполнять несколько задач одновременно, без delay. Тогда пора заняться установкой Arduino IDE и перейти на текстовый код; добавление библиотек для новых датчиков тоже окажется в твоих руках. Лучший способ смягчить переход — переписать в Arduino IDE проект, сделанный в mBlock: так одна и та же логика видна в двух представлениях рядом.
- В mBlock выдели и скопируй код на панели Arduino C; открой в Arduino IDE новый скетч и вставь его.
- Выбери плату (Arduino Uno) и порт в меню «Инструменты» (Tools), затем нажми сначала Проверить, а потом Загрузка. Код должен работать так же, как в mBlock.
- Затем упрости код: собери строки pinMode в setup(), перенеси содержимое цикла while(1) в loop() и вместо _delay() используй delay() или millis().
- Где это уместно, замени переменные float на int или bool и дай номерам пинов понятные имена через const int.
- Выводи переменные в монитор порта, чтобы следить за тем, что делает программа; это текстовый аналог живого наблюдения в mBlock.
Ниже — программа, которая объединяет задания 3 и 4: автоматический ночник, который включается и выключается кнопкой, написанный в Arduino IDE. Номера пинов совпадают с таблицей подключения выше.
1// mBlock gece lambası etkinliğinin Arduino IDE ile yazılmış hali
2// The mBlock night-light activity rewritten for the Arduino IDE
3const int LED_PIN = 5; // LED + 220 ohm direnç (PWM pini) / LED + 220 ohm resistor (PWM pin)
4const int BUTON_PIN = 2; // buton 5V'a, 10k pull-down GND'ye / button to 5V, 10k pull-down to GND
5const int LDR_PIN = A0; // LDR + 10k gerilim bölücü / LDR + 10k voltage divider
6const int ESIK = 400; // bu değerin altı "karanlık" sayılır / below this value counts as "dark"
7
8bool sistemAcik = true; // butonla açılıp kapanır / toggled with the button
9int oncekiButon = LOW; // önceki buton durumu / previous button state
10unsigned long sonYazma = 0; // son Seri Monitör yazma zamanı / last Serial Monitor print time
11
12void setup() {
13 pinMode(LED_PIN, OUTPUT);
14 pinMode(BUTON_PIN, INPUT); // harici pull-down olduğu için INPUT / INPUT because of the external pull-down
15 Serial.begin(9600); // Seri Monitör 9600 baud / Serial Monitor at 9600 baud
16}
17
18void loop() {
19 int buton = digitalRead(BUTON_PIN);
20 if (buton == HIGH && oncekiButon == LOW) { // yalnız basıldığı an / only at the moment of the press
21 sistemAcik = !sistemAcik;
22 delay(30); // basit debounce / simple debounce
23 }
24 oncekiButon = buton;
25
26 int isik = analogRead(LDR_PIN); // 0 karanlık, 1023 aydınlık / 0 dark, 1023 bright
27 if (sistemAcik && isik < ESIK) {
28 int parlaklik = map(isik, 0, ESIK, 255, 40); // karardıkça daha parlak / brighter as it gets darker
29 analogWrite(LED_PIN, parlaklik);
30 } else {
31 analogWrite(LED_PIN, 0);
32 }
33
34 if (millis() - sonYazma >= 500) { // delay olmadan yarım saniyede bir yaz / print every half second without delay
35 sonYazma = millis();
36 Serial.print("Isik: ");
37 Serial.print(isik);
38 Serial.print(" Sistem: ");
39 Serial.println(sistemAcik ? "acik" : "kapali");
40 }
41}Посмотри, чем она отличается от версии из mBlock: setup() выполняется только один раз и готовит пины, а loop() повторяется сам по себе, поэтому while(1) не нужен. Кнопка сравнивается со своим предыдущим состоянием и засчитывается только в момент нажатия; иначе, пока палец лежит на кнопке, система переключалась бы сотни раз в секунду. Функция map() масштабирует значение фоторезистора в диапазон от 255 до 40, так что чем темнее в комнате, тем ярче светится светодиод. Вывод в монитор порта происходит раз в полсекунды через millis(), а не через delay(), поэтому во время ожидания программа не пропускает нажатие кнопки. Подробности этого приёма — в статье millis и delay, а больше о выводе данных — в статье монитор порта Arduino.
Та же программа на ESP32 и Raspberry Pi Pico
В библиотеке устройств mBlock есть собственные платы Makeblock на базе ESP32, например CyberPi и HaloCode, но официального устройства для обычной отладочной платы ESP32 или для Raspberry Pi Pico нет; расширения от сообщества, которые иногда встречаются, тоже меняются от версии к версии. Хорошая новость в том, что логика, освоенная на блоках, от платы к плате не меняется. Когда ESP32 программируется в Arduino IDE, код почти тот же; меняются только номера пинов, рабочее напряжение 3,3 V и 12-битная шкала АЦП от 0 до 4095. Поэтому порог темноты становится примерно 1600 вместо 400.
1// Aynı gece lambası ESP32'de (Arduino IDE) / The same night light on the ESP32 (Arduino IDE)
2const int LED_PIN = 18; // LED + 220 ohm direnç / LED + 220 ohm resistor
3const int BUTON_PIN = 4; // buton 3V3'e, 10k pull-down GND'ye / button to 3V3, 10k pull-down to GND
4const int LDR_PIN = 34; // ADC1 girişi, LDR + 10k bölücü (3V3) / ADC1 input, LDR + 10k divider (3V3)
5const int ESIK = 1600; // ESP32 ADC 12 bit: 0-4095 / ESP32 ADC is 12-bit: 0-4095
6
7bool sistemAcik = true; // butonla açılıp kapanır / toggled with the button
8int oncekiButon = LOW; // önceki buton durumu / previous button state
9unsigned long sonYazma = 0; // son yazma zamanı / last print time
10
11void setup() {
12 pinMode(LED_PIN, OUTPUT);
13 pinMode(BUTON_PIN, INPUT); // harici pull-down / external pull-down
14 Serial.begin(115200); // ESP32 için yaygın hız / common speed for the ESP32
15}
16
17void loop() {
18 int buton = digitalRead(BUTON_PIN);
19 if (buton == HIGH && oncekiButon == LOW) { // yalnız basıldığı an / only at the moment of the press
20 sistemAcik = !sistemAcik;
21 delay(30); // basit debounce / simple debounce
22 }
23 oncekiButon = buton;
24
25 int isik = analogRead(LDR_PIN); // 0 karanlık, 4095 aydınlık / 0 dark, 4095 bright
26 if (sistemAcik && isik < ESIK) {
27 analogWrite(LED_PIN, map(isik, 0, ESIK, 255, 40)); // karardıkça daha parlak / brighter as it gets darker
28 } else {
29 analogWrite(LED_PIN, 0);
30 }
31
32 if (millis() - sonYazma >= 500) { // yarım saniyede bir yaz / print every half second
33 sonYazma = millis();
34 Serial.printf("Isik: %d Sistem: %s\n", isik, sistemAcik ? "acik" : "kapali");
35 }
36}На Raspberry Pi Pico чаще всего используют MicroPython. Программа ниже, которую нужно запускать в редакторе Thonny, делает то же самое: read_u16() возвращает значение АЦП от 0 до 65535, а duty_u16() ждёт коэффициент заполнения ШИМ в той же шкале. Почему Python — хороший второй шаг после блочного программирования, мы рассказываем в статье основы MicroPython.
1# Aynı gece lambası Raspberry Pi Pico'da (MicroPython) / The same night light on Raspberry Pi Pico (MicroPython)
2from machine import Pin, ADC, PWM
3import time
4
5led = PWM(Pin(14)) # LED + 220 ohm direnç / LED + 220 ohm resistor
6led.freq(1000) # PWM frekansı 1 kHz / PWM frequency 1 kHz
7buton = Pin(2, Pin.IN, Pin.PULL_DOWN) # buton 3V3'e, pull-down / button to 3V3, pull-down
8ldr = ADC(26) # GP26 = ADC0, LDR + 10k bölücü / GP26 = ADC0, LDR + 10k divider
9ESIK = 25000 # 0-65535 arası karanlık eşiği / darkness threshold on 0-65535
10
11sistem_acik = True # butonla açılıp kapanır / toggled with the button
12onceki = 0 # önceki buton durumu / previous button state
13son_yazma = time.ticks_ms() # son yazma zamanı / last print time
14
15while True:
16 b = buton.value()
17 if b == 1 and onceki == 0: # yalnız basıldığı an / only at the moment of the press
18 sistem_acik = not sistem_acik
19 time.sleep_ms(30) # basit debounce / simple debounce
20 onceki = b
21
22 isik = ldr.read_u16() # 0 karanlık, 65535 aydınlık / 0 dark, 65535 bright
23 if sistem_acik and isik < ESIK:
24 # karardıkça daha parlak / brighter as it gets darker
25 led.duty_u16(65535 - isik * 55000 // ESIK)
26 else:
27 led.duty_u16(0)
28
29 if time.ticks_diff(time.ticks_ms(), son_yazma) >= 500: # yarım saniyede bir / every half second
30 son_yazma = time.ticks_ms()
31 print("Isik:", isik, " Sistem:", "acik" if sistem_acik else "kapali")Те же проекты в виде блоков на телефоне
Если хочется продолжать работать с блочной логикой из mBlock вдали от компьютера, загляни в приложение BlueGrays. Код более чем 100 проектов для Arduino, ESP32 и Raspberry Pi Pico в приложении доступен и в наших собственных блоках на основе Blockly. Включи в проекте Показать блоками — и вместо кода появится та же программа из блоков; а вкладка Разбор блоков пошагово объясняет, что делает каждый блок. Все задания из этого руководства — светодиод, светофор, светодиод с кнопкой, ночник на фоторезисторе, зуммер, парктроник и сервопривод с потенциометром — есть там и в блоках, и в виде кода Arduino C, а переключаться между ними можно одним касанием. Сравнить последовательность, собранную в mBlock, с блоками в приложении — простой способ увидеть, как одна и та же логика строится в двух разных инструментах.
Для ESP32 и Pico, у которых, как сказано выше, нет официального устройства в mBlock, в приложении тоже есть проекты с блоками: сначала посмотри блочную версию, а потом переходи к коду Arduino C или MicroPython того же проекта. В разделе приложения Справочник по коду примеры базовых команд, таких как digitalWrite, if/else и циклы, тоже показаны блоками. А чтобы закрепить знания, Вопросы дня дают 5 вопросов в день по уровням от A1 до C2, а также недельный рейтинг и значки.
Частые проблемы с подключением и их решения
| Симптом | Вероятная причина | Решение |
|---|---|---|
| Список портов пуст | Кабель только для зарядки или нет драйвера CH340 | Используй кабель с передачей данных и установи драйвер CH340; в «Диспетчере устройств» должна появиться строка вроде «USB-SERIAL CH340 (COM3)» |
| Порт виден, но подключения нет | Порт занят другой программой | Закрой монитор порта Arduino IDE, второе окно mBlock или вкладку веб-версии |
| Подключение есть, но загрузка не проходит | В библиотеке устройств выбрана не та плата | Выбери точную модель платы; на клоне Nano попробуй Arduino Nano (old) |
| В веб-версии не открывается список портов | Браузер не поддерживает последовательные порты | Используй свежую версию Chrome или Edge |
| Leonardo не подключается в веб-версии | Прямое подключение не поддерживает Leonardo, Micro и Yun | Установи mLink или используй настольную версию |
| В режиме Live блоки не реагируют | Прошивки нет или её стёрла загруженная программа | Снова загрузи прошивку через Setting > Update Firmware (настройки › обновить прошивку) |
| Загрузка завершилась, но программа не работает | Блоки не стоят под when Arduino Uno starts up | Присоедини программу к блоку-шапке; отдельно лежащие блоки в код не превращаются |
| Программа зависает или плата постоянно перезагружается | Сервопривод или мотор берёт слишком большой ток от USB | Питай сервоприводы и моторы от внешнего источника 5 V и соедини GND |
| mLink не устанавливается или не открывается | Его блокирует антивирус или брандмауэр | Разреши установку и добавь mLink в список доверенных |
Быстро понять, в чём проблема — в mBlock или в плате, — можно, попробовав загрузить в ту же плату пример Blink через Arduino IDE. Если и Arduino IDE выдаёт ошибку вроде avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00 (нет синхронизации с платой), плата и компьютер не могут связаться: проблема в порте, кабеле, типе платы или загрузчике. Все причины этой ошибки разобраны в руководстве код не загружается в Arduino; подробнее о микросхеме CH340 и её драйверах — в статье преобразователь USB-TTL. Если плата перезагружается, когда подключён сервопривод, помогут советы по питанию из статьи Arduino постоянно перезагружается.
Идеи проектов, которые можно сделать в mBlock
- Светофор с кнопкой для пешеходов: при нажатии на кнопку для машин загорается красный, а для пешеходов — зелёный; схема и код — в статье светофор на Arduino.
- Парктроник: сигнал, который пищит всё чаще, и светодиоды, которых загорается всё больше, по мере того как HC-SR04 измеряет всё меньшее расстояние.
- Робот, объезжающий препятствия: машинка с двумя моторами и датчиком расстояния, которая видит препятствие впереди и меняет направление; подробности в руководстве робот, объезжающий препятствия.
- Робот, следующий по линии: соревновательный робот, который едет по чёрной ленте с помощью ИК-датчиков (робот, следующий по линии).
- Пульт для сцены: игра в режиме Live, в которой потенциометр или джойстик управляет космическим кораблём на сцене.
- Автополив растений: система, которая включает маленький насос, когда датчик влажности почвы обнаруживает сухую почву.
- Радар на сервоприводе: проект, который сканирует пространство вокруг датчиком расстояния на сервоприводе и рисует на сцене экран радара (радар на Arduino).
- Робот-машинка: перенеси логику моторов и датчиков, освоенную в mBlock, в проект робот-машинка на Arduino.
mBlock — самый мягкий способ программировать настоящую Arduino с удобством блочного кода и перейти на текстовый код, когда придёт время. Если платы пока нет, те же задания можно попробовать в браузере в симуляторе Arduino в Tinkercad. В приложении BlueGrays есть пошаговые схемы и код проектов со светодиодом, светофором, светодиодом с кнопкой, ночником на фоторезисторе, зуммером, парктроником на HC-SR04 и сервоприводом с потенциометром; эти же проекты можно открыть и в виде блоков, чтобы одним касанием сравнить блочную и текстовую версию каждого задания, собранного в mBlock.
Частые вопросы
mBlock бесплатный?
Да. Настольная, веб- и мобильная версии mBlock 5 бесплатны, а для программирования Arduino даже не нужен аккаунт. Только у некоторых расширений, которые используют ИИ и облачные сервисы, есть дневной лимит использования, и они просят войти в аккаунт.
Почему mBlock не видит Arduino?
Чаще всего причина в USB-кабеле только для зарядки или в отсутствии драйвера CH340; эту микросхему использует большинство клонов. Подключи плату напрямую к компьютеру кабелем с передачей данных, установи драйвер CH340 и закрой программы, которые занимают порт, например монитор порта Arduino IDE. Если порт появился, отметь в окне подключения Show all connectable devices (показать все доступные устройства) и выбери нужный порт вручную.
Чем отличаются режим Live и режим загрузки в mBlock?
В режиме Live программа выполняется на компьютере и отправляет команды в Arduino по USB; результат виден сразу, но при отключении кабеля программа останавливается, а в плате должна быть прошивка mBlock. В режиме загрузки блоки переводятся в Arduino C и навсегда записываются в плату; программа работает без кабеля и должна начинаться с блока when Arduino Uno starts up.
Можно ли использовать код из mBlock в Arduino IDE?
Да. В режиме загрузки открой панель кода Arduino C справа, скопируй код, затем вставь его в Arduino IDE и скомпилируй. mBlock превращает блок forever в цикл while(1) внутри setup() и объявляет переменные как float; код работает и так, но для читаемости его стоит упростить до привычной структуры с loop().
Поддерживает ли mBlock ESP32 или Raspberry Pi Pico?
mBlock умеет программировать платы Makeblock на базе ESP32, например CyberPi и HaloCode, но официальной поддержки устройств для обычных отладочных плат ESP32 и Raspberry Pi Pico нет. Для этих плат лучше использовать Arduino IDE для ESP32 и MicroPython в Thonny для Pico; логика, освоенная на блоках, по-прежнему работает.
Что выбрать: mBlock 3 или mBlock 5?
Если ты только начинаешь, используй mBlock 5. Веб-редактор mBlock 3 на Flash больше не работает в современных браузерах, а его 32-битная версия для Mac не запускается на macOS 10.15 и новее. mBlock 5 основан на Scratch 3.0, умеет открывать проекты mBlock 3 и Scratch, и именно в него добавляются новые платы и расширения.
Что собрать после прочтения
Все проекты
Мигающий светодиод
Самое первое «привет» в электронике: включение и выключение одного светодиода. Arduino включает и выключает светодиод через короткие промежутки, поэтому свет быстро мигает. Ты самым простым способом в

Светофор
Крошечная копия светофора, который ты каждый день видишь на дороге. Красный горит две секунды, жёлтый мигает на мгновение, зелёный горит две секунды, затем через жёлтый снова возвращается красный, и т

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

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

Работа с зуммером
Интересно, как дверной звонок или сигнализация издают звук? Arduino заставляет маленький зуммер пищать через короткие промежутки: пик, пауза, пик, пауза. Ты видишь, как электричество превращается в зв

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

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

Парктроник на HC-SR04
Мини-версия автомобильного парктроника: чем ближе предмет, тем чаще сигнал. Датчик расстояния измеряет предмет перед собой; если он дальше 20 сантиметров, горит зелёный светодиод, а если ближе — мигае
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

