Серия "Дерзай!" (Робоплатформа-конструктор). Общие вопросы конструирования на основе контроллеров Arduino


.

Дерзай! Готовим робоплатформу BHV к подвигам. Bluetooth управление в mBlock

Первая и вторая публикации о наборе «Мобильные роботы на базе Arduino» были ориентированы на родителей и педагогов, желающих адаптировать робоплатформу для занятий с детьми и максимально упростить пользование ею. По сути, мы с вами выступали в роли инженеров, пытающихся «заточить» продукт под собственные нужды. Хотелось бы, чтобы уже со следующей статьи можно было не увлекаться сугубо инженерными задачами и приступить к практической робототехнике, обучая детей и обучаясь вместе с ними. Чего же не хватает нашей робоплатформе? Ответ прост: необходимо обеспечить возможность дистанционного управления ею с компьютера, а заодно и с разных других устройств. Поможет нам Bluetooth как наиболее универсальный тип беспроводной связи.

Надо сказать, что опыт использования Bluetooth очень быстро убеждает в том, что это средство, далекое от идеала. О методах борьбы я рассказывал в отдельной публикации («Как связать два микроконтроллера по Bluetooth. Настраиваем HC-05 для работы в режиме Master.»). Когда полтора десятка учеников по очереди обращаются к Вам с проблемой потери связи, это может привести к срыву всего занятия. Не зря тот же MakeBlock предлагает альтернативное решение для рабочих групп: наборы mBot v 1.1 - (2.4G Version), в которых используется 2.4G Wireless Serial for mBot, представляющий собой два изначально сопряженных друг с другом компонента, один из которых подключается в роботу, а другой к компьютеру.

Наборы, кстати, замечательные, отличаются продуманностью и имеют готовые расширения (в отличие от того же Scratchduino, сходного по концепции), легко собираются, легко дополняются всем необходимым, годятся для занятий «из коробки». Любой из наборов MakeBlock можно смело рекомендовать родителям, которые хотели бы приобрести своему ребенку что-то «этакое» для самостоятельных занятий. Эти родители будут избавлены от необходимости заниматься пайкой. В общем, легкий путь Вам теперь известен.

Но раз мы не боимся сложностей и с самого начала «подписались» на пайку и прочую головную боль, будем осваивать матчасть. Лучший способ увлечь чем-то ребенка это увлечься самому, а на нашем тернистом пути мы многому научимся. Постараемся максимально приблизиться к увиденному идеалу, пользуясь наработками MakeBlock и пытаясь реализовать что-то аналогичное своими силами. Модули 2.4G очень хорошее решение, однако нельзя недооценивать универсальность Bluetooth. Поэтому все-таки будем ориентироваться на этот тип беспроводной связи. А чтобы уменьшить число проблем, я настоятельно рекомендую приобрести преобразователь USB-UART и дополнительный Bluetooth модуль, укомплектовать робоплатформу собственным управляющим «брелком» как я описал.

Раз уж зашла речь о наработках MakeBlock. На официальном сайте лежат сценарии занятий на английском языке для обучения детей программированию и работе с робототехническими наборами: «Scratch 2.0, The adventures of Mike» и «Kids maker rocks with the robots». Существует еще и русскоязычная версия сайта и переводы этих материалов на русский язык.

Вернемся к теме. Можно ли обойтись без настройки беспроводного соединения? Можно, но мы многое потеряем. Робоплатформа наша мобильная, негоже, чтобы она была как сторожевой пес на привязи. А связь с компьютером это не только работа в режиме радиоуправляемой машинки, но и отладка, переключение программ автономной работы (поиск и автоматический захват банки, например, если она находится в зоне досягаемости), включение режима ассистирования при дистанционном управлении («автопилот», «парктроник»). И самое главное, это возможность работы в интерактивном режиме, что позволяет пройти весь путь от формулировки задачи до ее решения значительно быстрее.

Поэтому настраиваем Bluetooth. Основная проблема в том, что наш Bluetooth модуль (HC-05) прошит на какую-то одну определенную скорость обмена, и сменить ее можно лишь при помощи затейливых процедур. Только что купленный имеет скорость 9600. Если ее не поменять, нам недоступна полноценная работа в mBlock с возможностью интерактивного управления. Кроме того, мы будем испытывать сложности при составлении программ в режиме «Arduino mode». Нам требуется сменить скорость на ту, что использует mBlock, 115200. Мы по-прежнему будем сталкиваться с типичными проблемами Bluetooth соединения: теряющимся коннектом и необходимостью заново устанавливать сопряжение при подключении робоплатформы к другому компьютеру. Поэтому удобнее всего использовать пару заранее сопряженных модулей и USB-UART конвертер, так, как это описано в вышеуказанной статье. И если мы попытаемся упростить себе задачу сейчас, то приобретем массу проблем в будущем.

Резюмируем. Можно не подключать Bluetooth вообще. Можно использовать Bluetooth модуль в том виде, в котором мы его получили, на скорости 9600. Можно перепрошить модуль на использование адекватной нашим задачам скорости. Можно приобрести USB-UART конвертер, дополнительный HC-05 и перепрошить оба модуля таким образом, чтобы они использовали скорость 115200 и самостоятельно устанавливали соединение, стоит на них лишь подать питание. Каждый следующий вариант будет давать нам принципиально новые возможности. В дальнейшем я буду ориентироваться на то, что Вы справились с задачей перепрошивки модуля (или двух), скорость 115200, и мы можем работать в среде mBlock с интерактивным управлением робоплатформой. А со скоростью 9600 нам доступно лишь программирование в стиле создания скетчей для Arduino IDE с загрузкой программы в контроллер для автономной работы. Этим пока и займемся.

Напишем программу, загрузим в контроллер, вначале проверим ее работу по проводу, а затем по Bluetooth соединению. Итак, вводные данные. Наш HC-05 модуль по-прежнему прошит на скорость 9600 и пока еще не подключен к контроллеру.

Ставим робоплатформу на подставку, чтобы крутила колесами в воздухе. Включаем питание, соединяем с компьютером при помощи USB кабеля. Запускаем mBlock. Проверяем настройки. «Extensions» — «Arduino» и «MakeBlock». «Boards» — «Starter/Ultimate (Orion)». Коннектимся на нужный COM-порт, «Соединить» — «Serial Port». Теперь можно пощелкать по блокам управления моторами либо помигать светодиодом на плате (пин D13), чтобы убедиться, что все получилось.

Переключитесь в режим Arduino mode, «Редактировать» — «Arduino mode». Соберите следующую программу из блоков. Вам потребуется создать переменную с именем «code». В блоке «слить» первый параметр просто текст, а второй — переменная.

Нажмите на кнопку «Upload to Arduino», дождитесь конца загрузки. Скорее всего, Вам придется заново установить коннект с платой («Соединить» — «Serial Port»). Теперь хотелось бы пообщаться с Arduino контроллером, отправлять ему символы и видеть, что он нам отвечает. В правом нижнем углу программного окна mBlock находятся нужные нам инструменты. Переключитесь в «Char mode», отправьте на плату строчные латинские символы «w», «s», «a», «d». Мы узнали, что их коды 119, 115, 97, 100.

Усложним программу, загрузим в контроллер.

Заново установим соединение, проверим работу. У нас получился пульт дистанционного управления. Только пользоваться им неудобно. Давайте сохраним программу и закроем mBlock, нам он пока не нужен. Запустим любой терминальный клиент, умеющий отправлять символы, не дожидаясь нажатия на кнопку «Enter». Например, «Tera Term». Соединимся с COM-портом нашей платы, поменяем скорость на 115200 («Настройка» — «COM-порт»; чтобы не делать этого каждый раз, настройки можно сохранить, «Настройка» — «Сохранить настройки»). Управлять стало гораздо удобнее, робоплатформа сразу исполняет команду, стоит нажать на клавишу. Ко всему прочему, мы убедились, что программа действительно исполняется автономно на Arduino контроллере.

Однако мы по-прежнему привязаны проводом, а робоплатформа крутит колесами в воздухе. Если мы сейчас попытаемся использовать Bluetooth вместо провода, никакого соединения не получится, наш Bluetooth модуль работает на скорости 9600. Поэтому закрываем Tera Term и заново запускаем mBlock.

У нас есть пара способов решить проблему. Созданная нами программа транслируется в текстовой скетч, и его можно отредактировать перед загрузкой в контроллер, если нажать на кнопку «Edit with Arduino IDE» вместо «Upload to Arduino». Пробуем. Находим инструкцию «Serial.begin(115200)», меняем на «Serial.begin(9600)».

Но так делать придется каждый раз. Давайте пожалеем себя и детей, добьемся того, чтобы текстовой скетч сразу генерировался «правильно» (так, как это нужно нам).

Откроем меню mBlock «Extensions» — «Manage Extensions». Обратите внимание, оказывается, в mBlock можно добавлять собственные расширения! Выберем «Installed», найдем «Arduino», щелкнем «Просмотреть код».

Откроется папка с файлами, описывающими работу в данным устройством. Отредактируем файл «Arduino.s2e» при помощи WordPad , заменим везде «Serial.begin(115200)» на «Serial.begin(9600)». На всякий случай стоит сделать резервную копию оригинальной версии файла. Готово, осталось перезапустить mBlock.

Снова загружаем сохраненный проект. Не забываем переключиться в Arduino mode и установить соединение с платой. Проверяем текст сгенерированного скетча. И видим там скорость 9600!

Загружаем в контроллер нажатием на кнопку «Upload to Arduino». Проверить работу программы при помощи строки и кнопки справа внизу не получится, mBlock сгенерировал скетч по нашему заказу, но все равно пытается устанавливать соединение на скорости 115200. Закрываем mBlock, либо просто сбрасываем соединение с контроллером (снимаем галочку в меню «Соединить» — «Serial Port»). Проверять работу дистанционного управления будем в Tera Term. Нужно только не забыть выставить скорость 9600 через меню «Настройка» — «COM-порт». По проводу все получается, осталось проверить работу по Bluetooth.

Отсоединяем USB кабель, отключаем питание робоплатформы. Пора подсоединять HC-05 модуль. С использованием Arduino Sensor Shield возможно несколько вариантов подключения, удобнее всего через разъем «COM» (меньше риска запутаться в контактах). Схема подключения такова:
«VCC» (HC-05) — «+» (Sensor Shield)
«GND» (HC-05) — «-» (Sensor Shield)
«TXD» (HC-05) — «RX» (Sensor Shield)
«RXD» (HC-05) — «TX» (Sensor Shield)

С контакта «TXD» («transmit data») данные бит за битом передаются по последовательному протоколу на контакт «RX» («receive data») платы «Sensor Shield» (и далее на Arduino контроллер), и подобным же образом в обратном направлении.

Поскольку подключать и отключать HC-05 модуль придется часто, скрепите разъемы изолентой, чтобы контакты шли в правильном порядке.

Кстати, на фотографии Вы можете увидеть, что я уже подключил к своей робоплатформе трехосевой гироскоп-акселерометр GY-521 MPU-6050. Мотайте на ус, скоро будем с ним работать в mBlock.

При работе с Arduino по Bluetooth протоколу важно всегда помнить одну вещь. Когда Вы загружаете собственную программу или прошивку в Arduino контроллер, Вам следует подключить USB кабель и ОТКЛЮЧИТЬ Bluetooth модуль. Когда Вы пользуетесь загруженной программой (например, работаете в интерактивном режиме mBlock с Bluetooth подключением), не забыть подключить HC-05 модуль снова. И если у Вас что-то не получается, не паникуйте, а первым делом вспомните об этом простом правиле.

Итак, Bluetooth модуль подключили. Щелкаем клавишей питания робоплатформы, светодиод на модуле должен начать часто мигать. Устанавливаем сопряжение средствами операционной системы компьютера. «Пуск», «Устройства и принтеры», «Добавление устройства». Windows покажет нам найденный модуль, и поскольку мы еще ничего не меняли, его имя будет «HC-05». Вводим код образования пары — «1234». Готово. Светодиодная индикация модуля изменилась. Открываем свойства «НС-5», вкладку «Оборудование» и видим номер связанного с устройством виртуального COM-порта. В моем случае это COM44. Запоминаем. Закрываем лишние окна и программы. Открываем Tera Term, соединяемся с нужным портом на нужной скорости. Проверяем. Можно поздравить себя, дистанционное управление по Bluetooth работает!

Теперь можно заняться совершенствованием управляющей программы. Добавить пропорциональное управление (с регулировкой мощности), использовать вместо примитивного Tera Term собственноручно написанные либо готовые приложения, например «Arduino Bluetooth RC Car» для Android устройств.

Напоследок в качестве маленького бонуса демонстрационный проект для двух Arduino контроллеров из моей статьи про настройку Bluetooth, «Bluetooth Ping-Pong».

Download
Скачать все проекты этой публикации
article3_sb2_projects.zip
Compressed Archive in ZIP Format 119.1 KB




Продолжение следует!

P.S. Кстати, создатели робоплатформы демонстрируют большую заинтересованность в совершенствовании набора и устранении найденных недочетов. Уже готов новый вариант корпуса, в котором датчики будут лучше защищены. Это очень приятно, некоторым российским разработчикам не хватает именно такой оперативности. Пожелаем издательству «БХВ-Петербург» успехов!


.

Программирование мобильной робоплатформы в mBlock, конфигурация MakeBlock-Scratchduino

В своей прошлой публикации я рассказал о новом продукте издательства «БХВ-Петербург», наборе «Мобильные роботы на базе Arduino + книга». Мы научились управлять моторами с использованием предлагаемой в книге схемы подключения. К сожалению, эта схема имеет недостатки, и нам придется поработать, чтобы от них избавиться. Давайте определим, чего мы хотим добиться.
- Для управления моторами используется слишком много выходов Arduino, целых шесть, хотелось бы снизить их число до четырех (на большее пока не замахиваемся).
- В будущем нам понадобятся пины D2, D3, D11 для специальных задач, освободим их от управления моторами.
- Было бы удобно использовать какую-то общепринятую конфигурацию, это давало бы нам дополнительные возможности.

О последнем пункте следует рассказать подробнее.

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

Самый же главный аргумент перехода к альтернативной аппаратной конфигурации выходит за рамки позиции «лень — двигатель прогресса». Мы с вами, как люди взрослые, в состоянии напрячься и понять, что такое широтно-импульсная модуляция (ШИМ), изучить принцип работы H-моста. Но зачем же сразу грузить детей этими излишними для начала подробностями? Всему свое время. Хотелось бы иметь возможность программировать нашу робоплатформу с использованием графической среды с простыми и понятными командами, без необходимости объяснять детям, в какой пин нам надо записать какое значение, чтобы поехать вперед.

Попытаемся максимально упростить пользование робоплатформой во время занятий с детьми, а если говорить конкретнее, сделать так, чтобы можно было брать готовые блоки управления моторами при программировании в визуальной среде mBlock. Для этого нам придется изменить аппаратную конфигурацию робоплатформы, сделать ее совместимой с MakeBlock и ScratchDuino.

Рассмотрим, каким образом здесь происходит управление моторами. ScratchDuino робоплатформа и все робоконтроллеры начального уровня MakeBlock (Me Orion, Me Uno Shield, mCore) совместимы с Arduino Uno, имеют сходную конфигурацию и управляются одинаково. Кстати, это означает, что если у вас есть ScratchDuino робоплатформа, вы можете работать с ней, как-будто бы это робот на базе Me Orion, используя программирование в среде mBlock. И если это вам зачем-то нужно, вы можете взять Arduino Uno, Me Uno Shield и работать с ними в среде визуального программирования ScratchDuino. После модификации нашу БХВ-робоплатформу тоже можно будет программировать в обоих визуальных средах с использованием готовых команд управления движением. Давайте договоримся, что левый двигатель у нас подключен как M1, правый как M2, при положительном значении мощности происходит движение вперед, при отрицательном — назад (для ScratchDuino робоплатформы это будет верно, если считать, что передняя часть у нее там, где два датчика).

В конфигурации MakeBlock/ScratchDuino используется всего 4 выхода Arduino контроллера для управления движением — D4, D5, D6, D7.
Наша робоплатформа должна управляться следующим образом:
- D7 – задаем направление вращения левого двигателя (M1), если записываем в порт LOW (логический ноль), получается движение назад, HIGH (логическую единицу) – вперед;
- D6 – задаем мощность левого двигателя (M1), генерируем ШИМ со скважностью 0 — остановка (нулевая мощность), со скважностью 255 — максимальная мощность;
- D4 – направление правого двигателя (M2), LOW – назад, HIGH – вперед;
- D6 – мощность правого двигателя (M2), ШИМ со скважностью 0 — остановка, со скважностью 255 — максимальная мощность.

Между тем, и драйвер двигателя L293D робоплатформы ScratchDuino, и наш L298N, имеет 3 входа для управления каждым двигателем. Мы могли бы использовать самодельный драйвер из двух реле и транзистора, схема управления осталась бы той же.

Рассмотрим все подробнее на примере управления правым двигателем. Нашей задачей является превратить два выходных сигнала в три. Сигнал ШИМ, получаемый с порта D5 контроллера Arduino, не трогаем и подаем напрямую на входной контакт «Enable» драйвера двигателя. А выходной сигнал с порта D4 преобразуем по следующей схеме:
- когда на D4 логическая единица, на контакт In1 драйвера двигателя подаем логический ноль, а на In2 логическую единицу;
- когда на D4 логический ноль, на In1 подаем логическую единицу, а на In2 логический ноль.

Таким образом, H-мост драйвера двигателя будет всегда в одном из двух базовых состояний: вращение вперед или вращение назад. Мы потеряли возможность динамического торможения двигателя, зато освободили пару портов Arduino для выполнения других задач.

Но каким образом преобразовать сигнал? Поможет нам использование микросхемы транзисторно-транзисторной логики (TTL) подобной SN7400N или КМ155ЛА3 (отечественный аналог).

В блоге Леонида Захарова описано, как спаять необходимую простенькую схему. Для тех же, у кого нет возможности заниматься травлением или фрезеровкой, предлагаю вариант с монтажом на беспаечной плате. Итак, потребуется приобрести (либо извлечь из закромов smile.gif
макетную беспаечную плату (берите сразу хотя бы парочку, пригодится);
- микросхему КМ155ЛА3 или аналог (4 логических элемента 2и-не);
- 4 резистора 1 кОм (в моем случае резисторы 10 кОм не подошли, все заработало лишь с 1,8 кОм, для надежности берем 1 кОм);
- провода Dupont «папа-мама»;
- провод одножильный изолированный сечением 0,5-0,9 мм (для монтажа).

Для тестирования схемы понадобится:
- пара светодиодов;
- пара резисторов 220 Ом;
- тактовая кнопка;
- провода Dupont «папа-папа»;
- макетная беспаечная плата (для подобных целей удобнее использовать вот такую).

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

Монтируем по следующей схеме (обратите внимание на вырез на корпусе микросхемы, он показывает, где расположены контакты 1 и 14). Пока не спешим устанавливать собранную схему в робоплатформу.

Собираем схему для тестирования, подключаем вместо драйвера двигателя.

Тестируем оба логических преобразователя (D4 – In1, In2 и D7 – In3, In4). Для тестирования достаточно просто соединять проводочком контакты +5V и D4 (D7) на логическом преобразователе, но для наглядности мы подключим кнопку. Когда кнопка не нажата должен гореть один светодиод, когда нажата — другой. В качестве источника питания можно использовать плату Arduino робоплатформы.

Убедившись, что схема работает, устанавливаем ее в робоплатформу и все окончательно подключаем. Напомню, сигнал ШИМ идет напрямую от контроллера Arduino к драйверу двигателя (от D5 к EnA, от D6 к EnB).

На ту же макетную плату монтируем тактовую кнопку по следующей простой схеме. Понадобится сама кнопка и резистор 10 кОм. Подключаем к контакту D12.

Собираем робоплатформу. Вид на кнопку.

Остается провести ходовые испытания. Выбираем в mBlock расширения «Arduino» и «MakeBlock», плату «Starter/Ultimate (Orion)». Соединяемся с нужным COM-портом, загружаем прошивку. Теперь можно вдоволь пощелкать по блокам управления двигателями. Не забудьте поставить робота на подставку, чтоб не уехал со стола! Полюбуемся открывшимся богатством. «Ultrasonic sensor», «3-осевой гироскоп»… Будем этим учиться пользоваться!

В качестве побочного эффекта имеем заметное увеличение стабильности работы mBlock в режиме интерактивного управления. Теперь для управления двигателем от компьютера к контроллеру отправляется одна команда, а не три.

Тестируем работу кнопки.

Загружаем в робоплатформу тестовую программу для автономной работы. Обратите внимание, мы используем «шапку» «Orion program». Переключаемся в «Arduino mode», собираем программу из блоков, нажимаем на кнопку «Upload to Arduino».

Как видите, теперь все проще и понятнее. Программа загружена, светодиод на плате сигналит, что робоплатформа готова стартовать, отсоединим USB провод, нажмем на кнопку, поехали!

Стоит добавить, что возможно использовать и иные схемы управления двигателями. Например, собрать конфигурацию, аналогичную Robbo.robot. Для этого не потребуется никаких дополнительных деталей. Но нам сложнее будет работать с mBlock.

Теперь мы можем использовать для занятий еще и вот такую книжку:

Download
Все mBlock проекты этой публикации:
mBlock_article2.zip
Compressed Archive in ZIP Format 117.9 KB

.

Программирование мобильной робоплатформы в mBlock, первые шаги

Издательство «БХВ-Петербург» подготовило новый продукт серии «Дерзай!». Это набор электронных компонентов вместе с книгой, обучающей работе с ним. Юрий Винницкий в своей публикации уже рассказал об одном из продуктов этой серии. На сей раз нас ждет набор «Мобильные роботы на базе Arduino + книга», продажи которого начнутся в ближайшем месяце.

Не могу не повторить за Юрием мысль о том, что подход, применяемый в серии продуктов «Дерзай!», видится очень продуктивным. Акцент сделан на книгу, в которой пошагово описано, как использовать Arduino IDE для программирования мобильной робоплатформы, идущей в комплекте. Ее аппаратная конфигурация позволяет реализовать любой из описываемых примеров, и достаточно интересна, кстати. В частности, помимо стандартных датчиков препятствия и датчиков линии, в набор входит дальномер на поворотной голове с сервомотором и магнитометр (магнитный компас). А также набор литиевых аккумуляторов с зарядным устройством, Bluetooth модуль, инфракрасный пульт с приемником для дистанционного управления. Получается полноценный комплект начального уровня, позволяющий реализовать массу интересных проектов. Возможности собранной робоплатформы выгодно отличают ее от «одноклассников» - других распространенных робоплатформ начального уровня на базе Arduino. А с учетом цены, обозначенной на сайте «БХВ-Петербург», этот набор превращается просто в «MUST HAVE» для каждого начинающего любителя робототехники.

Автором книги, входящей в комплект, является Михаил Викторович Момот, доцент кафедры информационных систем Томского политехнического университета. На FTP-сервере издательства «БХВ-Петербург» размещен электронный архив методических материалов, скачать который может любой желающий. Этот архив включает в себя скетчи Arduino IDE по каждому проекту, набор файлов для лазерной резки и модели для печати на 3D-принтере. При желании можно приобрести лишь книгу и собрать подобную робоплатформу самостоятельно из собственных деталей. А поскольку набор проектов начинается со стандартной элементарной программы мигания светодиодом, появляется возможность осваивать программирование в Wire и основы микроэлектроники на примере решения типичных (и нетипичных) практических задач образовательной робототехники. И мигать светодиодом с определенной частотой мы будем уже не просто так, а со смыслом, для того, чтобы просигнализировать о том или ином состоянии нашего робота.

Добавим пол-ложки дегтя, ничуть не умаляющих достоинств издания. Как показало изучение тестового образца, попавшего в наши руки, конструктив робоплатформы все еще нуждается в доработке, датчики расположены в уязвимых местах и плохо защищены. Предложенная схема подключения драйверов двигателей и других электронных компонентов имеет недостатки, я бы использовал альтернативную (об этом позже). А также добавил пару датчиков, очень логично вписывающихся в предложенную конфигурацию и сильно расширяющих возможности робоплатформы. Не всякий имеет доступ к 3D-принтеру и лазерному граверу, можно было бы предложить пару схем сборки робоплатформы на базе пластикового конструктива типа Lego или Meccano (мы у себя используем вот такой компактный вариант):

Но самый главный недостаток, на мой взгляд, заключается не в этом. Текстовое программирование на языке Wire в Arduino IDE требует освоения синтаксиса языка и не позволяет нам использовать робоплатформу для занятий в младших классах. Между тем существуют средства визуального программирования типа Scratch, существенно снижающие порог вхождения в интереснейший мир робототехники как для взрослых, так и для детей. Вот об этих средствах и поговорим.

Итак, будем учиться программировать мобильную робоплатформу в визуальной среде mBlock, базирующейся на Scratch 2. Для начала освоим управление моторами и напишем тестовую программу автономной работы робоплатформы, в следующих статьях перейдем к беспроводному дистанционному управлению и другим задачам образовательной робототехники.

Прежде всего нам понадобится сам mBlock. Это OpenSource программа, доступная в версии для Windows и macOS. Скачиваем ее с официального сайта: http://www.mblock.cc/download.

В составе дистрибутива уже есть драйвера для всех распространенных Arduino контроллеров (включая китайские клоны), а также встроенный Arduino IDE с подключенными библиотеками MakeBlock. Инсталлируем mBlock, дожидаемся конца установки.

Прежде, чем запустить, давайте проверим, что все подготовлено правильно. Размещаем робоплатформу на какую-нибудь подставку, чтобы она могла свободно вращать колесами в воздухе. Включаем питание от аккумуляторов, четырем мощным моторам будет не хватать того тока, который в состоянии обеспечить USB. Подключаем проводом Arduino контроллер нашей робоплатформы к USB разъему компьютера, проверяем, что операционная система корректно «подклеила» драйвера, у компьютера появился соответствующий COM-порт (Пуск — Панель управления — Диспетчер устройств — Порты COM и LPT). Запоминаем его номер, он нам понадобится.

Теперь можно продолжать. Запускаем mBlock. Первым делом идем в главное меню и меняем настройки. Выбираем русский язык (Language – Русский). Включаем расширение «Arduino» (Extensions – Arduino). Выбираем Arduino Uno контроллер (Boards – Arduino Uno). От этого выбора зависит используемая система команд, в будущем мы научимся использовать иные Arduino Uno совместимые варианты. Подключаемся к нашей плате (Соединить — Serial Port – нужный нам COM-порт). Загружаем на нее прошивку mBlock, позволяющую работу в интерактивном режиме (Соединить — Обновить прошивку). Дожидаемся сообщения о том, что загрузка прошивки прошла успешно. Все, можно начинать работать.

Перед нами модифицированная среда Scratch 2.

Scratch великолепен и сам по себе, и применительно к самым разным предметным областям. Не хватит толстенной книжки, чтобы описать все его возможности, но пусть вас это не смущает. Его в состоянии использовать даже первоклассники, важно знать и понимать некоторые моменты, остальное осваивается шаг за шагом. Так и будем двигаться. Любой, кто хочет большего, может погуглить «Scratch быстрый старт» или «Scratch первые шаги». А тот, кто уже знаком с этой замечательной программой, будет чувствовать себя как рыба в воде.

Следует учитывать, что в среде Scratch может существовать множество объектов, каждый из которых имеет собственную программу поведения (то есть обладает собственным полем со скриптами). В данном случае мы видим два объекта — «Сцена» и «M-Panda». Панда это спрайт, спрайтов в сложном проекте обычно бывает много. Спрайт может прогуливаться по сцене и исполнять иные «финты», сцена тоже кое-что умеет делать. Если мы хотим запрограммировать работу контроллера Arduino, у нас есть возможность задействовать любое удобное нам поле со скриптами. Напишем первую программу, используя рабочее поле спрайта «M-Panda». Обратите внимание, что именно этот объект выбран, и его значок отображается в правом верхнем углу.

Скрипты собираются из блоков (элементарных команд) и соединяются как кирпичики в конструкторе Lego. Посередине экрана располагается палитра блоков. Откроем категорию блоков «Робот», найдем и вытащим на рабочее поле блок «Установить цифровой pin...»:

Эта команда имеет два параметра — номер пина и состояние (HIGH, LOW). Поменяем номер пина на 13. Если теперь щелкнуть по блоку мышью, мы увидим, что встроенный светодиод на нашем Arduino контроллере зажегся. Поменяем состояние на LOW (щелкнув по стрелочке), щелкнем по блоку, светодиод погас. Соберем скрипт из нескольких блоков. Нам понадобится дубль блока «Установить цифровой pin…» (щелчок по блоку правой кнопкой мыши, «дубликат»). Из категории «Контроль» блок «Ждать...секунд», а из категории «События» блок «Когда клавиша пространство нажата». Блоки подклеиваются друг к другу, стоит лишь их переместить в соответствующую позицию. Скрипт можно разрывать на части и собирать заново, если что-то склеилось не так. В результате должно получиться вот что:

Нажмем клавишу «пробел» на клавиатуре. Светодиод на плате загорелся на одну секунду и погас. Работает. Время осваивать управление моторами. Еще раз проверьте, что робоплатформа никуда не уедет и может свободно вращать колесами в воздухе.

Выкинем собранный скрипт целиком обратно на палитру блоков. Пространство освободили, начнем все заново. Разместим на рабочем поле следующие скрипты:

Чтобы упростить себе работу, активнее используйте дублирование c последующей правкой параметров.

Давайте изучим используемую схему управления моторами.

На робоплатформе установлен драйвер двигателей L298N. Он имеет две пары выходных контактов и позволяет управлять двумя мощными моторами, каждый из которых может потреблять до двух ампер, а кратковременно до четырех.

У нас к каждому выходу подключено сразу два мотора, к одному выходу два левых, к другому два правых. Каждая пара двигателей работает синхронно и управляется состоянием трех контактов. Всего требуется шесть. Выходные контакты контроллера Arduino соединены с управляющими драйвера двигателей следующим образом:
- D10 (Arduino) – EnA (L298N)
- D11 (Arduino) – EnB (L298N)
- D8 (Arduino) – In1 (L298N)
- D7 (Arduino) – In2 (L298N)
- D4 (Arduino) – In3 (L298N)
- D3 (Arduino) – In4 (L298N)

Для управления правой моторной парой используются контакты EnA, In1, In2. Для управления левой — EnB, In3, In4. Соответственно выходы D10, D8, D7 контроллера Arduino управляют правыми моторами, а D11, D4, D3 – левыми.

Посмотрим на левую моторную пару. Обычно контакт «Enable» (в данном случае контакт EnB) используется для управления мощностью, на него подают сигнал широкоимпульсной модуляции (ШИМ). Такой сигнал у нас генерирует пин D11. Если записать сюда ноль, получим мощность ноль (ноль процентов времени импульса нагрузка включена), 255 — получим 100% (100% времени импульса нагрузка включена). Но только в том случае, если определено направление вращения, которое зависит от состояния пары других контактов (у нас это D4 и D3). Если на одном контакте логическая единица, а на другом ноль, двигатель вращается в одну сторону. Если наоборот — в противоположную. Если состояние контактов одинаковое, двигатель не вращается. Если на обоих контактах логическая единица и логическая единица (то есть ШИМ 255) на контакте «Enable», дополнительно включается динамическое торможение. Попробуйте пощелкать по управляющим скриптам и проверить, как работают двигатели.

Надо сказать, что предложенная в книге схема подключения драйвера двигателей требует использования аж шести выводов платы Arduino и отнимает у нас ценные контакты D3 и D11 с уникальными возможностями. Об альтернативных схемах подключения и о том, что нам это дает, а что отнимает, мы поговорим в следующих публикациях. Забегая вперед, скажу, что выбор той же схемы, что в контроллерах MakeBlock, позволит нам использовать готовые блоки управления моторами. Аналогичную MakeBlock схему управления имеет робоплатформа ScratchDuino, кстати.

Давайте поуправляем двигателями с клавиатуры. Воспроизведите следующий набор скриптов:

Потребуется 5 «шапочек» «когда клавиша.. ..нажата», для четырех из которых мы выберем другое значение вместо «пространство» (клавиша «пробел»).

Отдельно следует сказать о добавленных блоках «ждать». Никто из нас не безглючен, и, к сожалению, не всегда mBlock работает стабильно. Особенно это касается управления контроллером Arduino в интерактивном режиме. Если отправлять команды на плату слишком часто, не все они могут оказаться исполненными. Одна десятая секунды — цена, которую мы вполне сейчас в состоянии заплатить для большей стабильности работы.

Понажимайте на клавиши, понаблюдайте, как работают двигатели.

Мы подошли к самому «вкусному». Изучим те возможности mBlock, которые заставляют простить ему все недостатки. Переключимся в режим «Arduino mode», именно его можно считать главным и основным при работе в mBlock.

Начните новый проект («Файл», «Новый»). Выберите в меню «Редактировать», «Arduino mode». Вы увидите, что экран изменился, и не все блоки стали доступны.

Первым делом мы создадим свой собственный блок (высокоуровневую команду) для управления моторами.

Выберите на палитре «Данные и блоки», нажмите кнопку «Сделайте блок». Укажите его имя («motors») и имена двух числовых параметров («power1» и «power2»).

На рабочем поле у вас появится «шапочка» для определения новой подпрограммы. Далее воспроизведите следующее:

После того, как мы загрузим данную программу в контроллер кнопкой «Upload to Arduino», наша робоплатформа автономно начнет исполнять следующую последовательность действий:
- подождать;
- проехать вперед, проехать назад (на максимальной скорости, будьте внимательны, чтобы не свалилась со стола!), подождать;
- покрутить левыми моторами вперед и назад, подождать;
- покрутить правыми моторами вперед и назад;
- ждать, пока единица не станет меньше единицы (а этого не произойдет никогда, таким образом мы предотвратили повторение всей процедуры).


Download
На всякий случай прикладываю готовый проект mBlock.
roboBHV_test1.zip
Compressed Archive in ZIP Format 3.1 KB


Для надежности лучше взять робоплатформу в руки. Нажимаем на кнопку «Upload to Arduino», дожидаемся конца загрузки. Наблюдаем, как весело крутятся моторы. Отсоединяем USB провод, отключаем питание. Теперь можно поставить робоплатформу на пол, снова включить питание и убедиться, что все работает и без участия компьютера.


.

mBlock - достойный преемник ArduBlock. Scratch-программирование автономных Arduino роботов.

В настоящее время появляется все больше робототехнических наборов на базе Arduino, пригодных для обучения детей программированию и другим аспектам робототехники. Содержание этих наборов и направленность обучения - большая тема, достойная отдельного разговора, но можно указать на одну общую проблему, связанную с их использованием. Существует большой разрыв между визуально-ориентированными (преимущественно Scratch-подобными) программными средствами и "взрослым" программированием в Arduino IDE (Integrated Development Environment), проводимом в текстовом режиме. Это является и причиной и следствием того, что робототехнические Arduino наборы пока в основном делятся на две большие и очень разные категории. Либо это нечто "начального" уровня с весьма ограниченными возможностями, жесткой конструкцией, простое в сборке и использовании, но с трудом поддающееся совершенствованию и адаптации к текущим учебным задачам. Либо это обширный набор электронных компонентов, предполагающий обучение в стиле «как заставить мигать светодиоды», с возможностью подключать что угодно к чему угодно (в том числе неправильно), и собрать из этого набора полноценное законченное устройство без паяльника, лобзика и прочих атрибутов Самоделкина вряд ли получится. Между тем эту пропасть вполне можно (а по мнению автора, нужно) преодолеть. Путем усложнения конструкции "шаг-за-шагом", путем постепенного усложнения средств и методов программирования. Переход от простого к сложному должен быть плавным и поэтапным. В результате один робототехнический комплект становится возможно (и интересно!) использовать на протяжении всего курса обучения.

На слуху российского пользователя робототехнический набор ScratchDuino отечественной разработки, в двух вариантах, лаборатория и робоплатформа. Продукт, несомненно, не без недостатков. Однако на время отвлечемся от критики и укажем на ряд неоспоримых плюсов. Наборы комплектуются одноименной средой визуального программирования и позволяют детям даже младших классов начать работу с контроллером Arduino в простой и понятной форме. ПО бесплатное, проект открытый, каждый может (но не каждый сумеет) собрать по схемам своего собственного робота или лабораторию. Вопреки расхожему мнению есть возможность расширять аппаратные возможности готовых покупных наборов (пример здесь и здесь). Но что дальше? Как пользоваться полученными возможностями? Можно подключить сервомотор, но как им управлять? В настоящий момент среда ScratchDuino не позволяет даже менять скорость вращения колес. Как сделать автономного робота? Наличие BlueTooth несколько снимает остроту проблемы, но не решает ее. Мы по-прежнему привязаны к компьютеру, а хочется-то получить автономное устройство. Кроме того, хочется иметь возможность программировать любое Arduino устройство, простое или сложное, а не только лишь специфических роботов ScratchDuino.

Одним из способов решения данной проблемы является использование плагина ArduBlock для Arduino IDE, описанное Юрием Винницким в серии публикаций. Там он справедливо сетует на то, что проект перестал развиваться. ArduBlock - хорошее решение, но давайте посмотрим, какие в настоящий момент есть альтернативы? Итак, обозначим задачи. Продукт должен быть бесплатным. Должен быть легким в использовании, должен быть максимально похож на привычный Scratch (тут ArduBlock слегка подкачал). Должен давать возможность полноценно управлять Arduino и на уровне отдельных вводов-выводов и с помощью высокоуровневых команд (моторы вперед, назад). Наконец, должен позволять загружать программу в контроллер для работы Arduino в автономном режиме (а в большинстве случаев это необходимое условие для участия робота в соревнованиях). В качестве существенного бонуса было бы здорово, если бы был стимул перехода от визуального программирования к текстовому, генерировался код Arduino, как это происходит в ArduBlock. Достаточно противоречивые требования, но, тем не менее, попробуем присмотреться к вариантам.

1. S4A - Scratch for Arduino (http://s4a.cat). 

Достаточно известный и зарекомендовавший себя проект. Роботы под управлением S4A приобретут массу новых возможностей. Подключайте к любой плате Arduino датчики, потенциометры и получите аналог ScratchDuino лаборатории. Управляйте разнообразными внешними устройствами. Однако робот не всякой аппаратной конфигурации будет полностью совместим с S4A. ScratchDuino робоплатформа - не полностью. Конечно, если вы собираете робоплатформу своей собственной конфигурации, почему бы не воспользоваться совместимой? Базируется на Scratch 1.4, а это значит, что программа легко "крутится" на старых слабеньких компьютерах. Другой стороной этой медали является то, что придется забыть о чудесной библиотеке векторных спрайтов Scratch 2, а для некоторых проектов это существенно. Не получится создавать свои собственные блоки. И самое главное, никакой автономности, робот по-прежнему привязан к компьютеру. Для использования S4A требуется предварительно загрузить в контроллер прошивку при помощи Arduino IDE.

2. Snap4Arduino (http://s4a.cat/snap)

Очень интересный, хоть и пока достаточно сырой проект. Для наших задач принципиально несколько особенностей данной программной среды. Есть возможность работы с любым цифровым или аналоговым портом, то есть аппаратная конфигурация нашего робота может быть произвольной. Можно определять собственные блоки, а значит, легко научить робота выполнять высокоуровневые команды. Более того, эти блоки могут быть с параметрами и использовать рекурсию. Мы получили возможность применять рекурсивные алгоритмы, теперь наши роботы и спрайты будут рисовать фракталы! Управлять можно любой Arduino-совместимой платой, поскольку используется стандартный протокол Firmata, а скетч для прошивки входит в состав Arduino IDE. Скорость обмена данными между платой и компьютером увеличена в 7 раз по сравнению с S4A. И самое "вкусное". Заявлена возможность экспорта простых программ в скетчи Arduino!

Пока это экспериментальная функция, работает она не без ошибок. 

И тем не менее, это огромный шаг вперед! В тестовом экспортированном скетче мне пришлось сделать несколько простых исправлений, и все заработало.

Почитать о "Snap!" можно здесь (http://progopedia.ru/implementation/snap).



3. mBlock (http://mblock.cc)

Данной средой программирования комплектуются очень интересные китайские робототехнические наборы MakeBlock. Именно эту торговую марку можно указать в качестве примера последовательного использования изложенной выше концепции «от простого к сложному». Радует то, что русский есть в списке поддерживаемых языков. Давайте посмотрим внимательнее. Установочный пакет уже включает в себя Arduino IDE. И это неспроста! Но обо всем по-порядку.

Этот программный продукт бесплатный, базируется на Scratch 2 (поэтому все знакомо и понятно) и позволяет программировать Arduino роботов произвольной конфигурации. Для некоторых из них уже есть готовые наборы высокоуровневых команд. Если вашего робота нет в списке, не беда! Надо лишь выбрать в качестве используемого расширения базовой системы команд «Arduino» ("Extentions", "Arduino").

Определяйте и используйте свои собственные блоки, как в "Snap!" и Scratch 2, с параметрами и возможностью рекурсии. Контроллер Arduino нет нужды прошивать заранее. Вам только нужно указать тип платы и используемый COM порт. Выбираете его ("Соединить", "Serial Port").

Указываете тип контроллера ("Boards"). Платы поддерживаются не все, но самые распространенные есть в списке.

Остается залить прошивку, и можно начинать программирование ("Соединить", "Обновить прошивку").

Робот послушно исполняет наши команды, работает под управлением скриптов Scratch. Приятный бонус - можно использовать показания ультразвукового дальномера! Но... прелести на этом не заканчиваются, а только начинаются! Выбираем "Редактировать", "Arduino mode" и видим до боли знакомые "void setup", "void loop"... 

Начинаем собирать из блоков программу и наблюдаем, как тут же меняется текстовой скетч. Закончив, нажимаем на кнопку "Upload to Arduino". Наблюдаем за процессом. Программа загружена в контроллер, нам больше не нужен компьютер!

Вуаля, наш первый простейший автономный робот для езды по линии, запрограммированный в Scratch, готов!