基于STM32的平衡车:蓝牙APP控制,带原理图、PCB图及源代码,支持二次开发并可选配多种模块功能
寻迹壁障自平衡小车,带手机APP蓝牙功能,STM32平衡车,赠送原理图,PCB图,源代码等全部资料。 默认功能:手机APP操控小车前进后退、左右转向、原地旋转。 可选配功能:OLDE显示、超声波壁障、超声波跟随,红外寻迹等。 主要硬件:STM32F103C6T6单片机、MPU6050陀螺仪模块、DRV8833电机驱动模块、HLK-B40蓝牙模块、直流减速电机、新款车轮、14500充电电池两节、电池盒一个。 集成STM32单片机最小系统,SWD接口下载代码,所有引脚全部引出,方便二次开发。 买家须知: 1.本小车默认不包括寻迹模块、超声波模块、显示屏模块等,需选配。 2.本小车采用两节3.7V锂电池供电,型号为14500型,需买家自备电池和充电器。 3.本小车采用SWD接口下载代码,需买家自备下载器。 4.手机APP仅限于安卓手机,苹果手机无法使用。 5.原理图和PCB文件为PDF版本。
今天咱们来拆解一台能玩出花样的自平衡小车,这货不仅能用手机APP远程操控,还能选装各种黑科技模块。核心板子用的是STM32F103C6T6,别看它体积小,扛起整个平衡系统可一点不含糊。

先说说这车子的灵魂——MPU6050陀螺仪。初始化时得先解锁寄存器,不然传感器会罢工。下面这段I2C配置代码老司机都懂:
void MPU6050_Init()
{
i2c_write(MPU6050_ADDR, PWR_MGMT_1, 0x00); // 解除休眠
i2c_write(MPU6050_ADDR, SMPLRT_DIV, 0x07); // 采样率1kHz
i2c_write(MPU6050_ADDR, CONFIG, 0x06); // 低通滤波
}
注意最后那个0x06参数,调不好车子会像醉汉一样晃悠。实际调试时建议用匿名四轴上位机看原始波形,比盯着数值直观得多。
平衡控制核心是经典PID算法,但参数整定绝对是个玄学活儿。见过有人拿Ziegler-Nichols法硬刚,结果小车直接跳起机械舞。这里有个取巧方案——先调直立环再调速度环:
float Balance_PID(float angle)
{
static float err_prev = 0;
float err = target_angle - angle;
integral += err * dt;
float output = KP * err + KI * integral + KD * (err - err_prev)/dt;
err_prev = err;
return output;
}
重点在dt取值,建议用定时器中断确保精确计时。遇到剧烈抖动时,试着给KD项加个限幅阀值。

蓝牙模块用的是HLK-B40,这货的AT指令有点反人类。手机APP发送的指令格式要注意校验位,遇到过数据丢包的同学可以试试这个接收策略:
void USART3_IRQHandler()
{
if(USART_GetITStatus(USART3, USART_IT_RXNE)){
char ch = USART_ReceiveData(USART3);
if(ch == '!'){
parse_command(buffer); // 指令开始符
memset(buffer,0,20);
} else {
strncat(buffer, &ch, 1);
}
}
}
实测当手机离车三米以上时,最好在APP里加个心跳包检测。曾有个老哥在广场试车,结果小车收到周边十几台手机的蓝牙指令,当场表演托马斯回旋...
寻迹壁障自平衡小车,带手机APP蓝牙功能,STM32平衡车,赠送原理图,PCB图,源代码等全部资料。 默认功能:手机APP操控小车前进后退、左右转向、原地旋转。 可选配功能:OLDE显示、超声波壁障、超声波跟随,红外寻迹等。 主要硬件:STM32F103C6T6单片机、MPU6050陀螺仪模块、DRV8833电机驱动模块、HLK-B40蓝牙模块、直流减速电机、新款车轮、14500充电电池两节、电池盒一个。 集成STM32单片机最小系统,SWD接口下载代码,所有引脚全部引出,方便二次开发。 买家须知: 1.本小车默认不包括寻迹模块、超声波模块、显示屏模块等,需选配。 2.本小车采用两节3.7V锂电池供电,型号为14500型,需买家自备电池和充电器。 3.本小车采用SWD接口下载代码,需买家自备下载器。 4.手机APP仅限于安卓手机,苹果手机无法使用。 5.原理图和PCB文件为PDF版本。

电机驱动用DRV8833时要特别注意PWM频率,建议设置在18-20kHz之间。频率太低电机啸叫能吵醒邻居,太高了MOS管发热严重。驱动逻辑可以这样写:
void Set_Motor(int16_t pwm)
{
if(pwm > 0){
MOTOR_IN1 = 1;
MOTOR_IN2 = 0;
PWM_Output(pwm);
} else {
MOTOR_IN1 = 0;
MOTOR_IN2 = 1;
PWM_Output(-pwm);
}
}
注意死区时间配置,否则容易烧驱动芯片。有个血泪教训:某次没加死区保护,上电瞬间两个MOS管直通,直接上演放烟花。
想玩进阶功能的注意了,超声波模块的触发信号最好用定时器生成。当同时处理多路超声时,用输入捕获模式能精准测量时间差。红外寻迹建议做成模块化设计,方便后期扩展其他传感器。

最后说几个坑点:电池一定要选带保护板的14500,裸奔锂电池过放一次就废。SWD下载器推荐用DAP-LINK,某宝二十块的兼容版也能用。原理图虽然是PDF格式,但拿Kicad照样能反向改图,亲测有效。
这车最爽的是平衡状态下突然来个原地漂移,车轮摩擦地面的声音比跑车声浪还带感。有次调参过头,小车直接变身为指尖陀螺,在桌面上转了整整两分钟没倒下——所以说,玩平衡车最大的风险不是烧芯片,而是容易上瘾啊!
更多推荐
所有评论(0)