Pi-Powerman

  • Posted on: 18 April 2019
  • By: obbo

  Głównym celem jest stworzenie uniwersalnego serwisu działającego z Raspberry Pi pozwalającego na kontrolowanie układu zasilania. Oczywiście układ zasilania musi być zgodny pod względem sposobu komunikacji z serwisem. Obecna wersja wykorzystuje w tym celu I2C oraz dwa porty I/O. W skład rozwiązania wchodzą zatem: serwis uruchomiony na Raspberry oraz współpracujący z nim układ zasilania z mikrokontrolerem.

Podstawowe możliwości:

  • Możliwość łatwego dostosowania układu zasilacza,
  • Funkcja UPS, automatyczne przełączenie na zasilanie zapasowe, kontrola stanu naładowania i ładowanie akumulatora,
  • Automatyczny "shutdown" po zaniku zasilania,
  • Do 8 przycisków z LED (1 przycisk zasilania i 7 definiowanych przez użytkownika),
  • Możliwość definiowania rozbudowanych scenariuszy dla przycisków,
  • LED automatycznie sygnalizują stan przycisków i powiązanych scenariuszy,
  • Do 8 załączanych obwodów zasilania (w tym 1 dedykowany dla Raspberry Pi),
  • Odcięcie zasilania po zamknięciu systemu (shutdown),
  • Monitorowanie napięć, pobieranej mocy, stanu UPS, temperatury i napięcia baterii,
  • Eksport monitorowanych wartości do RRD i plików .txt, .csv,
  • IoT, wysyłanie komunikatów protokołem MQTT,
  • Komunikacja z Raspberry przez I2C i dwa dedykowane porty I/O,
  • Dedykowana LED dla sygnalizacji statusu układu zasilania i Raspberry.

Hardware

  Przykładowy układ został zastosowany w DAC. Podział na bloki funkcjonalne daje możliwość łatwego modyfikowania układu. Cechy zasilacza: napięcie wejściowe od 16V do 24V, 4 przyciski sterujące, 4 obwody zasilania (dla uproszczenia, na schemacie widoczne są tylko dwa), pomiar pobieranej mocy (INA219), układ UPS z akumulatorami 8*Ni-Mh 1900mAh eneloop (zapewnia ok 3 godziny pracy).

Firmware

  Dołączone oprogramowanie zawiera stabilne wersje. Ponieważ jest jednak nadal gruntownie modyfikowane, należy używać najnowszych wersji firmware, serwisu i szablonów konfiguracji. Pliki można pobierać także z GitHub

Serwis Python dla Raspberry

  Pliki do zainstalowania na Raspberry zawarte są w pi-powerman.tgz (zakładam że zostaną umieszczone w /usr/local/pi-powerman/):

  • pi-powerman.py - główny program,
  • pi-powerman.service - konfiguracja serwisu,
  • pi-powerman-hardware.yaml - plik związany ze sprzętową konfiguracją układu zasilania,
  • pi-powerman-config.yaml - główny plik konfiguracyjny,
  • pi-powerman.mqtt - poświadczenia dla brokera MQTT
  • shut.sh, ppp0_start.sh, ppp0_stop.sh - przykładowe, proste skrypty wykorzystane w konfiguracji scenariuszy dla przycisków

  Instalacja polega na utworzeniu katalogu i wypakowaniu archiwum:



  Instalujemy także moduły wymagane dla działania pi-powerman.py:



  Przed pierwszym uruchomieniem należy zgodnie z potrzebami zmodyfikować pliki konfiguracyjne: pi-powerman-hardware.yaml i pi-powerman-config.yaml. Warto także upewnić się że szyna I2C jest uruchomiona i komunikuje się z kontrolerem zasilacza.




  Dla celów testowych pi-powerman.py możemy uruchomić przez:



testowe uruchomienie pi-powerman.py

  Dodatkowo można wydzielić plik logu dla serwisu. W katalogu /etc/rsyslog.d dodajemy plik pi-powerman.conf:


  Należy jeszcze uruchomić ponownie syslog:



  Aby pi-powerman.py uruchamiał się automatycznie i działał jak serwis (wymaga systemd, domyślnie w Raspbian Jessie lub nowszym), wykonujemy:



zainstalowany i uruchomiony serwis pi-powerman

Prezentacja stanu zasilania

  Dla przetestowania komunikacji MQTT wykorzystałem konto serwisu ThingSpeak.

dane opublikowane protokołem MQTT na thingspeak.com

  Możemy także łatwo umieścić wykresy generowane z RRD na lokalnym serwerze www, np. tworzymy plik .html:



dane z RRD opublikowane na lokalnym serwerze www

  Informacje o stanie modułu zasilania możemy także przez MQTT wysłać do bazy InfluxDB, a następnie obserwować przy pomocy serwera Grafana. Aby baza mogła przyjąć dane z MQTT, skonfigurujemy np. moduł Telegraf dla publikacji w formacie JSON.



dane opublikowane na serwerze Grafana

Komunikacja

  Do komunikacji pomiędzy serwisem uruchomionym na Raspberry i kontrolerem zasilacza wykorzystana jest szyna I2C oraz dwa porty I/O.

Porty komunikacyjne

PI_REQ <I/O GPIO.0>

  Port przekazuje do Raspberry informację o wystąpieniu zdarzenia na kontrolerze zasilacza np. naciśnięciu przycisku, zmianie stanu UPS, obecności błędów. Domyślnie pin ustawiony jest w stan wysoki, wystąpienie zdarzenia sygnalizowane jest stanem niskim. Stan portu sprawdzany jest przez serwis w odstępach określonych przez parametr konfiguracji: check_request_period_sec. Po wykryciu stanu niskiego, serwis pobiera przez I2C pełną informację o stanie kontrolera. Odczyt stanu kontrolera powoduje jednocześnie skasowanie stanu niskiego na PI_REQ.

PI_STAT <I/O GPIO.2>

  Port służy przekazaniu do kontrolera informacji o stanie serwisu. Zaraz po uruchomieniu serwisu, na portcie ustawiany jest stan wysoki. Taki stan powinien być utrzymany do momentu wyłaczenia serwisu i zamknięcia systemu. Po zamknięciu systemu na porcie pojawia się stan wysokiej impedancji.

I2C

  Na szynie I2C Raspberry pełni rolę "mastera", a kontroler zasilacza działa jako "slave".

Komendy odczytujące stan kontrolera (pobierają zawsze 32 baty).
0x41 Informacja binarna o możliwościach modułu zasilającego.
0x42 Informacja tekstowa o kontrolerze zasilacza, część pierwsza.
0x43 Informacja tekstowa o kontrolerze zasilacza, część druga.
0x44 Informacja tekstowa o module UPS.
0x45 Informacja binarna o stanie modułu zasilacza: stan przycisków, stan wyjść, wartości napięć, ...
0x46 Bieżącą konfigurację zapisana w pamięci kontrolera zasilacza.

Komenda sterująca "długa" (32 bajty).
0x47 < konfiguracja > Zapis do konfiguracji kontrolera zasilacza, wysyłane są wszystkie wartości konfiguracji, komenda uzupełniana jest wartością 0x00 do długości 32 bajtów.

Komendy sterujące "krótkie" (wysyłają zawsze dwa bajty parametrów, w przypadku komend bez parametrów, długość uzupełniana jest wartością 0x00)
0x48 < kod_przycisku > < nowy_stan > Ustawia nowy stan przycisku (przycisk zasilania nie podlega zmianie przez tą komendę).
0x49 < kod_przycisku > [< nowy_stan{ON, OFF} lub domyślnie, przełączenie_stanu {PRESS}>] Symuluje naciśnięcie przycisku.
0x4a < porty_zasilania_które_mają_zmienić_stan > < nowy_stan > Zmienia stan portów (port zasilania Raspberry nie podlega zmianie przez tą komendę).
0x4b "KEEPALIVE" komenda potwierdzająca działanie komunikacji I2C.
0x4c Zgłoszenie błędu podczas działania serwisu pi-powerman.
0x4d < kod_błędu > Zerowanie kodu w rejestrze błędów.
0x4e Zgłoszenie błędu w działaniu systemu.

Pliki

Najnowsze wersje można pobrać także z GitHub

Schematy w formacie KiCad.

mime_iconpi-powerman_4i2o1pu_xmega128a4u_190115.zip (15.5 KB)

mime_iconpi-powerman_ups_8xNiMh_190115.zip (6.64 KB)

Firmware dla powyższych układów.

mime_iconpi-powerman.firmware.zip (52.85 KB)

Serwis Python dla Raspberry Pi.

mime_iconpi-powerman.tgz (16.16 KB)

Dodaj komentarz