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

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

Само устройство работает, но я заметил, что из-за того, что я использовал delay (), чтобы позволить сервоприводу завершить свои полные движения, он задерживает остальную часть кода, и в результате зуммер и возврат расстояния очень не реагируют и вялые.

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

Мой текущий рабочий, но вялый код:

//Серво 
#include <Servo.h>
int servoPin = 12; // Контакт для взаимодействия с сервоприводом определенными
int servoStart = 0; //начальное положение серводвигателя
int servoEnd = 90; //конец сервопривода означает, что она вращается на 90 градусов
int waitTime = 1000; // позволяет сервопривода снова будет вращаться до переезда 
int servoPos = 20; // приращения положения сервопривода
int servoStep = 20; //количество приращения установки сервопривода
Servo myServo; // Создает экземпляр объекта servo


//Ультразвуковой
int trigPin = 9;
int echoPin = 10;
long duration;
int distance;
int maxDistance = 329; // Максимальный диапазон ультразвукового датчика

//Buzzer stuff
int buzzerPin = 11;
int buzzerWait = 200;

void setup(){

//Прикрепите серво-объект к штифту и начните последовательный мониторинг с
// polling rate of 9600
Serial.begin(9600);
  myServo.attach(servoPin);
  pinMode(buzzerPin, OUTPUT);
  

    pinMode(trigPin, OUTPUT); // Trig pin set as output
    pinMode(echoPin, INPUT); // echo pin set as i
      }
    
    void loop()
    {
    
    
      // Moving servo 
      myServo.write(servoStart); //Перемещает серво в исходное положение
      //delay (waitTime); //позволяет сервомотору полностью двигаться перед следующим ходом
      //myServo.write(servoEnd); //Перемещается в конечную позицию
      //delay (waitTime); // ждет перед возвратом обратно в start pos
      
    //myServo.write(servoStart);
    //delay(waitTime);
    //myServo.write(20);
    //delay(waitTime);
    //myServo.write(40);
    //delay(waitTime);
    //myServo.write(60);
    //delay(waitTime);
    
     // Использование ультразвукового датчика
      
      // Очищает триггер
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      
    // Устанавливает trigPin в ВЫСОКОЕ состояние в течение 10 микросекунд
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      
    // считывает эхопин и возвращает время прохождения волны в микросекундах
      duration = pulseIn(echoPin, HIGH);
      
    // Расчет расстояния
      distance = duration*0.0343/2;
      
    //Печать расстояния до последовательного монитора
      Serial.print("Distance: ");
      Serial.println(distance);
      Serial.println(distance);
      
      if (distance < maxDistance) {
      digitalWrite(buzzerPin, HIGH);
      //delay(buzzerWait);
      //digitalWrite(buzzerPin,LOW);
      //delay(buzzerWait);
      
      }else digitalWrite(buzzerPin, LOW);
      
        
    }

Любые указатели на некоторые хорошие ресурсы для этого были бы очень признательны, спасибо.

, 👍1


1 ответ


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

2

Из вашего кода кажется, что вы делаете все движения сервопривода, прежде чем прочитать расстояние и отчитаться. Большая часть кода закомментирована, поэтому следовать ей немного сложно. То, что я бы сделал, - это что-то вроде:

[...]
int servoStart=0;
int servoEnd=90;
int servoPos=0;

[...]
void setup() {
    [usual setup stuff like you do it now]
    myServo.write(servoPos);  //start at pos 0
    // Может быть, задержка здесь, чтобы убедиться, что мы находимся в pos. 0
}

void loop() {
    //Switch direction if we reach end
    if (servoPos+servoStep < servoStart || servoPos+servoStep > servoEnd)
        servoStep = -servoStep;    
    servoPos += servoStep;
    myServo.write(servoPos);
    //Small delay?
    //Read distance
    //Send distance to seraial
    //Buzz buzzer if needed
}
,

Спасибо вам за это, работает отлично!, @SourOddity