Серводвигатель в работе
У меня есть проект с 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);
}
}
@Fabrízio Newton, 👍0
Обсуждение2 ответа
Да, это возможно, и вы сделали это почти правильно. Я внес небольшое исправление в функцию 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
Вы не использовали функцию attach():
s1.attach(pin_1);
s2.attach(pin_2);
См. как использовать серводвигатель
- Как заставить сервопривод вращаться на угол больше 180°
- Подключение Arduino к сервоприводу с внешним источником питания
- Мой сервопривод не работает плавно
- Бесполезная проводка коробки и код
- Почему сервопривод не перемещается по углам должным образом
- Микро сервопривод не работает с Arduino UNO
- поворот позиционного серводвигателя более чем на 180 градусов
- Почему loop() останавливается?
Где остальная часть твоего скетча? Включение сервопривода отсутствует, настройка отсутствует, а
var i = 0;
выглядит как JavaScript, а не как «код Arduino»., @VE7JROпопробуйте
void toMove (Servo & obj, int inPosition, int forPosition) {
, @JurajНет смысла записывать все значения от
inPosition
доforPosition
с шагом в сервопривод. Поскольку период импульсного сигнала на сервопривод намного больше (на несколько порядков), чем время, необходимое для цикла for, сервопривод (почти) никогда не увидит никаких промежуточных значений. Вы можете просто написатьforPosition
для сервопривода., @the busybee