PCA9685: как "сбросить" ШИМ-сигнал?

Я использую свой Arduino с сервоконтроллером Adafruit PCA9685. Для установки ШИМ-сигналов я использую предоставленную библиотеку: https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library

Он позволяет легко установить сигнал ПММ и хорошо работает. Но как я могу "сбросить" ШИМ-сигнал для определенного вывода?

Если ШИМ siganl активен, серво фиксируется в текущем положении и не может быть перемещено вручную, но только путем установки другой длины импульса. Поэтому мне нужно переместить серво, а затем "освободить" его.

, 👍4

Обсуждение

Я не очень-то люблю сервоприводы... "отпускают ли они" только тогда, когда рабочий цикл равен 0% или 100% (это легко сделать с помощью вашего PCA9685)? Если нет, то единственный способ-это отключить питание этого сервопривода., @mic

Вы нашли решение? У меня та же проблема., @Miguel


5 ответов


-1

К несчастью, AFAIK, сервопривод приводит двигатель в действие, даже когда ШИМ-сигнал не подается. Так что "удаление" ШИМ бесполезно.

Вам придется "выключить" сервопривод, отключив питание. Для этого используйте транзистор (обычно сервоприводы потребляют больше тока, чем может выдержать arduino). Когда вы захотите "освободить" сервопривод, отключите питание, и он будет "свободен".

,

вы ошибаетесь , если я подключаю сервопривод к своей сборке, он "свободен", пока у меня не будет ШИМ , а также я могу освободить все сервоприводы, отправив команду сброса на PCA9685 но моя задача состоит в том, чтобы "освободить" только один конкретный сервопривод: есть проблема, @Sergey Kravchenko


0

Вы можете попробовать изменить соответствующий вывод с выходного на входной. Чтобы не нарушать другие настройки, вы можете выполнить прямое управление портом.

void servo_off() {
  DDRD &= ~(1<<PD5);
}

void servo_on() {
  DDRD |= (1<<PD5);
}

Это предполагает, что вы используете контакт PD5 для ШИМ-сигнала. Отрегулируйте "D" в DDRD и PD5 таким образом, чтобы оно соответствовало используемому порту, а также номеру контакта.

Конечно, вам нужен какой-то дополнительный пользовательский ввод, например, кнопка для запуска вызовов этих функций.

,

PCA9685 управляется через I2C, и речь идет о библиотеке Adafruit для модуля PCA9685, @Juraj


-1

Я получил ту же проблему, искал вокруг, но не нашел ответа, поэтому я заглянул в исходный код и обнаружил, что вам просто нужно установить угол наклона сервопривода на "Нет", чтобы перестать посылать ШИМ-импульсы на сервопривод. Например, если ваш сервопривод использует канал 14 на плате PCA9685:

комплект.сервопривод[14].угол = Нет

,

Это звучит так, как будто вы говорите о python или чем-то подобном, а может быть, и о какой-то другой библиотеке, и не имеет никакого отношения к этому вопросу., @timemage


3

Вы можете попытаться отправить время "ON" на свой выходной вывод на PCA9685. Итак, вы начинаете "ВКЛ." с 0 и останавливаете "ВЫКЛ." с 0.

void freeServo(uint8_t servoIdx)
{
  pwm.setPWM(servoIdx, 0, 0 );
}
,

0

Являются ли управляющие контакты вашего сервопривода активными высокими или активными низкими?

Из библиотечного кода по адресу https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library/blob/d265f74fc0e66632e6dafc787c95b008f3245550/Adafruit_PWMServoDriver.cpp#L242 похоже,что существуют специальные значения включения и выключения setPWM(pin,on, off), которые полностью включают или полностью выключают сервопривод, и то, как они работают, зависит от того, является ли сервопривод активным высоким или активным низким.

unsigned byte idle = CertainPin;

servoController01.setPWM(idle, 0, 4096); // полностью выключен Активный высокий
// servoController01.setPWM(idle, 4096, 0); // полностью выключен Активный низкий

или с помощью лучше документированного setPin():

servoController01.setPin(idle,0,false); // Active high
//servoController01.setPin(idle,0,true); // Active low
,