РЕШЕНО Пд для двух серво от джойстика

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Jogovskiy, 7 июн 2020.

  1. Jogovskiy

    Jogovskiy Нерд

    Написать код, чтобы сервы от джойстика работали я смог, работает. Но джойстик нежный, пропорционально-дифференциальный регулирования написать не получается
    мой код
    Код (C++):
    #include <Servo.h>
    const int servo1 = 3; // первая серва
    const int servo2 = 4; // вторая серва
    const int joyH = 2; // выход L/R джойстика Parallax
    const int joyV = 3; // выход U/D джойстика Parallax
    int servoVal; // переменная для хранения данных с аналогового пина
    int servoVa2;
    float N=10.;
    Servo myservo1; // создаем объект Servo для управления первой сервой
    Servo myservo2; // создаем объект Servo для управления второй сервой
    void setup() {
    myservo1.attach(servo1); // подключаем серву
    myservo2.attach(servo2); // подключаем серву
    Serial.begin(9600);
    }
    void loop(){
    outputJoystick();
    servoVal = analogRead(joyH);
    servoVal = (map(servoVal, 0, 1023, 0, 180));
    myservo1.write(servoVal);
    servoVa2 = analogRead(joyV);
    servoVa2 = map(servoVa2, 0, 1023, 0, 180);
    myservo2.write(servoVa2); }

    void outputJoystick(){
    Serial.print(analogRead(joyH));
    Serial.print ("---");
    Serial.print(analogRead(joyV));
    Serial.println ("----------------");
    }

    //пробовал прописать
    float N=10. //как коэффициент
    servoVal = (servoVal +(map(servoVal, 0, 1023, 0, 180)-servoVal)*2)/(N+1);
    //пробовал прописать
    float N=10. //как коэффициент
    servoVal = (servoVal +(map(servoVal, 0, 1023, 0, 180)-servoVal)*2)/(N+1);
     
    Последнее редактирование: 8 июн 2020
  2. parovoZZ

    parovoZZ Гуру

    а оно здесь зачем? Да и применяется чаще ПИ регулирование, а ещё чаще просто П ))
     
  3. Jogovskiy

    Jogovskiy Нерд

    П отвечает за амплитуду
    Д за ошибку по времени
    рассуждал так.
    Первый раз сталкиваюсь с этим, видимо не правильно понял. Если есть возможность с ПИ помочь
    Натыкался на примеры с ПИД, но они про температуру, а не серво(
     
  4. parovoZZ

    parovoZZ Гуру

    нет
    нет
    Регулятор регулирует значение параметра так, чтобы на выходе была минимальная ошибка с заданным значением. А что это за параметр - фиолетово. Хоть погода на Марсе.
     
  5. Jogovskiy

    Jogovskiy Нерд

    ну для меня эта тема сложная, поэтому ищу того, кто готов на бартер
     
  6. b707

    b707 Гуру

    Во-первых, коммерческие заказы размещаются в Закажу проект.
    А во-вторых, Паровоз вам правильно говорит, никакой ПИД - ПИ - ПД и прочее регулятор к вашему случаю не подходит.
    Самое главное условие любого Пхх регулятора - наличие обратной связи между регулятором и регулируемой величиной. То есть если вы регулируете температуру - вы выставили уставку, регулятор измеряет реальное значение, сравнивает с заданным и пытается уменьшить ошибку. Ровно точно также с давлением, влажностью и тд...
    А в вашем случае как регулятор узнает. что сервы отработали правильно? - никак. Значит никакой регулятор тут работать не будет
     
    Daniil нравится это.
  7. SergeiL

    SergeiL Оракул Модератор

    Вставьте код в первом сообщении, в соответствии с правилами форума, смотрите пункт "4 - Вставка кода" Правила здесь
     
  8. akl

    akl Гуру

    а в чем проблема то выражается? что значит "нежный" джойстик?
     
  9. Jogovskiy

    Jogovskiy Нерд

    А вот это грамотный ответ, четко сформулировали. Просто сбивали форумы, где пид для сервы мол применяют
     
  10. Jogovskiy

    Jogovskiy Нерд

    Если надо серву чуть-чуть подвинуть, то джойстиком очень трудно поймать.
    или если серву в крайнее положение, то серво тоже мгновенно поворачивает. Надо плавно
     
  11. Jogovskiy

    Jogovskiy Нерд

    Принял, исправил!
     
    SergeiL нравится это.
  12. akl

    akl Гуру

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

    а что вообще должна делать серва? может быть будет лучше джойстиком не задавать конкретное положение сервы, а задавать скорость поворота?
    типа отклонил чуток вправо - серва медленно едет вправо, отклонил сильнее - едет быстрее. но это зависит от того что она в принципе должна делать
     
  13. akl

    akl Гуру

  14. Jogovskiy

    Jogovskiy Нерд

    Да,замедлить скорость.

    Серва стоит в положение 90градусов. их две. одна серва отвечает за ось х, другая - у. при повороте вправо серво идет до 0, при повороте влево до 180. Соответственно чем если на половину вправо,то серво встанет на 45.
    Но скорость высока, просто мне сказали, что через регулятор можно сделать. Сам я нуб.поэтому на форум и написал
     
  15. akl

    akl Гуру

    при отпускании джойстика надо чтоб серва вернулась в исходное среднее положение?
     
  16. Jogovskiy

    Jogovskiy Нерд

    Ну сейчас серва возвращается, джойстик то уходит на центр, поэтому и серва уходит на середину. Это нормально, вопрос только к скорости
     
  17. akl

    akl Гуру

    можно тупо как-то так сделать.
    Код (C++):
    val = analogRead(joyH);
    val = (map(servoVal, 0, 1023, 0, 180));

    if(millis()-lastmillis > ratemillis){
       lastmillis=millis();
       if(servoVal<val){
          servoVal+=1;
       }
       else if(servoVal>val){
          servoVal-=1;
       }
      myservo1.write(servoVal);
    }
     
  18. Jogovskiy

    Jogovskiy Нерд

    попробую на железе проверить.
     
  19. akl

    akl Гуру

    короче суть в том чтобы обновлять положение сервы с определенной частотой по времени, при этом значение приближать к заданному на 1. задавая время обновления ratemillis можно менять скорость. думаю где-то 10-50 мс будет норм
     
  20. akl

    akl Гуру

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