Эта музыка будет вечной если я заменю батарейки (С)
Это опус посвящен моим изысканиям по питанию автономными беспроводными устройствами, входящими в систему умного дома MySensors.
Сперва был литий...
Вернее литий-ионные и литий-полимерные аккумуляторы.
Долгое время эти аккумуляторы от старых гаджетов копились в ящике. Думал — вот оно, универсальное питание для всех малогабаритных микроконтроллеров. Тем более, напряжение 3.3-4.2В отлично подходит как для AVR, так и для всяческих ESP и STM. Для надежности можно поставить LDO стабилизатор нужной мощности и получить стабильные 3.3 для МК и всей периферии.
Но как оказалось, не все так хорошо.
- Аккумуляторы требовалось заряжать. Для этого нужно было делать их съемными, либо добавлять в свое устройство модуль зарядки, что, в свою очередь, давало дополнительную стоимость, габариты и отверстия для зарядки в корпусе. Да и не всегда удобно заряжать устройства, например, погодный сенсор за окном.
- Литиевые аккумуляторы (как и вообще большинство источников питания) не годятся для работы при отрицательных температурах. В погодном сенсоре, закрепленном за окном, зимой в мороз аккумулятор садился сразу.
- При длительной эксплуатации если вовремя не отследить напряжение аккумулятора, можно разрядить его "в ноль", то есть ниже допустимого значения, что гарантировано его убьет. Значит нужны средства защиты от переразряда.
- Разнообразие размеров и емкости аккумуляторов значительно ограничивали повторяемость устройств в одинаковых корпусах. Да и запасы старых аккумуляторов, быстро подошли к концу — в результате нужно было покупать где то новые. И, как оказалось, стоимость таких источников питания оказалась совсем не копеечной и добавляла как минимум $2 к стоимости каждого устройства (а с учетом платы зарядки и больше). Причем экономии от перезаряжаемости не было, так как большинство автономных контроллеров потребляли очень мало энергии и могли работать долгие месяцы без перезарядки.
NiMH и прочие AA/AAA аккумуляторы были еще хуже. Их обязательно нужно было заряжать в специальном заряднике, они имели имели "эффект памяти" и изначально низкое напряжение (1.2-1.3В), а при последовательном включении из за разности внутреннего сопротивления одна из батарей могла разрядиться сильнее других, что опять же приводило к ее порче.
И вновь литий ...
Теперь уже круглые малогабаритные литиевые батарейки на 3.0В, в пользу которых я решил отказаться от капризных и дорогих аккумуляторов.
Батарейки CR2032 применяются во огромном количестве BIOSов компьютеров, электросчетчиков и прочих устройств с RTC, наручных часах, калькуляторах и различных игрушках. При маленьких габаритах и невысокой цене они имеют 3.0В напряжения, вполне достаточного для МК и приличную для своих габаритов емкость 200-250мА/ч.
Но опять проблемы. Дело в то. что постоянный ток такой батарейки всего 0.4мА. Если нагрузить ее более высоким током, напряжение батареи будет падать, хотя потом может частично или полностью восстановиться. Типовой контроллер Mysensor в режиме сна потребляет несколько микроампер. Но вот в режиме передачи — уже порядка 15-20мА. При этом новые версии библиотеки MySensors заставляют устройства посылать много пакетов — пинг, приветствие, презентации, поиск шлюза или маршрутизатора что выливается в длительную, порой в несколько секунд, работу радиомодуля. При напряжении около 2В дешевые китайские NRF24L01 начинают глючить, при этом иногда даже не получается увести их в режим сна sleep() от MySensors.
В результате, на свежей батарейке еще как то все работает, но по мере разрядки увеличиваются проблемы со связью, радиомодуль начинает больше "флудить" в эфир, увеличивая еще тем самым разряд батареи. В конце концов напряжение снижается до того, что все устройство перестает уходить в режим сна, а затем получается циклическая перезагрузка, пока батарея не сядет совсем.
В зависимости от производителя и "свежести" батареи устройство может проработать от пары дней до месяца. Если покупать дешевые батарейки на алиэкспресс — то и вовсе лотерея. Немного спасает переход на более емкие CR2450 и CR2477, но и они длительно отдавать ток более 0.5мА не умеют.
Какое то время я экспериментировал с повышающими преобразователями, которые позволяли до последних крох энергии батареи сохранять нормальное рабочее напряжение для МК, но те имели небольшой, но все же ненулевой ток покоя, что сокращало общий срок службы.
Пальчики — мизинчики
Пора бы уже успокоится и перенять "передовой" китайский опыт, питать все свои устройства от трех AAA (батарейки в комплект не входят). Но же решил поискать решение хотя бы с двумя 1.5 вольтовыми батарейками .
Остановился на такой схеме с повышающим стабилизатором NCP1400:
Две последовательно включенные щелочные батареи ААА дают изначально 2.7-3.1В к концу продуктивного периода снижая напряжение до 1-2В
При отключенном NCP1400 (низкий уровень на управляющем входе) питание от батарей сразу поступает на МК через катушку L1 и диод шоттки D1 с минимальным падением напряжения около 0.1В. Если на управляющий вход подать высокий уровень, то запускается стабилизатор NCP1400 и выдает на МК напряжение 3.3В при суммарном напряжении батарей от 0.8В до 3.1В.
Алгоритм работы такой:
- Основное время контроллер находится в PowerDownMode, вся периферия, включая NRF24 отключена или также находится в режиме низкого энергопотребления.
- Выходит МК из режима сна по прерыванию от таймера либо внешнему прерыванию (например в выключателях по прерыванию от кнопки), мерит напряжение питания VCC (встроенная функция AVR контроллеров).
- Если напряжение питания больше 3В (или другого напряжения, достаточного для стабильной работы периферии), то NCP1400 не запускается и вся обработка ведется при этом напряжении питания до следующего цикла сна.
- Если напряжения ниже 3В, то запускается стабилизатор NCP1400, устанавливается напряжения питания 3.3В, выполняются все регулярный обработки устройства включая отправку данных через NRF24
- Далее, если напряжения выше 1.7В (достаточное напряжения для выхода МК из режима сна), то NCP1400 отключается до следующего цикла пробуждения.
- Если напряжение менее 1.7 (минимальное напряжение работы МК), то NCP1400 не отключается до перезагрузки контроллера или до снижения напряжения питания ниже 0.8В (напряжения работы NCP1400)
#define MY_RF24_CE_PIN 9
#define MY_RF24_CS_PIN 10
#define MY_RF24_POWER_PIN 8
#define MY_RADIO_NRF24
#include <MySensors.h>
#define PIN_NCP1400 2
#define CHILD_ID_VCC 0
MyMessage msgVcc(CHILD_ID_VCC, V_VOLTAGE);
bool low_power = false;
int readVcc();
//
void before(){
pinMode(PIN_NCP1400,OUTPUT);
digitalWrite(PIN_NCP1400,HIGH);
}
void presentation(){
sendSketchInfo("NCP1400 test", "1.0");
present(CHILD_ID_VCC, S_MULTIMETER,"mV");
}
//
void loop(){
int vcc = 1000;
if( low_power == false ){
vcc = readVcc();
digitalWrite(PIN_NCP1400,HIGH); //Включаем стабилизатор NRF1400
}
if( vcc < 1700 )low_power = true; //Переходим в режим постоянно включенного стабилизатора NRF1400
send(msgVcc.set(vcc)); //Посылаем занчение VCC
if( low_power == false )digitalWrite(PIN_NCP1400,LOW); //Выключаем стабилизатор NRF1400
sleep( 300000 ); //Переходим в режим низкого потребления на 5 минут
}
/**
* Считываем напряжение питания на VCC контроллера
*/
int readVcc() {
long result;
// Read 1.1V reference against AVcc
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Convert
while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
result |= ADCH<<8;
result = (1100L * 1023)/result;
return((int)result);
}
Тестирование
А как у нас состоит дело на практике с потреблением тока? Подключаю свою схему к ЛБП и делаю замеры тока потребления и напряжения на выходе.
Ток холостого хода при выключенном NCP1400 и входном напряжении питания 1-3В составил 0.3мкА. Даже ниже заявленного по даташиту 0.5мкА (а может на таком диапазоне у меня приборы дают большую погрешность). А вот при включенном стабилизаторе без нагрузки ток оказался неожиданно большим — более 0.3мА. Оказалось, большое потребление вызывал подтягивающий резистор R1. Заменив номинал R1 с 10К до 150К получил 30мкА при входном напряжении 3.0В и 44мкА при 1.0В.
Если совсем убрать резистор R1, то стабилизатор при отсутствии подключения этого входа к МК будет постоянно включенным потребляя при входящих 2В порядка 11мкА.
Теперь подключаю микроконтроллер с NRF24L01 и датчиком HUD21, работающим по выше описанному алгоритму:
- Входное напряжение 3.0В — активный режим (NCP1400 включен) 32мА, режим сна (NCP1400 выключен) 9мкА
- Входное напряжение 2.0В — активный режим (NCP1400 включен) 51мА, режим сна (NCP1400 выключен) 6мкА
- Входное напряжение 1.7В — активный режим (NCP1400 включен) 63мА, режим сна (NCP1400 выключен) 5.6мкА
- Входное напряжение 1.0В — NCP1400 включен постоянно — режим сна 197мкА
- Входное напряжение 0.5В — NCP1400 включен постоянно — режим сна 397мкА
Потребление от батареи в активном режиме растет при снижении питания. Напряжение 1.7В подобрано опытным путем. Ниже этого значения микроконтроллер уже может стабильно не работать. При снижении напряжения батареи ниже этого порога стабилизатор NCP1400 уже не выключается и потребление в режиме сна довольно высокое. В этом режиме батареи уже долго не проживут, но времени будет вполне достаточно для их замены.
Воплощение в железе
Спроектировал универсальные платки питания для моих устройств умного дома
И хотя готовые устройства получились не столь компактными как с литиевыми батарейками, результат меня вполне устроил. особенно учитывая стоимость щелочных батареек в магазинах Галомарт, Касторама, Леруаль и пр.
В настоящее время я эксплуатирую у себя дома больше десятка разных устройств контроля температуры, влажности почвы и др. в системе MuSensors/MajorDoMo.
Подробнее можно почитать в моем блоге