цикличная работа сервопривода

Тема в разделе "Arduino & Shields", создана пользователем piter pen, 16 ноя 2017.

  1. piter pen

    piter pen Нерд

    не... increment =1; это шаг с которым меняется угол положения сервы
    а вот Sweeper sweeper1(0); - это скорость вращения
    просто нужно подобрать так сказать "баланс" между этими значениями
     
  2. ORLENOK

    ORLENOK Гик

    Я понимаю. За тоже время, условно 1 секунду, будет выполнено не 180 итераций в цикле, а 90. Может быть рывки будут. Каждое второе положение серва будет пропускать. Может визуально это и не будет заметно, но в коде будет так.
     
    piter pen нравится это.
  3. piter pen

    piter pen Нерд

    но вот с углами так и не выходит каменный цветок :)
     
  4. akl

    akl Гуру

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

    возможно дело в этой штуке
    if ((pos >= 180) || (pos <= 0)) // конец вращения
    {
    // обратное направление
    increment = -increment;
    }
    если начальная pos равна нулю, то когда например pos <= 1, оно каждый цикл будет тупо менять increment туда-сюда, и никогда не выйдет из 0-1
     
  5. akl

    akl Гуру

    попробуй как-то так например
    Код (C++):



    if((millis() - lastUpdate) > updateInterval) // время обновлять
      {
      lastUpdate = millis();

      if (pos >= 170)
      {
      pos -= increment;
      }
    if (pos <= 10)
      {
      pos += increment;
      }
      servo.write(pos);
      Serial.println(pos);
    }
     
  6. piter pen

    piter pen Нерд

    честно говоря я тоже смутился поначалу... но пока забить код так как надо не выходит...
     
  7. piter pen

    piter pen Нерд

    спасибо за поправку! но все равно замирает в крайнем положении (в начальном)
     
  8. ORLENOK

    ORLENOK Гик

    Попробуйте сделать начальную позицию 11, допустим. Что произойдёт?
     
  9. vvr

    vvr Инженерище

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

    piter pen Нерд

    ничего не происходит, за исключением того что серва встает в крайнее положение.
     
  11. ORLENOK

    ORLENOK Гик

    Замените это
    if ((pos >= 180) || (pos <= 0)) // конец вращения
    {
    // обратное направление
    increment = -increment;
    }
    вот на это:

    Код (C++):
    int minServo,maxServo
    minServo = 5;
    maxServo = 170;
    if ((pos >= maxServo) || (pos <= minServo)) // конец вращения
    {
        if(pos + increment < minServo)
            pos = minServo;
        if(pos - increment > maxServo)
            pos = max;
    // обратное направление
    increment = -increment;
    }
     
    соответственно объявление переменных можете вынести из этого метода.
     
    piter pen нравится это.
  12. piter pen

    piter pen Нерд

    здесь наверное maxServo?
    если да - все нормально!!! получилось. не знаю в чем дело... просто перезапустил ардуино иде и перепрошил... и заработало...
    Спасибо большущее!!!
     
    Последнее редактирование: 27 ноя 2017
  13. ORLENOK

    ORLENOK Гик

    Рано радоваться, тем более я видел первый вариант этого комментария)))
    Что-то уже материться хочется...
    Код (C++):

    int minServo,maxServo
    minServo =5;
    maxServo =170;

    void Update()
      {
        if((millis() - lastUpdate) > updateInterval) // время обновлять
        {
          lastUpdate = millis();
       
          pos += increment;
          servo.write(pos);
          Serial.println(pos);

          if((pos >= maxServo)||(pos <= minServo))// конец вращения
          {
             if(pos + increment < minServo)
             {
                  pos = minServo;
                  increment = increment > 0 ? -increment : increment;
             }
             if(pos - increment > maxServo)
             {
                  pos = maxServo;
                  increment = increment < 0 ? -increment : increment;
             }
             // обратное направление
             increment =-increment;
          }
       }
    }
     
     
  14. piter pen

    piter pen Нерд

    почему рано?
     
  15. akl

    akl Гуру

    так и должно быть - мой косяк. хотел вот так
    Код (C++):
    if((millis() - lastUpdate) > updateInterval) // время обновлять
      {
      lastUpdate = millis();
    int n;
      if (pos >= 170)
      {
      n=-1;
      }
    if (pos <= 10)
      {
      n=1;
      }
    pos += increment*n;
      servo.write(pos);
      Serial.println(pos);
    }
    а всё почему? потому что в чертовом ардуино дебаггера-симулятора нету. если б был - ТС давно сам бы посмотрел что происходит с переменными и разобрался бы

    только переменную эту n надо вынести отсюда к остальным переменным в начало, чтобы можно было ей присваивать значение в сетапе и задавать начальное направление движения
     
    Последнее редактирование: 27 ноя 2017
    piter pen нравится это.
  16. ORLENOK

    ORLENOK Гик

    Был такой код, что нужно было 2 вхождения в метод, чтобы начало двигаться.
    Проблемный момент:
    Начальное положение: 0
    Икремент: 1
    Минимум 5

    Посмотрите, что будет в таком случае происходить.

    Это да....
     
  17. piter pen

    piter pen Нерд

    Приношу извинения что стал невольным участником расшатывания вашей нервной системы ;-) я это ненарочно
     
  18. piter pen

    piter pen Нерд

    ну это только если изначально загонять серву в нулевое положение. хотя при смене направления вращения она тоже бы тормозилась... или я не прав?
     
  19. ORLENOK

    ORLENOK Гик

    В принципе нет. Дошел до края, сменилось направление и пошел дальше.
     
  20. piter pen

    piter pen Нерд

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