Как использовать сервопривод в прерывании?
Сейчас я работаю над небольшой схемой, в которой увеличиваю вращение серводвигателя и одновременно мигаю светодиодом.
Я использовал все известные мне методы, но он все равно не работает или мигает, а затем сервопривод начинает работать, но никогда оба одновременно. Вот с чем я в основном работаю:
for(position=0;position<=90;position=position+5){
digitalWrite(led_pin,HIGH);
delay(200);
digitalWrite(led_pin,LOW);
delay(200);
servoBar.write(position);
delay(15);
}
Но он мигнет один раз, а затем перестанет, и сразу после этого сервопривод начнет работать.
Я знаю, что нельзя использовать задержки в прерываниях. Я использую функцию, которую могу, но просто для того, чтобы показать вам, с чем я работаю.
@, 👍1
2 ответа
Проблема в том, что процедура задержки блокируется. Он останавливает работу и блокирует другие события. Взгляните на пример «Мигание без задержки» на вкладке «Пример». (также ссылка ниже) https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
Что вам нужно сделать, так это не блокировать. Часто вызывайте программу проверки времени и проверяйте, не истекло ли время, которое вы хотите отложить. Выполните действие, которое необходимо было выполнить в данный момент.
Это более сложный способ обработки синхронизированных событий. Также посмотрите это Демонстрационный код для нескольких задач одновременно. https://forum.arduino.cc/index.php?topic=223286.0
Учитесь с удовольствием. :)
Хорошим способом управления временем без задержек является использование:
if(millis()-lastCheck > delayPeriod){
lastCheck=millis();
doStuffHereOrChangeServo();
}
Этот код естественным образом защищен от переполнения, и на самом деле именно так работает функция задержки. Разница в том, что функция задержки() использует цикл while(), который прерывается при выполнении этого условия, поэтому он предотвращает запуск любого кода после задержки ДО тех пор, пока задержка не завершится. Вот почему в вашем коде возникают странные паузы.
Кстати, на самом деле это интересный проект по созданию простого планировщика задач, который использует список указателей на функции и вариацию этого метода для выполнения абсолютно общего планирования. Если вы хотите попробовать этот маршрут, вам следует сохранить структуру, содержащую указатель функции и целое число с подписанным, превышающее максимально предполагаемый размер задержки. Затем при каждом вызове планировщика вы вычитаете разницу между millis() и сохраненным значением millis() из каждого из этих целых чисел в структуре. Как только оно станет отрицательным или нулевым, задачу можно будет запустить!
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Если вам нужна механика синхронизации прерывания, вам нужно создать очень тонкую процедуру
loop()
, которая только проверяет, установлен ли ваш собственный флаг «переместить сервопривод». Если да, удалите флаг и переместите сервопривод, а прерывание используйте только для установки флага., @towe