Разработка hexapod с нуля (часть 10) — датчики касания
Всем привет! Был сделан очередной шаг к реализации алгоритма адаптации к ландшафту. До текущего момента я не мог придумать оптимальное решение для определения состояния ноги: наступила она на землю или нет. И вот спустя пол года я случайно наткнулся на интересный датчик, при помощи которого можно реализовать нужную конструкцию, позволяющую определить не только момент касания ногой земли, а так же усилие.
Этапы разработки:
Часть 1 — проектирование
Часть 2 — сборка
Часть 3 — кинематика
Часть 4 — математика траекторий и последовательности
Часть 5 — электроника
Часть 6 — переход на 3D печать
Часть 7 — новый корпус, прикладное ПО и протоколы общения
Часть 8 — улучшенная математика передвижения
Часть 9 — завершение версии 1.00
Часть 10 — датчики касания
Что? Зачем? Почему?
Для реализации алгоритма адаптации к ландшафту необходимо знать наступила нога на землю или нет. Вариантов реализации этого механизма было несколько, давайте рассмотрим их плюсы и минусы с моей точки зрения:
Тактовая кнопка — решение в лоб.
Плюсы: просто и дешево
Минусы: наличие движущихся частей, необходимых для нажатия на кнопку, а так же для ограничения силы удара по ней во время ходьбы. Мне показалось это не надежнымНемного поясню свои мысли по поводу движущихся частей. Нужно сделать так, чтобы при касании с поверхностью какой-то механизм перемещался вверх-вниз и соответственно давил на кнопку. Наличие движущихся пластиковых частей будет слабым местом конструкции. В мусор — мы не выбираем легких путей.
Датчики тока. Можно установить на силовые цепи сервоприводов шунты и микросхему для измерения падения напряжения на них. Довольно хорошее решение, которое позволит определять не только касание, но и нагрузку на ногу.
Плюсы: отсутствие какой-либо механики, возможность определения нагрузки и перегрузки приводов, да и в целом полезно знать потребление.
Минусы: глобальное потепление. На шунтах в 0.1Ом и токе 3А будет рассеиваться 0.9Вт, их будет 6 шт (на каждую ногу отдельная линия питания). Соответственно 5.4Вт уходят в никуда.Можно использовать 0.01Ом, но достать их проблемно и стоимость доставки превышает стоимость резисторов. ЧипДип в моем городе просит меня оформить заказ на 4000шт минимум, что явно не подходит.
Места на плате питания не хватает для подобных решений, а если увеличить её размеры, то она не влезет в корпус и про дешевое производство в Китае можно забыть (там размеры прям в притык).
Резистивный датчик давления. Прекрасная идея, но мне они показались довольно хрупкими. Взгляните сами — это же просто пленка с резистивным покрытием
Резистивный датчик давления и одно из его примененийДумаю после нескольких хороших ударов резистивное покрытие начнет разрушаться. В моем случае на ногу действует сила порядка 2 кг, и вот каждый раз будет удар по земле с такой силой — уверен помрут они быстро.
К тому же, я не смог придумать красивой реализации этого в плане дизайна.
Тебе не угодишь, всё не нравится! Нет, не всё
Вот решение всех моих проблем — тензодатчик для весов. Мне нравится в нем всё: прочный, чувствительный, есть отверстия для крепежа и можно собрать на коленке MVP для тестов (ардуино и прочее). Набор из 7 тензодатчиков + плат с АЦП к ним обошелся в 1600р с доставкой при покупке в России.
Но не все так гладко. Проблема заключается в направлении силы, прикладываемой к датчику. Допустимое направление показано на картинке ниже, возможно так же обратное. В других направлениях датчик не может определять воздействие ввиду своей конструкции и об этом поподробнее.
Тут используется мостовая схема измерений, что вполне логично, т.к. деформация алюминиевого бруска происходит на невероятно маленькие значения (там прям на уровне атомов). В состоянии покоя этот мост должен быть сбалансирован, но в реальном мире без калибровки нуля и расчета offset никуда.
Сами датчики растяжения и сжатия представляют собой тензорезисторы, которые изменяют свое сопротивление при деформации.
Так почему сила должна быть направлена именно в таких направлениях, как было показано ранее? Для примера возьмем упрощенный мост c 2 постоянными резисторами по 50 Ом и 2 тензорезисторами по 50 Ом. Напряжение питания моста возьмем 5В.
В состоянии покоя мост сбалансирован, убедимся в этом (разница между двумя делителями напряжения):
Предположим, что мы деформировали брусок так, что тензорезисторы изменили свое сопротивление на 25 Ом. При этом R1 растянулся (50 + 25 = 75), а R2 сжался (50 — 25 = 25). Погнали считать.
Мост разбалансирован и мы получили не только числовое значение деформации, но и её направление. Если деформировать в другом направлении, значение будет положительным.
Если приложить силу сбоку, то тензорезисторы деформируются на одинаковую величину и мост останется сбалансированным. Аналогично будет, если прикладывать силу спереди — оба тензорезистора сожмутся.
Не всё так плохо
Нам нужно лишь направить силу воздействия в нужном направлении и нога гексапода для этого крайне удачно была спроектирована. На картинке ниже красным обозначено направление силы, действующей на ногу. Если разрезать ногу на две части и соединить их алюминиевой балкой, то прикладываемая сила к ноге будет пытаться сжать ногу в «точке сжатия». При этом будет происходить деформация датчика в нужном направлении — он будет работать на излом, а это нам и нужно.
Почему нога спроектирована удачно? Все дело в расположениях точки крепления ноги к приводу и точки опоры\касания к земле — вектор силы (красный) не пересекает её. Это получилось случайно и без умысла :)
Датчик можно использовать для калибровки сервоприводов. Сейчас нагрузка распределена не на все конечности равномерно из-за неидеального их расположения. Очень сложно накинуть пластиковый диск на все сервы в одинаковом положении, т.к. от диска к диску зубчики располагаются в разных местах.
Диск для сервоприводаЕсть возможность руками в конфигурации сдвигать логический ноль приводов и она используется, но на глаз это делать трудно. Помимо этого вносит свой вклад люфт редуктора привода, вот это компенсировать еще труднее.
При помощи датчика мы можем анализировать силу воздействия на ноги и автоматически сдвигать логический ноль в нужную сторону, компенсируя обе проблемы. Профит!
Реализация
Мне удалось разрезать ногу на 2 половины без ущерба внешнему виду. Мне кажется, что стало даже лучше. Половинки соединяются алюминиевой балкой, сама балка сидит жестко для исключения люфтов и минимизации перекосов.
Сравнение старой и новой ногиВ ноге предусмотрено место, где будет располагаться АЦП для получения значений с тензодатчика. Закрывается всё это счастье крышкой и болтами М2.
КрышкаРасположение АЦП в ноге необходимо для минимизации расстояния до датчика, т.к. там гуляют мВ, то возможно негативное влияние проводов. К тому же не хотелось кидать аналоговые цепи рядом с шестью силовых DC-DC преобразователей.
В качестве АЦП я выбрал HX711. Ну как выбрал, платки были в комплекте. 80Гц частота измерений и максимально простой цифровой интерфейс — самое то. Хотелось бы конечно I2C, а лучше SPI, но увы. Плата имеет на борту дифф. АЦП и всю необходимую обвязку.
С этих АЦП можно более менее синхронно вычитывать данные и начинать конверсию. Судя по даташиту линия SCK позиционируется как Digital Input, а значит их можно свести в одну и посылать по 25 тактов одновременно на все АЦП (используется канал А с усилением 128). Данные будут синхронно приходить на параллельные линии DOUT, что сэкономит временя передачи данных, при этом следующая конверсия будет начинаться одновременно.
О синхронности и почему её нетСинхронность тут условная с допустимой погрешностью и старт конверсии АЦП на самом деле не будет одновременным, т.к. они работают от своих внутренних тактовых генераторов, отклонение частоты которых зависит от множества факторов (температура, фаза луны, количество снега на улице и прочее).
Для достижения абсолютной синхронности их как минимум нужно тактировать от одного внешнего генератора. Там целая куча проблем, о которых я знаю и не знаю (всякие паразитные параметры цепей тактирования, их длина и прочее).
Именно по этой причине в процессорах тактирование блоков идет из центра (ЕМНИП), т.к. на высоких частотах начинают влиять законы физики и длина проводника (до дальних блоков импульс доходит позже, чем до близких).
Все упирается в требования — в нашем случае даже 5 мс будет приемлемо.
Под провода сделаны каналы внутри ноги, так что никаких торчащих проводов не будет. Это соответственно защитит их от случайного повреждения.
Тесты
Наконец-то дошли до самого интересного — результаты. Я поставил ногу на гексапод и заставил его немного побегать. После нехитрых манипуляций в Excel получился красивый график.
На графике очень хорошо видны моменты касания, а так же моменты отрыва ноги от земли. Я крайне доволен результатами! Единицы измерения тут неизвестны, к ним применен scale, который имеет магическое значение (запустил пример из библиотеки).
Никакой магии, дай мне бины АЦП! Тут уже другой эксперимент и график соответственно отличается. И вот тут уже другое дело: вместо диапазона 0–500 мы получаем 0–100000, ну разве не прелесть? Как это сочно выглядит. На первой половине графика гексапод встал, на второй пошел.
Всякие мелкие пики это дергания приводов (например 3-й), они там пытаются свои редукторы пнуть в заданное положение более точно, а резиновые наконечники не дают скользить ноге.
Можно заметить, что первые 2 пика меньше, чем 4 последних. Это объясняется тем, что во время подъема гексапод упирается всеми 6 ногами и нагрузка распределяется на все ноги. Во время передвижения на земле всего 3 ноги, соответственно нагрузка на них выше, деформация датчика больше, пики выше.
В прошивке нужно будет определить пики и скорее всего это будет просто пороговая функция. Тут нужны эксперименты, побегать быстро\медленно по мягкой\твердой поверхностях и дальше пошевелить мозгами, выбрав оптимальный порог.
Скорее всего будет 2 режима ходьбы: с адаптацией и без. С адаптацией гексапод будет ходить медленно и как бы прощупывать ландшафт под собой. По крайней мере для начала.
Планы
Вот так понемногу гексапод превратился из фанерного прототипа в технологического монстра с кучей различных датчиков и хитрых алгоритмов. Это радует. Иногда даже не верю, что я смог такое сделать в одиночку.
Для продолжения работы необходимо переделать плату управления. В частности нужно добавить еще один микроконтроллер (STM32F030) для сбора и обработки данных с шести таких датчиков. Дальше главный МК будет забирать из него данные при необходимости по I2C или SPI, я пока еще не определился.
Зачем отдельный МК? Да всё просто. У основного STM32F373 кончились ноги и он без этого хорошо загружен. Пусть там работает только ядро (коммуникация и передвижение), а сбором и обработкой вспомогательной инфы занимается другой МК.
Это уже будет четвертый МК на гексаподе: STM32F373 (основной), ESP32 (камера), Ralink (WIFI-UART мост) и STM32F030 (датчики). В три из них нужно заливать прошивку :)
Так же нужно добавить акселерометр на плату управления для автоматического выравнивания горизонта.
Еще планирую запихнуть в гексапод полноценный терминал. Там все будет по взрослому: история команд и автозавершение. Сейчас этого сделать нельзя, т.к. нужна дополнительная линия DTR с USB-UART преобразователя для сброса состояния терминала, а нога МК под это не выделена. Конфигурируемых параметров много и ими нужно как-то рулить, желательно через что-нибудь нормальное (сейчас там CLI и это не очень удобно).
Немного фото и видео
ФотоПоколдовал над матаном и получилось увеличить скорость передвижения. На видео ДО и ПОСЛЕ.