Два потенциометра управляют двумя сервоприводами — странное поведение

Я пытаюсь управлять двумя сервоприводами с помощью двух потенциометров. Я подумал, что можно просто изменить код руководства, добавив дополнительный потенциометр на 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, но скетч не загрузился. Поэтому я поставил оригинальный, и теперь всё работает отлично!

Черт возьми, если я могу это понять, может быть, плохой контакт с макетной платой?

В любом случае теперь все работает, спасибо за ваши предложения.

, 👍0

Обсуждение

Как подключены ваши потенциометры?, @jose can u c

Между + и - рельсами, с ползунками, подключенными к a0 и a1. Работает отлично для неизменённого кода одного сервопривода из руководства., @DrBwts

добавлена схема для ясности, @DrBwts

Используйте A0 и A1 в коде для аналоговых выводов вместо 0 и 1., @Majenko

Использование A0 и A1 не повлияло на поведение, @DrBwts

Возьмите показания с a0 и отправьте их на оба сервопривода, но измените один из них на 180-е значение., @Majenko


1 ответ


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