Как привести линейный привод в действие на разных скоростях в течение заданных периодов времени

Я новичок в Arduino и задаюсь вопросом, может ли кто-нибудь помочь мне правильно запрограммировать его. Я использую две кнопки для управления линейным приводом, чтобы открывать и закрывать дверь сарая. Я хочу, чтобы он шел с определенной скоростью в течение определенного периода времени... как 3 секунды. Затем я хочу, чтобы он замедлился и прошел еще 2 секунды. Линейный привод не имеет обратной связи, что хорошо для данного применения, поскольку он не должен быть точным. Ниже приведен код, который я скопировал с сайта производителя - он работает хорошо, но я не могу понять, как заставить его работать в течение определенных периодов времени. Пожалуйста, помните, что я никогда раньше не использовал Arduino, и это буквально иностранный язык для меня. Я просто надеюсь, что кто-нибудь подскажет мне, что делать. Это для моего дома, а не для школьного проекта.

*** ДОПОЛНЕНИЕ - Спасибо за помощь. Жаль, что я не могу выложить видео... Вот окончательный код:

/* Firgelli Automations
 * Limited or no support: we do not have the resources for Arduino code support
 * 
 * Program enables momentary direction control of actuator using push button
 */

int RPWM = 10; //подключите вывод Arduino 10 к IBT-2 pin RPWM
int LPWM = 11; //подключите вывод Arduino 11 к IBT-2 pin LPWM
int RPWM2 = 5; //подключите вывод Arduino 5 к IBT-2 pin RPWM
int LPWM2 = 6; //подключите Arduino вывод 6 к выводу IBT-2
int downPin = 12; 
int upPin = 13;
int speed1 = 0; // Максимальная скорость вы можете изменить ее между [0-255]
int speed2 = 0; // Низкая скорость вы можете изменить его между [0-255]
int speed3 = 0; // Низкая скорость вы можете изменить его между [0-255]

void setup() {
  pinMode(RPWM, OUTPUT);
  pinMode(LPWM, OUTPUT);
  pinMode(RPWM2, OUTPUT);
  pinMode(LPWM2, OUTPUT);
  pinMode(downPin, INPUT_PULLUP);
  pinMode(upPin, INPUT_PULLUP);
}

void loop() { 
  if(digitalRead(upPin)==LOW){ //проверить, нажата ли кнопка расширения
    analogWrite(RPWM, 0);
    analogWrite(RPWM2, 0);
    analogWrite(LPWM, 255); // вращать двигатель с максимальной скоростью (с ШИМ, установленным на 255)
    analogWrite(LPWM2, 236); // вращать двигатель с максимальной скоростью (с ШИМ, установленным на 255)
    delay(3000);               // ожидание
    analogWrite(LPWM, 185); // вращение двигателя с низкой скоростью (с ШИМ, установленным на 150)
    analogWrite(LPWM2, 181); // вращающийся двигатель с низкой скоростью вращения (с ШИМ, установленным на 150)
    delay(1600);               // ожидание
    analogWrite(LPWM, 80); // вращение двигателя с низкой скоростью (с ШИМ, установленным на 150)
    analogWrite(LPWM2, 80); // вращающийся двигатель с низкой скоростью вращения (с ШИМ, установленным на 150)
    delay(1400);               // подождите x секунд
    analogWrite(LPWM, 0);     // раскомментируйте, если вы хотите остановить двигатель сейчас
    analogWrite(LPWM2, 0);     // раскомментируйте, если вы хотите остановить двигатель сейчас 
  } 


  else if(digitalRead(downPin)==LOW){ //проверить, нажата ли кнопка втягивания
    analogWrite(LPWM, 0);
    analogWrite(LPWM2, 0);
    analogWrite(RPWM, 254); // вращать двигатель с максимальной скоростью (с ШИМ, установленным на 255)
    analogWrite(RPWM2, 255); // вращать двигатель с максимальной скоростью (с ШИМ, установленным на 255)
    delay(3000);               // ожидание
    analogWrite(RPWM, 170); // вращение двигателя с низкой скоростью (с ШИМ, установленным на 150)
    analogWrite(RPWM2, 170); // вращающийся двигатель с низкой скоростью вращения (с ШИМ, установленным на 150)
    delay(1500);               // ожидание
    analogWrite(RPWM, 80); // вращение двигателя с низкой скоростью (с ШИМ, установленным на 150)
    analogWrite(RPWM2, 80); // вращающийся двигатель с низкой скоростью вращения (с ШИМ, установленным на 150)
    delay(1500);               // подождите x секунд
    analogWrite(RPWM, 0);     // раскомментируйте, если вы хотите остановить двигатель сейчас
    analogWrite(RPWM2, 0);     // раскомментируйте, если вы хотите остановить двигатель сейчас  
  } 

  else{ //если ни одна кнопка не нажата, оставайтесь неподвижными
    analogWrite(RPWM, 0); 
    analogWrite(LPWM, 0);
    analogWrite(RPWM2, 0);
    analogWrite(LPWM2, 0);
  }
}

, 👍1

Обсуждение

вам нужно будет реализовать скетч конечного автомата... https://duckduckgo.com/?q=arduino +fsm&ia=web ... кроме того, изучите скетч примера blinkWithoutDelay, чтобы узнать, как отсчитывать время событий неблокирующим способом, чтобы программа могла реагировать на нажатия и отпускания кнопок во время движения двери, @jsotola

начните с составления списка всех возможных состояний , которые есть у двери ... например, закрыто, открыто, закрывается быстро, закрывается медленно, останавливается посередине ... присвоите каждому состоянию номер... нарисуйте диаграмму и укажите , что происходит в каждом состоянии и что вызывает переход из одного состояния в другое ... https://www.instructables.com/Arduino-Traffic-Lights-Using-Finite-State-Machines/, @jsotola


1 ответ


1

Вы можете сделать это легко, используя встроенную функцию ШИМ Arduino и функцию задержки. Но помните, что использование задержки в вашем коде заблокирует ваш код, так что если ваша программа просто хочет сидеть и ждать 3 секунды на некоторой скорости, то задержка в порядке для вас, иначе вам нужно реализовать функцию Millis.

сначала вам нужно определить различные скорости в соответствии с вашими требованиями помните, что функция PWM имеет значение от 0-255, где 0 в минимальной скорости и 255-максимальная скорость. Поэтому здесь я определю speed1 для максимальной скорости и speed2 для низкой скорости Итак, теперь ваша программа будет выглядеть следующим образом

int RPWM = 10; //подключите вывод Arduino 10 к IBT-2 pin RPWM
int LPWM = 11; //подключите вывод Arduino 11 к IBT-2 pin LPWM
int downPin = 12; 
int upPin = 13;
int speed1 = 255; // Максимальная скорость вы можете изменить ее между [0-255]
int speed2 = 150; // Низкая скорость вы можете изменить его между [0-255]

void setup() {
  pinMode(RPWM, OUTPUT);
  pinMode(LPWM, OUTPUT);
  pinMode(downPin, INPUT_PULLUP);
  pinMode(upPin, INPUT_PULLUP);
}

void loop() { 
  if(digitalRead(upPin)==LOW){ //проверить, нажата ли кнопка расширения
    analogWrite(RPWM, 0);
    analogWrite(LPWM, speed1); // вращать двигатель с максимальной скоростью (с ШИМ, установленным на 255)
    delay(3000);               // wait for 3 sec
    analogWrite(LPWM, speed2); // rotate motor with low speed (with PWM set to 150)
    delay(2000);               // ждать 2 секунды
   // analogWrite(LPWM,0); // раскомментируйте, если вы хотите остановить двигатель сейчас 
  } 

  else if(digitalRead(downPin)==LOW){ //проверить, нажата ли кнопка втягивания
    analogWrite(LPWM, 0);
    analogWrite(RPWM, speed1); // вращать двигатель с максимальной скоростью (с ШИМ, установленным на 255)
    delay(3000);               // ожидание аналоговой записи в течение 3
    analogWrite(RPWM, speed2); // вращение двигателя с низкой скоростью (с ШИМ, установленным на 150)
    delay(2000);               // wait for 2 sec
    // analogWrite(RPWM,0); // раскомментируйте, если вы хотите остановить двигатель сейчас 
  } 

  else{ //если ни одна кнопка не нажата, оставайтесь неподвижными
    analogWrite(RPWM, 0); 
    analogWrite(LPWM, 0);
  }
}
,

Отлично! Спасибо за вашу помощь! В конце концов я, возможно, захочу использовать millis (), но пока это работает довольно хорошо. Опубликую окончательный код в качестве дополнения выше., @Chris Groat

Приятно это слышать, Крис., @dharmik