Надо запустить 2 цикла for() одновременно, но я не могу сделать это без выполнения одного, а затем другого после него
Я управляю 2 серводвигателями, но хотел бы настроить их переменные отдельно, в частности их верхние и нижние значения, а также их скорости. Этот код я нашел в Интернете, а затем разделил, так как исходный код не имел регулируемых переменных для обоих. Я использую сервоконтроллер adafruit
for (uint16_t microsecL = mainServoClosedL; microsecL < mainServoOpenL; microsecL +=5)
for (uint16_t microsecR = mainServoClosedR; microsecR < mainServoOpenR; microsecR -=5) {
pwm.writeMicroseconds(mainServoL, microsecL);
pwm.writeMicroseconds(mainServoR, microsecR);
}
@Miguel, 👍-3
Обсуждение2 ответа
Ответ прост, но решение-нет.
Простая часть: не используйте для циклов.
Самое сложное: у вас есть одна функция loop ()
, которая выполняется многократно. Для каждой итерации этой функции вы принимаете решения о том, что делать во время этого цикла, и действуете в соответствии с ними. Такие решения, как "Пришло ли время увеличить это значение ШИМ?" Или "Достигло ли это значение нужного мне предела?" и т. Д.
Микроконтроллер не может делать больше одной вещи за раз. Что он может сделать, так это сделать это намного быстрее, чем это нужно вашим сервоприводам. Таким образом, у него есть (более чем) достаточно времени, чтобы оценить состояние и потребности каждого двигателя и сделать это достаточно быстро, чтобы вы не заметили, и на них не повлияет разница.
Единственное, чего ваш код не должен делать, - это ждать, пока что-то произойдет, если только это не единственное, что может произойти дальше. В реальном мире это редко случается, поэтому контроллер должен снова и снова проверять все возможные интересующие события, чтобы иметь возможность реагировать на то, что произойдет дальше.
В вашем фрагменте кода вы увеличиваете microsecL и уменьшаете microsecR, но не с какой-то определенной скоростью. Ваш код цикла, вероятно, должен смотреть на часы времени выполнения (функции `millis()' и 'micros()' прочитают это за вас), а когда пройдет подходящий интервал, отрегулируйте одно или оба этих значения и сделайте что-нибудь еще, что может потребоваться сделать, например остановка двигателя по истечении определенного времени или по достижении им конечного положения.
- Как заставить сервопривод вращаться на угол больше 180°
- Подключение Arduino к сервоприводу с внешним источником питания
- Мой сервопривод не работает плавно
- Бесполезная проводка коробки и код
- Почему сервопривод не перемещается по углам должным образом
- Микро сервопривод не работает с Arduino UNO
- поворот позиционного серводвигателя более чем на 180 градусов
- Почему loop() останавливается?
- Мне нужно кое-что сделать. Это какой-то код, который я нашел. - Это не вопрос. В чем заключается ваш вопрос?, @Majenko
Мне нужно запустить 2 цикла for() одновременно
.... зачем вам нужно иметь два цикла for ()?, @jsotolaМой совет: удалите свой пост (чтобы спасти свою репутацию), затем найдите свое собственное решение и никогда никому не сообщайте об этом. Это сообщество хорошо подходит для поиска решений, но не для того, чтобы задавать вопросы и получать ответы, @Kickass
И да, я вижу в этом иронию., @Kickass
Вы не указали, какой чип используете. Arduino не любит многопоточность (proto). А поскольку чипы arduino имеют только 1 ядро, у них есть только 1 поток. Переключитесь на двухъядерные чипы ESP32, у них есть FreeRTOS, у которого есть задачи. То, что вы пытаетесь сделать, было бы легко достижимо с помощью микроконтроллера ESP32., @Kickass