Angel71 писал(а):остановившиеся механические часы могут два раза в день правильное время показывать. в этой вашей текущей примитивной физической модели кое-как учитывается только время, всё остальное просто подогнано. изменится сопротивление провода, напряжение питания, максимальный ток, который источник питания выдать может, нагрузка на серву и т.д., всё, разница между фактическим и расчётным положением измениться в любую сторону. без внесения корректировок или обратной связи, допустим по потенциометрам, максимум это постоянно подгонять модель.
Конечно обратная связь очень важный элемент.Вот по изменению тока, это же скорее всего нужно по амперметру на каждую сервомашинку, верно? Или по вольтметру, тоже можно. Или есть способы считывать нагрузочные токи без сторонних модулей? Я хотел поставить на каждую лапу по нажимному контакту, тогда можно было распознавать, когда лапа уверенно соприкоснулась с землей и останавливать движение.
А в общем вы правы, без классов тут не обойтись. И физику движений тоже нужно расчитывать.
До этого я собирал 4х лапого паука с 3dof
Я расчитывал движения с циркулем и линейкой. Но там проще обстоят дела, так как вращение конечностей происходит от самого начала луча.
Добавлено спустя 4 минуты 24 секунды:loox писал(а):Newbe
Пожалуста отнеситесь к нашим вопросам конструктивно, очень трудно понять логику, когда коллега, задавший ворос, не описывает проблему, а показывает кусок кода, без коментариев и не всегда грамотно написанный.
Итак:
1. Цикл управления сервоприводом 20 миллисекунд, это связано с конструктивными особенностями сервопривода.
2.Управление приводом - задать угол, дождаться года серво выполнит команду.
Самая сложная проблема - это из программы понять, установилось ли заданное положение угла
а) два одинаковых серво имеют разные скорости - это из их кострукции
б) нагруженная на вал и без нагрузки - то же разные скорости
Обычно в любительских конструкциях применяют следующий код:
Servo.wrire(angl);
delay(ждем);
......
Напишем код
void loop ()
{
myservo.write(60); // установить в исходное состояние
delay(500); // не заю в каком состоянии находится механизм все должно встать на место
// это пример
myservo.write(120); //повернуться на угол 120
delay(400); // не знаю какое время нужно для поворота, подберу в эксперименте
myservo.write(60);
while(1) {};
}
В этом куске кода серво должно повернуться из исходного состояния 60 в положение 120 а потом вернуться снова в 60
delay(400) -эту часть кода, а вернее 400 надо подобрать таким образом, чтобы серво повернуласть уверенно, зафиксировала свое положение а потом вернулассь назад.
Это понятно?
Есть ли у Вас циклограмма движения?
В вашем коде, есть непонятная конструкция - это главный бесконечный цикл, непонятно
Looc
Спасибо за старания) Но то что вы мне предлагаете отпало еще год назад. В вашем примере серво меняет угол с максимальной скоростью. Можно сделать конечно и плавно, но это не сработает, когда нужно будет делать движение робота вперед или поворот на месте, так как будет задействовано одновремено 4-8 серв и они должны будут двигаться одновременно и на абсолютно разные углы.
У меня есть график движения лап и корпуса на диаграме x,y. Но он на листе бумаги)
Сегодня я хочу сделать блок-схему движений, мне кажется так будет проще работать. Вот изначальный проект человека, который это задумал
http://www.robotshop.com/letsmakerobots/quadУ него шаги осуществляются как вы видите: задняя правая, передняя поавая, потом левая сторона, а у меня крест на крест. То есть передняя правая-задняя левая, передряя левая-задняя правая