#ifndef BALANCE_H #define BALANCE_H #include #include "mpu6000.h" /* * SaltyLab Balance Controller * * Consumes fused IMUData (pitch + pitch_rate from mpu6000 complementary filter) * PID controller → motor speed command * Safety: tilt cutoff, arming, watchdog */ typedef enum { BALANCE_DISARMED = 0, /* Motors off, waiting for arm command */ BALANCE_ARMED, /* Active balancing */ BALANCE_TILT_FAULT, /* Tilt exceeded limit, motors killed */ } balance_state_t; typedef struct { /* State */ balance_state_t state; float pitch_deg; /* Current pitch angle (degrees) */ float pitch_rate; /* Gyro pitch rate (deg/s) */ /* PID internals */ float integral; float prev_error; int16_t motor_cmd; /* Output to ESC: -1000..+1000 */ /* Tuning */ float kp, ki, kd; float setpoint; /* Target pitch angle (degrees) — tune for COG offset */ /* Safety */ float max_tilt; /* Cutoff angle (degrees) */ int16_t max_speed; /* Speed limit */ } balance_t; void balance_init(balance_t *b); void balance_update(balance_t *b, const IMUData *imu, float dt); void balance_arm(balance_t *b); void balance_disarm(balance_t *b); #endif