自平衡小车/zh

来自Microduino Wikipedia
502748957@qq.com讨论 | 贡献2015年11月10日 (二) 07:25的版本
跳转至: 导航搜索

概述

  • 项目名称:Microduino自平衡车
  • 目的:制作一台可以用遥控板控制的自平衡机器人小车
  • 难度:中
  • 耗时:2小时
  • 制作者:
  • 简介:

两轮自平衡小车是一个集多种功能于一体的综合系统,是自动控制理论与动力学理论及技术相结合的研究课题,其关键问题是在完成自身平衡的同时,还能够适应各种环境下的控制任务。本次教程我们使用Microduino产品模块快速搭建一个可以用遥控板控制的自平衡机器人小车,玩家可以迅速上手,并且看到小车运动和平衡的效果,玩家们可以在制作结束后,继续更深一步的智能控制部分的研究。

材料清单

  • Microduino设备
模块 数量 功能
Microduino-Core+/zh 1 核心板
Microduino-USBTTL/zh 1 下载程序
Microduino-nRF24/zh 1 无线通信
Microduino-Robot/zh 1 驱动连接地板
Microduino-Stepper/zh 2 驱动步进电机
  • 其他设备
模块 数量 功能
2.4G天线 1 2.4G通讯
固定支架 1 固定支撑
尼龙螺丝 4 固定
尼龙螺母 12 固定
电池盒 1 装载电池
电池 2 供电
Micro-USB数据线 1 串口通信,下载程序
车轴 2 连接车轮
车轮子 2 结构
步进电机 2 驱动车轮
  • Joypad材料
模块 数量 功能
Microduino-Core 1 核心
Microduino-nRF241 1 无线通讯
Microduino-Joypad 1 遥控器
Microduino-TFT 1 显示
Microduino-USBTTL 1 下载程序
锂电池 1 供电
亚克力面板 1 面板
尼龙柱 4 固定
长尼龙螺丝 4 固定
短尼龙螺丝 4 固定
尼龙螺母 4 固定
海绵板 1 固定

实验原理

  • PID原理

PID在自动控制领域有着极其重要的作用,作为最早实用化的控制技术已经有70多年的历史,近几年一些创客们自制的一些很酷的东西,如:四轴飞行器,自平衡车等等都离不开它的身影。 首先了解什么是PID。PID实指“比例proportional”、“积分integral”、“微分derivative”,如果我们要求被控制的对象最终趋于一个稳定的结果,一般就可以使用PID算法。 假设说,有一辆速度为1m/s的小车,我们要求他的速度改变为5m/s,要完成这样的一件事,我们必须要有:

  • 小车驱动装置(用程序控制它输出多大的电压,电压决定驱动的马力);
  • 被驱动器控制的部分(即小车);
  • 检测当前速度的装置(当前速度与目标速度的差称为误差);

本来,我们可以给小车一个驱动力让小车加速,直到检测到小车速度达到5m/s,撤去驱动力。但是,这样做会带来几个问题: 1)当小车速度达到5m/s时,从装置检测到这个速度,通知控制器,让控制器改变输出的电压,这一个过程需要耗费一定时间,在这个时间里面,小车速度可能增加了不少。 2)撤去驱动力后,外界条件如摩擦会让小车速度进一步改变。 然而,PID算法可以在一定误差内解决这些问题。 使用PID算法时,大致是这样的。每一个采样周期,通过速度检测装置获得当前速度,传入程序,通过程序计算得到电压控制小车得到新速度。下一个采样周期又把新速度传入,获得新电压,再传入速度,再获得电压,如此反复。 PID算法的关键,是如何根据当前得到的速度值,输出一个“恰当”的电压,以致小车最终能够趋于稳定。 PID算法采用比例,积分,微分(Proportion Integral Differential)三种方法进行控制。三种方法都有自己对应的一个常量(pconst,iconst,dconst)。这三个变量都需要在实验中多次尝试得出。用数学公式表达PID算法如下图所示: 此处:e = 期望值 – 输入值

平衡车之所以可以自己掌握平衡,首先通过Microduino-10DOF模块的加速度和陀螺仪测出相应的姿态数据,然后利用kalman滤波算法得出当前平衡车的角度。平衡的角度是180度,如果测出的角度偏离180,PID算法会调整输出相应的PWM值给电机,从而保持小车平衡。 PID原理有点像锅炉房里烧锅炉,首先定下来锅炉的恒定温度,比如26摄氏度,锅炉房里的墙上有一个温度计,能够实时测得锅炉的实时温度。锅炉房里通常有个老大爷时不时(每十分钟看一次)的看着墙上的温度计,如果温度高了就给锅炉降温,低了就给锅炉升温。如果让一个没有经验的年轻小伙子来管理锅炉的温度,可以想象温度表的值会上下浮动的,有经验的老大爷会把这个浮动降到最低。其实PID就是这个烧锅炉的例子,在代码中就有这个故事的影子: 1)规定的26度就是setpoint 2)当前的温度就是CurrentAngle 3)实际值与26度的偏差就是error 4)没有经验的小伙子有点像PID中的P 5)有经验的老大爷相当于PID了 6)每十分钟看一次相当于PID计算的周期时间 PID的主要代码:

// PD的实施。 DT是毫秒 
float stabilityPDControl(float DT, float input, float setPoint, float Kp, float Kd) 
{ 
    float error; 
    float output; 
    error = setPoint - input; 
    // Kd的两部分实施 
    //仅使用输入(传感器)的一部分而不是设定值输入(T-2)最大的一个 
    //而第二个使用该设定值 
    output = Kp * error + (Kd * (setPoint - setPointOld) - Kd * (input - PID_errorOld2)) / DT; 
    //Serial.print(Kd*(error-PID_errorOld));Serial.print("\t"); 
    PID_errorOld2 = PID_errorOld; 
    PID_errorOld = input;  // 误差为Kd值是唯一的输入组件 
    setPointOld = setPoint; 
    return(output); 
} 
//P控制实现。 
float speedPControl(float input, float setPoint,  float Kp) 
{ 
    float error; 
    error = setPoint - input; 
    return(Kp * error); 
} 

本套件利用陀螺仪和加速度传感器(Microduino-10DOF/zh)来检测车体态的变化,并利用步进电机控制核心(Microduino-Stepper/zh),精确地驱动电机进行相应的调整,以保持系统的平衡。

  • 主要传感器

Microduino-10DOF

文档

调试过程

将Microduino-Core+与Microduino-USBTTL叠加(无上下顺序),通过USB数据线与电脑连接起来

Download1.jpg

确认你搭建了Microduino的开发环境,否则参考附录1-Arduino IDE安装指导。

打开Arduino IDE编程软件,点击 【文件】->【打开】

Dl1.jpg

浏览到项目程序地址,点击“Joypad_Balance_Reception.ino”程序打开

点击“工具”,在板选项里面选择板卡(Microduino-Core+),在处理器选项里面选择处理器(Atmega644pa@16M,5V),再在端口选项里面选择正确的端口号,然后直接烧录程序

  • 平衡车骨架搭建

按下图步骤将步进电机装在骨架上

再用

安装电池和Microduino-Robot底板

  • 注意:装上电池之前请确认Microduino-Robot底板上的开关位于”off”位置

之后将

把用到的模块叠加起来。

  • Microduino-10DOF
  • Microduino-nRF(带天线)
  • Microduino-Core+

再将叠加好的模块叠加到Microduino-Robot底板上

将Microduino-Stepper模块叠加到Microduino-Robot底板上

将电机线一头接到步进电机接口上,另一头接到Microduino-Stepper的电机接口上

完成这一步平衡车就搭建完成了

  • Joypad遥控板的搭建与调试

将Microduino-Core与Microduino-USBTTL叠加(无上下顺序),通过USB数据与电脑连接起来。

Download1.jpg

打开Arduino IDE编程软件,点击【文件】->【打开】

Dl1.jpg

浏览到项目程序地址,点击“Joypad_RC_2.3.ino”程序打开。

点击【工具】,在板选项里面选择板卡(Microduino-Core),在处理器选项里面选择处理器(Atmega328p@16M,5V),再在端口选项里面选择正确的端口号,然后直接烧录程序。

Dl3.jpg
  • 安装Joypad

将Microduino-TFT安装在Microduino-Joypad面板上

将尼龙螺丝安装在Microduino-Joypad上,并且将底面板粘贴在Microduino-Joypad底部

将Microduino-TFT与Microduino-Joypad通过转接线连接起来

将锂电池连接到底板上,注意正负极别接反了,板子背面标注了正负极

将底板和面板用尼龙螺丝固定好

可以打开电源开关,观察供电是否正常

将下载好程序的core还有nRF24板卡放在Joypad底板上,完成这一步Joypad的搭建就完成了

  • 自平衡小车和Joypad测试

Joypad操作说明

  • 左上边是油门控制开关,打开(拨到上面),才能进行控制,你可以摇动摇杆,观察屏幕的变化。
  • 右边开关是精度调整开关,开关拨到上面可以最大幅度控制,否则只能小幅度控制了,小幅度有助于稳定控制。
  • 左边摇杆本次未使用。
  • 右边摇杆在垂直方向上控制前后方向移动,往上向前,往下向后,在水平方向上控制左右方向移动。

Joypad开机设置

打开遥控器电源开关,按下复位按键(左边USB接口右边那个)进入系统,请在4S内按下【key1】按键,进入遥控器校准和控制选择模式。 360度最大幅度旋转两个摇杆,遥控板会读入摇杆的位置数据,摇动至示数不再变化即可

选择控制模式,可以通过【key3】按键来选择是控制四轴飞行器(Quad.)还是机器人(Robot),Robot模式可控制自平衡车和BOXZ mini,黑色表示选中。因此我们需要选择Robot模式。还可以通过【key4】按键来选择是否是体感控制模式,如果选择体感模式,你必须叠加Microduino-10DOF模块,选择“MPU ON”。如果是摇杆控制模式,选择“MPU OFF”。 这次搭建没有使用10DOF模块,因此选择MPU OFF模式;

选择完成后,通过【key2】按键退出配置,进入操作

将左上边控制开关打开(拨到上面),才能进行控制,你可以摇动摇杆,观察屏幕的变化

右边开关是幅度调节模式,开关拨到上面可以最大幅度控制Robot,否则只能小幅度控制。如果使用小幅度控制小车,右边摇杆拨到最大位置,小车速度也只能小范围变化,这样有助于稳定控制

当启动小车时,只需要用到右边的摇杆,摇杆的方向和平衡车的方向一致,你可以尝试摇杆控制是否正确。 测试通过后,就可以打开平衡车上Microduino-Robot底板上的电源开关,拨到ON(左边),如果可以看到核心板上的红色led亮,说明供电正常。这样制作就完成了,可以愉快的玩耍了

注意问题

  • 下载程序时候最好只叠加core(core+)和USBTTL,虽然本次搭建涉及的nRF24不会引起冲突,但是别的通信模块有时会造成串口冲突,养成好习惯。
  • Core+要叠在nRF24,USB的底下,紧贴ROBOT板。
  • 锂电池正负极别接错了,否则会烧坏电路。
  • 调试好后,实际运行时不要使用USB供电,供电电压不足,请使用电池

程序说明

视频