Шаговый двигатель с датчиком HCSR-04

Я хочу заставить шаговый двигатель увеличивать и уменьшать скорость, работая с датчиком HCSR04. Идея состоит в том, что если датчики обнаруживают объект, шаговый двигатель замедлится и остановится как можно ближе к объекту.

Я написал код, и он вроде как работает.

Мой текущий код выглядит так:

if (distance > 30) 
{
  digitalWrite(13,HIGH); // Вывод высокий
  delayMicroseconds(500); // Ждать
  digitalWrite(13,LOW); // Низкий выходной сигнал
  delayMicroseconds(500); // Ждать
}

if (distance > 20 && distance < 30)
{
  digitalWrite(13,HIGH); // Вывод высокий
  delayMicroseconds(2000); // Ждать
  digitalWrite(13,LOW); // Низкий выходной сигнал
  delayMicroseconds(2000); // Ждать
}

if (distance > 10 && distance < 20)
{
  digitalWrite(13,HIGH); // Вывод высокий
  delayMicroseconds(10000); // Ждать
  digitalWrite(13,LOW); // Низкий выходной сигнал
  delayMicroseconds(10000); // Ждать
}

if (distance > 1 && distance < 10)
{
  //digitalWrite(13,HIGH); // Вывод высокий
  //задержкамикросекунды(1000); // Ждать
  digitalWrite(13,LOW); // Низкий выходной сигнал
}

Но я подумал, что это может быть проще, поэтому я создал функцию:

void velocity()
{
 digitalWrite(13,HIGH); // Вывод высокий
 delayMicroseconds(500); // Ждать
 digitalWrite(13,LOW); // Низкий выходной сигнал
 delayMicroseconds(500); // Ждать
}

Теперь мой вопрос: могу ли я манипулировать задержкой микросекунд, чтобы она изменилась, если расстояние изменится? Есть ли формула, позволяющая сделать это?

Весь код:

int trigPin = 11; 
int echoPin = 10; 

void setup()
{  
pinMode(trigPin, OUTPUT); //Датчик
pinMode(echoPin, INPUT); //Датчик
pinMode(6,OUTPUT); // Давать возможность
pinMode(13,OUTPUT); // Шаг
pinMode(12,OUTPUT); // Реж.
digitalWrite(6,LOW); // Установить низкий уровень включения
digitalWrite(5,LOW); // Устанавливаем низкий шаг
Serial.begin(9600);
} 

void loop()
{  
//поверните влево();
//Serial.println("Теперь я делаю ровно один оборот против часовой стрелки");
//задержка(1000);
//поворот вправо();
//Serial.println("Теперь я делаю ровно один оборот по часовой стрелке");
//задержка(1000);
//скорость();

 //датчик
 long duration, distance;
 digitalWrite(trigPin, LOW);
 delayMicroseconds(2);
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(5);
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);
 distance = (duration/2) / 29.1;
 Serial.print ("cm ");
 Serial.print (distance);

//собственное творение

if (distance > 30) 
{
  digitalWrite(13,HIGH); // Вывод высокий
  delayMicroseconds(500); // Ждать
  digitalWrite(13,LOW); // Низкий выходной сигнал
  delayMicroseconds(500); // Ждать
}

if (distance > 20 && distance < 30)
{
  digitalWrite(13,HIGH); // Вывод высокий
  delayMicroseconds(2000); // Ждать
  digitalWrite(13,LOW); // Низкий выходной сигнал
  delayMicroseconds(2000); // Ждать
}

if (distance > 10 && distance < 20)
{
  digitalWrite(13,HIGH); // Вывод высокий
  delayMicroseconds(10000); // Ждать
  digitalWrite(13,LOW); // Низкий выходной сигнал
  delayMicroseconds(10000); // Ждать
}

if (distance > 1 && distance < 10)
{
  //digitalWrite(13,HIGH); // Вывод высокий
  //задержкамикросекунды(1000); // Ждать
  digitalWrite(13,LOW); // Низкий выходной сигнал
}

//Собственные функции
}

void velocity()
{
 digitalWrite(13,HIGH); // Вывод высокий
 delayMicroseconds(500); // Ждать
 digitalWrite(13,LOW); // Низкий выходной сигнал
 delayMicroseconds(500); // Ждать
}

void rotateleft()
{
 digitalWrite(12,HIGH); // Устанавливаем высокий уровень Dir
 for(int x = 0; x < 200; x++) // Цикл 200 раз
  {
    digitalWrite(13,HIGH); // Вывод высокий
    delayMicroseconds(1000); // Ждать
    digitalWrite(13,LOW); // Низкий выходной сигнал
    delayMicroseconds(1000); // Ждать
   }
  }
  void rotateright()
  {
   digitalWrite(12,LOW); // Устанавливаем высокий уровень Dir
   for(int x = 0; x < 200; x++) // Цикл 200 раз
   {     
     digitalWrite(13,HIGH); // Вывод высокий
     delayMicroseconds(1000); // Ждать
     digitalWrite(13,LOW); // Низкий выходной сигнал
     delayMicroseconds(1000); // Ждать
   } 
 }

, 👍1

Обсуждение

Вы можете рассмотреть возможность использования функции constrain(), чтобы установить расстояние, за которое вы будете бежать на полной скорости, а затем использовать функцию map(), чтобы превратить это в *обратную* зависимость между расстоянием и задержкой. Остерегайтесь возможных колебаний во время измерения, а также того факта, что ультразвуковые датчики имеют минимальное расстояние, поэтому убедитесь, что вы не переходите на полную скорость, когда что-то находится ближе минимального!, @Chris Stratton


1 ответ


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

1

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

Обновление Изменен код для увеличения скорости при увеличении расстояния

int time = 0;
int timeWait = 1000; //интервал в миллисекундах между каждым считыванием расстояния
int maxDelay = 1000;

void velocity(int speed){
   int trim = 10;
   digitalWrite(13,HIGH); // Вывод высокий
   delayMicroseconds(maxDelay - speed*trim); // Ждать
   digitalWrite(13,LOW); // Низкий выходной сигнал
   delayMicroseconds(maxDelay - speed*trim); // Ждать
}

int readDistance(){
 //код для чтения расстояния
 return distance;
}    

void setup(){
time = millis();
}

void loop(){
   if(millis()-time > timeWait){ // расстояние чтения только в том случае, если с момента последнего чтения прошло 1000 мс
     time = millis();
     int distance = readDistance(); //ваш код дистанционного чтения;

   }
   velocity(distance);
}`

Обновление 2
Вам также понадобится что-то для обработки верхних и нижних пределов задержек (т. е. вам не нужны задержкиMicroсекунды(0) или любые отрицательные числа, и вы не хотите включать посторонние показания расстояния)

,

Похоже, что это увеличивает задержку (т. е. замедляет перемещение) на большие расстояния, что, по-видимому, противоречит цели., @Chris Stratton

Я отредактирую, чтобы вычесть максимальную задержку, которая должна увеличить скорость при увеличении расстояния., @Airfield20