Pi-Powerman
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,
- Aktualizacja firmware w trakcie pracy systemu.
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:
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:
Prezentacja stanu zasilania
Dla przetestowania komunikacji MQTT wykorzystałem konto serwisu ThingSpeak.
Możemy także łatwo umieścić wykresy generowane z RRD na lokalnym serwerze www, np. tworzymy plik .html:
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.
Komunikacja
Do komunikacji pomiędzy serwisem uruchomionym na Raspberry i kontrolerem zasilacza wykorzystana jest szyna I2C oraz dwa porty I/O.
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.
pi-powerman_4i2o1pu_xmega128a4u_190115.zip (15.5 KB)
pi-powerman_ups_8xNiMh_190115.zip (6.64 KB)
Firmware dla powyższych układów.
pi-powerman.firmware.zip (60.89 KB)
Serwis Python dla Raspberry Pi.
Dodaj komentarz