В этой статье я опишу как начать работать с устройством 105 Bender. Это устройство ZiChip было создано специально для «оживления» давнишнего моего проекта — робота Бендера:
— здесь я собрал шасси
— а здесь внутреннюю электронику
В данной статье мы еще не будем запускать Бендера (это я сделаю в следующей статье). Цель статьи — рассмотреть основы работы с программой Тюнер и принципы построения сценария устройства ZiChip. Это не сложно. Постараюсь подробно про все написать. В конце статьи есть видео — все должно быть понятно. И еще, данная статья — это почти полный копи-паст статьи с ресурса ZiChip — больше информации о ZiChip всегда можно найти там.
Для демонстрации работы нам понадобится:
— плата Arduino (Uno или Nano) с ATmega328, 16 МГц
— макетка (для удобства)
— светодиод с резистором 300 Ом — 1 кОм
— ИК приемник TSOP (тип особо не имеет значения)
— ИК пульт (подойдет любой)
— пьезоизлучатель (или динамик с резистором 300 Ом)
Еще, нужно скачать программу для настройки устройств ZiChip — Тюнер.
Обычно, поддержку каждого нового устройства в Тюнер предварительно нужно добавить, но устройство 105 Bender уже встроено в Тюнер по умолчанию и нам ничего, кроме самой программы, не нужно скачивать.
Краткий обзор устройства (посмотреть полный обзор).
Устройство ZiChip №105 Bender предназначено для несложного управления подвижной тележкой. Устройство имеет набор входных и выходных линий. Каждая конкретная линия связана со своей периферией. Переназначить линии нельзя.
Устройство №105 ZiChip создавалось с целью «оживить» мой старый проект «Робот Бендер», поэтому и периферия подобрана таким образом, чтобы можно было управлять всеми модулями робота (и даже немного больше). Но в тоже время устройство способно управлять и другими вариантами подвижных тележек (с одним приводным двигателем и подвижными рулевыми колесами, 2-мя, 4-мя приводными колёсами или даже гусеничной тележкой).
Подготовка устройства к работе – прошивка МК
1 Подключаем Ардуино штатным шнуром к USB.
— если понадобятся драйвера – их можно скачать здесь
2 Запускаем Тюнер и запускаем утилиту для программирования Ардуино
3 Выбираем порт, с которым связана Ардуина (появляется при подключении Ардуины)
4 Утилита сама находит доступные прошивки устройств и выдает их перечень. Выбираем «Робот Бендер (ver_A)»
5 Выбираем тип Вашей Ардуины и жмем кнопку «Начать прошивку >>»
По окончании процедуры программирования устройство будет готово к работе.
Знакомство с Тюнером
Прошитое устройство не выполняет никаких действий (кроме подтверждения нажатия кнопок ИК-пульта индикаторным светодиодом Ардуины). Нужно создать сценарий поведения и записать его в Ардуину при помощи Тюнера.
Для примера, попробуем настроить элементарное действие, такое как включение/отключение светодиода по нажатию кнопки пульта.
1 Собираем простую схему (я использовал Arduino Nano, но и Uno тоже подойдет).
— не забываем, что светодиод нужно подключать к Ардуине через гасящий резистор 300 Ом – 1 кОм
2 После сборки схемы, подключаем Ардуину к компьютеру.
3 Запускаем Тюнер
Тюнер представляет собой 3 отдельных окна:
— Слева «Сценарий устройства» — здесь мы будем из доступных элементов выстраивать логические цепочки (микропрограммы), формируя логику работы устройства.
— Окно по центру — «Настройка элемента сценария». В этом окне мы будем выбирать элементы из палитры и настраивать каждый из них.
— Справа – окно модулей устройства. В этом окне мы сможем видеть текущих участников сети, выбрать настраиваемое устройство и наблюдать в реальном времени информацию о состоянии устройства и его модулей
4 Создадим новый проект. Для этого нажимаем кнопку и создаем новую папку проекта (например, project1)
5 Далее необходимо в проект занести всех участников сети ZiChip (в нашем случае он один, но это сути не меняет). Это делается Тюнером автоматически, по факту наличия подключенных устройств.
Нажимаем кнопку и выбираем порт, с которым связана Ардуина. При выборе порта и при наличии на нем ЗиЧип-устройств, появляется сообщение «ZiChip сеть :)» — жмем ОК. Тюнер просканирует всех участников сети и в правом окне выдаст их список. В нашем случае будет только одно устройство
6 Настройка модулей
— Сейчас мы не будем рассматривать все модули, но для демонстрации построения сценария, нам понадобится модуль ИК-пульта. В нем мы определим пару кнопок пульта, которые будут управлять светодиодом.
Жмем в правом окне и попадаем в окно настройки пульта. Здесь мы укажем устройству, с какими кнопками пульта мы хотим работать.
Определение кнопок пульта происходит следующим образом:
— кнопкой добавляем пару новых строчек для кнопок пульта
— выбираем верхнюю (нулевую) строчку
— теперь нажимаем выбранную кнопку на пульте (на кнопке внизу окна должен отобразится ее хеш-код)
— нажимаем кнопку с хеш-кодом и этот хеш-код попадет в таблицу (и устройство) – первая кнопка определена
— при желании можно написать комментарий к этой кнопке — в поле «Описание» строчки двойной клик мышки и пишем «Вперед»
— тоже проделываем и со второй кнопкой — называем ее «Стоп»
— Настройки модуля сохраняются в EEPROM устройства и в последующем повторно эту процедуру проходить не нужно.
— Пульт может быть любым – устройство автоматически подстроится под любой протокол.
Создание первого простого примера сценария
Переходим к созданию сценария (по ходу буду пояснять, как работает этот механизм). Сценарий устройства строится посредством элементарных логических цепочек «событие-действие» («событие» дает команду на выполнение «действия»). В нашем случае, событием будет нажатие заданной кнопки пульта, а действием – переключение светодиода
— каждая логическая цепочка должна быть заключена (обозначена) элементами «Микропрограмма» и «Конец микропрограммы»
— этих цепочек в сценарии может быть несколько
— можно считать, что все цепочки сценария работают параллельно и независимо друг от друга
— сценарий должен заканчиваться элементом «конец сценария».
1 В левом окне «Сценарий устройства» кнопкой добавляем несколько пустых строк. Выбираем первую пустую строчку и в выпадающем списке «Палитра элементов устройства» центрального окна «устанавливаем» в нее нужный элемент.
2 Последовательно вставляем элементы «Микропрограмма», «Событие от кнопок пульта», «Индикация простая», «Конец микропрограммы», «Конец сценария».
В результате у нас должно получится следующее:
Данная цепочка (и сценарий) еще не работоспособна – это только скелет логики. Теперь нужно настроить каждый элементы цепочки нужным нам образом.
3 Начнем с элемента «Событие от кнопок пульта». Выбираем его в окне сценария и делаем настройку в центральном окне в поле «Параметры элемента»
Из параметров пульта нам нужно указать галочкой, какая из 16 возможных кнопок пульта будет создавать событие (смотрим в правое окно, где наши кнопки пульта определены и пронумерованы). Галочкой отмечаем нулевую кнопку — «Вперед».
С пультом все. Теперь нужно определиться, что нам нужно от светодиода (что он будет делать, когда возникнет событие от нажатой кнопки пульта).
4 Выбираем строчку со светодиодом и в окне настройки видим параметры светодиода. В выпадающем списке выбираем Светодиод: «- ELED» и Действие: «- переключить» (каждое новое событие будет переключать состояние светодиода на противоположное).
Теперь сценарий готов..
5 Осталось созданный сценарий записать в устройство.
— так как сценарий хранится в EEPROM, процесс записи не влияет на работу устройства и может быть запущен даже в момент, когда устройство выполняет какое либо действие. Это будет актуально, когда тележка будет связана с компьютером не USB-шнурком, а при помощи BlueTooth-модуля. В этом случае логику тележки можно менять не вставая за ней с рабочего места.
Для записи сценария нажимаем кнопку (в левом окне) и в окне мастера жмем «ОК» (мастер сделает все автоматически).
Готово – первый сценарий записан, теперь можно его проверить (Ардуину отключать от ПК не нужно). Нажимайте кнопку пульта и наблюдайте за переключением светодиода.
Обзор возможностей
С элементами светодиода и пульта мы разобрались — там все довольно просто. Кратко ознакомимся с другими элементами устройства (более подробней смотрите или в хелпе Тюнера — кнопка , или в обзоре устройства, или в описании элементов на этом ресурсе).
Элементы устройства можно разбить на функциональные группы.
1 Группа элементов которые служат для разметки сценария, управления ходом выполнения микропрограммы, ее комментирования.
2 Группа элементов формирующие событие (от кнопок пульта и от аналоговых входов). Для аналоговых входов может быть задан произвольный коэффициент усиления и смещение нуля — это удобно для работы с различными аналоговыми датчиками.
3 Элементы управления тележкой специфичные и созданы специально для этого устройства. При помощи этих элементов происходит управление тележкой и задание режимов движения:
— реализован разгон двигателей (останов) с заданной интенсивностью (то есть тележка не двигается рывками — движения плавные)
— реализовано управление двигателями по логарифмическому закону (можно отключить, но с логарифмом лучше)
— поворот может осуществляться как самими двигателями так и при помощи сервы (это если тележка с одним приводным двигателем и возможностью поворачивать передние колеса)
— реализована возможность задания глобальных настроек для всех элементов (и их смены в процессе работы) .
Элементы позволяют плавно и удобно управлять тележкой посредством таких неудобных устройств управления как ИК-пульт и символьные команды от BlueTooth.
4 Элементы управляющие сервоприводом.
5 Элементы реализующие управление индикацией тележки. Имеются различные варианты визуальных эффектов (то есть подал один раз команду и индикация работает по заданной программе).
6 Элементы работы с флагами устройства — ниже я них напишу.
7 Элементы работающие с BlueTooth или UART.
8 Так как места в МК оставалось прилично, под зуммер был реализован однобитный олдскульный звук! В устройстве предустановлено 15 различных звуков для несложного озвучивания модели.Следующий пример сценария будет со звуком.
9 Дополнительный набор элементов (для формирования более сложной логики) — перекочевал с предыдущего базового устройства:
События
Действия
Работа с точками доступа
Работа с ячейками памяти
Второй пример сценария – комбинированные действия
После ознакомления с элементами устройства, попробуем немного усложнить наш сценарий – добавив в него элемент «звук».
1 Для того чтобы услышать как работает этот элемент нужно в предыдущую схему добавить динамик (или пьезоизлучатель).
— элемент «звук» работает довольно своеобразно, так как он воспроизводит однобитные предустановленные треки. Качество звука не позволяет полноценно создавать звуковые эффекты для моделей. Этот элемент был создан только с целью демонстрации и, возможно, каких то несложных озвучек. Для полноценной озвучки можно воспользоваться моей говорилкой, где звук гораздо лучше и есть возможность проигрывать свои файлы. Еще в планах есть создание новой говорилки работающей полноценно в ЗиЧип.
2 Построим следующую логику работы:
— задействуем 2 кнопки пульта «вперед» и «стоп» (ранее мы их уже определили)
— по нажатию первой кнопки загорается светодиод и имитируется звук запуска «мотора»
— после того ка «мотор» «запустился»
— начинает непрерывно воспроизводиться «холостой» ход «мотора»
— после нажатия кнопки пульта «стоп» светодиод погаснет и проиграется звук «остановки» «мотора»
Реализуется этот алгоритм не намного сложнее предыдущего сценария.
3 Для начала сделаем включение и отключение светодиода разными кнопками. Для этого немного подправим наш первый сценарий. Создаем дубликат ранее созданной цепочки сценария (выделяем нужные строчки с зажатым Shift, потом копируем Ctrl+C и вставляем Ctrl+V).
4 Изменяем настройки элементов:
— светодиод в первой цепочке – устанавливаем действие «- включить»
— пульт во второй цепочке — выбираем галочкой вторую кнопку (под номером 1)
— светодиод во второй цепочке – устанавливаем действие «- выключить»
5 Записываем сценарий в Ардуину и проверяем, как включается и отключается светодиод от разных кнопок. Работает правильно? Продолжаем!
Пришло время добавить звук.
6 После каждого светодиода кнопкой добавляем новую строчку и вставляем туда элемент звук
7 Правим:
— первый звук – выбираем Воспроизвести: «-старт» (остальные настройки не трогаем)
— второй звук – выбираем Воспроизвести: «-стоп» (остальные настройки не трогаем)
— действий в цепочках сценария можно выстраивать по несколько в ряд – все они выполнятся одновременно по приходу события.
Еще раз записываем сценарий в Ардуину и пробуем нажимать кнопки. Работает?
8 Теперь нам нужно добавить звук холостого хода:
— в первой цепочке добавляем еще один элемент звука (обязательно до элемента звука, который воспроизводит «-старт») . Если элемент попал не туда, то стрелками можно передвигать выделенную строчку вверх или вниз по сценарию.
— в добавленном звуке выбираем «-холостой ход» и ставим галку «воспроизводить как зацикленный фон»
— во второй цепочке в настройке звука «стоп» выбираем — По окончании воспроизведения: «тишина» — это для того чтобы после воспроизведения звука остановки не продолжился фоновый звук холостого хода
— два звука в цепочке будут работать следующим образом. Вначале запустится фоновый звук и тут-же мгновенно запускается звук «-старт». При запуске «-старт» фоновый звук отложит свое воспроизведение (даже не начав воспроизводится) и запустится уже после окончания звука «-старт». Далее «холостой ход» будет работать зациклено бесконечно (пока не будет воспроизведен «стоп»).
Записываем сценарий – проверяем.
Третий пример сценария – работа с флагами устройства.
Если со вторым примером «поиграться» чуть дольше, то станут заметны пару огрехов, которые здорово портят впечатление (это не считая качества звука 🙂 ).
А именно:
— если во время озвучивание холостого хода нажать кнопку пульта еще раз «вперед», то произойдет повторное озвучивание «старт» — чего не должно быть
— кнопка пульта «стоп» будет озвучивать процесс остановки двигателя в любом состоянии, даже если устройство в данный момент никуда не «едет»
Чтобы убрать эти огрехи, нам необходимо знать в каком режиме работает устройство в момент подачи команды (нажатии кнопки пульта) и действовать по обстоятельствам. Об состоянии устройства проще всего судить по флагам устройства.
— Устройство ЗиЧип имеет большой набор флагов. Флаги отображают различные состояния периферии или внутренних процессов. Например, флаги устанавливаются во время воспроизведения звука, во время нажатия любой кнопки на пульте, при установке сервопривода в крайние состояния, при движении двигателей вперед или назад и так далее. Еще флаги управляют режимами работы периферии. Например, установив соответствующие флаги можно запрещать определенные действия устройства или задействовать альтернативные функции на линиях ввода-вывода. Еще, флаги общего назначения можно использовать в своих целях для формирования нужной логики сценария.
Узнаем какие у нашего устройства есть флаги. Для этого откроем окно флагов (в правом окне пиктограмма ). Нажимаем пиктограмму и получаем перечень предустановленных флагов устройства. Состояние флагов изменяется в режиме реального времени, то есть, то что Вы видите в окне – это реальное состояние флагов устройства (понажимайте любые кнопки на пульте и Вы увидите как изменяет свое значение соответствующий флаг). Флаги можно переключать вручную – просто выбирайте нужную строчку мышкой – флаг будет изменять свое значение.
Чтобы определять в каком режиме работает устройство в каждый момент времени (и адекватно реагировать на нажатия кнопок пульта) мы будем использовать флаг «воспроизведение сэмпла». То есть, если звука нет, значит наше устройство никуда не «едет» и его можно «завести» но нельзя «заглушить» и наоборот.
Приступаем к правке предыдущего примера
— все примеры приведенные выше есть в разделе примеров устройства. Примеры можно посмотреть (и загрузить) из окна примеров которое открывается кнопкой в левом окне.
Добавим в сценарии предыдущего примера по новой строчке в каждой цепочке после элемента Пульт. В эти строчки устанавливаем элемент «Событие от флага».
В первой цепочке в элементе «Событие от флага» устанавливаем номер флага 16 — «Воспроизведение сэмпла» и ставим галочку «- инвертировать событие флага». В элементе Флага второй цепочки устанавливаем тот-же 16 флаг, но без галочки.
— события установленные одно за другим обрабатываются по принципу логического-И. То есть, чтобы выполнилось действие нужно чтобы все события были активны.
Логика, сформированных выше цепочек, следующая:
— первая цепочка сформирует событие (и отработает «запуск двигателя») только тогда, когда нет воспроизведения звука и нажата кнопка на пульте. Если звук уже проигрывается — ничего не произойдет.
— вторая цепочка будет действовать наоборот (срабатывать только когда звук воспроизводится) так как нет галочки «- инвертировать событие флага» в элементе флага.
Загружаем сценарий в устройство — пробуем.
Обещанное видео — все о чем я написал выше (включите во весь экран)
В конце небольшой ликбез по основным понятиям ZiChip (читать не обязательно)
Термины и определения
ZiChip
– это готовое устройство с определенным функционалом, позволяющее простыми и доступными средствами настроить логику работы «под себя». Кроме того, ZiChip по умолчанию поддерживает сеть устройств и в любой момент можно внести новое устройство в сеть и «прописать» его взаимодействие с уже работающими устройствами.
ZiChip Tuner
– это программа, предназначенная для настройки, как отдельных ZiChip-устройств, так и сети в целом. Тюнер умеет получать различную информацию от устройств в сети и управлять любым функционалом.
Номер устройства
— это номер посредством которого устройство идентифицирует себя в сети и для Тюнера. Номер устройства – это, фактически, тип устройства. В сети могут участвовать устройства разных типов (в том числе и одинаковых)
Адрес устройства
— это присвоенный Тюнером номер, служащий для идентификации устройства в сети. То есть – это номер, по которому к устройству обращаются или от имени этого номера устройство передает информацию другим участникам в сети. В сети может участвовать до 15 устройств (соответственно, адреса лежат в пределах 1 – 15). В сети не может быть устройств с одинаковыми адресами.
Сценарий поведения устройства
— это специальная запись в EEPROM микроконтроллера, которая формирует способ реагирования устройства на внешние сигналы. Устройства ЗиЧип позволяют изменять сценарий поведения «на лету», во время работы (без перепрошивки и необходимости выключения устройства из сети).
Микропрограмма (логическая цепочка)
— группа элементов заключенная между элементами «Микропрограмма» и «Конец микропрограммы» и выполняющая элементарную работу — «событие-действие». «Событие» дает команду на выполнение «Действия». Цепочек в сценарии может быть несколько. Все цепочки, прописанные в сценарии, работают параллельно.
Точки взаимодействия (точки доступа)
— это базовый механизм ZiChip, посредством которого осуществляется связь внутренних модулей устройства между собой и связь между отдельными устройствами в сети. Процесс формирования алгоритма поведения устройства сводится к формированию связей между точками взаимодействия.