Как синхронно управлять двумя сервоприводами?

Для преодоления проблем с крутящим моментом я прикрепил 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();
    }
}

Будет ли это работать? Рекомендуется ли этот подход?

, 👍1

Обсуждение

вы знаете, что весь этот код выполняется WAAAAY быстрее, чем время отклика сервоприводов, и по большей части они будут работать одновременно?, @KyranF

если вы пишете оба вывода одновременно (две строки кода последовательно), этого достаточно, чтобы они работали синхронно., @KyranF


4 ответа


Лучший ответ:

5

Если у вас есть два радиоуправляемых сервопривода, которые всегда должны двигаться вместе, вы можете просто подключить оба управляющих входа к одному выходу.

,

Так нужен ли мне NPN-транзистор для усиления сигнала?, @RinkyPinku

Неа. Просто подключите и управляйте ими вместе., @Spehro Pefhany


0

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


3

Ответ Спехро самый очевидный. Но учтите, что одинаковых сервоприводов не бывает. Вы можете напрячь их, если соедините их жестким соединением.

Если вы хотите, чтобы две механические части выполняли одно и то же движение, правильное решение — соединить их механически, а не использовать два сервопривода, выполняющих одно и то же действие.

,

0

Чтобы управлять двумя или более сервоприводами одновременно, вам необходимо интерполировать их движения, сначала немного перемещая один сервопривод, затем перемещая следующий, вперед и назад, пока все сервоприводы не прибудут в точку назначения. Я еще не видел библиотеки, которая делает это за вас, поэтому вам, вероятно, придется написать свою собственную процедуру. Вот проект, в котором я интерполировал три сервопривода и включил код: https://www.instructables .com/id/MonkeyBot-3-Servo-Climbing-Robot/

,