Два потенциометра управляют двумя сервоприводами — странное поведение
Я пытаюсь управлять двумя сервоприводами с помощью двух потенциометров. Я подумал, что можно просто изменить код руководства, добавив дополнительный потенциометр на a1 и дополнительный сервопривод на d8 (я использую Nano).
#include <Servo.h>
Servo myservo; // создаем объект сервопривода для управления сервоприводом
Servo myservo_2;
int potpin = 0; // аналоговый вывод, используемый для подключения потенциометра
int potpin_2 = 1;
int val; // переменная для считывания значения с аналогового контакта
int val_2;
void setup() {
myservo.attach(9); // прикрепляет сервопривод к контакту 9 к объекту сервопривода
myservo_2.attach(8);
}
void loop() {
val = analogRead(potpin); // считывает значение потенциометра (значение от 0 до 1023)
val_2 = analogRead(potpin_2);
val = map(val, 0, 1023, 0, 180); // масштабируем его для использования с сервоприводом (значение от 0 до 180)
val_2 = map(val_2, 0, 1023, 0, 180);
myservo.write(val); // устанавливает положение сервопривода в соответствии с масштабированным значением
myservo_2.write(val_2);
delay(15); // ждет, пока сервопривод доберется туда
}
...но сервоприводы реагируют только на один из потенциометров (на a0) и оба перемещаются в одно и то же положение независимо от значения на a1.
Может, я упускаю что-то очевидное? Почему значение a1 игнорируется, а значение, полученное из a0, отправляется в d8 и d9?
Я заменил потенциометр на a1 на всякий случай, если он был неисправен, но поведение осталось прежним.
РЕДАКТИРОВАНИЕ: Добавлена схема

ДОПОЛНЕНИЕ: Я поменял Nano на другой Nano, но скетч не загрузился. Поэтому я поставил оригинальный, и теперь всё работает отлично!
Черт возьми, если я могу это понять, может быть, плохой контакт с макетной платой?
В любом случае теперь все работает, спасибо за ваши предложения.
@DrBwts, 👍0
Обсуждение1 ответ
Я понятия не имею, что не так с вашей системой, но это может помочь вам диагностировать ее.
#include <Servo.h>
static const size_t MaxServos = 2; // Количество подключенных потенциометров и сервоприводов
const int servoPins[MaxServos] = {9, 8}; // Контакты, через которые управляются сервоприводы
const int potpins[MaxServos] = {A0, A1}; // аналоговый вывод, используемый для подключения потенциометра
Servo myservo[MaxServos]; // создаем объект сервопривода для управления сервоприводом
void setup ()
{
for (size_t index = 0; index < MaxServos; ++index)
{
myservo[index].attach (servoPins[index]);
}
}
void loop ()
{
for (size_t index = 0; index < MaxServos; ++index)
{
readAndSet (potpins[index], myservo[index]);
}
delay (15); // ждет, пока сервопривод не доберется до нужного места — возможно, потребуется умножить значение на количество повернутых градусов, чтобы получить более точное значение.
}
// \brief Считать указанный аналоговый вывод и установить сервер пропорционально
// \param Аналоговый вывод, к которому подключен потенциометр.
// \param Сервопривод, который будет перемещен
void readAndSet (const int& pin, Servo& servo)
{
const int value = analogRead (pin); // считывает значение потенциометра (значение от 0 до 1023)
const int mappedValue = map (value, 0, 1023, 0, 180); // масштабируем его для использования с сервоприводом (значение от 0 до 180)
servo.write (mappedValue); // устанавливает положение сервопривода в соответствии с масштабированным значением
}
Я выполнил рефакторинг вашего кода, чтобы устранить дублирование. Это означает, что вы получите большее покрытие тестами и сможете быстрее найти ошибку. Вы можете добавить оператор Serial print в функцию readAndSet, чтобы убедиться, что вы передаёте и вычисляете правильные значения, но я подозреваю, что вы это делаете.
Похоже, с кодом всё в порядке, но, возможно, дело в каком-то аппаратном ограничении? Может быть, между линиями есть короткое замыкание, из-за которого потенциометр на A1 отключается?
Спасибо, что такое size_t? Я отредактировал свой вопрос. После того, как я заменил, а затем установил оригинальный Nano, система заработала как надо., @DrBwts
Это unsigned int. Вам нужно считать только от 0 до +0xffff, так что не беспокойтесь об использовании int., @Code Gorilla
- когда 3 компонента на Arduino nano работают вместе, один из них не работает
- 9 сервоприводов на Arduino Nano?
- Уменьшить яркость светодиода с помощью NPN-транзистора
- Мигающий светодиод при движении сервопривода
- Почему моя «подсказка настроения» не работает?
- Параллельное сервоуправление?
- Контроллер радиоуправляемой машины с использованием библиотеки RC-switch
- Не могу двигать сервопривод с моим Nano
Как подключены ваши потенциометры?, @jose can u c
Между + и - рельсами, с ползунками, подключенными к a0 и a1. Работает отлично для неизменённого кода одного сервопривода из руководства., @DrBwts
добавлена схема для ясности, @DrBwts
Используйте
A0иA1в коде для аналоговых выводов вместо0и1., @MajenkoИспользование A0 и A1 не повлияло на поведение, @DrBwts
Возьмите показания с a0 и отправьте их на оба сервопривода, но измените один из них на 180-е значение., @Majenko