Надо запустить 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);
      }

, 👍-3

Обсуждение

- Мне нужно кое-что сделать. Это какой-то код, который я нашел. - Это не вопрос. В чем заключается ваш вопрос?, @Majenko

Мне нужно запустить 2 цикла for() одновременно .... зачем вам нужно иметь два цикла for ()?, @jsotola

Мой совет: удалите свой пост (чтобы спасти свою репутацию), затем найдите свое собственное решение и никогда никому не сообщайте об этом. Это сообщество хорошо подходит для поиска решений, но не для того, чтобы задавать вопросы и получать ответы, @Kickass

И да, я вижу в этом иронию., @Kickass

Вы не указали, какой чип используете. Arduino не любит многопоточность (proto). А поскольку чипы arduino имеют только 1 ядро, у них есть только 1 поток. Переключитесь на двухъядерные чипы ESP32, у них есть FreeRTOS, у которого есть задачи. То, что вы пытаетесь сделать, было бы легко достижимо с помощью микроконтроллера ESP32., @Kickass


2 ответа


2

Ответ прост, но решение-нет.

Простая часть: не используйте для циклов.

Самое сложное: у вас есть одна функция loop (), которая выполняется многократно. Для каждой итерации этой функции вы принимаете решения о том, что делать во время этого цикла, и действуете в соответствии с ними. Такие решения, как "Пришло ли время увеличить это значение ШИМ?" Или "Достигло ли это значение нужного мне предела?" и т. Д.

,

1

Микроконтроллер не может делать больше одной вещи за раз. Что он может сделать, так это сделать это намного быстрее, чем это нужно вашим сервоприводам. Таким образом, у него есть (более чем) достаточно времени, чтобы оценить состояние и потребности каждого двигателя и сделать это достаточно быстро, чтобы вы не заметили, и на них не повлияет разница.

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

В вашем фрагменте кода вы увеличиваете microsecL и уменьшаете microsecR, но не с какой-то определенной скоростью. Ваш код цикла, вероятно, должен смотреть на часы времени выполнения (функции `millis()' и 'micros()' прочитают это за вас), а когда пройдет подходящий интервал, отрегулируйте одно или оба этих значения и сделайте что-нибудь еще, что может потребоваться сделать, например остановка двигателя по истечении определенного времени или по достижении им конечного положения.

,