На этом уроке мы научимся управлять двигателем постоянного тока с помощью реле.
На этом уроке мы научимся управлять двигателем постоянного тока с помощью реле.
Рассмотрим схему, представленную ниже. Катушка является частью реле. Когда транзистор отключит источник электричества от реле, то ток в катушке не сможет измениться мгновенно и это может привести к перенапряжению на источнике питания. Чтобы избежать этого, подключим диод параллельно катушке.
Подключим к выводу 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() возвращает количество миллисекунд прошедших с момента начала работы программы в микроконтроллере.
Скомпилируйте и загрузите получившийся скетч на плату, чтобы увидеть результат.