Разработка 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В.

    В состоянии покоя мост сбалансирован, убедимся в этом (разница между двумя делителями напряжения):

    (+Sig) - (-Sig) = 5 \times \frac{50}{50+50} - 5 \times \frac{50}{50+50} = 2.5 - 2.5 = 0V

    Предположим, что мы деформировали брусок так, что тензорезисторы изменили свое сопротивление на 25 Ом. При этом R1 растянулся (50 + 25 = 75), а R2 сжался (50 - 25 = 25). Погнали считать.

    (+Sig) - (-Sig) =5 \times \frac{25}{25+50} - 5 \times \frac{75}{75+50} = 0.33 - 3 = -2.67V

    Мост разбалансирован и мы получили не только числовое значение деформации, но и её направление. Если деформировать в другом направлении, значение будет положительным.

    Если приложить силу сбоку, то тензорезисторы деформируются на одинаковую величину и мост останется сбалансированным. Аналогично будет, если прикладывать силу спереди — оба тензорезистора сожмутся.

    Не всё так плохо

    Нам нужно лишь направить силу воздействия в нужном направлении и нога гексапода для этого крайне удачно была спроектирована. На картинке ниже красным обозначено направление силы, действующей на ногу. Если разрезать ногу на две части и соединить их алюминиевой балкой, то прикладываемая сила к ноге будет пытаться сжать ногу в "точке сжатия". При этом будет происходить деформация датчика в нужном направлении — он будет работать на излом, а это нам и нужно.

    Почему нога спроектирована удачно? Все дело в расположениях точки крепления ноги к приводу и точки опоры\касания к земле — вектор силы (красный) не пересекает её. Это получилось случайно и без умысла :)

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

    Диск для сервопривода
    Диск для сервопривода

    Есть возможность руками в конфигурации сдвигать логический ноль приводов и она используется, но на глаз это делать трудно. Помимо этого вносит свой вклад люфт редуктора привода, вот это компенсировать еще труднее.

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

    Реализация

    Мне удалось разрезать ногу на 2 половины без ущерба внешнему виду. Мне кажется, что стало даже лучше. Половинки соединяются алюминиевой балкой, сама балка сидит жестко для исключения люфтов и минимизации перекосов.

    Сравнение старой и новой ноги

    В ноге предусмотрено место, где будет располагаться АЦП для получения значений с тензодатчика. Закрывается всё это счастье крышкой и болтами М2.

    Крышка

    Расположение АЦП в ноге необходимо для минимизации расстояния до датчика, т.к. там гуляют мВ, то возможно негативное влияние проводов. К тому же не хотелось кидать аналоговые цепи рядом с шестью силовых DC-DC преобразователей.

    В качестве АЦП я выбрал HX711. Ну как выбрал, платки были в комплекте. 80Гц частота измерений и максимально простой цифровой интерфейс — самое то. Хотелось бы конечно I2C, а лучше SPI, но увы. Плата имеет на борту дифф. АЦП и всю необходимую обвязку.

    С этих АЦП можно более менее синхронно вычитывать данные и начинать конверсию. Судя по даташиту линия SCK позиционируется как Digital Input, а значит их можно свести в одну и посылать по 25 тактов одновременно на все АЦП (используется канал А с усилением 128). Данные будут синхронно приходить на параллельные линии DOUT, что сэкономит временя передачи данных, при этом следующая конверсия будет начинаться одновременно.

    О синхронности и почему её нет

    Синхронность тут условная с допустимой погрешностью и старт конверсии АЦП на самом деле не будет одновременным, т.к. они работают от своих внутренних тактовых генераторов, отклонение частоты которых зависит от множества факторов (температура, фаза луны, количество снега на улице и прочее).

    Для достижения абсолютной синхронности их как минимум нужно тактировать от одного внешнего генератора. Там целая куча проблем, о которых я знаю и не знаю (всякие паразитные параметры цепей тактирования, их длина и прочее).

    Именно по этой причине в процессорах тактирование блоков идет из центра (ЕМНИП), т.к. на высоких частотах начинают влиять законы физики и длина проводника (до дальних блоков импульс доходит позже, чем до близких).

    Все упирается в требования - в нашем случае даже 5мс будет приемлемо.

    Протокол HX711
    Протокол HX711

    Под провода сделаны каналы внутри ноги, так что никаких торчащих проводов не будет. Это соответственно защитит их от случайного повреждения.

    Тесты

    Наконец-то дошли до самого интересного — результаты. Я поставил ногу на гексапод и заставил его немного побегать. После нехитрых манипуляций в 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 и это не очень удобно).

    Немного фото и видео

    Фото

    Поколдовал над матаном и получилось увеличить скорость передвижения. На видео ДО и ПОСЛЕ.

    Similar posts

    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 36

      +2
      А можно видео развернуть? Поворачивать стол с монитором не вариант.
        0
        Согласен. Не очень удачно снято.
          0
          У меня на ютубе была функция «повернуть».
        0
        Рекомендую не увеличивать номенклатуру контроллеров, если начали использовать STM32F373 то и второй брать такой-же.
        — почти одинаковый основной код
        — одинаковые баги чипа
        — возможность иметь в резерве лишний чип
        — проще перераспределять задачи на два одинаковых контроллера.
          +2
          Да, мысли хорошие. Я руководствовался стоимостью, размерами и ресурсами МК. К тому же F030 развести на плате проще некуда, да и накопилась их целая куча :)

          проще перераспределять задачи на два одинаковых контроллера.
          А тут можно подробнее? В чем могут быть сложности?
            +1
            Иметь два мощных контроллера выгоднее чем один — если делать сложную адаптивную постобработку датчиков у F030 может не хватить мощности.
            Но основная причина это переиспользование кода и схемотехники — второй контролер надо отдельно изучать.
              0
              Спасибо. Нужно будет заглянуть дальше в будущее и подумать над хотелками, возможно действительно имеет смысл поставить два 373.

              А на счет изучения, то в качестве вспомогательных МК я беру обычно уже знакомые с написанными мною драйверами в других проектах :)
          0
          аккуратный и симпатичный получается
            +1
            А что с радиационной стойкостью контроллеров? Предполагается апгрейд после проработки прототипа?
              0
              Ух, о таком я пока не задумывался. Прототипу нужно найти полезное применение и дальше от этого отталкиваться. Пока что это только игрушка для саморазвития.
              +1
              Можно определять не сами пики, а по порогу производной находить место, где пик только начинает расти. Порог можно делать абсолютный или какой-нибудь плавающий, например по размаху в окне, или по отклонению от средней точки в окне.

              Рекомендация: выгружать не только тренды с датчиков, но и различные переключения состояний и метки алгоритмов управления — быстрее сможете отлаживаться по логам.

              Эксель — это гемор, лучше использовать какой-нибудь Matlab / Python+matplotlib, или даже ImGUI на плюсах.
                +1
                Спасибо за идею, нужно подумать.
                  0
                  Ещё напомню, что пиковые аномалии, если потребуется, можно сгладить фильтром Калмана.
                0

                Если уж есть тензодатчик на ноге — то сервоприводы хорошо бы заменить на бесколекторники с управлением по току/моменту и энкодерами. Тогда получится динамику вместо кинематики подтянуть. А там прыжки, паучий галоп, рысь, иноходь… Непочатый край усовершенствований)))


                Кстати, даже на видео с улучшенной математикой все равно видна неравномерность передвижения туловища робота. Как планируете решать данный вопрос?

                  +1

                  Все ограничено фантазией и бюджетом))


                  По поводу неравномерности. В чем именно она заключается? Если вы про то, что он идет не по прямой, то это я джойстик немного отклонил. С движением по прямой проблем точно нет.


                  Если же это связано с тем, что он немного рывками двигается — тут да, нужно немного с конфигурацией движения поиграть.

                    0
                    Вы не думали увеличить сопротивление с поверхностью? Достаточно резиновых/силиконовых ножек. Мне кажется на видео достаточно хорошо видно, что при улучшении динамики он начинает проскальзывать и терять скорость.
                    Я не уверен что это можно сделать на сервах, но может быть режим бега? Его главное отличие в том, что мы слегка подпрыгиваем в момент толчка, момент касания можно было бы ловить тензодатчиками, если бы частота была выше.
                    Вы не думали о полном математическом описании? Если его сделать можно ввести оптимальное управление, что является довольно забавной штукой: можно будет указывать только точку куда и информацию о препятствиях, тогда он сможет сам рассчитывать траекторию движения обходя препятствия. Возможно понадобиться чуть больше вычислительной мощности, но реально реализуема. Гексапод имеет не сложную физическую модель. Пример модели можно найти в западной литературе. Расчет же управления можно делать не руками, а например Python+sympy. Потом управление уже написать на Си и заложить в МК.
                      0
                      Достаточно резиновых/силиконовых ножек.
                      Там уже стоят на концах лап куски стержня от термопистолета. Возможно позже я подумаю над этим, но не сейчас. У меня горит внедрить новые сенсоры в гексапод :)

                      Его главное отличие в том, что мы слегка подпрыгиваем в момент толчка
                      Тут сервы точно отпадают — не хватит момента для прыжка, а более мощные сервы более медленные, соответственно не смогут развить нужную скорость для прыжка.

                      можно будет указывать только точку куда и информацию о препятствиях, тогда он сможет сам рассчитывать траекторию движения обходя препятствия
                      Это в планах. Для распознавания препятствий есть камера, возможно поставлю лидар на него. Математика каждый раз совершенствуется.
                      0

                      Да, рывками движется.

                        0
                        Движения не корректируются по обстановке, подвисает как анимация при недостатке памяти. Возможно вариантом будут инерциальные датчики положения на лапках и на основе их данных корректируемое положение манипуляторов.
                      0
                      А не тяжёл тензодатчик для ноги? тензорезисторы на пластик наклеить можно, плюс направление самому выбрать, да и стоят дешевле готовых, можно мост, полумост собрать и пр.
                        0

                        Можно конечно, только вот смысла мало. В цене особо не выиграешь, а работы больше.

                        0
                        Спорный выбор типа сенсора для определения контакта с поверхностью. Поверхность может быть вогнутой под лапкой, нестатичной или локально возвышенной(ветка). лапка должна иметь ход не только до уровня условного нуля поверхности но и ниже если там вогнутость ланшафта. Нужно уметь остановить лапку если она погружается ниже нуля. Я бы выбрал оптический или аккустический сенсор расстояния на каждую лапку. Это также дало бы возможность правильно формировать модель окружающего мира и отмечать тип подлежащей поверхности и нависающие препятствия(ощупать лапкой).
                          0
                          А измерять ток сервы, в качестве датчика касания, не пробовали?
                            0
                            Нет. В статье описано почему. Этот метод использовал мой знакомый и по результатам очень сложно определить момент касания
                              0
                              Если вы про резистор 0.01 ом, то есть же и другие способы измерения тока, но не суть. Мне интересно было, насколько это будет точно на практике
                                0
                                Там больше всего повлияло отсутствие места на плате. Конечно хотелось бы самостоятельно провести опыты, но перепроектирование и производство платы долго, и не хотелось тратить время на неизвестный результат. С тензодатчиками попроще будет :)
                            0
                            А вариант подпружиненной ноги, магнит и цифровой линейный датчик магнитного поля?

                            Типа — www.infineon.com/dgdl/Infineon-TLV493D-A1B6-DataSheet-v01_10-EN.pdf?fileId=5546d462525dbac40152a6b85c760e80

                              0
                              Опять же механика, движущиеся части. Я бы хотел свести к минимуму это
                              0
                              простите я немного туплю, мерить ток серв Датчиком Холла, в принципе 6 ногая микруха не так много места занимает… вы сказали ваш Знакомый сказал что по току, достаточно сложно понять касание, а если в совокупности с гравити сенсором? при касании ногой мы понимаем что у нас корпус начал менять положение отличное от горизонтального… расчеты должны упростить
                              P.S. у вас да уже решение готовое, рабочее, просто я смотрю для себя на сколько это будет сложнее ток+пложение в пространстве…
                              и еще Не могли бы вы чуть больше рассказать про DC-DC преобразователь на синхронном Mosfet… как собрать как считать, почему 6 каналов а не один большой и мощный, вы вроде пытались его сделать на 32f030, но в итоге у вас применено готовое решение на LM2678
                                0
                                на сколько это будет сложнее ток+пложение в пространстве
                                Будет однозначно сложнее, расчетов больше :)

                                и еще Не могли бы вы чуть больше рассказать про DC-DC преобразователь на синхронном Mosfet… как собрать как считать, почему 6 каналов а не один большой и мощный, вы вроде пытались его сделать на 32f030, но в итоге у вас применено готовое решение на LM2678
                                Там все не просто. Разрешения ШИМ на f030 не хватает для адекватной регулировки напряжения, там dV получается большой на каждый тик таймера. Но даже не в этом дело. Мои знания силовой электроники в тот момент были не очень и многие моменты я не учел, в итоге там мосфеты вышибало, либо их драйвер (дорогой засранец). Проще купить 6 готовых микрух с защитой от насыщения и прочими плюшками, чем ваять что-то свое. Намного дешевле выходит взять что-то относительно готовое, чем разрабатывать свое. Но он работал, правда не долго :)

                                Последнее время я очень ценю свое время и поэтому сначала смотрю как можно сделать все намного проще, быстрее, дешевле и на популярной элементной базе. Если я не могу найти что-то подобное, то уже пилю свое.
                                  0
                                  А вы тоже собираете гекса или...?
                                    0
                                    если комне вопрос, то скорее «или...» собираюсь=) у меня есть 20 серв mg996r с комплектными пластиковыми дисками которые при нагрузке 6кг/см слизывают грани(требуется докупить металлические)? куча винтиков с гаяками М3 под шестигранник, доступ к 3D принтеру, 1 DC DC на XL4016 (8А), stm32f103(Blue pill) PCA9685 2шт(драйвер PWM 12бит 16 каналов), малина 3B
                                    видео на youtube www.youtube.com/watch?v=0jyBiECoS3Q&t=15s&ab_channel=Zenta
                                    и непреодалимое желание повторить сие чудо, но я не знаю с какой стороны подступиться…
                                      0

                                      Да, вопрос к Вам. На счет пластиковых дисков, у меня тоже пластиковые и зубчики при 15кг не слизывались. Может повезло. Я тоже поглядываю на металл, но у них есть резьба. Моя конструкция предполагает крепление диска к конечности, а не конечность к диску.


                                      С какой стороны подступить? Я бы начал с питания. Собрал бы предполагаемый источник питания и нагрузил бы его. У меня суммарно приводы в среднем потребляют 13-15А при ходьбе. Вот примерно такую нагрузку можно подключить к источнику и посмотреть как он себя поведет (просадка напряжения, пульсации и прочее). В качестве нагрузки можно взять мощный резистор и вентилятор. Нагружать 18 приводов не очень удобно))

                                        0

                                        Приводы. MG996R. У меня их полная коробка, на 3 гексапода хватит))) Почему? А потому что они не смогли поднять гекса весом 6кг. Заявленные характеристики очень завышены и точность низкая, т.к. они аналоговые.


                                        Я использую DS3218MG


                                        Если нужна консультация, то мы можем перейти в более удобное место для этого (почта, ватсап)

                                          0
                                          6Кг, можно примерно откуда столько набралось?
                                          просто вот прикидываю
                                          батарея 900-1000г
                                          приводы 55*25
                                          пластик на корпус ±1000
                                          преобразователи питания 3*75
                                          контроллеры и прочая электроника 300г
                                          метизы 300
                                          охдаждение 200
                                          итого около 4кг, в п ринц даже если 6кг/см усилие привода, то наш паук легко и непринужденно может перемещаться поджав ноги под себя если он единовременно становится не меньше чем на 3 ноги
                                            0
                                            Это сложный вопрос, я по отдельности не взвешивал. Знаю, что корпус 2кг весит пустой + приводы где-то 1.5кг, они в алюминиевом корпусе. Я его просто поставил на весы и там было около 6кг, но весы для взвешивания человеков, так что погрешность в ±500г вполне может быть.

                                  Only users with full accounts can post comments. Log in, please.