roboforum.ru

Технический форум по робототехнике.

Экзоскелет "Крок"

Re: Экзоскелет "кРок"

Angel71 » 19 июл 2015, 23:59

это от человека зависит. вам программирование совершенно не интересно, вот оно мимо и проходит. я же вам писал, что лучше делать то, что нравится и получается, остальную работу предоставить тем, кто лучше вас это сделает.

Re: Экзоскелет "кРок"

robovan » 20 июл 2015, 10:15

Angel71 писал(а):это от человека зависит. вам программирование совершенно не интересно, вот оно мимо и проходит. я же вам писал, что лучше делать то, что нравится и получается, остальную работу предоставить тем, кто лучше вас это сделает.

солидарен с вами 8)

Добавлено спустя 8 минут 35 секунд:
Родил сегодня простенький скетч, написал как умею. Но сервомашинки быстро двигаются(не мудрено там ведь команды на поворот на заданный угол)
как сделать что бы они медленно двигались.
Подскажите плизз :sorry:





Добавлено спустя 27 минут 58 секунд:
Последний раз редактировалось robovan 17 авг 2015, 01:02, всего редактировалось 1 раз.

Re: Экзоскелет "кРок"

slom » 20 июл 2015, 14:38

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

а у вас извините какие то конвульсии серв, с задержкой дейли...

п.с. лучше бы вы доделали проект страйкбольного бота!
это в разы проще и дешевле. ответственности при производстве меньше, да и ввиду последних событий, на Украине как раз нужны такие боты, для того же разминироваения... лучше пусть машина на мине подорвется и колеса потеряет чем человек - ногу, и потом получит ваш протез, который поможет ему шею свернуть :)

Re: Экзоскелет "кРок"

robovan » 20 июл 2015, 16:15

slom писал(а):жуть какая!
чтобы сделать протез вам нужны датчики взаимодействующие с человеком... четко определяющие что человек хочет сделать. далее нужен четкий софт и датчики обратной связи, чтобы программа знала в каком положении конечности находятся сейчас... в случае с ногами какаята инверсная кинематика, гироскопы для стабилизации и прочее. это все на самом деле безумно сложно.

а у вас извините какие то конвульсии серв, с задержкой дейли...

п.с. лучше бы вы доделали проект страйкбольного бота!
это в разы проще и дешевле. ответственности при производстве меньше, да и ввиду последних событий, на Украине как раз нужны такие боты, для того же разминироваения... лучше пусть машина на мине подорвется и колеса потеряет чем человек - ногу, и потом получит ваш протез, который поможет ему шею свернуть :)

Спасибо за совет конечно, но я сам решаю чем мне заниматься! :crazy:
Если интересен страйкольный бот, то пожалуйста. За ваши деньги любой каприз :wink:
А насчет сложно там и все такое, нужно самому понимать для чего это нужно и на основе этого уже конструировать

Добавлено спустя 3 минуты 3 секунды:
Вот то что я хочу сделать
у этого человека нет возможности двигать ногами. Какие датчики вы предлагаете использовать?)))) :D
Последний раз редактировалось robovan 17 авг 2015, 01:08, всего редактировалось 1 раз.

Re: Экзоскелет "кРок"

Angel71 » 20 июл 2015, 16:19

программировать это умение составлять алгоритм, т.е. составлять последовательность действий. для этого нужно понимать что и как работает на достаточном для определённой задачи уровне. и только в последнюю очередь это знание языка. где-то в сторонке еще знание математики, физики и т.д.
тренируйся путешествовать во времени. есть несколько временных рядов, представь, что это рядышком лежит несколько старых фотоплёнок с разными размерами снимков. для микроконтроллера у тебя 2 или больше таких временных ряда, вот тебе и нужно вникать, в каком состоянии находится что-либо (серва, контроллер и т.д.) в каждый момент. нужно одновременно понимать, как всё работает в общем и как каждая штука в частности, уметь абстрагироваться и понимать, насколько детально что-то нужно рассматривать.
один временной ряд - это прерывание таймера, очень условно допустим с шагом 20мс. вот каждые 20мс прекращает работать основной код и мк начинает выполнять код ф-и прерывания, в которой в нужный момент на определённых ножках мк выставляется высокий или низкий уровень. потом этот код прекращает работать и продолжает выполнятся основной код. разобрался. допустим в основном коде ты уже присвоил переменным нужные значения (вызвал ф-ю servo.write). а теперь нажимаешь конопочку плэй и проигрываешь эту плёночку, смотря, что у тебя на сигнальном пине сервы. как-то так
s.png
s.png (64.34 КиБ) Просмотров: 2243

у тебя есть сервы. им переодически подаётся управляющий сигнал, выше было предположение, что это с переодичностью 20мс. в секунде 1000мс, т.е. 50 раз в секунду. электроника сервы получает этот сигнал, получает данные с потенциометра (переменного резистора) и пытается вращать мотор, что бы провернуть вал в нужную позицию. как быстро будет проварачиваться вал это зависит от сервы и в данном случае может зависить от напряжения питания сервы и от нагрузки на валу. вот для сервы 20-ти миллисекундные интервалы. у микроконтроллера кроме ряда прерывания есть ряд, где основной код выполняется. у него совсем мелкий шаг - это такты микроконтроллера, а их за секунду миллионы (8млн или 16млн или ещё сколько). что происходит прям каждый такт в данном случае рассматривать не нужно, так что короткими перебежками.
Код: Выделить всёРазвернуть
void loop()
{
  servo3.write(10); // нога назад
  servo4.write(20); // колено разогнуто
  delay(500);
  servo3.write(60); // нога вперед
  servo4.write(60); // колено согнуть
  delay(500);
  servo4.write(20);  // колено разогнуть
  servo3.write(40);  // нога чуток назад
  delay(500);
}

задал положения для серв. ждешь пол секунды. опять задал положения. опять ждешь. в третий раз задал положение. опять ждешь. а потом весь цикл по новой.
абстрагирование. знаешь, что каждые 20мс на управляющих пинах для серв выставляются соответствующие уровни (в зависимости от неких переменных, которые ты задал через servo.write). что там как работает в этом прерывание для данной задачи, как серва сравнивает сигналы и управляет мотором, значения не имеет. абстрагируешся от этих ненужностей. т.е. у тебя остаётся два временых ряда - основной код и положение серв. примерно прикидываешь, на какой угол проворачивается серва за некий период. вот попробуй совместить эти два ряда и одновременно их проиграть. проигрывать это всё в уме или в экселе/на листочке табличкой чиселки записывать или ещё как значения не имеет, придумай как тебе удобней будет понимать, что и когда происходит. для понимания разницы между желаемым положением и реальным поиграйся с изменением значения задержки. замени в delay 500 на 1 и опять проиграй. замени на 2000 и проиграй. позаменяй углы в вызовах servo.write.
вот создавать алгоритм это в данном случае и означает придумывание, в какой момент какие значения задавать функцией servo.write и как это делать. можно потренироваться управлять скоростью вращения сервы. допустим задаёшь для сервы почти крайнее положение (10, 20, 160 или 170 или ещё какой угол, который для твоей сервы безопасно устанавливать), делаешь задержку в 1-2 секунды. а потом в цикле с небольшой задержкой понемногу меняй угол
Код: Выделить всёРазвернуть
int servoDelay=15;

Код: Выделить всёРазвернуть
void loop(){
for (pos=20; pos<=160; pos=pos+1) {
  servo.write(pos);
  delay(servoDelay);
}
for (pos=160; pos>=20; pos=pos-1) {
  myPointer.write(pos);
  delay(servoDelay);
}

или так
Код: Выделить всёРазвернуть
void loop(){
servoDelay=15;
servo.write(20);
delay(2000);
for (pos=20; pos<=160; pos=pos+1) {
  servo.write(pos);
  delay(servoDelay);
}

поиграйся со значениями. а потом можно усложнить, управляя двумя сервами. выставляешь первоначальное значение, делаешь достаточную задержку и с небольшими задержками изменяешь значение желаемого положения для серв. знаешь, с какой примерно скоростью вал вращается? начальные положения такие-то, а за некое время хочешь переместить в такие-то. вот и вычисляешь значения задержек и на какой угол проворачивать.
поигравшись так, можно и с другим вариантом пробовать. для дуни есть возможность получать значение миллисекунд, прошедших с момента включения дуни. https://www.arduino.cc/en/reference/millis. присвоив переменной в каком-нибудь месте это значение получаешь возможность определять, сколько времени прошло с некоего момента. вот зная первоначальное положение, желаемое конечное и за какое время оно должно в него переместится, можно вычислять, какое положение задавать при вызове servo.write. накидал примерно как это может выглядеть
Код: Выделить всёРазвернуть
void loop() {
  int pos = 0;
  int tergetPos = 110;
  unsigned long time, diff;
  unsigned long travelTime = 1500; //milliseconds
  servo.write(20);
  delay(2000);
  time = millis();
  while(pos < tergetPos)
  {
    diff = time - millis();
    pos = вычисли здесь сам;
    servo.write(pos);
  }
}

Re: Экзоскелет "кРок"

robovan » 20 июл 2015, 16:39

спасибо, буду пытаться понять что там к чему :shock:

Re: Экзоскелет "кРок"

Angel71 » 20 июл 2015, 16:41

да там простенькие математические вычисления. а, ну и на код особо не смотри, я примерно накидал для понимания принципа. travelTime это за сколько миллисекунд серве желательно провернуться с первоначального угла до желаемого.
Последний раз редактировалось Angel71 20 июл 2015, 16:42, всего редактировалось 1 раз.

Re: Экзоскелет "кРок"

robovan » 20 июл 2015, 16:45

Angel71 спасибо, я впринципе написал неплохой алгоритм движения сер, единственное что нужно, что бы они медленней двигались.

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

Re: Экзоскелет "кРок"

Angel71 » 20 июл 2015, 16:49

пробуй придумывать, как в нужный момент и с каким значением вызывать servo.write. отот последний пример с вычислением значения тебе еще пригодится. переписать под себя библиотеку для серв или написать свою библиотеку управления моторами привода (если серву переделаешь или другой привод возьмёшь). для нормального управления тебе нужно будет знать реальное положение (ну то потом), а не пытаться управлять сервой по принципу "ну по идеи она должна сейчас быть тут". подпаяться к потенциометру сервы. мотором или управлять напрямую (свой h-мост/драйdер мотора прикрутить) или временно оставить через электронику сервы.
язык это не то, что бы второстепенное. само по себе хорошее знание бесполезно, если не можешь алгоритмы придумывать. как бы взаимодополняющее получается. язык вообще можно отдельно изучать. отдельно сам язык это даже полезней. просто самоучитель и в какой среде разработки (в контроллер дуни заливать не очень удобно - нет отладчика, в котором можно хоть пошагово выполнять и смотреть, какие значения у переменных/констант и т.д.), хоть консольное приложение. читаешь книжки, решаешь там задачки. можно порешать какие задачники по программированию. и т.д.
для начала из языка вообще не обязательно много знать. просто разок-другой прочитай небольшой самоучитель, где вкратце опишут основное и уже потом постепенно и из книжек и со всяких статеек по языку и программированию ардуинок будешь узнавать больше.

Re: Экзоскелет "кРок"

robovan » 20 июл 2015, 17:37

Angel71 писал(а):пробуй придумывать, как в нужный момент и с каким значением вызывать servo.write. отот последний пример с вычислением значения тебе еще пригодится. переписать под себя библиотеку для серв или написать свою библиотеку управления моторами привода (если серву переделаешь или другой привод возьмёшь). для нормального управления тебе нужно будет знать реальное положение (ну то потом), а не пытаться управлять сервой по принципу "ну по идеи она должна сейчас быть тут". подпаяться к потенциометру сервы. мотором или управлять напрямую (свой h-мост/драйdер мотора прикрутить) или временно оставить через электронику сервы.
язык это не то, что бы второстепенное. само по себе хорошее знание бесполезно, если не можешь алгоритмы придумывать. как бы взаимодополняющее получается. язык вообще можно отдельно изучать. отдельно сам язык это даже полезней. просто самоучитель и в какой среде разработки (в контроллер дуни заливать не очень удобно - нет отладчика, в котором можно хоть пошагово выполнять и смотреть, какие значения у переменных/констант и т.д.), хоть консольное приложение. читаешь книжки, решаешь там задачки. можно порешать какие задачники по программированию. и т.д.
для начала из языка вообще не обязательно много знать. просто разок-другой прочитай небольшой самоучитель, где вкратце опишут основное и уже потом постепенно и из книжек и со всяких статеек по языку и программированию ардуинок будешь узнавать больше.

Эх, буду стараться.. Вообще у меня с механикой дела обстоят куда лучше :roll:

Добавлено спустя 6 минут 14 секунд:
я где то находил код управление сервами, в котором описывалось как медленно вращать.

Re: Экзоскелет "кРок"

Angel71 » 20 июл 2015, 17:38

с механикой сколько возишся? вот если мозги в нужную сторону повёрнуты, будет так же и с программированием/электроникой. :) предыдущее сообщение не цитируют, это как при обычном разговоре постоянно повторять сказаное собеседниками.
всё нужное уже знаешь, сам придумывай, а не гоняйся за призраками примеров.

Re: Экзоскелет "кРок"

robovan » 20 июл 2015, 17:44

Код: Выделить всёРазвернуть
void loop() {
  int pos = 0;
  int tergetPos = 110;
  unsigned long time, diff;
  unsigned long travelTime = 1500; //milliseconds
  servo.write(20);
  delay(2000);
  time = millis();
  while(pos < tergetPos)
  {
    diff = time - millis();
    pos = вычисли здесь сам;
    servo.write(pos);
  }
}

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

Re: Экзоскелет "кРок"

HarryStar » 20 июл 2015, 17:46

Медленно сервы двигать очень просто.
Нужно не сразу задавать конечную точку, а постепенно
т.е. не
Код: Выделить всёРазвернуть
servo4.write(20); // колено разогнуто
delay(500);
servo4.write(60); // колено согнуть


а нужен цикл
Код: Выделить всёРазвернуть
for(i=20;i<60;i++)
{
   servo4.write(i);
   delay(100);
}

Т.о. серва будет плавно и постепенно двигаться к нужному углу. Задержка подбирается.

Re: Экзоскелет "кРок"

robovan » 20 июл 2015, 17:53

хм, попробую сейчас

Добавлено спустя 3 минуты 52 секунды:
пишет ошибку при компилировании..

Re: Экзоскелет "кРок"

Angel71 » 20 июл 2015, 17:59

:D так по печени компилятор, по печени. пускай тренируется писать правильные логи при компиляции. :) хотя можешь прочитать, что пишет и поискать ошибку.


Rambler\'s Top100 Mail.ru counter