Quadruped и millis

doktor2893
Offline
Зарегистрирован: 17.04.2016
  1. Здравствуйте проблема такая,пишу код для квадропода, хочу реализовать функцию движения через millis, но ни как не получается придумать способ,помогите пожалуйста.

    Пример движения вперед

    void forward()
    {
    
    
    // поднять вверх переднее правое колено и левое нижнее колено 
      for(i = 0 ; i<=25; i++){
    
      servo2.write(90 - i);
      
      servo3.write(90 + i);
      
       
      }
    
    // передвинуть переднее правое и левое заднее бедро вперед, переднее левое и заднее правое бедро назад
    
        for(i = 0 ; i<=44; i++){
    
                    servo11.write(90 + i + 7);//плб
                    servo22.write(50 + i );//ппб
                    servo33.write(93 - i - 4);//злб
                    servo44.write(138 - i  );//зпб
    
                   
    
                  }
    // опустить преднее правое и заднее левое колено
      for(i = 0 ; i<=25; i++){
    
      servo2.write(65 + i);
      
      servo3.write(115 - i);
      
        
      }
    // поднять переднее левое колено и заднее правое
    
    for(i = 0 ; i<=25; i++){
    
      servo1.write(90 + i);
      
      servo4.write(83 - i);
      
        
      }
    // передвинуть вперед переденее левое и заднее правое бедро, переднее правое и заднее левое бедро назад
    for(i = 0 ; i<=44; i++){
    
            servo11.write(141 - i - 7);//плб
                    servo22.write(94 - i );//ппб
                    servo33.write(45 + i + 4);//злб
                    servo44.write(94 + i);//зпб
    
                    
    
                  }
    // опустить вниз
    
        for(i = 0 ; i<=25; i++){
    
      servo1.write(115 - i);
      
      servo4.write(58 + i);
      
        
      }
    
    
     }
    
    
    void left()
    {
    // поднять вверх переднее правое колено и левое нижнее колено 
      for(i = 0 ; i<=25; i++){
    
      servo2.write(90 - i);
      
      servo3.write(90 + i);
      
        
      }
    
    // передвинуть переднее правое и левое  бедро вперед, заднее левое и правое бедро назад
    
        for(i = 0 ; i<=44; i++){
    
                    servo11.write(141 - i - 7);//плб
                    servo22.write(50 + i + 1);//ппб
                    servo33.write(45 + i + 4);//злб
                    servo44.write(138 - i - 11);//зпб
    
                    
    
                  }
    // опустить преднее правое и заднее левое колено
      for(i = 0 ; i<=25; i++){
    
      servo2.write(65 + i);
      
      servo3.write(115 - i);
      
       
      }
    // поднять переднее левое колено и заднее правое
    
    for(i = 0 ; i<=25; i++){
    
      servo1.write(90 + i);
      
      servo4.write(83 - i);
      
        
      }
    // передвинуть вперед заднее левое и заднее правое бедро, переднее правое и левое бедро назад
    for(i = 0 ; i<=44; i++){
    
    
    servo11.write(90 + i + 7);//плб
    servo22.write(95 - i - 1);//ппб
    servo33.write(93 - i - 4);//злб
    servo44.write(83 + i +11);//зпб
    
                   
    
                  }
    // опустить вниз
    
        for(i = 0 ; i<=25; i++){
    
      servo1.write(115 - i);
      
      servo4.write(58 + i);
      
        
      }
    
      
    }

     

 

MacSim
Offline
Зарегистрирован: 28.11.2012

Взяли чужой код и хотите чтоб за вас все написали?

где millis c которыми не получается?

с програмированием вам помогут, но придумывать алгоритм работы наврядли.

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Видите ли, doktor2893, такая конструкция

  1.   for(i = 0 ; i<=25; i++){
      servo2.write(90 - i);
      servo3.write(90 + i);
      }
    
    

по своему результату ничем не отличается от

 

  servo2.write(90 - 25);
  servo3.write(90 + 25);
 
doktor2893
Offline
Зарегистрирован: 17.04.2016

ч

doktor2893
Offline
Зарегистрирован: 17.04.2016

п

doktor2893
Offline
Зарегистрирован: 17.04.2016

c

doktor2893
Offline
Зарегистрирован: 17.04.2016

п

doktor2893
Offline
Зарегистрирован: 17.04.2016

вы понимаете в чем суть вопроса??я уже и нарисовал и продумал и сделал полностью алгоритм движения, а сейчас мне нужен он же но за место delay millis, хотя бы на примере 2 серв и все дальше я сам

doktor2893
Offline
Зарегистрирован: 17.04.2016

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

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

doktor2893 пишет:

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

всё хуйня - давай сначала.

ты выразил желание, а вопроса не задал - собери мозги в кучку и попробуй заново.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

doktor2893 пишет:

вы понимаете в чем суть вопроса??я уже и нарисовал и продумал и сделал полностью алгоритм движения, а сейчас мне нужен он же но за место delay millis, хотя бы на примере 2 серв и все дальше я сам

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

Внутри loop() проверяйте, не наступило ли время для выполнения очередной фазы движения (аналогично blink without delay), и если наступило - выбирайте нужное действие в соответствии со значениями указанных переменных.

Очевидно, действие должно быть элементарным - не включающем в себя какие-либо циклы или задержки.

doktor2893
Offline
Зарегистрирован: 17.04.2016

ладно:D

doktor2893
Offline
Зарегистрирован: 17.04.2016

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Из Ваших "элементарных движений" выкиньте цикл и вставьте параметр - номер фазы движения (у Вас - i). Ну и delay(), естественно, тоже выкинуть.

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

смотри вот это класс титановый велосипед для delay без delay(). 

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

doktor2893
Offline
Зарегистрирован: 17.04.2016

я все равно не особо представляю как сделать,можно кусочек кода пожалуйста?

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

doktor2893 пишет:

я все равно не особо представляю как сделать,можно кусочек кода пожалуйста?

#4 #40 #23

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015
void forward(unsigned int i)
{


// поднять вверх переднее правое колено и левое нижнее колено 
  if(i<=25){

  servo2.write(90 - i);
  
  servo3.write(90 + i);
  
  } else

// передвинуть переднее правое и левое заднее бедро вперед, переднее левое и заднее правое бедро назад

    if(i >= 26 && i <=70){
i -= 26;

        servo11.write(90 + i + 7);//плб
                servo22.write(50 + i );//ппб
                servo33.write(93 - i - 4);//злб
                servo44.write(138 - i  );//зпб

              } else
// опустить преднее правое и заднее левое колено
  if(i >= 71 && i<=96){
i -= 71;

  servo2.write(65 + i);
  
  servo3.write(115 - i);
  
  }
// поднять переднее левое колено и заднее правое
...
 }

 

 

doktor2893
Offline
Зарегистрирован: 17.04.2016

С

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А millis() нужно использовать в том месте, откуда вызывается forvard(). В исходном коде этого фрагмента нет, поэтому и я не стал приводить. Идея изложена в посте №10.

doktor2893
Offline
Зарегистрирован: 17.04.2016

его нет потому что у меня не прлучилось вставить его туда,спасибо

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

doktor2893, Вы уверены, что хорошо разобрались с blink without delay?

doktor2893
Offline
Зарегистрирован: 17.04.2016

сейчас уже почти написал то что нужно ,с millis blink там только половина из того что мне нужно 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вторая половина - конечные автоматы.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

На cyberform ТС послали пример "blink" без delay читать (и правильно сделали, кстати), а здесь вона как - щас всё и напишут :)

doktor2893
Offline
Зарегистрирован: 17.04.2016

ни каких нет тут конечных автоматов,сначала поднимаются два серво и остаются в удерживающем ссотоянии,потом 4 движется,потом два которые поднялись опускаются..

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

doktor2893 пишет:

ни каких нет тут конечных автоматов,сначала поднимаются два серво и остаются в удерживающем ссотоянии,потом 4 движется,потом два которые поднялись опускаются..

1. Слушайте, что Вам говорят знающие люди.

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

doktor2893
Offline
Зарегистрирован: 17.04.2016

а

bwn
Offline
Зарегистрирован: 25.08.2014

ЕвгенийП, вот и выросло племя, которое все знает и которому все должны((((

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

bwn пишет:

ЕвгенийП, вот и выросло племя, которое все знает и которому все должны(((

Здесь-то он новенький, а на cyberforum'е давно торчит. Можете глянуть на его репутацию (там под ником) - примечательны даже не цифры, а то что никто, ни разу не "сказал слово в защиту детёныша".

doktor2893
Offline
Зарегистрирован: 17.04.2016

х

bwn
Offline
Зарегистрирован: 25.08.2014

ЕвгенийП пишет:

bwn пишет:

ЕвгенийП, вот и выросло племя, которое все знает и которому все должны(((

Здесь-то он новенький, а на cyberforum'е давно торчит. Можете глянуть на его репутацию (там под ником) - примечательны даже не цифры, а то что никто, ни разу не "сказал слово в защиту детёныша".

А смысл глядеть, если уже во втором своем сообщении начинает хамить и предъявлять претензии. Это даже не его вина, его так научили в новой системе образования. Судя по цифрам ника, только что окончил институт и почуял себя ВЕЛИКИМ. Сейчас выйдет на дорогу и будет думать, а что это меня все пинают?

doktor2893
Offline
Зарегистрирован: 17.04.2016

о

doktor2893
Offline
Зарегистрирован: 17.04.2016

единственный ччеловек,которому хочу выразить респект это andriano, спасибо!

bwn
Offline
Зарегистрирован: 25.08.2014

doktor2893, чучело:
1. Я уже лет 20 никому ничего не доказываю, ибо тебя или слышат или нет. Ты слышишь только себя.
2. На любое утверждение можно ответить по разному, ты выбрал из самых агрессивных вариантов.
3. Человек гораздо старше тебя обращался на "вы", ты ему начал тыкать.
4. Повторив несколько раз "самоутверждаться-самореализовываться", посмотрись в зеркало.
5. Чтобы кого то освободить, надо сперва суметь поставить перед собой. Длинного языка для этого мало.
Вывод: Молодое, неудовлетворенное, невоспитанное существо с амбициями и непониманием, почему мир ко мне неласков. Будь попроще и не требуй того, что сам не готов дать другим. Может жизнь и наладиться.
 

 

 

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Понимаете, дорогой doctor2893, что тут  не форум помощи новичкам? Тут нет даже правил, по которым следует хоть пытаться помочь.

Поэтому помощь - дело добровольное. Мы поможем тому, кто интересен, и/или умен или, хотя бы, вежлив.

1. Про интересен - Максим, конечно покривил душой, говоря, что не знает про квдропод. Такой механизм тысячи раз обсосан и как проект - тут никому не интересен, нового там ничего нет, поэтому невежество в обмен на свежий источник идей - не катит. Скучно.

2. Про "умен". На вопрос "как заменить delay() на millis()" тут не станут отвечать ибо задолбало. Это тысячи раз описано на форуме и  вне форума, прямо на сайте написано о "блинк без делей". И Ваша реплика о том, что Вам там чего-то не хватает, или что-то непонятно, говорит о редком сплаве упрямства и скудоумия.

3. "Вежлив". Тут даже комментировать не стоит, но все же ответ одному из участников, что (перефразирую) он не может "знать лучше, что нужно для Вашего проекта". Это даже не хамство, а просто юмор. Вы же сами, фактом обращения, приняли то, что мы лучше знаем..., ну да ладно. В ответ на то, что замена задержки на источник информации - это замена логики алгоритма на автоматную, Вы пишете "причем здесь конечные автоматы?", что окончательно выявляет в Вас - невежду и невежу одновременно.

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

Это самое "философское", лишенное математической терминологии, и поэтому наиболее простое определение КА. А millis(), как бы это не показалось странным, источник сигналов, обрабатывая которые автомат должен совершать те или иные манипуляции конечностями квадропода. Поэтому переделка линейной программы с delay() в автоматную требует наличия хотя бы 200 грамм серого вещества. Причем несколько добрых людей уже написали Вам - как именно это сделать.

----------------------------

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

Клапауций 232
Offline
Зарегистрирован: 05.04.2016

doktor2893 пишет:

единственный ччеловек,которому хочу выразить респект это andriano, спасибо!

теперь andriano распечатает этот пост и повесит в туалете