mirror of
https://github.com/okalachev/flix.git
synced 2026-09-06 00:10:58 +00:00
Implement battery voltage monitoring
Add power subsystem. Add PWR_VOLT_PIN, PWR_VOLT_SCALE, PWR_VOLT_LPF_A parameters. Support BATTERY_STATUS mavlink messages streaming. Add pw cli command. Add voltage field to pyflix library. pyflix@0.12.
This commit is contained in:
@@ -16,6 +16,7 @@ extern float controlTime;
|
||||
extern int mode;
|
||||
extern bool armed;
|
||||
extern LowPassFilter<Vector> gyroBiasFilter;
|
||||
extern float voltage;
|
||||
|
||||
const char* motd =
|
||||
"\nWelcome to\n"
|
||||
@@ -39,6 +40,7 @@ const char* motd =
|
||||
"disarm - disarm the drone\n"
|
||||
"raw/stab/acro/auto - set mode\n"
|
||||
"rc - show RC data\n"
|
||||
"pw - show power info\n"
|
||||
"wifi - show Wi-Fi info\n"
|
||||
"ap <ssid> <password> - setup Wi-Fi access point\n"
|
||||
"sta <ssid> <password> - setup Wi-Fi client mode\n"
|
||||
@@ -135,6 +137,8 @@ void doCommand(String str, bool echo = false) {
|
||||
print("time: %.1f\n", controlTime);
|
||||
print("mode: %s\n", getModeName());
|
||||
print("armed: %d\n", armed);
|
||||
} else if (command == "pw") {
|
||||
print("Voltage: %.1f V\n", voltage);
|
||||
} else if (command == "wifi") {
|
||||
printWiFiInfo();
|
||||
} else if (command == "ap") {
|
||||
|
||||
@@ -39,6 +39,7 @@ void loop() {
|
||||
sendMotors();
|
||||
handleInput();
|
||||
processMavlink();
|
||||
readVoltage();
|
||||
logData();
|
||||
syncParameters();
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include "util.h"
|
||||
|
||||
extern float controlTime;
|
||||
extern float voltage;
|
||||
|
||||
int mavlinkSysId = 1;
|
||||
Rate telemetryFast(10);
|
||||
@@ -39,6 +40,13 @@ void sendMavlink() {
|
||||
mavlink_msg_extended_sys_state_pack(mavlinkSysId, MAV_COMP_ID_AUTOPILOT1, &msg,
|
||||
MAV_VTOL_STATE_UNDEFINED, landed ? MAV_LANDED_STATE_ON_GROUND : MAV_LANDED_STATE_IN_AIR);
|
||||
sendMessage(&msg);
|
||||
|
||||
uint16_t voltages[] = {voltage * 1000, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX};
|
||||
uint16_t voltagesExt[] = {0, 0, 0, 0};
|
||||
float remaining = constrain(mapf(voltage, 3.4, 4.2, 0, 1), 0, 1);
|
||||
mavlink_msg_battery_status_pack(mavlinkSysId, MAV_COMP_ID_AUTOPILOT1, &msg, 0, MAV_BATTERY_FUNCTION_ALL,
|
||||
MAV_BATTERY_TYPE_LIPO, INT16_MAX, voltages, -1, -1, -1, remaining * 100, 0, MAV_BATTERY_CHARGE_STATE_OK, voltagesExt, 0, 0);
|
||||
sendMessage(&msg);
|
||||
}
|
||||
|
||||
if (telemetryFast && mavlinkConnected) {
|
||||
|
||||
@@ -12,6 +12,9 @@ extern int rollChannel, pitchChannel, throttleChannel, yawChannel, armedChannel,
|
||||
extern int rcRxPin;
|
||||
extern int wifiMode, udpLocalPort, udpRemotePort;
|
||||
extern float rcLossTimeout, descendTime;
|
||||
extern int voltagePin;
|
||||
extern float voltageScale;
|
||||
extern LowPassFilter<float> voltageFilter;
|
||||
|
||||
Preferences storage;
|
||||
|
||||
@@ -109,6 +112,10 @@ Parameter parameters[] = {
|
||||
{"MAV_SYS_ID", &mavlinkSysId},
|
||||
{"MAV_RATE_SLOW", &telemetrySlow.rate},
|
||||
{"MAV_RATE_FAST", &telemetryFast.rate},
|
||||
// power
|
||||
{"PWR_VOLT_PIN", &voltagePin},
|
||||
{"PWR_VOLT_SCALE", &voltageScale},
|
||||
{"PWR_VOLT_LPF_A", &voltageFilter.alpha},
|
||||
// safety
|
||||
{"SF_RC_LOSS_TIME", &rcLossTimeout},
|
||||
{"SF_DESCEND_TIME", &descendTime},
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
// Copyright (c) 2026 Oleg Kalachev <okalachev@gmail.com>
|
||||
// Repository: https://github.com/okalachev/flix
|
||||
|
||||
// Power management
|
||||
|
||||
#include "lpf.h"
|
||||
#include "util.h"
|
||||
|
||||
float voltage;
|
||||
LowPassFilter<float> voltageFilter(0.2);
|
||||
int voltagePin = -1;
|
||||
float voltageScale = 2;
|
||||
|
||||
void readVoltage() {
|
||||
if (voltagePin < 0) return;
|
||||
static Rate rate(10);
|
||||
if (!rate) return;
|
||||
|
||||
float v = analogReadMilliVolts(voltagePin) * voltageScale / 1000.0f;
|
||||
voltage = voltageFilter.update(v);
|
||||
}
|
||||
Reference in New Issue
Block a user