Руководства · 16 мин чтения

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 и как решить самые частые проблемы с подключением.

Плата Arduino Uno R3, которую программируют в mBlock
Arduino Uno — плата, которая работает с mBlock без проблем; благодаря встроенному светодиоду L на пине 13 для первых опытов не нужны никакие дополнительные детали.

Что такое 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
Платы ArduinoUno, Nano, Nano (old), Mega 2560; Leonardo, Micro и Yun в настольной версии или через mLink
Текстовый языкArduino C на платах Arduino, Python на платах Makeblock и на сцене
Файл проекта.mblock
Язык интерфейсаДесятки языков, включая русский

Установка mBlock: настольная и веб-версия

  1. Открой в браузере mblock.cc и на странице загрузки (Download) скачай настольную версию mBlock 5 для своей операционной системы. На момент написания актуальная версия — V5.6; поддерживаются 64-битная Windows 7 и новее и macOS 10.12 и новее, для Mac на чипах Apple M-серии есть отдельный установщик.
  2. В Windows запусти установщик и следуй указаниям мастера. Если во время установки предлагается поставить драйвер CH340, соглашайся: на этом USB-UART-преобразователе работает большинство клонов Arduino, и без драйвера порт не появится.
  3. Если в macOS установщик не открывается, нажми на файл правой кнопкой и выбери Открыть или воспользуйся кнопкой Всё равно открыть в разделе «Конфиденциальность и безопасность» в «Системных настройках».
  4. Открой mBlock и выбери язык через значок глобуса в верхнем меню, например русский. После этого меню и названия блоков отображаются на этом языке.
  5. На школьных компьютерах, где нельзя устанавливать программы, открой 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

  1. Подключи Arduino к компьютеру USB-кабелем; на плате должен загореться светодиод ON (питание).
  2. В mBlock перейди на вкладку Devices (устройства) под сценой. Удали устройство Makeblock, которое стоит там по умолчанию (в зависимости от версии Codey Rocky или CyberPi), крестиком в его углу.
  3. Нажми + Add (добавить), в открывшейся библиотеке устройств введи в поиск «Arduino», выбери Arduino Uno и нажми OK. Если нажать на звёздочку в левом верхнем углу платы, mBlock подготовит её при следующем запуске.
  4. Нажми Connect (подключить). На вкладке USB открывшегося окна выбери порт, который нашёл mBlock: в Windows это имя вроде COM3 или COM4, в macOS — что-то вроде /dev/cu.usbmodem… или, на платах с CH340, /dev/cu.wchusbserial…. Если порта нет в списке, поставь галочку Show all connectable devices (показать все доступные устройства).
  5. Ещё раз нажми 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.

Плата Arduino Nano, которую используют с mBlock
У клонов Arduino Nano обычно USB-микросхема CH340 и старый загрузчик; в mBlock программа на них загружается с вариантом Arduino Nano (old).
Самая частая проблема с подключением — не тот кабель. Некоторые USB-кабели от зарядок для телефона передают только питание, линий данных в них нет: светодиод на плате горит, а компьютер порт так и не видит. Если через кабель можно подключить телефон и передавать файлы, это кабель с передачей данных. Кроме того, подключай плату напрямую в USB-порт компьютера, а не через USB-хаб.

Режим 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

  1. Подключи Arduino (Connect) и переведи переключатель режима в положение Live.
  2. Если в плате нет прошивки mBlock, программа обычно сама предлагает её обновить. Если нет, выбери Update Firmware (обновить прошивку) в меню Setting (настройки) рядом с кнопками подключения и запусти обновление в открывшемся окне.
  3. Во время загрузки светодиоды TX и RX на плате часто мигают; не отключай кабель и не закрывай mBlock, пока индикатор выполнения не дойдёт до конца.
  4. Для проверки перетащи из блоков пинов блок set digital pin (13) output as (high) в область скриптов и нажми на него один раз. Если светодиод L на плате сразу загорелся, режим Live работает; нажми на тот же блок с вариантом (low) — и светодиод погаснет.
Прошивка режима Live и твоя собственная программа делят одну и ту же флеш-память. Когда программа загружается в режиме загрузки (или из Arduino IDE отправляется скетч), прошивка стирается. Если потом вернуться в режим Live, блоки не будут реагировать; в этом случае достаточно снова загрузить прошивку. Если на уроке приходится часто переключаться между режимами, напиши этот шаг на доске, чтобы о нём не забыть.

Базовые блоки 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 секунду)Приостанавливает программу на заданное времяМигание, светофор
Светодиод
Светодиод
Кнопка
Кнопка
Фоторезистор (LDR)
Фоторезистор (LDR)
Потенциометр
Потенциометр
Сервопривод SG90
Сервопривод SG90
Зуммер
Зуммер
Ультразвуковой датчик расстояния HC-SR04
Ультразвуковой датчик расстояния HC-SR04

Таблица подключения: один учебный набор для всех заданий

Собирать схему заново каждую неделю — пустая трата времени урока. Если один раз собрать на макетной плате подключение ниже, все девять заданий можно выполнить, не трогая провода. Резистор для светодиода можно проверить в калькуляторе резистора для светодиода, а напряжение, которое даёт делитель с фоторезистором, — в утилите делителя напряжения. Если эти детали в руках впервые, в статьях светодиод, кнопка, фоторезистор и сервопривод подробно объясняется подключение каждой из них.

ДетальArduino UnoESP32Raspberry Pi PicoПримечание
Светодиод + резистор 220 ΩD5GPIO 18GP14Длинная ножка (анод) к пину, короткая — к GND
Кнопка + стягивающий резистор 10 kΩD2GPIO 4GP2Второй вывод кнопки — к 5V на Uno, к 3V3 на ESP32 и Pico
Фоторезистор + резистор 10 kΩA0GPIO 34GP26 (ADC0)Фоторезистор между питанием и пином, резистор между пином и GND
Потенциометр (средний вывод)A1GPIO 35GP27 (ADC1)Крайние выводы — к питанию и GND
Сервопривод SG90 (сигнал)D9GPIO 13GP16Красный провод — к 5 V (VIN на ESP32, VBUS на Pico), коричневый — к GND
Пассивный зуммерD8GPIO 25GP15Второй вывод — к GND
HC-SR04 Trig / EchoD11 / D12GPIO 26 / 27GP17 / GP18На ESP32 и Pico понизь линию Echo до 3,3 V делителем напряжения
На Arduino Uno библиотека Servo использует Timer1, поэтому, пока работает сервопривод, ШИМ (analogWrite) на пинах D9 и D10 не работает; функция tone(), которая играет ноты на зуммере, использует Timer2 и мешает ШИМ на D3 и D11. Поэтому в таблице светодиод стоит на D5. ESP32 и Pico работают от 3,3 V: никогда не подавай 5 V на кнопки или датчики, подключённые к их пинам.

Первая программа: мигаем светодиодом в режиме загрузки

  1. Переведи переключатель режима в положение Upload (загрузка).
  2. Перетащи блок when Arduino Uno starts up из категории Events в область скриптов.
  3. Прикрепи под ним блок forever (всегда) из категории Control.
  4. Внутрь блока forever по порядку положи set digital pin (13) output as (high), wait (1) seconds, set digital pin (13) output as (low) и ещё один wait (1) seconds.
  5. Нажми Upload (загрузить). mBlock компилирует код и отправляет его в плату; через несколько секунд появится сообщение о том, что загрузка завершена.
  6. Светодиод L на плате начнёт мигать раз в секунду. Если отключить USB-кабель и питать плату от пауэрбанка или адаптера на 7–12 V, программа всё равно работает; варианты питания разобраны в статье Arduino от батареек.

Как блоки превращаются в код Arduino C?

В режиме загрузки нажми кнопку кода Arduino C у правого края (значок с угловыми скобками), и mBlock покажет на панели код, соответствующий блокам. Любое изменение в блоках сразу обновляет код; это самый простой способ понять, какой блок даёт какую строку. Если в программу Blink выше добавить переменную sayac (счётчик) и увеличивать её на 1 при каждом проходе, сгенерированный код будет выглядеть примерно так. Строки комментариев добавили мы; отступы и место некоторых строк, например pinMode, в разных версиях могут немного отличаться.

C++ (Arduino IDE)
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, а частоты нот — в статье зуммер.

Небольшие, но полезные привычки для урока: пусть каждый ученик сохраняет проект как файл .mblock со своим именем; щёлкни правой кнопкой по области скриптов, чтобы экспортировать блоки картинкой и показать их на доске или в рабочем листе; а в новых версиях с помощью поиска блоков и отключения блоков можно временно выключить ошибочный фрагмент, не удаляя его. Работа в парах (одна роль — собирать блоки, другая — проверять схему) ускоряет отладку и уменьшает путаницу с проводами.

Переход на Arduino IDE: от блоков к настоящему коду

В какой-то момент блоков становится мало: с ростом программы область скриптов превращается в кашу, нужна библиотека датчика, которой нет в «Центре расширений», или хочется выполнять несколько задач одновременно, без delay. Тогда пора заняться установкой Arduino IDE и перейти на текстовый код; добавление библиотек для новых датчиков тоже окажется в твоих руках. Лучший способ смягчить переход — переписать в Arduino IDE проект, сделанный в mBlock: так одна и та же логика видна в двух представлениях рядом.

  1. В mBlock выдели и скопируй код на панели Arduino C; открой в Arduino IDE новый скетч и вставь его.
  2. Выбери плату (Arduino Uno) и порт в меню «Инструменты» (Tools), затем нажми сначала Проверить, а потом Загрузка. Код должен работать так же, как в mBlock.
  3. Затем упрости код: собери строки pinMode в setup(), перенеси содержимое цикла while(1) в loop() и вместо _delay() используй delay() или millis().
  4. Где это уместно, замени переменные float на int или bool и дай номерам пинов понятные имена через const int.
  5. Выводи переменные в монитор порта, чтобы следить за тем, что делает программа; это текстовый аналог живого наблюдения в mBlock.

Ниже — программа, которая объединяет задания 3 и 4: автоматический ночник, который включается и выключается кнопкой, написанный в Arduino IDE. Номера пинов совпадают с таблицей подключения выше.

C++ (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.

C++ (Arduino IDE)
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.

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 постоянно перезагружается.

В режиме Live нажатие на блок или стопку блоков запускает их один раз. При поиске проблемы не запускай всю программу целиком; проверяй блоки по одному: если блок светодиода работает, а блок кнопки всегда возвращает одно и то же значение, проблема в схеме, а не в блоках. Рядом с некоторыми блоками чтения есть флажок; если его отметить, значение будет показываться на сцене в реальном времени.

Идеи проектов, которые можно сделать в 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, и именно в него добавляются новые платы и расширения.

Все проекты
Мигающий светодиод
#1Новичок

Мигающий светодиод

Самое первое «привет» в электронике: включение и выключение одного светодиода. Arduino включает и выключает светодиод через короткие промежутки, поэтому свет быстро мигает. Ты самым простым способом в

4.6(188)
1127
Светофор
#3Новичок

Светофор

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

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

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

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

4.8(100)
167
Ночник на LDR
#12Новичок

Ночник на LDR

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

4.8(102)
205
Работа с зуммером
#13Новичок

Работа с зуммером

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

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

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

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

4.6(46)
71
Управление сервоприводом потенциометром
#36Новичок
Premium

Управление сервоприводом потенциометром

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

4.6(37)
52
Парктроник на HC-SR04
#28Средний
Premium

Парктроник на HC-SR04

Мини-версия автомобильного парктроника: чем ближе предмет, тем чаще сигнал. Датчик расстояния измеряет предмет перед собой; если он дальше 20 сантиметров, горит зелёный светодиод, а если ближе — мигае

4.8(64)
85