Беспроводной сенсорный модуль на nRF24l01 с низким энергопотреблением

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

На сколько дешево и насколько низкое энергопотребление можно достичь? В конце концов, я спустился до $12 за один многофункциональный Arduino-совместимый модуль с nRF24l01, работающий на ~ 2.6V, и должен работать в автономном режиме год-полтора на 2 АА или 5 месяцев на Cell батарейке (таблетке).

Исследование энергопотребления.

Раньше я делал тестовую сеть этих модулей с использованием 3,3в стабилизированным питанием. После этого, я понял, что для запуска, хватит даже меньше энергии и еще более дешевле. Две AA батарейки будут выдавать от 2,4 до 2,9 в. И оказалось что ATmega328P MCU и радио модуль nRF24L01+ работают просто отлично в этом диапазоне.

Для осуществления мне нужно было создать новый скетч в Arduino IDE. Этот скетч имеет два отличия по сравнению с настройкой по умолчанию:

  • Установите правильные FUSE для «Brown-Out Detector» (BOD). Arduino IDE поставляется с установкой, BOD в 2,7, так что чип будет питаться от 2x AA.
  • Запустите чип на частоте 8 МГц. Это максимум тактовой частоты на которой чип работает от 2.4V.

Вот так выглядят мои изменения в файле boards.txt:

lopower.name=Arduino Ultru Low-Power (<2.4V, 8 MHz) w/ ATmega328
lopower.upload.protocol=stk500
lopower.upload.maximum_size=30720
lopower.upload.speed=57600
lopower.bootloader.low_fuses=0xFF
lopower.bootloader.high_fuses=0xDA
lopower.bootloader.extended_fuses=0x06
lopower.bootloader.path=atmega
lopower.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex
lopower.bootloader.unlock_bits=0x3F
lopower.bootloader.lock_bits=0x0F
lopower.build.mcu=atmega328p
lopower.build.f_cpu=8000000L
lopower.build.core=arduino

Эксперименты с питанием

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

Это вопросы на которые я должен ответить, поэтому я пошел проводить эксперименты для поиска этих ответа:

  • Сколько энергии потребляется во время сна?
  • Сколько энергии потребляется во время пробуждения и передачи?
  • Как долго он будет спать каждый цикл?
  • Как долго он будет бодрствовать каждый цикл?
  • Сколько мощности реально получить от батареи?

Потребляемый ток

Для измерения тока, нам нужен мультиметр который способен измерять ток. Я использую Extech EX330 с автоматическим выбором диапазона измерения, но и многие более простые мультиметры могут проводить это измерение. Смотрите на установку «mA». Для измерения нужно подключить мультиметр в цепь в той точке в которой мы хотим знать текущий ток. То есть, ток течет через мультиметр на промежутку от батареи к нагрузке.

Есть два измерения тока, одно во время сна и другое во время работы. Так что я создал простой скетч для каждого из них. Один режим просто переводит в режим сна MCU и радио, а другой постоянно передает данные. Теперь нужно просто измерить значения тока для каждого режима.

На самом деле для измерения при передаче я использую «бесконечную отправку», и это отнимает — 13.57mA.

Для спящего режима, я получил странные результаты. С отключенным радио модулем, в режиме измерения в «микро амперах» мультиметр показывает 395 мкА. Но в режиме «мили амперы», он показывает 0.14мA. Кроме того, подключение радио модуля, не имеет большого значения. Вообщем при измерениях я не получил больше 410 мкА.

Длительность / Рабочий цикл

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

Для измерения длительности пробуждения и отправки я использовал тот же пример «бесконечной отправки», как и для измерения мощности. Эта система отправки фактически никогда не спит, передатчик отправляет данные в течении 30 секунд. Подсчитав количество отправок, и время прошедшее между каждой отправкой, я смог посмотреть, как долго он работает для измерения и отправки данных. В моем тесте, было передано 1128 показаний за 30 секунд, то есть продолжительность одной передачи составляет 27мс.

Емкость

Для чистоты эксперимента я взял полностью заряженный аккумулятор, и замкнул его на землю. Потому что потребление зависит от используемого тока, важно чтобы тест проходил с определенным постоянным током. Казалось бы, логичным выбором было использование пример «постоянной передачи», который я использовал в предыдущих тестах, и оставить его так долго, как это потребуется. Две батареи типа АА прожили более недели! Это 156 часов при 13.57мА с батареями на которых написано «2300мАч», но фактически там было 2110 мАч.

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

В конце концов, я решил использовать 3в батарейку, CR2450, мощностью 540mAh. Это лучший вариант. С этой батарейкой монетой, модули будут намного меньше и легче. Они также немного дешевле. Но используя их я получу только 5 месяцев автономной работы без перезарядки.

Расчет мощности

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

Входные
Потребление сна 0.14 mA
Потребление рабочее 13.57 mA
Продолжительность сна 60 s
Продолжительность работы 0.027 s
Емкость 2035.5 mAh
‘За один цикл сна‘
Использование «Сон» 8.4 =Потребление сна * Продолжительность сна
Использование «Работа» 0.36639 =Потребление рабочее * Продолжительность работы
Общее использование mAs 8.76639 =Потребление рабочее * Продолжительность работы + Потребление сна * Продолжительность сна
Общее использование 0.00243510833333333 =»Общее использование mAs»/3600
‘Результаты‘
Количество циклов 835897.102456085 = Емкость / Общее использование
Количество часов 13931.6183742681 = Количество циклов / (3600/Продолжительность сна)
Количество дней 580.484098927837 = Количество часов / 24
Количество месяцев 19.3494699642612 = Количество дней / 30

Файл: Power Calculations.ods

Датчик

Что мы будем измерять, и как?

Температура

«Hello world» для беспроводных сенсорных сетей является измерение температуры. Я полагаю, что всегда интересно знать какая температура, так что теперь я могу знать какая температура внутри дома 🙂 Я выбрал Microchip MCP9700. Есть много вариантов. Этот, казался простым и дешевым.

Напряжение батареи

Нам также полезно знать оставшийся заряд на батарее от которой мы питаемся. Для этого каждый модуль помимо прочего передает и напряжение своей батареи.
Эти модули имеют внутренний делитель 1.1в, поэтому напряжение батареи должно быть подтянуто вниз. Для этого я использую простой делитель напряжения с 1М и 470k резисторами. Резисторы выбираются так, чтобы иметь очень высокий импеданс. Как следствие, необходим конденсатор. (Не знаю, почему именно, но было предложено на форуме Arduino.)

Ниже очень простая схема делителя напряжения:

На будущее

Возможность расширения в будущем этого модуля небольшая, по этому я сделал порт расширения. Это дает 4 неиспользуемых контакта (2 цифровых, 2 аналоговых) и шина SPI. Это позволит мне в будущем добавить дополнительные датчики без необходимости повторной доработки платы.

Программное обеспечение

Эти модули запускают мой RF24Network стек. Построенный на модулях RF24, сетевой уровень обеспечивает модули адресации и маршрутизации, чтобы построить топологию дерева из радио модулей nRF24L01+.

Код отправки показания температуры и напряжения батареи очень прост. Он также использует свою библиотеку MCP9700 для датчика температуры и мою библиотеку сна для перевода модуля в спящий режим и пробуждение в нужное время.

// If there's a reading ready, send it.
if ( temp_sensor &amp;&amp; temp_sensor-&gt;available() )
{
// Take a reading
message.temp = temp_sensor-&gt;read();
if ( voltage_sensor )
message.voltage = voltage_sensor-&gt;read();// Send it to the base
RF24NetworkHeader header(/*to node*/ base_node,/*message type*/ 'T');
network.write(header,&amp;message,sizeof(message));

// Leaf nodes sleep
if ( is_leaf() )
{
// Power down the radio. Note that the radio will get powered back up
// on the next write() call.
radio.powerDown();

// Sleep the MCU. The watchdog timer will awaken in a short while, and
// continue execution here.
Sleep.go();
}
}

Принимающий узел и сохранение в SQL базу будет следующий постах.

Схема

Eagle файл: RF Duinode V3.sch

Печатная плата

Eagle файл: RF Duinode V3.brd

Беспроводной сенсорный модуль на nRF24l01 с низким энергопотреблением: 3 комментария

  1. На моём велосипедике стоят 2 датчика c nRf2402g. По потреблению тоже что и L01+. Батарейки Cr1632 хватает примерно на 4 года.

  2. Да уж, 140uA в спячке, ну оооочень много! Да и делитель за чем. Постоянно разряжать батарейку?. На меге 328 есть внутренний измеритель напруги, юзайте его.

  3. У меги же есть свой асцилятор на 10КГц. На нем он должен быть экономичнее, чем на 8МГц. Или мы проиграем на скорости передачи?

    А вообще статься очень интересная. Спасибо.

Добавить комментарий для FrGr Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *