Работа сервопривода от MPU6050 и потенциомтра

Тема в разделе "Arduino & Shields", создана пользователем Алекс1138, 9 ноя 2016.

  1. Доброго времени суток. У меня есть два кода, один что бы управлять сервой с помощью гироскопа (MPU6050), на этом реализована платформа, которая остается в горизонтальном положении не зависимо от того в каком положении находится объект на котором установлен гироскоп. И второй код для управления сервой с помощью потенциометра. Возник вопрос как объединить работу сервопривода от двух сигналов (с гироскопа и потенциометра)? Суть такова: гироскоп выполняет основную роль, но мне нужно потенциометром подрегулировать угол установки сервы когда это необходимо. Как совместить два кода что бы они работали совместно? что бы сигнал с гироскопа так же продолжал работать при новом угле вала сервопривода, установленного с помощью потенциометра?
    Специалисты в программировании, подскажите пожалуйста. Коды могу предоставить.
     
  2. rkit

    rkit Гуру

    Да элементарно складываются сигналы.
    А чтобы "объединять коды" надо чуть-чуть научиться программировать, и понимать, что "коды" делают.
     
  3. Спасибо за совет. Вот я и учусь программировать. Для меня код управления с MPU6050 сложный для понимания, и где там складывать сигнал и как не знаю.
     
  4. rkit

    rkit Гуру

    Сделайте шаг назад, поделайте проекты попроще. Придет понимание.
    Вон в вики есть много чего интересного http://wiki.amperka.ru/
     
  5. Спасибо. Мне бы пример, где реализовывается то о чем вы говорили, т.е. сложение двух сигналов с разных датчиков и их одновременная работа.
     
  6. rkit

    rkit Гуру

    Сигналы складываются буквально оператором +.
     
  7. Это понятно. ВОт часть кода для управления сервой от гироскопа :

    // читаем пакет из FIFO
    mpu.getFIFOBytes(fifoBuffer, packetSize);

    // отслеживаем FIFO рассчитанный здесь, в случае, если есть >1 доступного пакета
    // (Это позволяет сразу читать дальше, не дожидаясь прерывания)
    fifoCount -= packetSize;

    #ifdef OUTPUT_READABLE_YAWPITCHROLL

    // представление углов Эйлера в градусах
    mpu.dmpGetQuaternion(&q, fifoBuffer);
    mpu.dmpGetGravity(&gravity, &q);
    mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
    Serial.print("ypr\t");
    Serial.print(ypr[0] * 180/M_PI);
    Serial.print("\t");
    Serial.print(ypr[1] * 180/M_PI);
    myservoY.write(int(ypr[1] * -180/M_PI)+90); // расчет вращения вокруг Y
    Serial.print("\t");
    Serial.println(ypr[2] * 180/M_PI);
    myservoX.write(int(ypr[2] * 180/M_PI)+90); // расчет вращения вокруг X
    #endif

    А это код для управления сервой от потенциометра:

    int potent = analogRead(3);
    potent = map(potent, 0, 1023, 0, 180);
    servoX.write(potent);
    delay(10);

    Получается мне, для управления сервой X (myservoX) необходимо сточку
    myservoX.write(int(ypr[2] * 180/M_PI)+90); // расчет вращения вокруг X

    записать в следующем виде:
    myservoX.write(int(ypr[2] * 180/M_PI)+90)+(potent); // расчет вращения вокруг X

    Верно?
     
  8. rkit

    rkit Гуру

    Скобки не там. И я бы потенциомер наложил на диапазон поменьше. а то будут дикие перекосы.
     
  9. Спасибо. Скорее всего так верно:
    myservoX.write(int(ypr[2] * 180/M_PI)+90+(potent)); // расчет вращения вокруг X

    А потенциометр если так?
    potent = map(potent, 0, 682, 0, 120);
     
  10. rkit

    rkit Гуру

  11. Спасибо, читал эту статью. Только не разобрался при изменении диапазона, например у меня углы отклонения до 180, уменьшаю до 120, тогда FromLow и FromHigh (нижняя и верхняя граница текущего диапазона) оставлять прежними или тоже уменьшить пропорционально уменьшению границ нового диапазона? 1023 приходилось на 180 градусов, значит на один градус приходится 1023/180=5,6833, если беру новый предел не 180, а 120 градусов, то тогда что бы найти верхнюю границу текущего диапазона нужно 120*5,6833=682. Вот у меня и получилось map(potent, 0, 682, 0, 120)
     
  12. rkit

    rkit Гуру

    1024 это диапазон потенциомера. Он не изменяется.
     
  13. Ага!!! Понял! Спасибо :)
     
  14. rkit

    rkit Гуру

    И я бы проецирован не на диапазон от 0 до 120, а от -60 до 60.
     
  15. Спасибо за совет, завтра буду экспериментировать :)