logo
+7 (951) 999-89-94
428003, г. Чебоксары, ул. Федора Гладкова, д.9, оф.319
28.04.2019

Управление двигателем постоянного тока с помощью реле

Управление двигателем постоянного тока с помощью реле

На этом уроке мы научимся управлять двигателем постоянного тока с помощью реле.

Компоненты

  • Плата Arduino Uno
  • Макетная плата
  • USB кабель
  • Батарейный отсек типа AA
  • Резистор 10 кОм (2 шт.)
  • Резистор 1 кОм
  • Резистор 220 Ом
  • NPN транзистор
  • Реле
  • Двигатель
  • Тактовая кнопка
  • Светодиод
  • Диод

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

Схема

Подключим к выводу D12 контроллера тактовую кнопку. Вывод D9 будем использовать для управления реле. Нам понадобится два элемента питания (батарейки типа AA) для питания двигателя.

Соединение компонентов

Скетч

Напишем скетч в котором при каждом нажатии кнопки будет изменяться состояние реле. Таким образом мы будем управлять нашим двигателем.

int relayPin = 9;
int buttonPin = 12;
 
int buttonState = HIGH;
int relayState = LOW;
int lastButtonState = HIGH;
 
long lastChangeTime = 0;
 
void setup() { 
  pinMode(buttonPin, INPUT);
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, relayState);
  Serial.begin(115200);
}
 
void loop() {
  int nowButtonState = digitalRead(buttonPin);

  if (nowButtonState != lastButtonState) {
    lastChangeTime = millis();
  } 

  if (millis() - lastChangeTime > 10) {
    if (buttonState != nowButtonState) {
      buttonState = nowButtonState;
      if (buttonState == LOW) {
        relayState = !relayState;
        digitalWrite(relayPin, relayState);
        Serial.println("Button is Pressed!");
      }
      else {
        Serial.println("Button is Released!");
      }
    }
  }
  lastButtonState = nowButtonState;
} 

В этом скетче мы использовали новый способ чтения состояния кнопки (оно контролируется постоянно). Как только кнопка нажимается, программа меняет состояние реле и запоминает время этого события. Чтобы изменить состояние реле, нужно нажать и удерживать кнопку более 10-и микросекунд. Такой метод мы применили для избежания дребезга контактов.

Для начала необходимо задать две переменные, которые будут отвечать за кнопку и реле.

int buttonState = HIGH;
int relayState = LOW;

Объявим переменную, запоминающую последнее состояние кнопки.

int lastButtonState = HIGH;

Объявим переменную, запоминающую время последнего изменения состояния кнопки.

long lastChangeTime = 0;

В функции loop() контролируется состояние кнопки и оно сравнивается с предыдущим состоянием. Если состояние кнопки изменяется, то запоминается время этого события.

void loop() { 
  int nowButtonState = digitalRead(buttonPin);
  if (nowButtonState != lastButtonState) { 
    lastChangeTime = millis(); 
  } 
… 
  lastButtonState = nowButtonState;
}

Если нажимать кнопку до истечения заданного времени 10 мс, то состояние кнопки изменяться не будет.

  if (millis() - lastChangeTime > 10) { 
    … 
  } 

Если состояние кнопки осталось неизменным, то ждем следующий цикл программы и повторяем все сначала.

    if (buttonState != nowButtonState) {
      buttonState = nowButtonState; 
      … 
    } 

Информации о нажатии кнопки передается в Serial порт.

      if (buttonState == LOW) {
        relayState = !relayState;
        digitalWrite(relayPin, relayState);
        Serial.println("Button is Pressed!"); 
      } 
      else {
        Serial.println("Button is Released!"); 
      } 

Функция millis(), которую мы применили для контроля состояния кнопки, не задерживает выполнение вашей программы, как это происходит в случае использования функции delay().

Функция millis() возвращает количество миллисекунд прошедших с момента начала работы программы в микроконтроллере.

Скомпилируйте и загрузите получившийся скетч на плату, чтобы увидеть результат.

 

Предыдущий урок | В начало | Следующий урок