Одной из основных проблем всех современных робототехнических конструкторов является ограниченность совместимых с ними комплектующих, начиная от простейших аналоговых и цифровых датчиков, заканчивая продвинутыми системами, такими как системы технического зрения, системы речевого ввода-вывода и т.д. Как показывает практика, современных образовательные робототехнические конструкторы различных производителей имеют примерно одинаковый набор датчиков – ИК и ультразвуковые дальномеры, детекторы линии и цвета и, в принципе все.
Некоторые производители выпускают отдельные киты совместимых со своими работами и расширяющих их функционал дополнительных датчиков. С одной стороны такой подход позволяет закрыть брешь в нехватке комплектующих, но с другой стороны такой подход сильно поднимает итоговую цену на полноценный набор и заставляет морочиться с отдельной закупкой датчиков. Но даже и такой подход не решает проблему нехватки комплектующих. Как правило, определенный набор датчиков очень быстро осваивается и становится не интересным для дальнейшего использования учащимися в своих проектах, желающих сделать что-то оригинальное и необычное, например, какой-либо проект, связанный с интернетом вещей или умным домом.
В настоящее время тема умного дома стала невероятно актуальна. Технические возможности позволяют любому человеку быстро сконструировать роботизированную систему ни только для наблюдения за безопасностью дома, но и прекрасно справляющуюся с обеспечением таких приятных задач, как, к примеру, включение и выключение света и электроники в комнате в зависимости от присутствия в ней человека. Но имеющиеся в составе набора компоненты не позволяют реализовать все потребности разработчика и вызывают у него желание использовать копеечные китайские датчики, которых можно без проблем купить в любом магазине радиоэлектроники. В данной статье мы разберем основные методы взаимодействия некоторых датчиков сторонних производителей с контроллером CM-530 популярного производителя робототехнических конструкторов DREAM, STEM и BIOLOID – компании Robotis.
Для примеров мы используем: датчик огня, датчик газа и резистивный датчик давления. Часть из них являются аналоговыми, часть- цифровыми. Два этих понятия будут также разобраны, и для каждого сенсора будет приведен пример кода и инструкция подключения.
Учитывая тот факт, что контроллер CM-530 совместим с фирменными серводвигателями Dynamixel, мы можем значительно расширить возможности имеющихся конструкторов, сделав мобильных роботов для обслуживания помещений и выполнения определенных полезных задач.
Большинство имеющихся аналоговых и цифровых датчиков имеют от двух, до трех выводов(пинов) из которых два – питание и один - сигнальный. Некоторые простые датчики имеют 4 вывода и как правило это связано с тем, что они имеют как аналоговый, так и цифровой сигнальный вывод. У контроллера же выделено для работы с датчиками 6 портов, каждый из которых имеет 5 выводов. Будучи подстроен под этот порт, стандартный кабель от ROBOTIS для работы с датчиками также имеет 5 проводов, которые жестко закреплены конструкцией. Здесь и появляется основная проблема: этот кабель не предусматривает подключение к каким-либо другим датчикам, кроме тех, которые поставляет ROBOTIS. Так что первым делом нам нужно создать допустимый переходник. Обратимся к карте пинов:
- OUT1 : 3.3V- Torque Possible (Maximum Allowed Current 0.3A)
- VCC (5V)
- ADC : The analog signals from the sensor made by the user can be read.
- GND
- OUT2 : 3.3V- Torque Possible (Maximum Allowed Current 0.3A)
Видно, что кроме 5 вольт для питания датчиков, нам доступны еще и два пина 3.3 В, что увеличивает спектр совместимых датчиков. Эти выходы идут с пометкой “OUT”, означающим что мы можем подавать через них регулируемо либо 3.3 В, либо 0 В. Так, если вы зайдете в RoboPlus Manager, в раздел “Other devices” и выставите в столбце “Control” пометку “User”, то справа появится меню выбора High/Low, где вы сможете настраивать какое напряжение подавать на выходы OUT1 и OUT2:
Здесь, соответственно, на пин OUT1 мы подаем 3.3 В, а на пин OUT2 0 В.
В среде RoboPlus Task вы можете сделать аналогичное действие в коде следующим образом:
Общение контроллера и датчика происходит через аналоговый порт. Датчики у нас как аналоговые, так и дискретные. Что это означает?
Для начала разберемся с понятием аналогового и цифрового (дискретного) сигналов.
В цифровой технике мы работаем с двумя значениями – логическим 0 – низкий логический уровень,- либо 1 – высокий логический уровень. Если наш контроллер оперирует лишь этими элементарными значениями, то мы имеем дело с цифровым сигналом. Здесь есть некоторые нюансы: Если напряжение на выходе ниже определённого значения, то мы принимаем значение на выходе за 0. Если значение напряжения на выходе выше определенного( или оно превышает заложенное пороговое)- то принимаем значение на выходе за 1. Для примера – в транзисторно-транзисторной логике (ТТЛ) низкому логическому уровню (0) соответствует диапазон напряжений от 0 до 0.5В, а высокому логическому уровню – от 2.0 до 5.0В
Если же сигнал на выходе имеет непрерывную характеристику, мы имеем дело с аналоговым сигналом. Но поскольку работать с непрерывном сигналом напрямую мы не можем, то этот сигнал мы оцифровываем с помощью АЦП – аналого-цифрового преобразователя, таким образом, что значению вольтажа ставится в соответствие какое-то число в диапазоне от 0 до 1023 для 8 разрядного АЦП.
Стоит заметить, что цифровой сигнал может также эмитировать аналоговый. Как?
Все дело в ШИМ(Широтно-Импульсной Модуляции). Элементарные сигналы те же: 0 и 1. Однако мы можем посылать эти сигналы с некоторой периодичностью (импульсами). Более того, мы можем увеличивать или уменьшать длину нашего импульса(как показано на графике)! Тем самым мы добиваемся эмуляции нужного напряжения. И слово “эмуляция” здесь очень важно, ибо мы именно эмулируем нужный вам вольтаж, чередуя нулевое напряжение и напряжение работы контроллера. Так, если мы подключим светодиод к цифровому устройству с поддержкой ШИМ и будем подавать изменяющееся от 0 до 2 В напряжение, то и яркость светодиода будет меняться. Но стоит потрясти светодиод перед глазами, как цифровой сигнал сразу выдаст себя: из-за особенностей человеческого глаза мы видим, что, хоть раньше светодиод и светился постоянно, но теперь, из-за того, что сигнал на самом деле периодический, он малую часть времени то горит, то нет.
Рассмотрим систему из датчика и контроллера: каждый датчик имеет какой-то промежуток рабочего напряжения. Элементарные датчики питаются за счет этого напряжения, в зависимости от конструкции различными способами изменяют свое сопротивление или просто значение напряжения и отсылают по сигнальному выводу сигнал в виде определенного значения напряжения. Далее, контроллер либо преобразует вольтаж в 0 и 1( если мы имеем цифровой вход), либо, имея встроенный АЦП, сопоставляет это напряжение с каким-либо числом от 0 до 1023(аналоговый вход или цифровой на ШИМ).
Но не стоит забывать и о таких понятиях, как шумы и помехи. Любое радиоустройство генерирует определенные помехи, к которым восприимчивы наши аналоговые и цифровые устройства. Для аналоговых устройств это чревато непостоянностью читаемых значений или смещением их диапазона. Для цифровых устройств последствия еще хуже: непредусмотренные скачки напряжения в диапазоне логической ‘1’ могут и вовсе привести к некорректной работе нашей системы. Но в простейших случаях эту проблему легко обойти: достаточно лишь к аналоговому или цифровому выходу датчика в узле добавить подтягивающий резистор, ведущий к земле.
Возвращаемся к нашему устройству: CM-530 имеет аналоговый вход, следовательно, мы будем иметь дело с АЦП. Значит с аналоговых датчиков мы сможем получать значения, пропорциональные имеющемуся вольтажу на них( в идеальном случае, если датчик питается от 5 в, сможем получить значение от 0 до 1023 в работе с 8ми разрядным контроллером. Стоит отметить, что, согласно RManager, максимальное рабочее значение аналогового сигнала для CM-530 не 1023, а 999). Если же датчик дискретный, то с него мы будем получать значения напряжения для логических 0 и 1 ( о котором писалось выше), а CM-530 будет конвертировать это напряжение в соответствующие числовые значения.
Осталось лишь спаять кабель:
В нашем случае 5 вольт не превышают границы безопасного вольтажа рассматриваемых датчиков, так что будем использовать только пин под 5 вольт( красный провод), аналоговый выход ( желтый провод) и GND( коричневый провод).
Подготовительная часть закончена. Теперь разберемся с самими датчиками, а, также, с возможными помехами и шумами.
Начнем с самого простого в плане работы-с резистивного датчика давления. Почему самого простого? Он имеет два выхода, не имеет полярности и является, по сути своей, резистором, который в зависимости от степени приложенной силы изменяет свое сопротивление. Чем больше сила - тем меньше сопротивление и выше ток. Хоть он один из самых простых в работе, он имеет довольно широкое применение. К примеру, установив такой датчик на руку-манипулятор, вы сможете регулировать силу сжатия объекта.
Попробуем подключить датчик. Вроде бы нам следовало бы подключить 1 выход к нашим 5 вольтам, а другой- 5 аналоговому входу. Так? Ответ- не совсем.
Зайдите в в RoboPlus Manager, в раздел “Other devices” и вновь выставите для нужного номера порта в столбце “Control” пометку “User”. Теперь мы можем считывать значения с нашего датчика.
Попробуйте совсем чуть-чуть надавить на датчик. Значения начнут изменяться чрезмерно быстро. Датчик слишком чувствителен. Все дело в особенностях самого датчика: изменение сопротивления в зависимости от прикладываемой силы нелинейно и с определенного значения резко падает.
Соответственно, использовать его с такой резистивно-силовой характеристикой затруднительно. Здесь нам вновь на помощь придет подтягивающий резистор. Подключим один выход датчика к пину 5 В, другой- через 10 кОм к земле. Между нашим датчиком и резистором 10 кОм в узле подведем дополнительный провод к аналоговому входу контроллера:
Тогда входное напряжение будет иметь следующую зависимость: , где - напряжение, подаваемое на аналоговый вход, - наши 5 В, - значение сопротивления подтягивающего резистора( 10 кОм), - переменное сопротивление резистивного датчика. Тем самым мы сглаживаем изменение считываемых значений, хоть незначительно и уменьшаем сам диапазон.
Вновь, через RoboPlus Manager посмотрите на изменение значений при нажатии на датчик: изменение получаемых значений происходит гораздо плавней, при том прикладывать силу мы можем гораздо большую.
Теперь напишем простой код: при определенном значении светодиод AUX на контроллере будет светиться:
Постепенно нажимаем на датчик. В определенный момент светодиод загорается. Отпускаем датчик- диод гаснет. Можно усложнить конструкцию: собрать из Dynamixel манипулятор, прикрепить этот датчик нему и запрограммировать манипулятор сжимать объект до определенного получаемого с датчика значения. Так, робо-рука сможет переносить разные хрупкие объекты.
В то же время, похожий код можно использовать для устройства, сигнализирующего о возможности начала пожара. Для этого воспользуемся сенсором газа.
Наш сенсор может быть использован как аналоговое, так и цифровое устройства( о чем свидетельствуют выходы AD и D0). Удобней использовать его как аналоговое устройство. VCC(+) датчика подключаем к VCC контроллера, GND(-) – к GND контроллера. AD датчика- ADC контроллера.
Напишем простой скетч, аналогичный предыдущему:
Включенный светодиод AUX свидетельствует, что установка работает. Когда концентрация газа достигает определенного значения- начинает играть мелодия.
Но что произошло, если уже что-то успело загореться?
Рассмотрим работу с устройством, на основе которого можно сделать сигнализацию, оповещающую о возгорании,- датчик огня:
Датчик огня, имеющийся у нас- цифровое устройство. При том работает он инвертировано: если пламени нет, то он выдает 1, если есть- 0. Так что, если мы подключим его, то в нормальном состоянии будет получать максимальное значение при отсутствии огня(RManager выдает 999) и 0 при его наличии. Подключать также стоит с подтягивающем резистором:
Теперь мы можем сразу попробовать написать код для сигнализации:
Изначально, когда огня нет, будет гореть светодиод AUX. Если датчик засекает огонь( датчик выдает нам 0), то начинает играть мелодия, а светодиод гаснет. Работоспособность установки легко проверить с помощью обыкновенной зажигалки.
Теперь попробуем совместить полноценную платформу, построенную на основе робототехнического конструктора BIOLOID, и датчик газа, о котором писалось выше.
Для этого используем собранную модель Avoider. К порту 2 подключим с помощью нашего кабеля датчик газа и закрепим его на передней части платформы.
Загрузим в него простую прошивку: Если газ есть, то Avoider будет несколько секунд ехать вперед. Если же газа нет- будет стоять.
Пример работы можно посмотреть в видео
Аналогичными способами подключаются и большинство остальных аналоговых и цифровых устройств. В свою очередь, среда RoboPlus может дать все для базовой работы с этими датчиками, включая реальную возможность создания простых роботизированных систем на основе самого контроллера CM-530. Но, для создания довольно сложных систем, работающих со специальными датчиками, требующими дополнительные библиотеки и возможности среды, одной RoboPlus становится недостаточно. Здесь можно объединить несколько систем в одну: Заставить CM-530 отвечать за работу с механикой, а другой контроллер, имеющий более широкие возможности по опросу датчиков, нацелить на работу с теми самыми датчиками. Но это уже история совсем для другой статьи.