Как запрограммировать угол поворота сервы по приведённому графику?

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

  1. mcureenab

    mcureenab Гуру

    analogRead(joy1x); возвращает значение от 0 до 1023. Откуда ваши 2400-600???
     
  2. avex

    avex Нерд

    mcurenab, по первому коду - залилось, но ...
    1. Серва отклоняется только в одну сторону - на движение джойстика в обратном направлении не реагирует.
    2. Самое главное - в начале движения джойстика (процентов 25-35 от хода) серва не движется вовсе, а потом делает скачок. Важным было как раз добиться плавности и чуткости привода.
     
  3. avex

    avex Нерд

    Видимо, хвосты с где-то взятого кода... А как нужно было?
     
  4. ostrov

    ostrov Гуру

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

    avex Нерд

    Да, обычный, для пробы взял их несколько штук. Джойстик удобен тем, что одним хватом управляешь двумя направлениями. Потенциометр такой возможности не даёт - придётся задействовать обе руки, но тогда не будет возможности производить другие манипуляции.
    Планировал, что из такого можно выжать максимум его возможности.
     
  6. mcureenab

    mcureenab Гуру

    Результат analogRead отправьте в Serial, и посмотрите какой диапазон значений реально рабочий. Какое значение получается в среднем положении джойстика.
    Лучше, чтобы крайние значения были от 0 - 1023, а среднее 511-512.
     
  7. avex

    avex Нерд

    Сейчас попробую с другим кодом.
    Среднее значение - 509, минимальное - 3, максимальное - 1011.
    Но, повторюсь, доворот до крайних значений меня не интересует.
     
  8. ostrov

    ostrov Гуру

    Так и есть. Но у всех джойстиков немного отличается центральное положение, в том числе по осям. Если нужна строгость, то программа должна калибровать центральное значение автоматом при запуске. При этом трогать джойстики нельзя.

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

    Да и 600-2400 очень похоже на шим (в мкс) для бесколлекторного мотора или сервы. Но для сервы это аналог угла поворота, так что график как минимум странный. Надо бы определиться с желаниями.
     
    Последнее редактирование: 8 май 2017
  9. mcureenab

    mcureenab Гуру

    Значит по совету Острова делаем калибровку 0 в функции setup
    Значение a2 возьмем такое, чтобы pot1x заведомо не вылетало за область определения функции.

    Код (C++):

    #include <Servo.h>
    #define joy1x A0
    Servo servo1x;

    int joy1x_zero = 511; // примерный 0 джойстика.
    float a2( 0.0f ), b2( pow(90.0f, 2) );

    void setup()
    {
      servo1x.attach(5);
      joy1x_zero = analogRead(joy1x);
      a2 = pow( max( joy1x_zero, 1023 - joy1x_zero ), 2); // диаметр эллипса примем больше большего возможного значения pot1x
    }

    void loop()
    {
      const int pot1x ( analogRead(joy1x) );
      float x = pot1x - joy1x_zero;  // калибровка 0.
      float serv = sqrt( b2 - b2 / a2 * pow( x, 2) );

      servo1x.write(serv);
    }
     
     
    avex нравится это.
  10. mcureenab

    mcureenab Гуру

    Последнее редактирование: 8 май 2017
    avex нравится это.
  11. avex

    avex Нерд

    По ощущениям получше, но снова движется только в одну сторону и в начале движения джойстика серва спит.
     
  12. mcureenab

    mcureenab Гуру

    Понял. Нужно знах x в формуле учесть. Иначе только половинка, даже четвертинка эллипса получается.
     
  13. mcureenab

    mcureenab Гуру

    Код (C++):
    float serv = ( x < 0.0 ? -1.0 : 1.0 ) + sqrt( b2 - b2 / a2 * pow( x, 2) );
    не то.
     
    Последнее редактирование: 8 май 2017
  14. avex

    avex Нерд

    Снова в одну сторону. Джойстиком вправо - движение сервы вправо плавное где-то до 80-85 градусов. Джойстиком влево - серва движется опять же вправо, но уже рывком и на 90 градусов.
     
  15. mcureenab

    mcureenab Гуру

    Ваш первый график не правильный. Он от точки 90 град должен дальше расти как зеркальное продолжение.
     
  16. avex

    avex Нерд

    Куда расти? Он был нужен только для примерной иллюстрации, чтобы было нагляднее.
     
  17. mcureenab

    mcureenab Гуру

    Код (C++):
        float serv = sqrt( b2 - b2 / a2 * pow( x, 2) );
        serv = x < 0.0 ? serv : 180.0 - serv;
     
     
    avex нравится это.
  18. mcureenab

    mcureenab Гуру

    Как то так

    http://www.wolframalpha.com/input/?i=plot(y=x^3+90)

    Ну ладно. Смотрите выше формулу.
     
    avex нравится это.
  19. avex

    avex Нерд

    Работает!!! Начало так же пропускается, но посмотрел поближе на джойстик - там так конструктивно исполнено, что потенциометр вращается не сразу вслед за рукояткой.
    Вы - настоящий мастер!!!
    Подскажите, пожалуйста, как размножить код для 4-х сервоприводов. Нужно объявлять новые переменные для каждого привода и приводить код с вычислением или есть другой способ?
     
  20. mcureenab

    mcureenab Гуру

    Видимо лучше массив сделать.