Привет! Этот текст возник в результате бесед с моими коллегами из издательства "БХВ", в котором я продолжаю плодотворно работать. Наряду с компьютерными и детскими книгами наша компания проектирует и выпускает наборы для хобби-электроники, мобильных роботов, а также авторские (непереводные) книги по языку Scratch. Открыв последнюю ссылку, вы убедитесь, что Scratch - это уже не игрушки (в чём мы полностью согласны с уважаемой компанией Sportmaster, в блоге которой вышел пост). Но добавим, что наряду со Scratch существует аналогичная среда визуального программирования mBlock, практически не рассмотренная на Хабре. Это инструментарий для работы с Arduino, прекрасно показавший себя в наших разработках. Под катом вашему вниманию предлагается разбор программируемого девайса, который пока не планируется в серию, но позволяет оценить достоинства Scratch и mBlock, порадовать ваших детей и питомцев и просто с интересом провести ближайшие выходные. Статья является изложением идей и инженерных изысканий кандидата технических наук, уважаемого Игоря Владимировича Шишигина.
При создании электронных устройств на базе платы Arduino большинство разработчиков использует интегрированную среду разработки Arduino IDE, предлагаемую компанией-разработчиком Arduino. При этом бытует мнение, что использование среды визуального программирования на базе Scratch хорошо только для обучения детей и людей, далеких от программирования. Мы тоже придерживались такого мнения. Однако более углубленное погружение в вопрос показало, что ряд задач быстрее и эффективнее решать с помощью подобных платформ.
В предлагаемой статье на примере создания интерактивной кормушки для кота мы покажем, как быстро создать сложную систему с использованием нескольких блоков в среде визуального программирования Snap4Arduino. Причём это под силу даже неподготовленным разработчикам.
Платформы для визуального программирования
Платформа визуального программирования на Scratch позволяет воплощать игровые и обучающие проекты со статическими и динамическими объектами, взаимодействующими друг с другом. Язык Scratch был специально разработан для обучения программированию детей и подростков и сразу получил большую популярность благодаря своей простоте и доступности. Программы на Scratch (называемые Script, а по-русски - скриптами или сценариями) состоят из графических блоков, на которых написано их функциональное назначение. Скрипты выполняются внутри среды разработки.
С появлением в 2008 году контроллера Arduino на базе среды Scratch появились приложения, с помощью которых можно не только разрабатывать интерактивные программы, мультфильмы и видео, но и взаимодействовать с контроллером Arduino, который подключается к компьютеру через последовательный порт с помощью кабеля USB. Появление таких приложений можно считать революционным событием, поскольку отныне юный программист мог видеть результаты своей работы не только на экране монитора, но управлять электронными устройствами, подключенными к плате Arduino и получать данные измерений от подключенных к Arduino датчиков. Появилась возможность включать светотодиоды, генерировать звук, вращать колесами, получать данные измерений температуры, влажности, давления, расстояния, движения и много др.
Для взаимодействия ПК с платой Arduino на плату загружается специальная прошивка, которая принимает, «понимает» и интерпретирует сигналы, получаемые через кабель USB от среды Scratch. Такой режим работы называется интерактивным.
Некоторые среды разработки могут работать не только в интерактивном, но и автономном режиме. В этом случае программа из «блочного» вида переводится в язык понятный Arduino IDE и затем может быть либо загружена на плату, либо отправлена в Arduino IDE для дальнейшего редактирования в текстовом виде.
Наряду с контроллером Arduino современные платформы разработки на базе Scratch поддерживают и другие контроллеры (ESP32, Raspberry Pi, BBC micro:bit и др). Но в этой статье, мы остановимся, на платах, совместимых с Arduino (Arduino Uno/Nano, mCore, Lavin, Romeo, SPBot) из-за их высокой популярности. Работа с другими контроллерами в Scratch, по существу, мало отличается и вы сможете без труда самостоятельно научиться работать с ними.
Подробный анализ различных графических платформ сделан на Хабре в статье «Визуальное программирование для детей. Выбираем платформу». Описание некоторых платформ можно найти в прилагаемом списке литературы в конце статьи или в руководствах пользователя на сайтах разработчиков.
Несмотря на то, что принцип разработки приложений для всех платформ примерно одинаков и основан на идеологии создания сценариев в стиле Scratch с помощью программных блоков, имеются различия и интересные особенности. Эти особенности важно знать при выборе платформы программирования.
Большинство специалистов, которые разрабатывают скетчи (программы) для Arduino на языках С или Python с помощью популярной интегрированной среды разработки Arduino IDE, относятся к графическому программированию с использованием Scratch исключительно как к средству обучения для начинающих. Между тем эти платформы позволяют создавать проекты, которые сделать с помощью Arduino IDE крайне затруднительно. Например, управление персонажем на экране монитора, создание интерактивных игр или обучающих видеороликов.
Таблица 1. Особенности различных сред визуального программирования
|
|
S4A |
Snap4Arduino |
mBlock3/5 |
ArduBlock 3.0 |
Mind+ |
|
|
|
||||
1 |
Возможность работы с персонажами и графикой на экране |
Да |
Да |
Да |
Нет |
да |
2 |
Интерактивный режим работы |
да |
да |
да |
– |
ограничен |
3 |
Пошаговое выполнение программы |
Да |
Да |
– |
– |
|
4 |
Возможность написания собственных блоков |
– |
Да |
Да |
– |
Да |
5 |
Использование протоколов HTTP для удаленного управления через браузер |
да |
да |
– |
– |
– |
В качестве примера покажем, как легко с помощью Snap4Arduino создать систему удаленного видеонаблюдения и управления кормушкой вашего домашнего любимца.
Для создания сценария понадобится всего несколько блоков и знания об использовании HTTP-протокола для управления сценарием через браузер.
Если с использованием графических блоков для создания сценариев проблем, как правило, не возникает, то вопросы использования HTTP-протокола требуют некоторого пояснения, т.к. не отражены подробно в документации Snap4Arduino. Правда разработчики этой среды очень любезно ответили на все наши вопросы.
Прежде чем приступить к описанию процесса создание «видеосистемы удаленного кормления» расскажем, как применяется HTTP-протокол в среде разработки Snap4Arduino.
Snap4Arduino и HTTP-протокол
Snap4Arduino поставляется со встроенным крошечным HTTP-сервером. Это означает, что вы можете управлять своим приложением Snap4Arduino с любого компьютера, мобильного телефона, планшета или любого другого сетевого устройства в той же сети. В следующих разделах слово IP относится к IP -адресу ПК, на котором запущен Snap4Arduino. IP-адрес вашего ПК можно увидеть в окне диалога HTTP server, которое открывается при включении опции HTTP server. В нашем случае IP адрес — 192.168.0.105.
HTTP-протокол работает только в версии Desktop. Для того, чтобы его использовать, необходимо включить опцию HTTP-сервер. Для этого выберите опции «Шестерёнка»| HTTP server.
Таблица 2. Командная строка для взаимодействия по протоколу HTTP
Задача |
Описание командной строки в браузере |
Передача сообщений из браузера в Snap4Arduino |
http://IP:42001/broadcast=+MESSAGE где IP – это IP-адрес вашего ПК во внутренней сети (например, 192.168.0.105), broadcast — команда для передачи сообщений. Символ «+» перед сообщением означает, что оно является публичным и может быть передано по сети. Остальные сообщения считаются личными и недоступны из сети. |
Обновление через браузер значения переменной в скрипте Snap4Arduino |
http://IP/vars-update= VARIABLE-NAME=VARIABLE-VALUE где IP – это IP-адрес вашего ПК во внутренней сети (например, 192.168.0.105), Эта строка присвоит глобальной переменной VARIABLE-NAME значение VARIABLE-VALUE . |
Чтение в браузере значения переменной из скрипта Snap4Arduino |
http://IP :42001/send-var=VARIABLE-NAME где IP – это IP-адрес вашего ПК во внутренней сети (например, 192.168.0.105), |
Чтение в браузере значений всех переменных |
http://IP :42001/send-vars
где IP – это IP-адрес вашего ПК во внутренней сети (в нашем случае это 192.168.0.105),
Отобразится список всех глобальных переменных, определенных в Snap4Arduino, имена которых начинаются с символа + или - , а также их текущие значения. |
Чтение в браузере сообщений передаваемых в скрипте Snap4Arduino |
http://IP :42001/send-messages
Вы можете прочитать в браузере все сообщения, перед которыми стоит символ «+». Такие сообщения считаются общедоступными, если знака «+» нет, то сообщение считается приватным и функционирует только внутри скрипта. Для этого надо набрать в браузере строку |
Видеотрансляция сцены Snap4Arduino в реальном времени |
Сцену Snap4Arduino вместе с персонажами можно отобразить в браузере в режиме реального времени. Для этого необходимо: 1. Включить HTTP-сервер. Для этого выберите опцию «Шестерёнка» | HTTP–server. 2. Включить опцию режим передачи изображения сцены по протоколу HTTP. Для этого выберите опцию «Шестерёнка» | Public Stage. 3. Введите в браузере адрес
|
Изображение сцены Snap4Arduino в реальном времени |
Для того чтобы сделать «фотографию» Сцены Snap4Arduino вместе с персонажами в браузере необходимо ввести адрес: http://IP:42001/stageimg |
POST. Обновление нескольких переменных Snap4Arduino из HTML-формы |
Вы можете обновить одновременно несколько глобальных переменных в проекте с помощью HTML-формы, отправленной через POST-запрос. <form action="http://IP:42001" method="post">
Используя теги < Обратите внимание, что Snap4Arduino ожидает, что все запросы будут в кодировке UTF-8. Чтобы убедиться, что ваш запрос пройдет правильно, особенно при работе со специальными символами, вы всегда можете использовать:
|
Создаём систему удалённого видеонаблюдения и управления при помощи Snap4Arduino
Допустим, вы уезжаете на несколько дней из дома, а ваш котик остается дома один. Надо решать проблему с его питанием. Можно конечно попросить соседей (если вы с ними в хороших отношениях) или приобрести кормушку-автомат, но мы не будем искать простых решений и разработаем собственную интерактивную видеокормушку для котиков.
В качестве «механизма кормления» используем готовые решения автоматических кормушек для котов. На видео ниже подробно показано, как изготовить механическую конструкцию подачи корма в миску, а также собрать и запрограммировать блок управления. «Мозгом» системы управления является контроллер Arduino Uno/Nano, поступление корма в миску обеспечивает серводвигатель, а время подачи корма – модуль времени. Загрузка скетча на плату Arduino осуществляется через кабель USB с помощью среды разработки Arduino IDE.
Мы решили усовершенствовать управление такой кормушкой, а для этого использовать платформу Snap4Arduino и ее возможности по удаленному взаимодействию с браузером по протоколу HTTP (описанные выше). Это позволит:
1. Усовершенствовать и модернизировать предлагаемый сценарий управления кормушкой даже для людей, далеких от программирования. Программирование на Scratch доступно уже с 4 класса школы.
2. Осуществлять видеонаблюдение за миской вашего любимца.
3. Удаленно насыпать сухой корм в миску
4. Фиксировать количество подходов кота к миске, чтобы оценить его аппетит).
5. Визуально оценивать, не похудел ли ваш питомец.
Блок-схема интерактивной видеокормушки для кота
На рисунке ниже представлена блок-схема подключения кормушки к Сети с указанием задействованных физических устройств (очертания рамок), исполняющихся на них программ (внутри рамок) и соединяющих их протоколов связи (пунктирные линии между рамками). Такая схема поможет вам заранее — ещё до того, как непосредственно приступить к реализации проекта — спланировать разработку кода и создание схемы соединений.
Что нам потребуется
Для создания управления кормушкой нам понадобиться блоки и компоненты, описанные в следующей таблице.
Таблица 3. Элементы для сборки кормушки и управления ею
Схема подключения
В качестве платы управления мы использовали многофункциональный контроллер SPBot (рис. 5), на которой уже установлены фоторезистор, зуммер, удобный разъем для подключения питания. В этом случае потребуется купить только серводвигатель (например, SG90 или MG90S). Если у вас нет этой платы, то можно воспользоваться и «стандартной» Arduino Uno (рис. 6).
Написание сценария
Прежде всего разработаем алгоритм удалённого кормления котика.
1. Открываем на смартфоне (ноутбуке, ПК) браузер и посылаем сообщение, которое включает видеокамеру и отображает видео на Сцене приложения.
http://IP:42001/broadcast=+video_ON
2. Посылаем сообщение, которое начинает трансляцию сцены Snap4Arduino в окне браузера.
http://IP:42001/stage
3. Видим на экране смарфона миску (пустую или полную), а если повезет, то и самого котика. А также количество подходов кота к пустой миске.
4. Мы принимаем решение «подсыпать ему корм или нет». Если «да», то посылаем через браузер на смартфоне сообщение
http://IP:42001/broadcast=+feed
В этом случае звучит сигнал зуммера, дверца открывается и корм высыпается в миску в течении 3 секунд. Затем дверца закрывается.
5. Вы видите, как довольный котик подбегает к миске и с благодарностью ест корм
6. Для того, чтобы прекратить трансляцию следует послать сообщение
http://IP:42001/broadcast=+video_OFF
7. Фоторезистор, который устанавливается неподалеку от миски, фиксирует количество подходов котика к ней.
Сценарий состоит и 4 групп блоков, взаимодействие между которыми осуществляется с помощью механизма широковещательной передачи сообщений (broadcast) в Snap4Arduino (рис. 8).
Сообщения в Snap4Arduino можно передавать двумя способами:
- с помощью блока «разослать»
- в командной строке браузера с использованием протокола HTTP (см. п. 1.2)
Для отладки сценария удобно добавить блоки, показанные на рисунке 9 ниже. С помощью этих блоков вы будете имитировать отправку сообщения через браузер.
Проект можно скачать по ссылке https://disk.yandex.ru/d/1bqV1KF-ol3VGA.
Включаем видеокамеру (#1)
Для включение видеокамеры и передачи видеоизображения на сцену надо отправить сообщение «+video_ON».
Для этого нажмите клавишу <1> или введите в командной строке браузера адрес http://IP:42001/stage
где IP – это IP-адрес вашего ПК во внутренней сети (в нашем случае это 192.168.0.105) — см. п.1.2.
На Сцене появится изображение с видеокамеры.
Выключаем видеокамеру (#2)
Для того, чтобы выключить камеру передайте сообщение «+video_OFF».
Насыпаем корм на блюдце (#3)
Для того, чтобы корм начал поступать из емкости в блюдце, надо с помощью серводвигателя открыть заслонку.
Передайте сообщение «feed». Вы услышите три коротких сигнала излучаемых модулем звука, затем серводвигатель откроет заслонку, корм будет высыпаться в блюдце, а через 3 секунды сервомотор закроет заслонку. Время высыпания корма определите экспериментально.
После того, как заслонка закроется, будет разослано сообщение «+feed», которое «запускает в работу» 4 группу блоков.
Определяем «коэффициент голодного кота» (#4)
Для того, чтобы определить, как часто ваш любимец подходит к миске предназначен четвёртый блок сценария. Он начинает функционировать, когда получает сообщение «N_feed».
Для фиксации факта подхода котика к миске используем датчик освещенности. Если освещенность резко изменится (L1-L2>100), то переменная L3, которая хранит количество подходов увеличится на 1. При каждом новом засыпке корма в блюдце переменная L3 обнуляется.
Подключение через Интернет
Мы создали сценарий, который позволяет подключаться к видеокамере и управлять кормушкой в пределах вашей домашней (или офисной сети Wi-Fi). Такой проект интересен, но имеет, скорее, учебное нежели практическое значение, поскольку кот и вы должны находится в пределах действия вашей сети Wi-Fi.
Для того чтобы реализовать удаленное управление через Интернет из любой точки земного шара, потребуется обеспечить дополнительные условия:
-
ваша сеть Wi-Fi должна иметь выход в Интернет;
-
внешний IP-адрес роутера для выхода в Интернет должен быть статическим (этим параметром управляет провайдер);
-
на роутере, через который осуществляется выход в Интернет, нужно выполнить операцию, называемую «проброс портов»;
В качестве примера покажем этапы настройки роутера tp-link с внешним IP-адресом 176.197.XXX.XX и внутренним IP-адресом 192.168.0.1:
В адресной строке браузера вводим внутренний адрес роутера: 192.168.0.1, попадаем в окно авторизации и вводим логин и пароль администратора (по умолчанию admin/admin);
В меню Переадресация экран выбираем пункт Виртуальные серверы и нажимаем в правой части окна на кнопку Добавить:
1. В открывшемся окне ввода параметров заносим параметры нового виртуального сервера:
-
Порт сервиса (выбирается произвольно, но больше 8000).
-
IP-адрес (в нашем примере, 192.168.0.105).
-
Внутренний порт — 42001.
-
Протокол — TCP.
-
Состояние — включено.
Нажмите кнопку Сохранить.
Созданный сервер появится в списке виртуальных серверов.
Теперь вы можете обращаться к вашему HTTP-серверу из любой сети интернет, только вместо адреса внутреннего HTTP-сервера следует вводить статический адрес вашего ПК.
Например, при передаче сообщения +MESSAGE
вместо строки
http://192.168.0.105:42001/broadcast=+MESSAGE
следует указывать строку
http://176.197.XXX.XX:42001/broadcast=+MESSAGE
где 176.197.XXX.XX — ваш статический адрес.
Управление через Интернет
Мы можем управлять кормушкой, вводя строки в адресной строке браузера, описанные в п. 1.3.4.
http://IP:42001/broadcast=+video_ON |
включить видеокамеру и передать изображение на Сцену Snap4Arduino |
http://IP:42001/stage |
транслировать в браузере видеоизображение |
http://IP:42001/broadcast=+feed |
открыть люк для загрузки корма |
http://IP:42001/broadcast=+video_OFF |
выключить видеокамеру |
где IP — это IP-адрес вашего ПК. Либо во внутренней сети (например, 192.168.0.105), либо во внешней (например, 176.197.XXX.XX).
Согласитесь, вводить длинные строки для управления неудобно. Поэтому мы написали код для простой HTML-страницы, задача которой открывать ссылки.
Несомненно, можно сделать более красивое и функциональное приложение, но наша цель было его максимально упростить, чтобы был понятно, как все работает.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Feeder</title>
</head>
<body>
<a href="http://192.168.0.109:42001/stage" target="iframe_a">Показать сцену</a> |
<a href="http://192.168.0.109:42001/broadcast=+feed" target="iframe_b">Добавить корм в миску</a><br><br>
<a href="http://192.168.0.109:42001/broadcast=+video_ON" target="iframe_b">Включить видео</a> |
<a href="http://192.168.0.109:42001/broadcast=+video_OFF" target="iframe_b">Выключить видео</a><br>
<br><hr>
<iframe src="demo_iframe.htm" name="iframe_a"width="900" height="700"></iframe><br>
<iframe src="demo_iframe.htm" name="iframe_b"</iframe>
</body>
</html>
Результаты работы приложения на рисунке.
Заключение
В заключение хотелось бы отметить:
1. С помощью среды визуального программирования можно создавать достаточно сложные электронные устройства, даже не обладая навыками программирования на языках высокого уровня.
2. Среды визульного программирования, несмотря общий подход в разработке сценариев с помощью блоков Scratch, имеют отличительные особенности, которые могут быть вам полезны.
3. Вы можете без труда добавить к нашему проекту новые датчики и устройства, придав кормушке новые функциональные возможности.
4. Для выполнения экспериментов с платой Arduino Uno/nano нет необходимости использовать именно эти платы. На рынке имеется и другие контроллеры на базе ATMega328, на который можно загружать скетчи Arduino Uno. Преимуществом таких контроллеров является наличие интегрированных датчиков, драйверов двигателей и др.
Интересно узнать мнение разработчиков о трудозатратах в случае реализации подобного проекта с помощью среды разработки Arduino IDE (Platform I/O и др.).
На почитать
1. Snap Reference Manual 8.0 (https://snap.berkeley.edu/snap/help/SnapManual.pdf)
2. Голиков Д. В. Scratch и Arduino. 18 игровых проектов для юных программистов микроконтроллеров, 2-издание.
Автор: OlegSivchenko