遥控平衡小车的经验

现在的项目是在做一个比较大的遥控平衡车,目前可以做到遥控行走了,也遇到过很多坑,就说一点吧,不过我理解的也不是很深入,有不足的欢迎指出

1、平衡车的重心越低,平衡效果越好

2、平衡车前进的原理是,把小车保持平衡的角度前倾,小车为了保持这个倾角,会往前追,从而达到前进的效果,所以前进的速度就和前倾的这个角度有关了,后退同理;这里又涉及到了一个问题,就是如果平衡车的重心太低了,已经和电机在同一个平面了,那么小车前倾了一定角度,同样能保持平衡,所以就前进不了

3、平衡车的3个PID环–角度环,速度换,转向环;首先,角度环是为了让小车保持平衡,但是它不会考虑到速度,比如在调节平衡时,前倾了一点,小车就会往前追;所以,这里就要加入速度环了,速度环的作用是保持设定的速度(通常这个速度为0),所以加入了速度环小车就会保持在原地前后摆动了;转向环就是用来调节转向的角度的

4、关于小车前进的方法,有3种,第一种是在角度环里修改保持平衡的那个角度,修改时平滑一点修改,比如可以每5ms修改0.02度或者0.04度的样子(目前我使用的就是这种);第二种是在速度环里修改位移的积分,其实这里我理解的也不是很懂,就不乱讲了;第三种则是修改速度环里保持的速度的变量

5、关于小车的平衡点,我之前一直认为小车是在水平方向上平衡的,但实际上不是;如果小车的重心是在控制板的垂直方向上,那么的确是在水平方向平衡,但是如果重心在前面或者后面的话,就需要把上电保持的平衡角度进行适当修改了;改这个变量的方法有两种,一种就是读出平衡时的角度,写死在程序里,但是如果重心改变则不能保持平衡;第二种是上电时读取当前角度,然后把这个角度加在角度环里,所以用这种方法时,上电必须把小车放在一个平衡的角度

6、紧跟第5点,有一些MPU6050上电时通过DMP读出来的数据在前20秒内是不稳定的,这个要注意

7、小车的底盘一定要稳,如果上面的重量都大于下面的重量了,平衡效果不好,前进之后会后退的

  • 22
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
声明:该设计资料转自lb8820265网友分享,仅供学习参考,不可用于商业用途。 手机遥控蓝牙平衡小车概述: 蓝牙平衡玩具小车,具有的功能有:手机APP虚拟遥感控制模式,自动行走避障模式,碰撞自动后退,倒下自动停止,预警模式,跳舞模式,说话,语音表情,压强播报,温度播报,湿度播报,前方障碍物距离播报,PC上位机无线调参,示波器显示,3D姿态显示。是集趣味性,智能性,易操作性,可研究性于一体的蓝牙平衡小车。 视频演示: 采用的硬件如下: 处理器: Nucleo STM32F411核心板 传感器模块: Nucleo IKS01A1(包括陀螺仪,加速度计,磁力计,温度计,湿度计,压强计) 蓝牙模块: CC2541 蓝牙4.0模块 无线模块: NRF24L01+模块 电机驱动模块: BT6612模块 测距模块: 夏普2Y0A21红外测距模块 舵机: SG90模拟舵机 语音模块: SYN6658语音模块 电池: 狮子11.1V 2200mAh 电源: LM2596电源模块 电机: 诗凯支架自带,3530直流减速电机 光电编码器: 电机自带,13440线每轮转,AB相输出 手机: 魅族MX3 上位机接收端: MSP430G2553核心板 电脑: 这个随意 整个系统的硬件拆解图图下图所示: 整个系统可大致分为4个部分,分别是:小车部分,上位机接收机,PC上位机,安卓手机控制端。 4个部分的关系如下图所示: 其中以平衡小车为中心,能将信息通过无线发送给上位机接收端,上位机接收端再将数据通过串口的形式发送给PC上位机。同时上位机亦可以发送调参与控制指令给上位机接收端,上位机接收端再将信息发送给平衡小车。安卓APP也能通过蓝牙传输信息给CC2541模块,将信息通过串口的形式发送给平衡小车进行控制。 编写的软件如下: 小车: 采用IAR7.3编写 上位机接收端: 采用CCS5.1编写 上位机: 采用VC6.0 MFC编写 手机APP: 采用Android studio 1.2.2编写 手机APP 之前的帖子已经讲了,如何实现蓝牙4.0的收发,那么接下来就是通信协议的制定与界面的编辑了, 下图是手机APP的截图: PC上位机端 上位机采用VC6.0编写,PC上位机主要是用来进行参数调整、虚拟示波器显示波形、3D姿态显示。下图是上位机截图。采用MSComm串口控件进行数据的发送与接收。能够进行端口扫描,并连接串口,实现数据发送,错误显示,实现了4个整形数字与4个浮点数的调整,并且能够读取系统的原始数据,显示发送状态,且能够显示信号强弱,同时能够进行示波器显示,调节显示间隔。 由于采用的是NRF24L01+带数据的ACK模式进行数据传输,所以上位机不发送数据的时候,小车并不会发送回来,所以上位机能够掌握显示数据的间隔。示波器采用的IPlot控件,能够实现4个数据波形显示,且能够让任意一组数据显示、实现轴的缩放、在顶端显示数值。3D姿态显示采用的是OpenGL库,画出小车模型,设置为半透明,能实时清晰的显示小车的姿态。 PC上位机示波器显示紧挨着3D姿态显示亲热照! 蓝牙平衡玩具小车全家福!
这里提供一个基于Arduino控制器和HC-05蓝牙模块的自平衡小车控制程序示例,供参考: ``` #include <Wire.h> #include <Adafruit_MotorShield.h> #include <Adafruit_Sensor.h> #include <Adafruit_L3GD20_U.h> #include <Adafruit_LSM303_U.h> #include <SoftwareSerial.h> SoftwareSerial bluetooth(3, 4); // 初始化蓝牙模块,TX连接到pin 3,RX连接到pin 4 Adafruit_MotorShield AFMS = Adafruit_MotorShield(); // 初始化电机驱动板 Adafruit_DCMotor *motor1 = AFMS.getMotor(1); // 初始化左电机 Adafruit_DCMotor *motor2 = AFMS.getMotor(2); // 初始化右电机 // 初始化陀螺仪和加速度计 Adafruit_L3GD20_Unified gyro = Adafruit_L3GD20_Unified(20); Adafruit_LSM303_Accel_Unified accel = Adafruit_LSM303_Accel_Unified(30301); // 陀螺仪校准值 float gyro_x_cal = 0; float gyro_y_cal = 0; float gyro_z_cal = 0; // PID参数 const float kp = 5.0; const float ki = 0.1; const float kd = 0.1; // 微调参数 const float gyro_gain = 0.07; const float angle_gain = 0.3; // 控制变量 float target_speed = 0; float actual_speed = 0; float error = 0; float last_error = 0; float integral = 0; float derivative = 0; float output = 0; float angle = 0; void setup() { AFMS.begin(); // 启动电机驱动板 motor1->setSpeed(150); // 设置左电机速度 motor2->setSpeed(150); // 设置右电机速度 // 初始化陀螺仪 if(!gyro.begin()) { while(1); } gyro.enableAutoRange(true); // 初始化加速度计 if(!accel.begin()) { while(1); } } void loop() { // 读取陀螺仪和加速度计数据 sensors_event_t gyro_event; sensors_event_t accel_event; gyro.getEvent(&gyro_event); accel.getEvent(&accel_event); // 计算角度 angle = angle_gain * (atan2(accel_event.acceleration.y, accel_event.acceleration.z) * 180 / M_PI); angle = angle + gyro_gain * (gyro_event.gyro.x - gyro_x_cal); angle = constrain(angle, -45, 45); // 计算速度和误差 actual_speed = (motor1->current() + motor2->current()) / 2.0; error = target_speed - actual_speed; // 计算PID输出 integral = integral + error; derivative = error - last_error; output = kp * error + ki * integral + kd * derivative; output = constrain(output, -255, 255); // 更新电机速度 motor1->run(output > 0 ? FORWARD : BACKWARD); motor2->run(output > 0 ? FORWARD : BACKWARD); motor1->setSpeed(abs(output)); motor2->setSpeed(abs(output)); // 发送角度和速度数据到蓝牙模块 bluetooth.print("Angle:"); bluetooth.print(angle); bluetooth.print(","); bluetooth.print("Speed:"); bluetooth.println(actual_speed); // 接收蓝牙模块发送的指令 if(bluetooth.available()) { char command = bluetooth.read(); switch(command) { case 'F': target_speed = 100; break; case 'B': target_speed = -100; break; case 'S': target_speed = 0; break; default: break; } } // 更新误差和PID参数 last_error = error; delay(10); } ``` 在这个程序中,我们使用Arduino的PWM输出来控制电机的速度,并且使用PID控制算法来控制小车的平衡。程序通过蓝牙模块接收来自手机等设备的指令,实现小车的前进后退等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值