Управление двигателем постоянного тока 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);// включить или выключить светодиод

}// цикл заканчивается

, 👍1

Обсуждение

у вас нет кода ИК-датчика, @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


1 ответ


2

У вас есть общее представление.

Ваш код выглядит немного загроможденным. Комментарии не являются частью программы, держите их подальше от кода.

Инструкции 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);                // перевести моторное состояние в действие

} 

,