Управление сервоприводом в функции

Тема в разделе "Arduino & Shields", создана пользователем issida, 28 авг 2016.

  1. issida

    issida Нерд

    Можно ли каким образом передать в функцию севопривод, тот, кторый VarSpeedServo myservo1; //1 сервопривод или VarSpeedServo myservo2; //2 сервопривод ? Изменяя только номер пина серва дёргается до положения прошлой, и потом становится в нужное положение.
    К примеру
    Код (C++):
    #include <VarSpeedServo.h>
    byte vo = 5;
    byte pi1=3;
    byte pi2=5;
    VarSpeedServo myservo1; //1 сервопривод
    VarSpeedServo myservo2; //2 сервопривод

    void serv (/*получить myservo1 или myservo2*/, byte pin,  byte vol){
    myservo.attach(pin);//включаем серву
    myservo.write(vol,5,true);//записывем текущий угол
    myservo1.detach();//отключаем серву
    }

    void setup() {}

    void loop() {
    /*какой-то код*/
    serv(/* вставить myservo1 или myservo2*/, pi1,vo);
    }
     
  2. vvr

    vvr Инженерище

    я что вы вообще то хотите получить ?
     
  3. issida

    issida Нерд

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

    vvr Инженерище

    передо мной подобной задачи не стояло
    я бы сначала посмотрел как народ всякими роботами-пауками управляет, там серв целая куча)))
    сходу массивы в голову лезут...
     
  5. Vetrinus

    Vetrinus Гик

    Как вариант, передать в функцию указатель на объект. Должно сработать
     
    Последнее редактирование: 29 авг 2016
  6. Vetrinus

    Vetrinus Гик

    Примерно так
    Код (C++):
    #include <VarSpeedServo.h>
    byte vo = 5;
    byte pi1=3;
    byte pi2=5;

    VarSpeedServo myservo1, *pointer_1; //1 сервопривод
    VarSpeedServo myservo2, *pointer_2; //2 сервопривод

    void serv (VarSpeedServo *myservo, byte pin,  byte vol){
    myservo.attach(pin);//включаем серву
    myservo.write(vol,5,true);//записывем текущий угол
    myservo1.detach();//отключаем серву
    }

    void setup() {
      pointer_1 = &myservo1;
      pointer_2 = &myservo2;
      }

    void loop() {
    /*какой-то код*/
    serv(pointer_1, pi1,vo);
    serv(pointer_2, pi1,vo);
    }
     
  7. Vetrinus

    Vetrinus Гик

    А еще можно создать массив экземпляров класса, и массив указателей. Как-то так:
    Код (C++):
    #include <VarSpeedServo.h>
    byte vo = 5;
    byte pi1 = 3;
    byte pi2 = 5;

    VarSpeedServo objects[10]; //Создаем 10 экземпляров класса VarSpeedServo
    VarSpeedServo* pointers[10]; //Создаем 10 указателей на объекты класса VarSpeedServo

    void serv (VarSpeedServo *myservo, byte pin,  byte vol) {
      myservo.attach(pin);//включаем серву
      myservo.write(vol, 5, true); //записывем текущий угол
      myservo1.detach();//отключаем серву
    }

    void setup() {
      byte index=0;
      for (byte i = 0; i < 10; i++) {
        pointers[index] = &objects[index];//Присваиваем массиву указателей адреса объектов
      }
    }

    void loop() {
      /*какой-то код*/
      serv(pointers[0], pi1, vo);
      serv(pointers[1], pi1, vo);
    }
     
  8. Vetrinus

    Vetrinus Гик

    А вообще странно, что нужно передавать в функцию номер подключенного пина. По хорошему, нужно сделать номер пина свойством объекта, и присваивать ему значение при объявлении, в конструкторе.
    Но нагуглив либу на гитхабе, я понял что не способен на такое, пока что)
    UPD. Хотя, наверное, если потратить время и вникнуть, то может быть и осилю. Теоретически, нужно будет изменить конструктор класса так, чтобы он параметром принимал номер пина, и во всех методах заменить переменную пина на свойство объекта
     
  9. issida

    issida Нерд

    Первый вариант не заработал, второй не стал пробовать. Создал класс с горя.
     
  10. Vetrinus

    Vetrinus Гик

    Ну так сделайте так, чтобы заработало. Я вам не готовую реализацию предложил, а только показал псевдокод. Поправьте огрехи, и все должно заработать
     
  11. AlexU

    AlexU Гуру

    Код (C++):
    VarSpeedServo myservo1, *pointer_1; //1 сервопривод
    VarSpeedServo myservo2, *pointer_2; //2 сервопривод
    или
    Код (C++):
    VarSpeedServo objects[10]; //Создаем 10 экземпляров класса VarSpeedServo
    VarSpeedServo* pointers[10]; //Создаем 10 указателей на объекты класса VarSpeedServo
     
    Зачем тратить память из кучи на хранение указателей?
    Можно -- либо, как уже сказал Vetrinus, через указатель, либо по ссылке.
    Первый вариант примерно такой:
    Код (C++):
    #include <VarSpeedServo.h>
    byte vo = 5;
    byte pi1=3;
    byte pi2=5;
    VarSpeedServo myservo1; //1 сервопривод
    VarSpeedServo myservo2; //2 сервопривод

    void serv (VarSpeedServo *myservo, byte pin,  byte vol){
    // Обратите внимание на '->', при работе с указателями
    // доступ к членам объекта производится через "стрелку", а не через точку
    myservo->attach(pin);//включаем серву
    myservo->write(vol,5,true);//записывем текущий угол
    myservo1->detach();//отключаем серву
    }

    void setup() {}

    void loop() {
    /*какой-то код*/
    // при вызове функции передаём указатель на объект
    serv(&myservo2, pi1,vo);
    }
    Второй вариант:
    Код (C++):
    #include <VarSpeedServo.h>
    byte vo = 5;
    byte pi1=3;
    byte pi2=5;
    VarSpeedServo myservo1; //1 сервопривод
    VarSpeedServo myservo2; //2 сервопривод

    void serv (VarSpeedServo &myservo, byte pin,  byte vol){
    // Объект передаётся по ссылке (без копирования),
    // доступ к членам объекта производится через через точку
    myservo.attach(pin);//включаем серву
    myservo.write(vol,5,true);//записывем текущий угол
    myservo1.detach();//отключаем серву
    }

    void setup() {}

    void loop() {
    /*какой-то код*/
    // при вызове функции передаём сам объект
    serv(myservo2, pi1,vo);
    }