Каталог

Кнопка включения питания для Ардуино

Кнопка включения АрдуиноПро подключение полевых транзисторов к Ардуино написано немало статей. Они помогают включать мощную нагрузку или, наоборот, отключать питание компонентов устройства для энергосбережения. Есть ещё одно интересное их применение, которое освещается значительно реже. Это программное отключение питания всего устройства (в том числе Ардуино / микроконтроллера) и включение его при нажатии на кнопку. Разумеется, речь о кнопке без фиксации. О том, как это реализовать, и пойдёт речь в данной публикации.

Принцип работы

Идея довольно простая: питание на Ардуино и остальную периферию подаётся через ключ, в роли которого будет использоваться полевой МДП транзистор (MOSFET). В обычном состоянии транзистор удерживается закрытым, ток через него не течёт и устройство выключено. Чтобы включить устройство, необходимо открыть транзистор, нажав на кнопку. Чтобы в дальнейшем он не закрылся при отпускании кнопки, эстафету перенимает уже включившаяся Ардуино. Она выставляет на одном из цифровых выводов сигнал нужного уровня для удержания транзистора в открытом состоянии. При снятии этого сигнала транзистор закроется и устройство выключится.

Схема

Реализовать описанное поведение можно разными способами. Кто-то скажет, что достаточно пары резисторов и одного MOSFET’а, затвором которого управляет Ардуино. Такой вариант не всегда окажется рабочим: может получиться так, что транзистор не закроется полностью и продолжит питать Ардуино. Более надёжной является схема, в которой полевой транзистор управляется биполярным. Пример такого ключа и его подключение к Ардуино представлены ниже:

Включение Ардуино кнопкой. Схема

Здесь P-канальный MOSFET Q1 открывается либо кнопкой, либо биполярным NPN транзистором Q2. Последний открывается при подаче на базу логической единицы через токоограничивающий резистор R2. Подтягивающий резистор R1 нужен для удержания полевого транзистора в закрытом состоянии при отсутствии управляющего сигнала.

Выбор в пользу P-канального полевого транзистора обусловлен тем, что он позволяет отключать от нагрузки линию Vcc. N-канальный транзистор отсоединяет землю - это не лучший вариант для схем управления питанием.

О выборе компонентов и номиналов. Полевой транзистор следует выбирать с малым сопротивлением канала (параметр Rds). Также обратите внимание на его предельные значения напряжения сток-исток (Vds) и тока (Id), они должны соответствовать требованиям устройства. У меня из P-канальных под рукой только CJ2301 в smd корпусе, он рассчитан на напряжение 20В и ток до 2.3А, сопротивление канала составляет 0.09Ом – этого вполне достаточно для многих устройств на Ардуино. В качестве Q2 подойдёт, пожалуй, любой биполярный транзистор малой мощности. Например, популярный 2N3904. Что касается номиналов резисторов, то я использую порядка 50кОм.

Скетч

Задача скетча описана ранее в принципах работы: сразу после включения выставить значение HIGH на цифровом выводе, в данном случае D2. После этого можно выполнять какие-либо действия: опрашивать датчики, выводить информацию и тому подобное. А когда мы решим выключить питание, изменяем состояние вывода D2 на LOW. Пример такого скетча приведён ниже. Для демонстрации его работы я добавил в схему текстовый LCD дисплей.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

#define PIN_POWERON 2 // Пин управления питанием

void setup() {
  // Первым делом настраиваем пин PIN_POWERON как OUTPUT
  // и выставляем на нём высокий уровень
  pinMode(PIN_POWERON, OUTPUT);
  digitalWrite(PIN_POWERON, HIGH);

  // Дальше делаем что нам нужно
  lcd.begin();
  lcd.print("Shutdown after");
  for (uint8_t i = 3; i > 0; i--) {
    lcd.setCursor(7, 1);
    lcd.print(i);
    delay(1000);
  }
  
  // А когда решим выключить питание, выставляем LOW
  digitalWrite(PIN_POWERON, LOW);
}

void loop() {

}

Другой вариант схемы

Рассмотрим еще один вариант схемы включения питания. От предыдущего он отличается тем, что кнопка подключена к выводу Ардуино и её можно опрашивать. Таким образом, включение может осуществляться одной из кнопок, уже используемых в устройстве.

Здесь вывод D3, подключенный к кнопке, "изолирован" от полевого транзистора биполярным транзистором Q3 и не мешает ему закрываться при отсутствии управляющего сигнала. При нажатии на кнопку, во-первых, откроется транзистор Q3 и затем Q1 (если он ещё не открыт), т.е. будет включено питание устройства; во-вторых, сигнал на входе D3 изменится от LOW к HIGH, что может быть зафиксировано при его опросе.

Резистор R4 между кнопкой и линией питания необязателен. Но если вывод D3 по ошибке будет настроен как OUTPUT и на нём будет значение LOW, то при нажатии на кнопку через него потечет ток и он не будет ничем ограничен. Напоминаю, что предельно допустимый ток через вывод AVR микроконтроллеров составляет 40мА. И его превышение приведёт к повреждению микроконтроллера. Резистор между кнопкой и Ардуино поможет избежать этого.

Логика скетча для данной схемы не отличается от предыдущего. Высокий уровень на выводе D2 удерживает полевой транзистор открытым. А с кнопкой работаем как обычно: можем опрашивать её в скетче или использовать для генерации прерываний.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

#define PIN_POWERON 2 // Пин управления питанием
#define PIN_BTN 3 // Пин кнопки

void setup() {
  // Настраиваем пин PIN_POWERON как OUTPUT и выставляем на нём высокий уровень
  pinMode(PIN_POWERON, OUTPUT);
  digitalWrite(PIN_POWERON, HIGH);

  lcd.begin();
  lcd.print("Push to shutdown");
  while (digitalRead(PIN_BTN) == HIGH); // На случай, если кнопку ещё не отпустили
  while (digitalRead(PIN_BTN) == LOW);  // Ожидаем нажатия кнопки для продолжения

  lcd.clear();
  lcd.print("Shutdown after");
}

void loop() {
  unsigned long tm;
  // По завершении цикла for питание будет выключено
  for (uint8_t i = 5; i > 0; i--) {
    lcd.setCursor(7, 1);
    lcd.print(i);
    tm = millis();
    while (millis() - tm < 1000) {
      if (digitalRead(PIN_BTN) == HIGH) return; // Нажатие на кнопку начинает цикл заново
    }
  }

  // Выключаем питание, установив LOW на выводе PIN_POWERON
  digitalWrite(PIN_POWERON, LOW);
}

Где это может пригодиться

Описанные способы управления питанием отлично подойдут для устройств, работающих на батарейках или аккумуляторах, если вы хотите использовать в них плату Ардуино, а не отдельный микроконтроллер. И даже в случае использования микроконтроллера это всё ещё хорошая альтернатива спящему режиму, поскольку отключаются сразу все компоненты устройства.

Ещё один вариант использования приведённых схем - это включение питания при удержании кнопки нажатой: достаточно добавить задержку на пару секунд в начало функции setup. Если за это время кнопка не будет отпущена, то питание будет удерживаться уже самой Ардуинкой - хороший приём для избежания случайных включений устройства.

footer shadow
Контакты

г. Москва, Пятницкое ш. д. 18, пав. 566

zakaz@compacttool.ru

8-495-752-55-22

compacttool logoadaptive site

accepted payment systems

Информация представленная на данном информационном ресурсе преследует исключительно рекламные цели и не является договором-офертой !

© Все права защищены 2015 - 2024г https://compacttool.ru