как сделать плавные повороты серво на с 0 на 90 и обратно?

Тема в разделе "Arduino & Shields", создана пользователем Толик Иванов, 8 дек 2015.

  1. Толик Иванов

    Толик Иванов Administrator Администратор

    загрузил на ардуино вот этот скетч
    Код (C++):
    #include <Servo.h>
    Servo myservo;
    void setup()
    {
      myservo.attach(9);
    }
    void loop()
    {
      myservo.write(90);  // устанавливаем сервопривод в серединное положение
      delay(500);
      myservo.write(0);  // устанавливаем сервопривод в крайнее левое положение
      delay(500);
      myservo.write(180);  // устанавливаем сервопривод в крайнее правое положение
      delay(500);
    }
    и все хорошо но серва так хрипит громко и резко поворачивается что или я или она так долго не выдержем...:(
    серва обычная FS90. В итоге планируется чтоб она плавно приоткрывала дверцу и при необходимости плавно закрывала.
     
  2. AvaTTaR

    AvaTTaR Нерд

    Ну как-то совсем банальный вопрос, я бы рекомендовал для начала посмотреть какую серию уроков по кодингу(не обязательно именно под ардуино)
    Ну а по сути- сделайте не такой резкий переход, что-нибудь в стиле:
    Код (C++):

    void loop()
    {
    int servopos = 0;
      while(servopos < 90) {
    servopos = servopos+1;
    myservo.write(servopos);
    delay(5);
    } // устанавливаем сервопривод в серединное положение делая шаги в 1 градус
      delay(500);
    while(servopos > 0) {
    servopos = servopos-1;
    myservo.write(servopos);
    delay(5);
    }
    // устанавливаем сервопривод в крайнее левое положение делая шаги в 1 градус
      delay(500);
    }
    ну и дальше по примеру, хотя шаг можно изменить и до 5 где-то, думаю всё равно будет достаточно плавно, но тут уже играйтесь в зависимости от поведения сервы с шагом и задержкой при шаге, ещё можете это всё вынести в отдельную функцию по типу movemyservo(i;j) которую вы будете вызывать с параметром позиции в которую нужно перейти и с каким шагом это делать.
     
    Последнее редактирование: 8 дек 2015
    Толик Иванов нравится это.
  3. Толик Иванов

    Толик Иванов Administrator Администратор

    Отлично, спасибо! обязательно попробую сделать как вы сказали
     
  4. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    Код (C++):
      for(int i = 0, i < 180, i++){
        myservo.write(i);
      delay(500);
    }
      for(int i = 180, i >= 180, i--){
        myservo.write(i);
      delay(500);
    }
     
    Толик Иванов нравится это.
  5. Толик Иванов

    Толик Иванов Administrator Администратор

    Спасибо!
     
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

  7. Толик Иванов

    Толик Иванов Administrator Администратор

    попробывал ее. Но она один раз медленно провернула серву , а потом замерла и с какойто неизвестной периодичностью сама поддергивалась и ... и все собственно. Реализовал через стандартный пример из библиотеки для серво. Вроде норм.
     
  8. shapkin

    shapkin Нуб

    вот я делал для камеры на квадрик
    Код (C++):
    #include <Servo.h> // подключаем библиотеку для работы с сервоприводом

    Servo servo1; // объявляем переменную servo типа "servo1"
    Servo servo2;// объявляем переменную servo типа "servo2"
    int ugol1;// угол для серво 1
    int ugol2;// угол для серво 2
    int skorost;
    void setup()

    {
    servo1.attach(3);// привязываем сервопривод к выходу
    servo2.attach(4);// привязываем сервопривод к выходу

    }


    void loop() // процедура loop

    {
    int skorost = 30;// скорость поворота чем больше значение тем медление
    servo1.write(90); // ставим угол поворота под 90
    servo2.write(120); // ставим угол поворота под 120
    delay(2000); // ждем 2 секунды
    //********************************
    for(ugol1 = 90 ; ugol1 < 140; ugol1 += 1)  // поворот от 90 до 140
      {                                
        servo1.write(ugol1);              
        delay(skorost);                      
      }
      for(ugol2 = 120 ; ugol2 < 150; ugol2 += 1)  // поворот от 120 до 150
      {                                
        servo2.write(ugol2);              
        delay(skorost);                      
      }
      delay(2000); // ждем 2 секунды
      //********************************
      for(ugol1 = 140; ugol1>=90; ugol1-=1)     // поворачиваем от 140 до 90
      {                              
        servo1.write(ugol1);            
        delay(skorost);                    
      }
      for(ugol2 = 150; ugol2>=120; ugol2-=1)     // поворачиваем от 150 до 120
      {                              
        servo2.write(ugol2);            
        delay(skorost);                    
      }
    }