Как синхронно управлять двумя сервоприводами?
Для преодоления проблем с крутящим моментом я прикрепил 2 идентичных сервопривода к определенной части моей руки робота и потому что я видел, как кто-то делал то же самое.
Теперь, когда я пишу код, я понимаю:
#include <Servo.h>
...
...
shoulder1.write(map(analogRead(p1), 0, 1023, 0, 179));
shoulder2.write(map(analogRead(p1), 0, 1023, 0, 179));
...
повернет плечо1
на 20*, а затем плечо2
еще на 20*, т.е. общий поворот 40*; это тоже при слишком большой нагрузке на сервоприводы, так как другой сервопривод будет неактивен в то время, когда активен первый.
Я хочу добиться 20* полностью синхронизированных включений обоих сервоприводов, как мне это сделать? Любые библиотеки Arduino или пошаговое руководство?
Могу ли я переместить их оба одновременно - что-то вроде многопоточность на ардуино? Вот что я пробовал:
void rotateTwoServoInSync(int angle) {
for(int i = 0; i<angle; i++) {
shoulder1.attach(9);
shoulder1.write(i);
shoulder1.detach();
shoulder2.attach(10);
shoulder2.write(i);
shoulder2.detach();
}
}
Будет ли это работать? Рекомендуется ли этот подход?
@RinkyPinku, 👍1
Обсуждение4 ответа
Лучший ответ:
Если у вас есть два радиоуправляемых сервопривода, которые всегда должны двигаться вместе, вы можете просто подключить оба управляющих входа к одному выходу.
Так нужен ли мне NPN-транзистор для усиления сигнала?, @RinkyPinku
Неа. Просто подключите и управляйте ими вместе., @Spehro Pefhany
analogRead()
и map()
работают медленно; выполнять их только один раз.
unsigned char rot = map(analogRead(p1), 0, 1023, 0, 179);
shoulder1.write(rot);
shoulder2.write(rot);
Я воспользуюсь вашим советом - но все же, если rot
равен 150*, то не приведет ли перемещение плеча1 на 150* к стационарному положению плеча2 сломать/сжечь установку?, @RinkyPinku
Только если ваша установка сделана из алмаза. В противном случае у него будет достаточно гибкости, чтобы справиться с разницей в несколько сотен наносекунд., @Ignacio Vazquez-Abrams
Не знаю, согласен ли я с этим, но вопрос крутящего момента все еще не решен., @RinkyPinku
Тогда ваши сервоприводы не идентичны., @Ignacio Vazquez-Abrams
Ответ Спехро самый очевидный. Но учтите, что одинаковых сервоприводов не бывает. Вы можете напрячь их, если соедините их жестким соединением.
Если вы хотите, чтобы две механические части выполняли одно и то же движение, правильное решение — соединить их механически, а не использовать два сервопривода, выполняющих одно и то же действие.
Чтобы управлять двумя или более сервоприводами одновременно, вам необходимо интерполировать их движения, сначала немного перемещая один сервопривод, затем перемещая следующий, вперед и назад, пока все сервоприводы не прибудут в точку назначения. Я еще не видел библиотеки, которая делает это за вас, поэтому вам, вероятно, придется написать свою собственную процедуру. Вот проект, в котором я интерполировал три сервопривода и включил код: https://www.instructables .com/id/MonkeyBot-3-Servo-Climbing-Robot/
- Бесполезная проводка коробки и код
- Почему loop() останавливается?
- Почему сервопривод вращается на 360 градусов?
- Программирование Сервопривода Как Получить -90 Градусов
- Как использовать фотодиод для arduino?
- Как использовать функцию карты
- Как повторить код
- Почему я не могу контролировать скорость двигателя? (М1 и Е1)
вы знаете, что весь этот код выполняется WAAAAY быстрее, чем время отклика сервоприводов, и по большей части они будут работать одновременно?, @KyranF
если вы пишете оба вывода одновременно (две строки кода последовательно), этого достаточно, чтобы они работали синхронно., @KyranF