Можно ли каким образом передать в функцию севопривод, тот, кторый 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); }
чтоб несколько серв управлялись по одному алгоритму, Отработала первая, потом вторая, третья, четвертая и тд. очень много места занимает расписывание для каждой в отдельности
передо мной подобной задачи не стояло я бы сначала посмотрел как народ всякими роботами-пауками управляет, там серв целая куча))) сходу массивы в голову лезут...
Примерно так Код (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); }
А еще можно создать массив экземпляров класса, и массив указателей. Как-то так: Код (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); }
А вообще странно, что нужно передавать в функцию номер подключенного пина. По хорошему, нужно сделать номер пина свойством объекта, и присваивать ему значение при объявлении, в конструкторе. Но нагуглив либу на гитхабе, я понял что не способен на такое, пока что) UPD. Хотя, наверное, если потратить время и вникнуть, то может быть и осилю. Теоретически, нужно будет изменить конструктор класса так, чтобы он параметром принимал номер пина, и во всех методах заменить переменную пина на свойство объекта
Ну так сделайте так, чтобы заработало. Я вам не готовую реализацию предложил, а только показал псевдокод. Поправьте огрехи, и все должно заработать
Код (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); }