Оптимизация энергопотребления Raspberry PI

Для установки автономных регистрирующих устройств (далее ARU) на базе Birdnet-PI на длительное время именно в автономном режиме, без привязки к электросетям, надо озаботиться оптимизацией энергопотребления малинки (платы миникомпьютера Raspberry PI) и наращиванием емкости батарей. Энергопотребление малинки очень существенное и не позволяет использовать ее длительное время без определенных манипуляций. Так например, паэурбанка Romoss 40Ah (фактическая емкость для 5V — 20Ah), хватает на 45 часов непрерывной работы. В этой статье мы рассмотрим два наиболее простых способа продления автономной работы ARU. Итак, разбираемся в двух вещах:

  1. Наращивание емкости аккумуляторов
  2. Оптимизация энергопотребления

Под оптимизацией энергопотребления можно рассматривать два направления:

а) уменьшение потребления за счет отключения неиспользуемых портов и другого hardware

б) использование Raspberry Zero 2W, которая потребляет минимум энергии (около 200мА)

  1. Использование двух аккумуляторов

Это самое простое экстенсивное решение. Берем два пауербанка на 60/80 Ah, покупаем на aliexpress плату yx850 и нехитрым способом к этой плате прикручиваем два разъема USB-A (входы от банок) и один разъем USB-micro-B (питание Raspberry).

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

Две банки Romoss 60Ah потенциально могут работать 7-8 суток.

2. Использование трех и более аккумуляторов

Для использования трех и более аккумуляторов реле YX850 даже в каскадном исполнении использовать не получится. Я для этих целей собрал собственное реле из платы Arduino Nano и P-MOSFET транзисторов. Arduino питается от собственного небольшого паербанка и управляет очередностью включения транзисторов и замером напряжения в цепи питания. Конденсатор используется для правильного пробуждения пауербанков, находящихся в режиме сна.

Схема для двух пауербанков (третий для Ардуино не считаем) представлена ниже. По аналогии можно подключать их в большем количестве, лишь бы хватило портов управления на Arduino.

Вот так выглядит сборка в реальной жизни.

Для сборки требуется:

  • Arduino Nano 1 шт
  • Powerbank 10-20 mah для питания Arduino
  • N (2,3 и более) Powerbank питания для Raspberry (можно по 80-100 mah)
  • P-MOSFET транзисторы по количеству банок
  • R 10 кОм — N штук + 2
  • R 100 Ом — N штук
  • R 1 кОм — 1 штука
  • C 470мкф — 1 штука
  • Точечная печатная плата MB-102
  • Провода-перемычки DuPont 40шт 10см Папа-Папа 
  • USB type A с выводами проводов (черный+красный) N штук
  • USB type C для питания Arduino

Приводу код для Arduino по проверке и переключению питания. Легко написать с использованием любых ИИ а-ля GPT

#define VOLTAGE_PIN A0
#define WAKE_PIN_1 7
#define WAKE_PIN_2 8
#define WAKE_PIN_3 9
#define LED_PIN 13

const int wakePins[] = {WAKE_PIN_1, WAKE_PIN_2, WAKE_PIN_3};

void setup() {
  for (int i = 0; i < 3; i++) {
    pinMode(wakePins[i], OUTPUT);
    digitalWrite(wakePins[i], HIGH); // MOSFET закрыты
  }
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
}

float measureVoltage() {
  int raw = analogRead(VOLTAGE_PIN);
  return raw * (5.0 / 1023.0) * 2.0;
}

void blinkLED(int count) {
  for (int i = 0; i < count; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(100);
    digitalWrite(LED_PIN, LOW);
    delay(100);
  }
}

void loop() {
  bool powerFound = false;
  
  // Проверяем все пины по очереди
  for (int i = 0; i < 3; i++) {
    digitalWrite(wakePins[i], LOW); // Открываем MOSFET
    delay(100); // Ждем стабилизации
    
    // Тройное мигание во время измерения
    blinkLED(3);
    
    if (measureVoltage() >= 4.5) {
      // Напряжение есть - остаемся на этом пине
      powerFound = true;
      digitalWrite(LED_PIN, HIGH);
      break;
    } else {
      // Напряжения нет - закрываем MOSFET и ждем
      digitalWrite(wakePins[i], HIGH);
      delay(1000);
    }
  }
  
  if (powerFound) {
    // Мониторим напряжение на найденном пине
    while (measureVoltage() >= 4.0) {
      delay(5000);
    }
    
    // Напряжение упало ниже 4.0В
    for (int i = 0; i < 3; i++) {
      digitalWrite(wakePins[i], HIGH); // Закрываем все MOSFET
    }
    digitalWrite(LED_PIN, LOW);
    delay(1000);
  } else {
    // Ни на одном пине нет напряжения
    digitalWrite(LED_PIN, LOW);
    delay(5000);
  }
}

2. Оптимизация энергопотребления

2.1 Отключаем wifi, bluetooth, hdmi. Актуально для всех RPI

Это самая сложная и интересная часть. Все настройки, связанные с оптимизацией энергопотребления малинки надо делать через SSH непосредственно в операционной системе Raspberry PI OS. Как подключаться по SSH здесь описывать не буду.

Шаг 1. Устанавливаем Midnight Commander

sudo apt-get install mc

Шаг 2. Запускаем его

mc

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

Сначала правим файл настройки операционной системы, там отключаем Bluetooth, wifi и hdmi.

cd /boot

Находим файл config.txt, открываем по кнопке F4

Нам нужно сделать следующие настройки:

dtoverlay=disable-bt

dtoverlay=disable-wifi

dtoverlay=i2c-rtc,ds3231

Нажимаем F2 и ESC, выходим из режима редактирования.

Отключаем HDMI. В командной строке пишем:

sudo tvservice -o

2.2. Отключаем eth и часть USB (актуально только для 3B+)

Но больше всего энергии потребляют разъемы eth и usb. Совсем их отключать — это значит у нас не подключить микрофон и потом не подсоединить к компу. Какой выход?

Смотрим на примере Raspberry PI 3B+, на старших версиях кажется так сделать нельзя.

Если мы научимся включать/выключать левые два USB и вместе с ним разъем от LAN (Eth), то добьемся существенного снижения энергопотребления.

Для начала надо научиться подключаться к малинке через USB со смартфона Андроид. Берем USB шнур питания для смартфона, втыкаем его в смартфон одним концом, а другим концом в правый нижний разъем USB малинки (верхний будет для микрофона). В смартфоне идем в настройки ищем настройку включения USB-модема. Включаем. На смартфон устанавливаем приложение «Ping & Net» и либо в Network Info, либо в Subnet Scan ищем IP-адрес присоединенной малинки. У меня это обычно что-то типа «192.168.172.98». По этому же адрес со смартфона через браузер можно использовать Birdnet-PI, даже в полях.

Устанавливаем на телефон программу JuiceSSH. С помощью него можно подключиться к малинке и делать все тоже самое, что мы умеем с компьютера по SSH. Например выполнить вот такую команду:

echo 0 > /sys/bus/usb/devices/1-1.1/bConfigurationValue

Этой командой мы значительно снизили энергопотребление. Но вы не сможете теперь подключиться к компу через порт Eth до перезагрузки малинки. После перезагрузки работа USB/Eth восстановится. Правые два USB останутся работать после этой команды, их можно использовать для микрофона и подключения с телефона.

Вернуть к жизни отключенные USB можно перезагрузкой или командой:

echo 1 > /sys/bus/usb/devices/1-1.1/bConfigurationValue

В своей практике я использовал эту настройку следующим образом. В папке по умолчанию (BirdNET-PI, в которую можно перейти по команде «cd ~») сделал два файла: usb_off.sh и usb_on.sh. Настроил через crontab после перезагрузки запуск файла usb_off.sh. Таким образом, при включении сразу отключается USB (левые два)+Eth. При необходимости, я их могу включить со смартфона командой usb_on.sh.

Можно пойти другим путем, при установке и включении в полях ARU (ШМ), после включения подключиться смартфоном и выключить USB. До следующей перезагрузки он не будет работать.

PS А еще я отключил все ненужные службы Birdnet-PI в Tools->Services. В соответствии с этой инструкцией:

If you want a smoother interface, you can disable any services you don’t use, e.g., Live Audio Stream, Web Terminal, BirdNET Log (the «View Log» page), Streamlit Statistics (the «Species Stats» page), Chart Viewer (this creates the charts you see on the «Overview» and «Daily Charts» pages), Spectrogram Viewer (the «Spectrogram» page), or Pushed Notifications. You can easily disable these services as needed in «Tools» > «Services». Be sure to select «Disable» and not «Stop» to ensure the service is not started again on reboot.

Добавить комментарий