Это от того, что гексапод похож на паука, но у паука 8 ног- 24 сервы. Можно котика, и собачку делать с таким же успехом и теми же подходами.
… или лошадку по кадрам анимировать.
Эти 4-9 мс у Вас уходят не на чтение Serial, а на ожидание, пока там хоть что-то появится.
@Arduman зачем так негативно критиковать? На самом деле очень перспективная вещь. Даже если достигнуть хотя бы поведения насекомого( что даже лучшим умам не под силу пока), уже будет величайший прорыв науки за последние тысячи лет.
Да, пожалуй, обработку УАРТа лучше сделать в прерывании.
Так приём и так в прерывании. Что ещё и в каком прерывании обрабатывать?
В прерывании:
- ждать старт-байт
- прием байт до N
- установка флага “блок принят”
- откл. приема (чтобы не испортить принятые байты)
В фоновой программе (loop() )
если(блок принят)
считать  CRC, исполнить.
запустить прием…
…
Зря я наверное это пишу, ну да ладно.
Ждать?
В прерывании?
Вообще-то в прерывании по приходу байта в UART ждать ничего не надо: прерывание происходит, когда байт уже пришел.
Дело прерывания либо сохранить принятый байт в буфер, либо конечным автоматом проанализировать очередной байт, выставляя флаг окончания приема.
По окончании анализа [одного] очередного байта из прерывания надо выходить.
А как ето надо было паруски написать?
if(B==Sinchro){}
Ждать это значит ждать, но не означает тупой петли в ожидании.
(такое ощущение что зачем-то стараются доказать свою правоту вместо простого смысла, считайте что вы правее меня, я не против ))
 Arduman:
 Arduman:В прерывании:
- ждать старт-байт
- прием байт до N
- Получить 100% uC utilization при наличии мусора, летящего в UART.
интересно узнать ваш вариант
Я уже писал выше - в лупе конечным автоматом побайтно анализировать. С обычным приоритетом.
чего там “анализировать”? ахаха. проверили на CRC да и дело с концом.
 andriano:
 andriano:Эти 4-9 мс у Вас уходят не на чтение Serial, а на ожидание, пока там хоть что-то появится.
мне обязательно конкретизировать подобные вещи? метод ушел получать данные и это заняло озвученное время)) это лишь для понимания сколько получение/ожидание заняло относительно всего процесса
 lilik:
 lilik:Может мой концепт отопытничаете? Он прост в понимании для повторяющих.
Концепт :slight_smile
1.В массиве хранятся углы набора серв для разных поз-кадров.
2.Функция самописная плавно ведёт качалки всех серв от кадра к кадру, замыкая их в разные походки - кино да и только.
да, простой очень концепт, но слишком… Смотрите, гекса может итди в направлении любого вектора и еще вращаться при этом с разной угловой скоростью. Плюс можно разный “клиренс” ставить, лапы при перестановке на разную высоту поднимать, ближе-дальше от корпуса лапы выставлять… и это всё разные координаты - т.е. разные углы, представляете количество вариантов? Даже если скажем дискретно угол вектора направления на 15 градусов менять и воспользоваться симметричностью конструкции робота, то как минимум 0 15 30 45 60 75 90 и вот только тут на 105 вы мооожет быть можете задуматься об использовании тех же значений но с вычитанием 180-углы и подобным. Т.е. памяти потребует будь здоров, и еще непонятно, какой из вариантов по итогу окажется сложнее для понимания…
 te238s:
 te238s:Ежели путь робота непредсказуем, возможно стоит думать в направлении тензодатчиков на ногах.
Как говорил, пока в планах нет. Но я бы попробовал дял простой игрушки сначала через акселерометр - банаьно в таком размере еще 12 проводов яхз куда девать. Вон в квадах mpu6000 вроде хорошо показывает уровень.
 SAB:
 SAB:133 поста, а оказалось ни кто не помог
Мне пояснили в нужных подробностях как работает уарт, когда всё “не очень хорошо”, намекнули на то как считать хеш и на необходимость поднять скорость до 115200. Более чем помогли, в статьях “давайте мигнем светодиодом” такой информации не сыщешь. Да что говорить во многих недоуроках и недостатьях даже область значений тригонометрических функций не пишут, типа неважно facepalm
 te238s:
 te238s:Именно тензодатчики. Понимать на какую ногу какая нагрузка.
кста, пока не знаю зачем, но инфа о нагрузке еще и ускорение поднимаемых/опускаемых конечностей косвенно будет содержать (конечность поднимается - на те которые остались на земле увеличится нагрузка из-за ее массы и вертикальной составляющей ускорения и так далее…) Пока не представляю для чего это можно применить, есть над чем подумать
 Resin:
 Resin:
String start(__HardwareSerial *_serial__, uint8_t _setPin)
никада так не делай
что именно не так, и как сделать правильно?
Ладно понял вроде что ссылка на порт не устраивает. А как еще мне передать этот объект в метод класса? У меня на меге Serial2 а на про микро Serial1 используется. Мне что делать, чтобы 1 и тот же класс использовать на обеих платах? Директивы препроцессора напихивать?
 Resin:
 Resin:ссылка на порт не устраивает
дак а эт не ссылка
правильней в конструкторе передавать именно константную ссылку, чтоб тебе при инициализации не подсунули “неведому зверюшку”
class ...
private fields...
  const HardwareSerial classSerial;
public:
  ctor(const HardwareSerial &Port) : classSerial(Port) {....}  
константные поля инициализируются только в конструкторе. И потом обращяцца можешь не по мерзкому “->”, а по православной точке.
Понял, спасиб, хорошего отдыха!))
В любом случае, если твой класс обращается к железу, передавай не указатель на железо, а именно константную ссылку. Относится к SPI, Serial, и прочим всяким I2C.
 DetSimen:
 DetSimen:передавай не указатель на железо
Жили же как-то люди в сях. И до сих пор живут…
