Серводвигатель в работе

У меня есть проект с 9 сервоприводами, я хочу сделать функцию для управления каждым отдельно. Только то, что он не принимает сервопривод в качестве параметра. Может ли кто-нибудь сказать мне, можно ли передать сервант в качестве параметра и как? Спасибо!! Пример:

Servo s1,s2,s3;

void toMove(Servo obj,int inPosition, int forPosition){
var i = 0;
  for(i = inPosition; i<forPosition; i++){
    obj.write(i);
  }
}

void loop(){
  if(true){
     toMove(s1,0,180);
     toMove(s2,0,180);
  }
}

, 👍0

Обсуждение

Где остальная часть твоего скетча? Включение сервопривода отсутствует, настройка отсутствует, а var i = 0; выглядит как JavaScript, а не как «код Arduino»., @VE7JRO

попробуйте void toMove (Servo & obj, int inPosition, int forPosition) {, @Juraj

Нет смысла записывать все значения от inPosition до forPosition с шагом в сервопривод. Поскольку период импульсного сигнала на сервопривод намного больше (на несколько порядков), чем время, необходимое для цикла for, сервопривод (почти) никогда не увидит никаких промежуточных значений. Вы можете просто написать forPosition для сервопривода., @the busybee


2 ответа


1

Да, это возможно, и вы сделали это почти правильно. Я внес небольшое исправление в функцию toMove() ("int" вместо "var") и предоставил функцию setup(), которую вы не показали. Он компилируется без ошибок. Я не проверял правильность его работы, так как похоже, что вы сократили свой код до минимального примера, необходимого для демонстрации вашего вопроса, и спасибо за это! Вот что я собрал:

#include <Servo.h>

#define SERVO1      9
#define SERVO2      10


/*****< External and Global Declarations >*****/
Servo s1, s2;
void toMove(Servo obj, int inPosition, int forPosition);


/*****< Local Function Prototypes >*****/


void toMove(Servo obj,int inPosition, int forPosition){
int i = 0;
  for(i = inPosition; i<forPosition; i++){
    obj.write(i);
  }
}

void setup()
{
    s1.attach(SERVO1);
    s2.attach(SERVO2);
}


void loop() {
   toMove(s1, 0, 180);
   toMove(s2, 0, 90);
}
,

прототип функции на строку перед определением функции? (и строчка перед комментарием об этом?), @Juraj

Как отметил Юрай в комментарии к исходному вопросу, было бы лучше передать _ссылку_ на сервопривод, а не копировать весь объект: void toMove(Servo &obj, int inPosition, int forPosition);., @Edgar Bonet

Да, это было "упс" при редактировании. Первоначально я поместил toMove() ниже loop(). Понятно, что декларация больше не нужна., @JRobert

Я моделирую в Tinkercad, я скопировал его код и настроил проект с Arduino и сервоприводом, он продолжает выдавать ошибку, сервопривод не идентифицируется как тип переменной для функции. Хотите мне помочь? В любом случае, благодарю Вас!, @Fabrízio Newton

Пробовали ли вы @juraj и @ EdgarBonet предлагать передачу по ссылке («& obj» вместо «obj» в списке параметров функции)? Компилятор примет его в любом случае (со штрафом в 58 байт кода за передачу всего объекта), но, возможно, Tinkercad не примет передачу всего объекта (я не смог попробовать - у меня ссылка не работает)., @JRobert


0

Вы не использовали функцию attach():

 s1.attach(pin_1);
 s2.attach(pin_2);

См. как использовать серводвигатель

,