Как я могу заставить мой atmega328 работать в течение года на батареях?

Сценарий

Я создал хороший электронный дверной замок для своей комнаты в общежитии. В настоящее время это Arduino Diecimila с сервоприводом, который [раз]блокирует дверь. Он имеет цифровую клавиатуру с 3x4 кнопками и 5 светодиодами (2 пары последовательно и один светодиод). В настоящее время он также работает от зарядного устройства для мобильного телефона.

Теперь я переделал его для работы на автономном Arduino (ATmega328), но мне бы очень хотелось, чтобы он работал от батареек типа АА или даже от 9-вольтовой батареи.

Что касается программной части, я решил, что могу поместить sleepвызовы в определенное время внутри метода цикла, чтобы максимально снизить энергопотребление ATmega. И пусть светодиод "вспыхивает" с как можно более долгим выключенным временем.

Вопрос 1

Когда кнопка нажата в течение нескольких миллисекунд, пока плата находится в спящем режиме, будет ли она «запоминаться»/«удерживаться» до тех пор, пока не выйдет из спящего режима, а затем будет воспринята как нажатие кнопки?

Как лучше всего справиться с нажатием этой кнопки во время сна? Могу ли я закодировать его, чтобы он просыпался при нажатии кнопки, или я должен просто позволить ему спать, например, 10 мс. в каждом цикле?

вопрос 2

Как бы я подошел к математике расчета того, сколько батареек типа АА необходимо для работы этого устройства в течение 10 месяцев?

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

Устройство

Мое устройство дверного замка

Ответы (7)

Atmega328 обеспечивает шесть режимов энергосбережения, упорядоченных от минимального до отличного (приблизительное потребление тока из этого сообщения на форуме ):

  • SLEEP_MODE_IDLE: 15 мА
  • SLEEP_MODE_ADC: 6,5 мА
  • SLEEP_MODE_PWR_SAVE: 1,62 мА
  • SLEEP_MODE_EXT_STANDBY: 1,62 мА
  • SLEEP_MODE_STANDBY: 0,84 мА
  • SLEEP_MODE_PWR_DOWN: 0,36 мА

Цитирую исходный вопрос:

Я подумал, что могу поместить sleepвызовы в определенное время внутри метода цикла "

Вам нужно будет использовать sleep_cpu()после настройки требуемый спящий режим из списка выше. На Arduino Playground есть полезный пост об этом .

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

Дополнительную экономию электроэнергии можно получить, выполнив следующие действия:

  • Используйте внутренний генератор микроконтроллера и низкую тактовую частоту (8 МГц вместо 16), но убедитесь, что код, связанный со временем и синхронизацией, по-прежнему работает должным образом. Для этого может понадобиться другая версия загрузчика.
  • Не оставляйте светодиоды включенными надолго, если они используются приложением. Использование быстрых двойных или тройных вспышек короткой продолжительности (0,05 секунды вкл., 0,5 секунды выключения) с промежутками в несколько секунд между ними обеспечивает заметную индикацию при минимальном потреблении энергии.
  • Используйте импульсный стабилизатор вместо линейного, если требуется регулятор.
  • Запустите микроконтроллер при более низком напряжении, если оно поддерживается, 3,0 В (например, литиевый элемент CR2032, регулятор не требуется) или 3,3 В вместо 5 В.
  • Следуйте рекомендациям в техническом описании для неиспользуемых настроек входных и выходных контактов для минимального энергопотребления.

Включение этих предложений позволяет запускать приложения микроконтроллера в течение нескольких недель или месяцев на одном элементе типа «таблетка» CR2032 и в течение многих лет на литиевом элементе типа LR123. Конечно, ваш пробег может варьироваться в зависимости от того, какие датчики, выходы и фактическая обработка требуются вашему приложению.

Некоторые полезные ссылки:

По моему опыту, в SLEEP_MODE_PWR_DOWN вы можете уменьшить его до 0,1 мкА до 6,0 мкА, если вы умно отключили каждую мелочь (например, обнаружение отключения). Я создал сборки, потребляющие менее 60 мкА, которые работают 3-5 лет на наборе щелочных батареек типа АА.
@TimEckel Я без ума от индикации состояния с помощью светодиодов - это съедает бюджет энергии, как будто это вышло из моды.
Это не обязательно. Используйте мощные светодиоды с высоким сопротивлением. Будет использовать долю мА вместо более 20 мА. Кроме того, светодиод состояния мигает в течение 5–15 мс каждые несколько секунд, а не горит постоянно. У меня был дешевый тусклый светодиод состояния, который потреблял 30 мА, я заменил его на мощный светодиод с резистором 3,3 кОм, который я мигал в течение 15 мс каждые 8 ​​секунд. Пошел от 30 мА до 2,9 мкА среднего тока, 1/1000 мощности!
@TimEckel Вы явно не понимаете степени моей страсти к мигающим огням :-D Не то чтобы я хотел уменьшить интенсивность, мне нравятся эти мелочи, сверкающие, как пламя Аида, к черту бюджет мощности! А если серьезно, то я знаю об этих маленьких хитростях и, по сути, придумал несколько собственных, которые увеличивают воздействие визуальной сигнализации при одновременном снижении мощности через светодиоды. Предыдущий комментарий был ( лишь частично ) шуткой, в дополнение к множеству забавных вопросов о светодиодах, на которые я отвечаю здесь.
Я измерил энергопотребление ATMega328P при разных напряжениях и частотах и ​​составил эту диаграмму docs.google.com/spreadsheets/d/…

Прямо сейчас у меня на столе стоит Arduino Pro Mini, который работает от 2 батареек типа АА и при необходимости может работать более года.

Есть три аспекта дизайна, которые достигли этого.

1. Другой регулятор

Я использую бустер регулятор LTC3525. Он имеет очень низкий ток покоя (7 мкА) и высокую эффективность (> 90% при 0,2 мА). Что-то вроде этой платы sparkfun https://www.sparkfun.com/products/8999 должно выполнять аналогичную работу. Обязательно подключите его к контакту 5V на Arduino, а не к VIN, чтобы регулятор Arduino не использовался.

2. Спи-и-и-и

Доля времени, в течение которого устройство активно, будет небольшой. В остальное время устройство должно находиться в спящем режиме SLEEP_MODE_POWER_DOWN. Вы можете основывать свои программы сна на базе библиотеки Rocketscreem Low Power Library . В соответствии с этой ссылкой вы сможете снизить его до 1,7 мкА с отключенными АЦП, БПК и WDT и в режиме отключения питания.

3. Прерывания

Другая половина сна прерывается, чтобы разбудить его. В спящем режиме Power Down прерывания только по уровню на INT1 и INT2, TWI совпадают, и WDT активирует его. Поэтому вам нужно подключить кнопку к INT1 или INT2, чтобы нажатие кнопки разбудило его.

Другие вещи:

Выключите все светодиоды, если в этом нет крайней необходимости. Если замок находится в помещении, светодиоды не должны быть яркими, что экономит больше энергии. Кроме того, если вам нужно, чтобы MCU регулярно выполнял какую-либо задачу, используйте сторожевой таймер, чтобы периодически пробуждать его.

Редактировать:

Один из методов, который может сработать, — использовать описанную выше библиотеку Low Power и спать, скажем, 60 мс в каждом цикле благодаря сторожевому таймеру. При пробуждении проверьте нажатие кнопки. Функция для вызова будет

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);

Все эти комментарии в точку. Я хотел бы добавить еще несколько предложений:

1) Для светодиодов используйте светодиоды с высоким выходным током 20 мА. Вот логика. Допустим, вам нужен тусклый светодиод состояния, который мигает каждые 8 ​​секунд. Вы не хотите, чтобы он был ярким, поэтому вы используете случайный светодиод. Проблема в том, что тусклый светодиод по-прежнему использует 20 мА (или больше) для вывода только 100 мкд. Вместо этого возьмите светодиод с высокой выходной мощностью, который по-прежнему рассчитан на 20 мА, но может выдавать 4000 мкд (убедитесь, что вы смотрите на угол выхода, вы, вероятно, хотите, чтобы он составлял 30 градусов или больше). С этим светодиодом на 4000 мкд вы подключаете его к чему-то вроде резистора на 3,3 кОм, и вы получаете световой поток около 100 мкд, но потребляете менее 1 мА. Таким образом, вместо того, чтобы использовать 20 мА для светодиода состояния, вы используете долю одного мА. Я также обычно устанавливаю время мигания светодиода состояния всего на 5-15 мс, что также может сэкономить много энергии, если раньше у вас было время включения вспышки на 100 мс.

2) Я предпочитаю стабилизатор напряжения Microchip MCP1700. Он потребляет всего 1,6 мкА тока покоя и очень дешев (около 0,30 доллара в небольших количествах). Единственным ограничением является то, что максимальное входное напряжение составляет всего 6 вольт, поэтому вы не можете использовать 9-вольтовую батарею. Но он идеально подходит для 4 батареек типа АА, одной литий-полимерной батареи или двух литиевых батарей типа «таблетка».

3) Для питания схемы ATmega с 4 батареями AA я обычно использую диод 1N4001 на VCC, чтобы понизить максимальное напряжение 6 вольт 4 батарей до 5,5 вольт. Кроме того, диод защищает ATmega от обратного напряжения, поэтому он служит двум полезным целям. Делая это, я могу создать схему с батарейным питанием, которая может потреблять всего 0,1 мкА во время сна, поскольку регулятор напряжения не потребляет ток все время.

Я провел тест на голом atmega328P-PU на макетной плате с использованием библиотеки RocketScream LowPower.

Использовал этот скетч:

#include "LowPower.h"

void setup(){}

void loop()
{
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);         
    delay(5000);
}

С uCurrent Gold я измерил 7,25 мкА в режиме отключения питания.

Хороший! Я попробую это как можно скорее. Позволяет ли это годами работать atmega238 с батареей CR2032?

Здесь есть два вопроса, но только второй является частью заголовка вопроса, поэтому, вероятно, будет лучше, если вы откроете еще один для вопроса о программировании Arduino. Я отвечу здесь на второй вопрос.

Одна топовая щелочная батарея AA 1,5 В имеет емкость около 2600 мАч. Если вы выберете литиевые батареи, вы можете получить около 3400 мАч, если вам повезет. Давайте возьмем эту цифру за основу для абсолютного наилучшего случая.

То, как вы рассчитываете теоретическое максимальное время работы для нагрузки, — это просто емкость, деленная на нагрузку. Если ваша нагрузка составляет 1 мА, вы можете проработать ее 3400/1 = 3400 часов = 141 день = ~ 5 месяцев. Однако это только теоретический максимум , так как за это время вы начнете получать значительное падение напряжения примерно на 65%. Если вы регулируете выход, вы получите эффект разгона, когда чем ниже напряжение батареи, тем выше ток, необходимый для поддержания регулируемого напряжения, что быстрее разряжает батарею. Я был бы удивлен, если бы вы могли получить от него более 80% заявленной емкости при достаточно высоком напряжении, чтобы запустить ваше устройство.

Итак, предположим, что вы получаете 80% этого времени после падения напряжения и неэффективности регулятора. Предположим, что вы работаете с напряжением 3,3 В от трех последовательно соединенных батарей. Это по-прежнему даст вам ту же емкость, но напряжения будет достаточно для регулятора. Если ваше устройство работает на токе 15 мА (это довольно консервативная оценка), цифры будут выглядеть так:

  • Емкость после КПД 80% = 3400 * 0,8 = 2720 мАч
  • Время = 2720/15 = 181 час = 7,54 дня.

Таким образом, вам потребуется около 144 литиевых батарей (48 комплектов по 3 штуки), чтобы проработать его в течение года. Не так хорошо, как хотелось бы!

Вместо этого я бы предложил использовать регулируемый источник постоянного тока от сети. Может быть включен резервный аккумулятор, который легко настроить с помощью реле SPDT - просто подключите катушку к сети постоянного тока и подключите контакт «выключения» к аккумулятору. При выходе из строя постоянного тока контакт размыкается, и вместо него используется батарея.

Мои беспроводные мечты разбились ;) Спасибо за подробный ответ. Мне тоже этот вариант показался оптимальным.
По совпадению, это был тот же вопрос, который я задавал себе при разработке электронного дверного замка. Даже с массивной аккумуляторной батареей емкостью 10 000 мАч оно того не стоило. В итоге в качестве резервной копии я использовал адаптер постоянного тока на 250 мА и аккумулятор старого мобильного телефона.
Среднее значение 15 мА звучит для меня не очень консервативно! 328-й может работать на одноразрядных микроамперах в спящем режиме, и, конечно же, вам может сойти с рук, по крайней мере, полуглубокий сон большую часть времени. Кроме того, на низких частотах (например, 0,5 МГц) можно обойтись <1 мА в активном режиме. Конечно, другие компоненты (регуляторы напряжения и т. д.) необходимо выбирать в соответствии с характером малой мощности.
Один только светодиод @exscape LED4 потребляет 15 мА. Активация S1, S2 или S3 потребует еще ~ 0,5 мА каждый из-за подтягивания.
@Polynomial Я не смотрел внимательно на схему, но, конечно, проект можно было бы построить без «светодиода питания». Или вы можете помигать, чтобы он был включен, например, на половинной яркости (через ШИМ), только, скажем, на 25 мс каждые 2 секунды, чтобы текущее использование упало в среднем до ~ 0,09 мА вместо 15.
@exscape Это правда. Возможно, в конце концов, его можно проработать почти год на нескольких литиевых батареях AA, если вы приложите дополнительные усилия для снижения потребления. Я полагаю, что средняя щелочная батарея не будет работать лучше, чем 4-6 месяцев.
Ардуино энергоемкий. Создание собственной доски решит эту проблему. Atmega328 потребляет 0,2 мА при 32 кГц и 0,75 мкА в режиме энергосбережения.

Кое-что, о чем еще никто не упомянул: у вас должен быть какой-то способ отключить питание + 5 В, питающее сервопривод, когда вы его не используете. Даже когда он не движется, сервопривод все равно потребляет энергию.

Полевой транзистор с затвором, управляемым контактом ввода-вывода от Arduino, — хороший способ сделать это.

Я обычно использую 2N3904 для каждого датчика или что-то еще, чтобы включить / выключить его. Или, если датчик маломощный и имеет то же напряжение, что и ATmega, я просто использую контакт напрямую для управления состоянием питания.
Используйте 2n7000, чтобы потреблять значительно меньше энергии, чем 2n3904, и вам не нужен базовый резистор.

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

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

Одним из примеров такого микроконтроллера является MSP430 от Texas Instruments. На их веб-сайте вы найдете примечания по применению, как сохранять энергию и приложения для сбора энергии.