Серводвигатель в работе
У меня есть проект с 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 к сервоприводу с внешним источником питания
- Мой сервопривод не работает плавно
- Что означает термин «9g» в рейтинге сервопривода?
- Бесполезная проводка коробки и код
- Почему сервопривод не перемещается по углам должным образом
- Как заставить сервопривод замедлить движение
- поворот позиционного серводвигателя более чем на 180 градусов
Где остальная часть твоего скетча? Включение сервопривода отсутствует, настройка отсутствует, а
var i = 0;выглядит как JavaScript, а не как «код Arduino»., @VE7JROпопробуйте
void toMove (Servo & obj, int inPosition, int forPosition) {, @JurajНет смысла записывать все значения от
inPositionдоforPositionс шагом в сервопривод. Поскольку период импульсного сигнала на сервопривод намного больше (на несколько порядков), чем время, необходимое для цикла for, сервопривод (почти) никогда не увидит никаких промежуточных значений. Вы можете просто написатьforPositionдля сервопривода., @the busybee