近期考试繁忙,先上视频热身热身!
做平衡需要具备的基本配件:
一.硬件方面:
1.电源:比如航模电池11V或者7V以上,具体看电机供电电压
2.Arduino推荐2560,因为后面可以加很多有趣的东西,比如语音,无线遥控,超声波,触摸屏,显示器等等,MEGA2560有足够的引脚
3.关键的东西>>MPU6050
4.电机和轮子+车架(可自制)。建议初学者买带有编码测速的车身,电机应带有两相测速,目的是可以测出电机正反转。
5.电机驱动:可用298或者TB6612.建议用TB6612,它体积小,功率够用。
6.降压模块。降压模块主要给Arduino供电,把11V的电压降到8V左右通过Vin供电端给Arduino供电,如果直接接11V,小心芯片Duang机。
小车可平衡之后就可以加点控制器件:比如HC-05/06蓝牙模块或者NRF2.4G无线模块。
二.软件方面:
1.最重要的当然是传说中的PID控制算法(其实不难,真不难,一个学期时不时的拿别人的程序出来看看,总会有理解的那天!)
2.理解测速和检测方向原理(不管最高最低转速如何,只要转动电机有数就好,不用担心数太小)
3.灵活运用串口监视器进行调试,可以打印数字观察角度,PWM等。
4.要知道MEGA2560和UNO的定时器库不一样,需注意!
#include //mega2560定时器库
#include //如果MsTi该库不变红色,需更新该库(UNO定时库)
5.拿到正确的MPU6050的角度和角速度。为什么说拿到呢?实话说6050不需要你太花费时间去理解它是怎么工作怎么叽叽歪歪的,你只需要找到它的出口值(角度和角速度)就行。就比如下面这段程序就可以得出标准的角度(f_angle )和角速度(omega)
当然在主函数钱还有它的一些定义:如何在一大堆程序里找出哪些才和它相关呢(先整体复制进来-编译运行-正确-尝试屏蔽掉自认为与它无关的语句以及定义-若报错,则它有关,恢复回来-若正常编译,则可去掉该语句)
/********MP6050相关***************/
float timeChange=10;//滤波法采样时间间隔毫秒
float dt=timeChange*0.001;//注意:dt的取值为滤波器采样时间
MPU6050 Mpu6050;//命名 陀螺仪类:Mpu6050
int16_t ax, ay, az, gx, gy, gz;//陀螺仪原始数据 3个加速度+3个角速度
float f_angle,angleA,omega,gyroGz,control_v;
float angle0 = 1.80,gy1 = 30; //因重心导致角度偏置;陀螺仪偏移量
/**************标准角度处理**************/
void jiao_du()
{
Mpu6050.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);//读取原始6个数据
float ax1 = map(ax,-15924,16629,-16384,16384); //除去每个轴的漂移量
float ay1 = map(ay,-16601,16121,-16384,16384);
float az1 = map(az,-17454,15750,-16384,16384);
angleA = atan2(ax1,az1) * 180 / PI+ angle0; //加速度计算角度。得到平衡位置的角度
omega = -(gy - gy1) / 131.00; //计算角速度
gyroGz =gz / 131.00;//陀螺仪角速度,注意正负号与放置有关
unsigned long now = millis(); // 当前时间(ms)
float dt = (now - preTime) / 1000.0; // 微分时间(ms)
preTime = now;
float K = 0.8; //一阶滤波
float A = K / (K + dt);
f_angle = A * (f_angle + omega * dt) + (1-A) * angleA; //得到正常的角度
}
6.(不需要)卡尔曼滤波。其实用了上面的角度处理程序,就不要卡尔曼了
因为要得到正常的角度和角速度有两种方式:
1.算法融合得到(简单)
2.卡尔曼滤波得到(复杂)
总接线图:
|