Управление с телеметрией по serial

Это да, но преимущества побайтного анализа перед строковым не ясно, если действия происходят на основе всего пакета-группы байтов принятых…на грудь.

Вам можно! :slight_smile:

1 лайк

Я не понял вас… у меня гекса с пульта управляется. Какое отслеживание текущего положения имеете ввиду?

вообще не надо заниматься анализом ни байтов ни строк, оперируете чистыми данными

Вроде смысл “абзаца” осилил. Тут важный момент кроме сцепления-отталкивание - это поведение остальных лап в этот момент. Иначе царапанье так и останется на месте.

Скорее я вас…по 2 “абзацу”.

:slight_smile: или чистой энергией.

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

ну самая простая реализация это “три на земле и три переставляются” Вы как только движение по вектору начинаете, сразу лапы 0, 2, 4 отправляете в направлении вектора на край окружности переставляться (поднятыми), а лапы 1, 3, 5 у вас в это время из центра до края землю толкают в противоположном направлении. Они должны эту фазу за одинаковое время закончить и тогда 0, 2, 4 начинают толкать землю уже от края до края (вначале было от центра) а 1, 3, 5 переставляются.

ну тут я попрошу вас вчитаться и конкретизировать, что именно непонятно, чтобы я перефразировал

Приняли пакет в packet[…]
Бинарный: 5A 0A FF
Сравниваем второе число в пакете: if (packet[2] < 0} { .... }

Строковый: #10$-1$
Сравниваем второе число в пакете: ...скоко операций для этого нужно?..

Я на ней и завершил все свои опыты с гексаподом :slight_smile:

Не, я пока буду переваривать 1 абзац. Идея с кругом интересная… в кадровом восприятии.

Ясно, вопрос экономии времени…а я думал волшебный протокол для каждого байта :slight_smile:

Вот вам рисунок чтоб понятнее было. Серым обозначена область, в которую лапа в принципе может попасть (у меня ограничение Х до 0, а так еще под себя подломиться немного может). Синим я выделил цилиндр оптимальной на мой взгляд высоты и радиуса, в пределах которого лапа будет перемещаться когда шаги/перестановки совершаются. Справа боковое сечение всего этого дела чтоб понятнее было, как выглядит область. Может даже углядите за счет каких размеров плечей конечности она именно такая получается

Вот нашел в старых записях схематику этого дела с метками размеров

это если сервы -90..+90 могут, и механика их в этом не ограничивает. R = L1 + L2, r = L2 - L1

вот наш легендарный второй абзац с этого начался. Попробую немного с другой стороны зайти.

Во-первых нужны хорошие сервы, с маленькой deathzone - то есть которые довольно быстро начинают реагировать на изменение ШИМ и имеют неплохую точность. А то я видел mg996 (скорее всего подделка) как ШИМ на 5 градусов меняешь а им по барабану.

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

Добавлю: у вас в любом случае получится движение немного рывками, т.к. за один шаг какой-то серве надо будет на 4 градуса повернуться, другой на 2 а третьей на 0.8 (условно) и им на это разное время потребуется, но при очень малом шаге разница сгладится, в т.ч. за счет люфтов в конструкции

Да, именно это - слабость sg90, печатных деталек и аккумулятора поспособствовали моему выбору в сторону 12 серв на гексапода. Поигрался и разломал.

Ну да, в моём варианте (двуного на 17 сервах) у каждой сервы меж кадрами были значения углов (в этих кадрах), их разница давала число одноградусных шагов, а общее время межкадрового перехода делилось на разницу углов. Так получалась задержка для каждой сервы на одноградусный сдвиг…вроде правильно вспомнил. Самописная функция в аргументах имела номера кадров и длительность межкадрового перехода.

как же я вас понимаю… я вот сначала хотел очень дешево, заказал mg90s клоны, а они прям говнище полное. Шестерни с плохой точностью сделаны и из-за этого потери в редукторе колоссальные, ни о каких 2.5кг/см там и близко речи нет. Одну поставил плавно менять угол от 0 до 180 непрерывно - через 15 минут у нее клей под наклейкой начал пузыриться, так сильно нагрелась.

Недавно пришли mg90d оригинал - вот с ними всё прям замечательно. Только цена в 4 раза дороже клона и корпус немного другой - пришлось робота полностью перерисовать и перепечатать. Но оно того стоило

Оставьте ссылку на продавца, что б народ знал какие сервы надо. Я лет 10-15 назад на ВДНХ видел гекса -самоделку другой ценовой доступности - алюминиевые листовые детали, сервы чёрные с мет. редуктором и питание :slight_smile: по-моему через кабель. Но и размеры внушительные.

я сомневаюсь, что это по правилам форума разрешено, вот на фотке признаки оригинала:


и цена 12+ килорублей за 20шт

на алишке видел подходящие под описание наборы, без серв вообще не особо дорого, сервы там обычно как раз mg996 не очень хорошие в плане точности и мертвой зоны. И самое плохое, что 2 и 3 колено как правило во всех таких сборках на валу сервопривода только держатся, т.е. всегда нагрузка на излом вала

это цифровые сервы, были бы Футаба то ещё дороже

Ну, если чтение у нас неблокирующее, то обычно такое обходится

  1. написанием своего враппера, который блокируется, или
  2. использованием API операционной системы, например, если Serial представлен файловым дескриптором (как сделано на ESP32 бордах), то можно туда выполнить ioctl() для blocking I/O, или воспользоваться функцией типа select().

Ежели ничего из вышеперечисленного в п.2 нет, то тогда пишется своя функция, типа такой:

uint32_t БлокирующееЧтение(Таймаут) {
  Цикл( пока не Таймаут, или не прочитано нужное количество байт) {
     Если (есть, что читать) {
      Читаем()
     }
     Задержка( Маленькая ); // дать возможность поработать другим задачам, например
  }
  Вернуть(Прочитанное)
}

Polling - это, конечно, не лучшее решение, но что поделать, если железо такоэ…

забавный коммент
Вы в курсе, что РТОС в ардуино далеко не везде есть?
Я бы даже сказал, что его нигде, кроме ЕСП32, нет.
Какие, нафик, “другие задачи” в Задержке?