Как привести линейный привод в действие на разных скоростях в течение заданных периодов времени
Я новичок в 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);
}
}
@Chris Groat, 👍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
- Печать string and integer LCD
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Отправьте несколько значений int из Python в Arduino, используя pySerial
- Глобальные переменные занимают много места в динамической памяти.
- (Код ультразвукового датчика: такого файла или каталога нет)
- rfid_default_keys проверить с помощью RC522
- Команда strtok() с Serial связью
вам нужно будет реализовать скетч
конечного автомата
... https://duckduckgo.com/?q=arduino +fsm&ia=web ... кроме того, изучите скетч примера blinkWithoutDelay, чтобы узнать, как отсчитывать время событий неблокирующим способом, чтобы программа могла реагировать на нажатия и отпускания кнопок во время движения двери, @jsotolaначните с составления списка всех возможных состояний , которые есть у двери ... например, закрыто, открыто, закрывается быстро, закрывается медленно, останавливается посередине ... присвоите каждому состоянию номер... нарисуйте диаграмму и укажите , что происходит в каждом состоянии и что вызывает переход из одного состояния в другое ... https://www.instructables.com/Arduino-Traffic-Lights-Using-Finite-State-Machines/, @jsotola