按照ChatGPT的说法,这款主板的的主控MCU、无线通信、电源管理、外设接口可以共用,需要差异化的有电机驱动、传感器的选择、控制算法和软件、电源供电。ChatGPT说的共用部分没啥争议,有差异化的地方需要细想下:电机驱动显然应该不同,比如四轴飞行器使用空心杯电机,那么它的电机驱动电路只用通过PWM控制空心杯电机的转速即可,平衡车电机就不一样,除了要控制转速,还要能控制正反转方向,还要能测量电机转速实现速度闭环控制;那么传感器的选择呢,四轴飞行器最少要用六轴传感器才行,它要用到三轴陀螺仪和三轴加速度计才能将当前姿态计算出来,平衡车则会少两个轴,因为它左右两个轮子固定了,不能左右倾斜,相当于四轴飞行器的横滚角固定不用测量,所以传感器可以就选用一款六轴传感器,平衡车不用其中两个轴就行了;控制算法和控制逻辑显然也会有差异,毕竟飞控系统和自平衡控制系统的控制原理不一样,用到的姿态检测数据也不一样,电机也不一样;电源供电不一样主要是因为四轴飞行器和平衡车的电机的功率不一样,额定电压也不一样。看来ChatGPT虽然只说大方向,但大方向细想后也没啥不对,接下来按照这个大方向设计顶层原理图图纸如下图所示,差异化的电机驱动部分通过两组GPIO来控制,具体差异在电机驱动模块原理图中设计;传感器直接选择六轴传感器,平衡车不用这么多数据在软件上过滤,硬件上不体现差异;供电由3.7V锂电池输入,通过电源电路分出3.3V和6V两路电源,3.3V给所有芯片供电,6V给平衡车电机供电,四轴飞行器的电机直接由3.7V锂电池供电。
控制算法与软件上的差异怎么做呢?问问ChatGPT
// 飞行器控制参数结构体
typedef struct {float roll_gain;float pitch_gain;float yaw_gain;float throttle_gain;
} FlightControllerParams;// 平衡车控制参数结构体
typedef struct {float balance_gain;float steering_gain;
} BalancingControllerParams;// 获取飞行器传感器数据
FlightSensorData getFlightSensorData();// 获取平衡车传感器数据
BalancingSensorData getBalancingSensorData();// 发送飞行器控制信号
void sendFlightControlSignal(FlightControlOutput control_output);// 发送平衡车控制信号
void sendBalancingControlSignal(BalancingControlOutput control_output);// 飞行器控制函数
FlightControlOutput flightControl(FlightSensorData sensor_data, FlightControllerParams params);// 平衡车控制函数
BalancingControlOutput balancingControl(BalancingSensorData sensor_data, BalancingControllerParams params);// 主函数
int main() {// 初始化飞行器控制参数FlightControllerParams flight_controller_params = {.roll_gain = 0.5,.pitch_gain = 0.5,.yaw_gain = 0.5,.throttle_gain = 0.5};// 初始化平衡车控制参数BalancingControllerParams balancing_controller_params = {.balance_gain = 0.5,.steering_gain = 0.5};// 主循环while (1) {// 获取飞行器传感器数据FlightSensorData flight_sensor_data = getFlightSensorData();// 获取平衡车传感器数据BalancingSensorData balancing_sensor_data = getBalancingSensorData();// 飞行器控制FlightControlOutput flight_control_output = flightControl(flight_sensor_data, flight_controller_params);// 平衡车控制BalancingControlOutput balancing_control_output = balancingControl(balancing_sensor_data, balancing_controller_params);// 发送飞行器控制信号sendFlightControlSignal(flight_control_output);// 发送平衡车控制信号sendBalancingControlSignal(balancing_control_output);}return 0;
}
ChatGPT给出了一个软件设计框架,主循环中就干了三件事:1、获取姿态数据,飞行器获取飞行器的,平衡车获取平衡车的;2、运行控制算法,得到控制信号,这个可以理解为根据当前飞行器姿态计算出一个飞行器电机的控制量,根据当前平衡车姿态计算出一个平衡车电机的控制量;3、将飞行器控制量给飞行器电机驱动电路来调节飞行器电机转速,将平衡车控制量给平衡车电机驱动电路来调节平衡车电机转速和方向。大方向好像没错,这里最复杂的应该是第2点的控制算法应该具体怎么做,再问问ChatGPT:
// 飞行器控制函数
FlightControlOutput flightControl(FlightSensorData sensor_data, FlightControllerParams params) {// 获取飞行器姿态信息float roll = sensor_data.roll;float pitch = sensor_data.pitch;float yaw = sensor_data.yaw;float throttle = sensor_data.throttle;// 计算飞行器控制输出float roll_output = roll * params.roll_gain;float pitch_output = pitch * params.pitch_gain;float yaw_output = yaw * params.yaw_gain;float throttle_output = throttle * params.throttle_gain;// 返回飞行器控制输出FlightControlOutput control_output = {.roll = roll_output,.pitch = pitch_output,.yaw = yaw_output,.throttle = throttle_output};return control_output;
}// 平衡车控制函数
BalancingControlOutput balancingControl(BalancingSensorData sensor_data, BalancingControllerParams params) {// 获取平衡车姿态信息float balance = sensor_data.balance;float steering = sensor_data.steering;// 计算平衡车控制输出float balance_output = balance * params.balance_gain;float steering_output = steering * params.steering_gain;// 返回平衡车控制输出BalancingControlOutput control_output = {.balance = balance_output,.steering = steering_output};return control_output;
}
这段伪代码大致描述了如何将传感器数据转换为控制量,貌似就是乘了一个参数,参考意义不大。
根据ChatGPT提供的一些大方向,最终设计出的主板实物如下图所示:
这款主板已经能完美驾驭四轴飞行器和两轮自平衡小车,目前已在淘宝上线,在淘宝搜索"FlyBalance飞行器平衡车兼容驱动"或者直接点这里跳转,感兴趣的朋友可以移步那里获取更多信息。