Как удалить задержки в этом коде для подметания сервопривода?
Я знаю, что это, вероятно, очень заданный вопрос, но я строю довольно простую вещь типа радара, которая метет влево и вправо и использует ультразвуковой датчик для определения расстояния до объекта, и зуммер срабатывает, если что-то обнаружено.
Само устройство работает, но я заметил, что из-за того, что я использовал 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);
}
Любые указатели на некоторые хорошие ресурсы для этого были бы очень признательны, спасибо.
@SourOddity, 👍1
1 ответ
Лучший ответ:
Из вашего кода кажется, что вы делаете все движения сервопривода, прежде чем прочитать расстояние и отчитаться. Большая часть кода закомментирована, поэтому следовать ей немного сложно. То, что я бы сделал, - это что-то вроде:
[...]
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
}
- Как независимо запускать позиционные и непрерывные сервоприводы с помощью millis()?
- Как справиться с rollover millis()?
- Использование millis() и micros() внутри процедуры прерывания
- Tower Pro MG996R сервопривод с высоким крутящим моментом 180 °, управляющий с помощью Arduino
- Как заставить сервопривод вращаться на угол больше 180°
- Пповорот сервопривода на 90 градусов
- Как синхронно управлять двумя сервоприводами?
- Ошибка "Servo" does not name a type
Спасибо вам за это, работает отлично!, @SourOddity