Как изменить скорость нескольких сервоприводов, работающих одновременно с модулем PCA9685?

Я использую модуль PCA9685 с библиотекой Adafruit. В моем коде у меня есть один объект класса сервопривода, который имеет 14 каналов (в основном управляющий 14 сервоприводами).

void Positioning(){
  ServoDriver.setPWM(right_foot, 0, MapRotation(rotations[0],"1"));
  ServoDriver.setPWM(left_foot, 0, MapRotation(rotations[1],"2")); 
  ServoDriver.setPWM(right_calf, 0, MapRotation(rotations[2],"1")); 
  ServoDriver.setPWM(left_calf, 0, MapRotation(rotations[3],"2")); 
  ServoDriver.setPWM(right_thigh, 0, MapRotation(rotations[4],"1")); 
  ServoDriver.setPWM(left_thigh, 0, MapRotation(rotations[5],"2")); 
  ServoDriver.setPWM(right_pelvis, 0, MapRotation(rotations[6],"1"));
  ServoDriver.setPWM(left_pelvis, 0, MapRotation(rotations[7],"2")); 
  ServoDriver.setPWM(torso, 0, MapRotation(rotations[8], "1"));
  ServoDriver.setPWM(right_shoulder, 0, MapRotation(rotations[9], "1")); 
  ServoDriver.setPWM(left_shoulder, 0, MapRotation(rotations[10], "2")); 
  ServoDriver.setPWM(right_arm, 0, MapRotation(rotations[11], "1")); 
  ServoDriver.setPWM(left_arm, 0, MapRotation(rotations[12], "2")); 
  ServoDriver.setPWM(right_hand, 0, MapRotation(rotations[13], "1")); 
  ServoDriver.setPWM(left_hand, 0, MapRotation(rotations[14], "2")); 
}

Все, что делает функция позиционирования, — это просто устанавливает все сервоприводы в определенное положение (они находятся в человекоподобном роботе, поэтому это положение предназначено для стояния). Массив rotations[] просто содержит положения сервоприводов от 0 до 180, которые задаются в другом месте кода для каждого сервопривода соответственно. Второй аргумент для поворота карты просто сопоставляет ее между минимальным и максимальным значениями импульса сервоприводов (115 и 560) в обычном или обратном порядке, в зависимости от числа.

Мой вопрос: как изменить скорость сервоприводов? Я не могу использовать delay() или циклы, потому что это не приведет к тому, что все сервоприводы будут вращаться последовательно, а не все сразу. изменение любого значения rotations[] указывает на то, что робот движется, и поэтому как мне сделать сервоприводы медленнее, вместо того, чтобы вращаться с максимальной скоростью в новые позиции rotations[] всякий раз, когда они изменены (так как positioning() вызывается в функции loop())?

, 👍-1


1 ответ


0

Вы не можете просто изменить скорость сервопривода. Вы можете только переместить шаг мой шаг в нужное положение, ожидая между ними. Так, например, вместо прямого перемещения от 0° к 90° вы можете сначала перейти к 5°, немного подождать, перейти к 10°, немного подождать, перейти к 15°, немного подождать,... пока не достигнете 90°. Вы также можете сделать шаг в 1°, чтобы сделать его более плавным.

Вы можете решить эту проблему с помощью задержек, но если вы хотите перемещать сервоприводы с разной скоростью, вам понадобится неблокирующий стиль кодирования, как в примере BlinkWithoutDelay среды разработки Arduino (это было описано бесчисленное количество раз на этом сайте и в Интернете).

Кроме того, при создании робота-гуманоида в какой-то момент вам придется учитывать не только позу, которую вы хотите, чтобы робот принял, но и способ ее достижения. Это может быть очень важно, и это может быть сложной задачей. В основном вам нужны формулы для движений, которые возвращают вам точное положение сервопривода Dach в любой момент времени в движении. Затем вы можете установить сервоприводы на это значение для текущего времени.

,