Управление двигателем постоянного тока ARDUINO через ИК-датчик INPUT
Я работаю над школьным проектом, в рамках которого строю небольшой ленточный конвейер, используя ARDUINO, двигатель постоянного тока и ИК-датчик для обнаружения движущихся объектов, чтобы мой датчик цвета мог считывать значение цвета.
Я использую один MOSFET IRFZ44N для управления двигателем постоянного тока. Я могу управлять двигателем постоянного тока, используя MOSFET, как обычно, включая и выключая его, используя цифровую запись с помощью arduino.
Итак, я хочу остановить конвейерную ленту на 500 мс, когда ИК-датчик обнаружит ВЫСОКИЙ уровень, и позволить датчику цвета считать цвет объекта, а затем позволить объекту нормально двигаться вперед по ленте. Я написал ниже код, но ИК-датчик обнаруживает объект, но двигатель никогда не останавливается.
#define IR_COLOR 34
const int MOTORpin = 32;
const long onDuration = 1000;// время выключения светодиода
const long offDuration = 1000;// время включения светодиода
int MOTORState =HIGH;// начальное состояние светодиода
boolean MOTOROnFlag = true;
long rememberTime=0;
void setup() {
pinMode(IR_COLOR, INPUT);
pinMode(MOTORpin,OUTPUT);// определяем MOTORpin как выход
digitalWrite(MOTORpin,MOTORState);// устанавливаем начальное состояние
}
void loop() {
int state = digitalRead(IR_COLOR);
if( state == false )
{
if( (millis()- rememberTime) >= onDuration){
MOTORState = LOW;
rememberTime=millis();
}
}
else if(state == true)
{
if( (millis()- rememberTime) >= offDuration){
MOTORState =HIGH;// меняем состояние светодиода
rememberTime=millis();// запомнить текущее время в миллисекундах()
}
}
digitalWrite(MOTORpin,MOTORState);// включить или выключить светодиод
}// цикл заканчивается
@Sunny Gavali, 👍1
Обсуждение1 ответ
У вас есть общее представление.
Ваш код выглядит немного загроможденным. Комментарии не являются частью программы, держите их подальше от кода.
Инструкции if
сокращаются до if (true)
, что означает, что часть == true
является избыточной.
Все, что вам нужно, это if(state)
. Блок if
будет выполняться, когда state
истинно.
И наоборот, if (!state)
проверяет, является ли state
ложным
Если есть только два возможных значения, то else if(state == true)
может быть просто else
.
Идентичный код, который находится в обеих частях блока if-else
, должен быть перемещен за пределы блока, rememberTime=millis();
должен быть перемещен после закрывающая фигурная скобка }
блока if-else
.
Вот код, который делает то, что вы хотите.
Этот код не тестировался на аппаратном устройстве.
https://wokwi.com/projects/364353854313747457
const int sensor_blocked = LOW; // определяем значения датчиков
const int sensor_clear = HIGH;
const int motor_on = HIGH;
const int motor_off = LOW;
const int master_enable = 2;
const int motor_pin = 3;
const int sensor_pin = 12;
int sensor_state;
int sensor_previous = sensor_clear;
int motor_state = motor_on;
unsigned long millis_previous = 0;
unsigned long millis_now;
const long interval = 500;
void setup() {
pinMode(master_enable, INPUT_PULLUP);
pinMode(sensor_pin, INPUT_PULLUP);
pinMode(motor_pin, OUTPUT);
}
void loop() {
sensor_state = digitalRead( sensor_pin );
// ------------------------------------------------ -------------------------------------------------- -
if ( sensor_state != sensor_previous ) { // запускаем этот код только при изменении состояния датчика
sensor_previous = sensor_state; // запоминаем новое состояние датчика
if ( sensor_state == sensor_blocked ) { // датчик заблокировался
motor_state = motor_off; // выключаем двигатель
millis_previous = millis(); // начало "двигатель выключен" интервал
}
delay(20); // датчик подавления дребезга
}
// ------------------------------------------------ -------------------------------------------------- -
if ( motor_state == motor_off ) { // проверка таймера актуальна только при выключенном двигателе
millis_now = millis();
if ( millis_now - millis_previous >= interval ) { // проверяем, не истек ли срок действия таймера
motor_state = motor_on; // включить двигатель
}
}
// ------------------------------------------------ -------------------------------------------------- -
if ( digitalRead( master_enable ) != LOW ) motor_state = motor_off; // главный переключатель
// ------------------------------------------------ -------------------------------------------------- -
digitalWrite(motor_pin, motor_state); // перевести моторное состояние в действие
}
- Чтение данных из Google Таблиц с помощью Nodemcu
- Пытаюсь прошить ESP8266 с помощью Arduino UNO
- Сдвиг уровня 5В <-> 3,3В
- Как далеко может стоять HC-SR04 от микроконтроллера?
- Правильный выбор источника питания для Arduino - ESP8266 - HC-SR04
- Подключите реле 5 В к плате ESP32 WROVER B
- Мой Arduino дымит каждый раз, когда я подключаю к нему настенный адаптер переменного/постоянного тока. Может ли кто-нибудь помочь мне исправить это?
- Код точки доступа ESP32 не компилируется
у вас нет кода ИК-датчика, @jsotola
@jsotola IR_COLOR — это ИК-датчик., @Sunny Gavali
что такое IR_RED тогда?, @jsotola
@jsotola Это было сделано для будущей работы, но первоначальная задача не завершена: остановить штифт двигателя на 500 мс и снова запустить двигатель. Двигатель останавливается, когда ИК-датчик обнаруживает объект , но остается выключенным, так как объект все еще находится перед ИК-датчиком., @Sunny Gavali
так как вы назовете датчик цвета? ... похоже, вы используете запутанные имена, @jsotola
вставьте разделительный слой между датчиком и двигателем ... используйте флаг «запуск» ... установите его в начале ... датчик сбрасывает флаг и запускает таймер ... истечение времени таймера устанавливает флаг .... дальше в коде, если флаг установлен, то запустить двигатель, @jsotola
@jsotola Я использую всего 5 ИК-датчиков и 1 датчик цвета. поскольку IR_COLOR — это первый ИК-датчик, близкий к датчику цвета, поэтому я назвал его IR_COLOR. Так что для меня это не большая проблема. Я буду называть датчик цвета чем-то COLOR_Sen., @Sunny Gavali
@jsotola Пожалуйста, не могли бы вы предоставить демо-код, связанный с флагом для arduino? Вы также можете редактировать мой код, если хотите!, @Sunny Gavali
вы уже используете переменную флага в своем коде... она называется
state
, @jsotolaДА! Меня это немного смущает! не могли бы вы вставить свою логику очистки флага датчиком в мой код?, @Sunny Gavali
выберите значение для
set
и значение дляclear
... true/false ... HIGH/LOW ... 1/-1 ... 10/20 ... "abc"/"xyz" . .. и т.д. и т.д. ... прямо сейчас ваш код использует HIGH и LOW ... true/false наиболее удобен, потому что операторыif
работают с true/false ...if (состояние) {}
иесли ( !состояние ){}
, @jsotolaиспользуйте ручку и бумагу... напишите описание желаемого поведения словами... что-то вроде "если датчик НИЗКИЙ, то снимите флажок"... четкое описание почти напрямую переводится в код, @jsotola
Я немного отредактировал свой код и вот он! Я не понимаю флаги Arduino, поэтому я хотел, чтобы вы отредактировали мой базовый код с помощью флагов! Вот моя отредактированная ссылка на код: https://drive.google.com/file/d/1ulzu5nnARIugKC4R7LD0-OWzkvYRSgdi/view?usp=sharing, @Sunny Gavali
нет такой вещи, как «флаги arduino»… это программирование на C или C++… вы уже используете переменную флага в своем коде… имя флага — «состояние»… значение флага переменная управляет двигателем
if (state == LOW) digitalWrite(Motor, LOW);
... Я не знаю, включает ли это двигатель или выключает... Я не буду ничего скачивать с Google диска, @jsotola@jsotola Действительно! Но проблема заключается во времени! Поскольку объект достигает ИК-датчика, ESP32 выключает двигатель, как указано в коде, но я хочу, чтобы он оставался выключенным в течение нескольких мс, например, 500 мс, а через 500 мс ESP32 должен снова запустить двигатель, даже если ИК-датчик обнаруживает объект! Как я могу перевести это в код для arduino?, @Sunny Gavali
@jsotola Я отредактировал код в своем основном посте! Вы можете проверить это для справки!, @Sunny Gavali