Я создал хороший электронный дверной замок для своей комнаты в общежитии. В настоящее время это Arduino Diecimila с сервоприводом, который [раз]блокирует дверь. Он имеет цифровую клавиатуру с 3x4 кнопками и 5 светодиодами (2 пары последовательно и один светодиод). В настоящее время он также работает от зарядного устройства для мобильного телефона.
Теперь я переделал его для работы на автономном Arduino (ATmega328), но мне бы очень хотелось, чтобы он работал от батареек типа АА или даже от 9-вольтовой батареи.
Что касается программной части, я решил, что могу поместить sleep
вызовы в определенное время внутри метода цикла, чтобы максимально снизить энергопотребление ATmega. И пусть светодиод "вспыхивает" с как можно более долгим выключенным временем.
Когда кнопка нажата в течение нескольких миллисекунд, пока плата находится в спящем режиме, будет ли она «запоминаться»/«удерживаться» до тех пор, пока не выйдет из спящего режима, а затем будет воспринята как нажатие кнопки?
Как лучше всего справиться с нажатием этой кнопки во время сна? Могу ли я закодировать его, чтобы он просыпался при нажатии кнопки, или я должен просто позволить ему спать, например, 10 мс. в каждом цикле?
Как бы я подошел к математике расчета того, сколько батареек типа АА необходимо для работы этого устройства в течение 10 месяцев?
Кроме того, я не знаю, как измерить среднее энергопотребление в минуту или около того, так как оно быстро меняется и т. д.
Atmega328 обеспечивает шесть режимов энергосбережения, упорядоченных от минимального до отличного (приблизительное потребление тока из этого сообщения на форуме ):
Цитирую исходный вопрос:
Я подумал, что могу поместить
sleep
вызовы в определенное время внутри метода цикла "
Вам нужно будет использовать sleep_cpu()
после настройки требуемый спящий режим из списка выше. На Arduino Playground есть полезный пост об этом .
Приложение должно управляться прерываниями, широко использовать вышеупомянутые спящие режимы и пробуждать процессор нажатием кнопки, переполнением таймера и событиями сторожевого таймера для фактического выполнения задач.
Дополнительную экономию электроэнергии можно получить, выполнив следующие действия:
Включение этих предложений позволяет запускать приложения микроконтроллера в течение нескольких недель или месяцев на одном элементе типа «таблетка» CR2032 и в течение многих лет на литиевом элементе типа LR123. Конечно, ваш пробег может варьироваться в зависимости от того, какие датчики, выходы и фактическая обработка требуются вашему приложению.
Некоторые полезные ссылки:
Прямо сейчас у меня на столе стоит 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 мкА в режиме отключения питания.
Здесь есть два вопроса, но только второй является частью заголовка вопроса, поэтому, вероятно, будет лучше, если вы откроете еще один для вопроса о программировании Arduino. Я отвечу здесь на второй вопрос.
Одна топовая щелочная батарея AA 1,5 В имеет емкость около 2600 мАч. Если вы выберете литиевые батареи, вы можете получить около 3400 мАч, если вам повезет. Давайте возьмем эту цифру за основу для абсолютного наилучшего случая.
То, как вы рассчитываете теоретическое максимальное время работы для нагрузки, — это просто емкость, деленная на нагрузку. Если ваша нагрузка составляет 1 мА, вы можете проработать ее 3400/1 = 3400 часов = 141 день = ~ 5 месяцев. Однако это только теоретический максимум , так как за это время вы начнете получать значительное падение напряжения примерно на 65%. Если вы регулируете выход, вы получите эффект разгона, когда чем ниже напряжение батареи, тем выше ток, необходимый для поддержания регулируемого напряжения, что быстрее разряжает батарею. Я был бы удивлен, если бы вы могли получить от него более 80% заявленной емкости при достаточно высоком напряжении, чтобы запустить ваше устройство.
Итак, предположим, что вы получаете 80% этого времени после падения напряжения и неэффективности регулятора. Предположим, что вы работаете с напряжением 3,3 В от трех последовательно соединенных батарей. Это по-прежнему даст вам ту же емкость, но напряжения будет достаточно для регулятора. Если ваше устройство работает на токе 15 мА (это довольно консервативная оценка), цифры будут выглядеть так:
Таким образом, вам потребуется около 144 литиевых батарей (48 комплектов по 3 штуки), чтобы проработать его в течение года. Не так хорошо, как хотелось бы!
Вместо этого я бы предложил использовать регулируемый источник постоянного тока от сети. Может быть включен резервный аккумулятор, который легко настроить с помощью реле SPDT - просто подключите катушку к сети постоянного тока и подключите контакт «выключения» к аккумулятору. При выходе из строя постоянного тока контакт размыкается, и вместо него используется батарея.
Кое-что, о чем еще никто не упомянул: у вас должен быть какой-то способ отключить питание + 5 В, питающее сервопривод, когда вы его не используете. Даже когда он не движется, сервопривод все равно потребляет энергию.
Полевой транзистор с затвором, управляемым контактом ввода-вывода от Arduino, — хороший способ сделать это.
Вы можете рассмотреть возможность использования микроконтроллера, специально оптимизированного для низкого энергопотребления, для вашего следующего проекта. Для низкого энергопотребления необходимо потреблять очень мало энергии во время сна. Что часто упускается из виду, так это то, что также важно, как быстро он может проснуться от этого сна.
Что имеет значение, так это то, сколько заряда требуется от самого глубокого сна, чтобы как можно быстрее обработать прерывание (потому что всплеск мощности будет очень коротким) и снова вернуться в сон.
Одним из примеров такого микроконтроллера является MSP430 от Texas Instruments. На их веб-сайте вы найдете примечания по применению, как сохранять энергию и приложения для сбора энергии.
Тим Экель
Аниндо Гош
Тим Экель
Аниндо Гош
Кано64