找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 23374|回复: 26
打印 上一主题 下一主题
收起左侧

基于Arduino的小平衡车

  [复制链接]
跳转到指定楼层
楼主
ID:138313 发表于 2017-6-17 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



近期考试繁忙,先上视频热身热身!

做平衡需要具备的基本配件:
一.硬件方面:
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.卡尔曼滤波得到(复杂)
总接线图:



评分

参与人数 3黑币 +17 收起 理由
KevinCruz + 5 希望楼主共享源码
偶游QHD + 8 绝世好帖!
Deathdom + 4

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2017-6-19 03:29 | 只看该作者
好东东,楼主能分享点制作资料吗?
回复

使用道具 举报

板凳
ID:138313 发表于 2017-6-20 15:10 | 只看该作者
admin 发表于 2017-6-19 03:29
好东东,楼主能分享点制作资料吗?

后面整理出来会有的,近期实在太忙。。。
回复

使用道具 举报

地板
ID:213116 发表于 2017-6-21 00:28 | 只看该作者
做得真不错,反应很灵敏,期待分享相关资料
回复

使用道具 举报

5#
ID:187533 发表于 2017-6-21 21:29 | 只看该作者
楼主真会吊胃口,寝食难安了啊!期待楼主的精彩分享
回复

使用道具 举报

6#
ID:187533 发表于 2017-6-23 06:06 | 只看该作者
楼主,收徒吧,太佩服了,我每天都来论坛里等你的消息。
回复

使用道具 举报

7#
ID:187533 发表于 2017-6-25 06:31 | 只看该作者
收到楼主的回复,好鸡冻
回复

使用道具 举报

8#
ID:138313 发表于 2017-6-25 22:56 | 只看该作者
实在是忙!但在这先给车友们一些思想指导,做平衡之前我也是属于小白,但坚持了两个月,不会就查,边查边尝试。然后做得厌倦了就先玩其他的,反反复复的弄来弄去,直到后面看了一个PID视频,顿时恍然大悟,最后稍作思路整理、重振旗鼓,终于看到了希望。因为了解了PID,再也不怕平衡,后面就可对其进行任意改装,目前正在给它加新功能。等暑假打个比赛后就可以整理资料。现在的建议是车友们最好先玩起来,等有了一定印象后就好办了,要是很白很白的小白,建议先玩4轮的小车!

评分

参与人数 1黑币 +100 收起 理由
admin + 100 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:187533 发表于 2017-6-27 05:05 | 只看该作者
正在走楼主走过的路,PID尚未悟出,心情好的时候会拿出来边调边悟,悟到心情急躁了就赶紧放下了,要不真受不了。感谢楼主的建议。
回复

使用道具 举报

10#
ID:187533 发表于 2017-6-27 05:08 | 只看该作者
祝楼主比赛顺利!
回复

使用道具 举报

11#
ID:138313 发表于 2017-8-7 01:46 | 只看该作者
由于在这个网站找不到继续编辑的入口,只好在其他网站继续更新平衡车内容,请移步
Arduino平衡小车——开始不断更新
回复

使用道具 举报

12#
ID:138313 发表于 2017-8-7 13:13 | 只看该作者
三.万事俱备只欠东风
1.第一步,测试电机控制。
        根据上面的接线图,把电机,驱动,电源,Arduino接好,然后用下面这段程序测试,电机是否能转,转的方向对不对,若出现不正常则检查相关信号线,比如转向反了(只需在程序里把IN对调或者把接线调即可)
电机测试程序:
//LM298
#define EA 5//左  UNO的PWM引脚为3、5、6、9、10、11
#define EB 6//右

#define IN1 11  //左轮
#define IN2 12
#define IN3 9   //右轮
#define IN4 10
void setup(){
      pinMode(EA,OUTPUT);
      pinMode(EB,OUTPUT);
      pinMode(IN1,OUTPUT);
      pinMode(IN2,OUTPUT);
      pinMode(IN3,OUTPUT);
      pinMode(IN4,OUTPUT);
                  }
void loop()
{
  PWM_Motor(200,-200);//测试电机,应看到左轮前进,右轮后退
}
/***********电机驱动子程序*************/
void PWM_Motor(int PWM_L,int PWM_R)
{
  if(PWM_L<0)
  {
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
  }
  else
  {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
   }
  if(PWM_R<0)
  {
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
  }
  else
  {
   digitalWrite(IN3, LOW);
   digitalWrite(IN4, HIGH);
  }

analogWrite(EA,abs(PWM_L));//5脚
analogWrite(EB,abs(PWM_R));//6脚
}
不知道大家有没有注意到:在这里判断正反转是通过判断PWM的正负来确定正反转的,而不是用角度来判断,
比如
错误的方向判断方式:
if(角度<0) {
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
  }
else......
正确的方向判断方式:
if(PWM_L<0) {
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
  }
  else
  {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
   }

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

13#
ID:187533 发表于 2017-8-13 20:16 | 只看该作者
楼主超级棒,小学徒的学徒开始学习中。
回复

使用道具 举报

14#
ID:187533 发表于 2017-8-13 20:29 | 只看该作者
arduino小学徒 发表于 2017-8-7 01:46
由于在这个网站找不到继续编辑的入口,只好在其他网站继续更新平衡车内容,请移步
Arduino平衡小车——开 ...

这个“Arduino平衡小车”我找不到,请发个链接吧。谢谢!
回复

使用道具 举报

15#
ID:222006 发表于 2017-8-23 13:49 | 只看该作者
好玩的东东。
回复

使用道具 举报

16#
ID:87193 发表于 2017-9-27 10:29 | 只看该作者
期待完整的资料,可以好好学习一下
回复

使用道具 举报

17#
ID:237069 发表于 2017-10-4 16:55 | 只看该作者
新人加入,等级够了再来下载学习
回复

使用道具 举报

18#
ID:242562 发表于 2017-11-8 00:02 来自手机 | 只看该作者
在学习中
回复

使用道具 举报

19#
ID:242562 发表于 2017-11-10 00:15 来自手机 | 只看该作者
什么时候更新?
回复

使用道具 举报

20#
ID:249075 发表于 2017-11-13 21:46 | 只看该作者
好赞啊,厉害
回复

使用道具 举报

21#
ID:78884 发表于 2018-1-9 15:04 | 只看该作者
楼主还在吗  我的平衡小车PID怎么调总是往一边歪  直立环的P怎么调 小车总是往固定一边慢慢滑,然后跑着跑着就倒了, 轻轻的往另一边推它会往那边滑一小段距离越来越慢然后又往固定那边跑了,然后越跑越快直到倒地 楼主造这是什么原因吗 求助
回复

使用道具 举报

22#
ID:388232 发表于 2018-8-20 17:11 | 只看该作者
arduino小学徒 发表于 2017-8-7 13:13
三.万事俱备只欠东风
1.第一步,测试电机控制。
        根据上面的接线图,把电机,驱动,电源,Arduino ...

楼主,我的程序判断方向就是用你说的错误方式写的,运行时跟抽风一样,想问一下为什么这个方式错误呢
回复

使用道具 举报

23#
ID:223788 发表于 2019-1-17 22:17 | 只看该作者
请问能不能分享下原理图跟源码呢?
回复

使用道具 举报

24#
ID:489682 发表于 2019-3-25 14:33 | 只看该作者
感谢楼主总结并分享!
回复

使用道具 举报

25#
ID:516946 发表于 2019-11-22 12:00 | 只看该作者
轮回之境 发表于 2018-1-9 15:04
楼主还在吗  我的平衡小车PID怎么调总是往一边歪  直立环的P怎么调 小车总是往固定一边慢慢滑,然后跑着跑 ...

平衡车实验成功了吗?成功的话能给大家分享一下代码吗?
回复

使用道具 举报

26#
ID:138313 发表于 2020-12-4 16:10 | 只看该作者
arduino平衡车代码

13.平衡车编程演示.zip

6.64 KB, 下载次数: 42, 下载积分: 黑币 -5

arduino平衡车代码

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

27#
ID:906966 发表于 2021-4-16 17:30 | 只看该作者
楼主的作品现在怎么样了?
最近也是做平衡车遇到问题了,向你学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表