Шаговый двигатель с датчиком 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); // Ждать
}
}
@Jordakoes, 👍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
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Запустить два степпера одновременно
- Могу ли я запретить библиотеке Stepper удерживать двигатель?
- Питание двух шаговых двигателей с драйверами A4988
- Управление функцией включения на драйвере микрошагового устройства
- Шаговый двигатель не работает с платой A4988
- Nema 17, Arduino Uno и шаговый двигатель ~2H42B
- Двигать шаговый двигатель вперед и назад
Вы можете рассмотреть возможность использования функции constrain(), чтобы установить расстояние, за которое вы будете бежать на полной скорости, а затем использовать функцию map(), чтобы превратить это в *обратную* зависимость между расстоянием и задержкой. Остерегайтесь возможных колебаний во время измерения, а также того факта, что ультразвуковые датчики имеют минимальное расстояние, поэтому убедитесь, что вы не переходите на полную скорость, когда что-то находится ближе минимального!, @Chris Stratton