网站同时做竞价和优化可以,用typecho做的网站,市场营销推广活动方案,怎样做网站seo优化摘要#xff1a;Nano是一个小巧可爱的机器人#xff0c;身高大约10公分#xff0c;特点是平衡感好#xff0c;长得很白以及善于卖萌。作为全球最迷你的自平衡机器人#xff0c;Nano身材虽小#xff0c;但配置有丰富的传感器—陀螺仪#xff0c;超声波#xff0c;Motion… 摘要Nano是一个小巧可爱的机器人身高大约10公分特点是平衡感好长得很白以及善于卖萌。作为全球最迷你的自平衡机器人Nano身材虽小但配置有丰富的传感器—陀螺仪超声波Motion sensor如果喜欢的话你可以让它自主巡线跟踪避障…更重要的是它是完全开源的从硬件到软件的资料都会在下文中提供下载。Nano的功能演示自平衡站立自平衡行走转向手机APP遥控及交互超声波感应摄像头目标跟踪卖萌Nano与蛋黄Nano的创意始于2013年暑假那时候它还叫“蛋黄”当时的想法是制作一个入门级的自平衡小车(因为赶上学校飞思卡尔比赛当时报的平衡组当预习功课了)初步的设想是基于Arduino制作可以用PS2手柄遥控能平衡能走最好还会卖萌。其实那也是我第一次接触和使用Arduino当时少年穷…买了一块国产的mini pro裸板感觉有点开心然后没多久就被我瞎接电源给霍霍了…最初版的蛋黄就是用mini pro做的由于当时还没有3D打印机可供差遣所以所有部件连接基本都是靠万能的万能胶整体结构十分的粗犷怎么说呢这也许就是蒸汽朋克风吧(并不是)。当时做的一个小视频《蛋黄物语》蛋黄的资料发在论坛之后引起了不少关注很多同学被顺利地带进了自平衡小车的坑…一年多时间还不断有人问我相关的问题也正因如此羞愧于靠着这么点干货应付大家许久加之个人对自平衡系统有了更深刻的理解…于是决定改进初代蛋黄的诸多不足着手设计制作蛋黄的2.0版本。当时对于初代的不满情绪主要集中体现在外表(毕竟颜值就是战斗力)速度控制(当时几乎没有用上速度环只能靠不断手动调节平衡点进行移动)扩展性(初代的外设太简陋没有完全发挥处理器的性能)以及外表(可以看出我真的很在意…)。最后就有了Nano啦~制作教程好啦接下来会介绍制作一只Nano的详细教程其中包括一些有关自动控制的原理和个人遇到的一些问题和经验总结。另外值得说明的是实现自平衡机器人的完整控制需要大量的参数调试过程因此本教程会尽量以通俗的方式介绍原理和调试方法但还是需要您拥有一定的电子制作基础、熟悉Arduino的使用、较强的动手能力以及坚定的极客精神祝成功:-)原理篇自平衡小车是一种典型的倒立摆控制模型什么是倒立摆呢普通的钟摆相信大家都见过当物体离开垂直的平衡位置之后便会受到重力与悬线的作用合力驱动重物回复平衡位置这个力称之为回复力其大小为F − mg*sinθ在偏移角度 θ很小的情况下 sinθ ≈ θ所以回复力与偏移的角度之间大小成正比关系, 方向相反在此恢复力作用下单摆便进行周期运动。而考虑在空气中运动的单摆由于受到空气的阻尼力 单摆最终会停止在垂直平衡位置。空气的阻尼力与单摆运动的角速度成正比 方向相反。阻尼力越大单摆越会尽快在垂直位置稳定下来。现在来看这样一个等效模型我们的车模其实就相当于一个倒立的钟摆可以看到这时候重力对于物体的作用是向下的也就是当物体偏移了一点角度之后重力作用会和偏移角度方向相同如果车轮不运动的话摆就会很快倒下。为了解决这个问题 使得倒立摆能够像单摆一样稳定在垂直位置我们有两个办法1、改变重力的方向 2、增加额外的受力使得恢复力与位移方向相反。显然能够做到的只有第二种方法为此我们根据摆的偏移角度控制车轮加减速运动这样在小车的坐标系非惯性系里摆就会受到额外的惯性力作用最终让摆平衡起来。再通俗一点说就是当我们发现小车向前倒的时候就赶紧让它轮子加速向前发现小车向后倒的时候就赶紧让它轮子加速向后只要这个过程做得足够精确和快速就能实现小车的自平衡。硬件篇原理里面说了我们要根据小车偏移的角度来控制轮子的加减速那么根据需求这里面需要用到的模块就有模块说明Arduino主控板选任何一块你熟悉的就行推荐nano小巧下载方便陀螺仪加速度计模块用来测量倾角推荐MPU6050便宜使用方便减速电机尺寸自定但最终输出转速为300rpm左右会比较合适值得注意的是电机必须带编码器或者码盘来测速单相或者两相的都可以电机驱动普通尺寸的电机推荐TB6612驱动芯片比L298的效率高不易发热平均电流1.2A左右功率更大请选L298或其他驱动迷你电机用L9110s模块即可便宜也很小巧蓝牙模块用于和手机通信从模块或者主从一体的都可以按键任何两个脚的按键都可以用来进行一些设置电池如果是用高于5V的锂电供电的话就可以直接使用但如果做迷你车用3.7v的小电池供电就需要注意得额外加一个DC升压模块否则Arduino可能无法正常工作在16MHz超声波模块可用于测距和避障SR04比较常用更小巧一点的有RCW-0001当然更小的还可以买收发一体的自己DIY距离传感器夏普的一系列传感器比超声模块贵一些但效果也更好OLED显示屏用来显示状态数据当然少不了屏幕0.96寸的分辨率128×64效果非常好注意最好买SPI接口的因为I2C可能跟MPU6050有冲突可能是个例按理说地址是不冲突的具体原因没有深究蜂鸣器让小车发声往往比盯着一个LED看效果更好推荐使用有源蜂鸣器摄像头 Motion Sensor准确的说是红外光传感器由于Arduino的性能不足以进行图像处理所以无法使用一般的摄像头此外除一般焊接工具和手工工具外一把热熔胶枪会成为你DIY的得力助手。至于结构件有3D打印机的同学可以直接下载后面的STL文件自行打印没有打印机的同学也可以到万能的橙色网站找到3D打印服务店。还有一点需要说明的是我当时使用的小电机是自己改装过的原本是一个数码相机的变焦马达所以非常小巧而且可以装码盘改了减速比和增加出轴之后就拿来做小车了只不过现在好像没有这款卖了…不过后来无意找到一款更合适的N20减速小电机性能比自己改装的那款好很多虚位和摩擦损耗都会更好出轴也能直接接轮子而且配备了霍尔测速长这样有意做超迷你平衡车的同学可以选用这款。TB链接就不发了…橙网搜 “N20减速电机 迷你”就能找到的软件篇软件篇主要介绍PID算法可以说PID是整个项目程序的核心其使用的好坏决定了你的小车能不能自平衡以及平衡得稳定不稳定。PID的算法和理论分析网络上有很多介绍这里就不详细讲解了大家可以自行搜索。基于数学模型的介绍有点不好理解本文从控制学的角度简单讲解一下PID及其使用方法。所谓PID就是比例-积分-微分的英文缩写但并不是必须同时具备这三种算法也可以是 PD, PI,甚至只有 P算法控制下面分别介绍每个参数的含义首先需要明确一个事实就是要实现PID算法必须在硬件上具有闭环控制就是得有反馈。比如控制一个电机的转速就得有一个测量转速的传感器并将结果反馈到控制器中而在自平衡系统中常用的有三个控制环 — 角度环、速度环、转向环大家可以想象出每个闭环的反馈元件分别是什么吗对就是上面元件清单里面包含的 IMU(陀螺仪加速度计)、编码器、摄像头(或者其他可以确定方位的元件比如陀螺仪磁场计等)P比例以小车巡线为例现在需要让小车跟随一条轨迹前进用PID算法控制方向环反馈传感器就假设为摄像头。那么小车行进中有这么几种情况1、车通过摄像头发现自己处在轨迹的左边位置误差值为正那么就需要向右转向转向值为正
2、车通过摄像头发现自己处在轨迹的右边位置误差值为负那么就需要向左转向转向值为负
3、车通过摄像头发现自己处在轨迹的正中间位置误差值为0很欢快地笔直前行转向值为0于是我们发现小车转向值的输出可以简单地通过把位置误差乘以一个系数就得到了而且显然误差越大得到的转向值也越大符合需求。这里面这个系数就是P了而系数具体的大小需要根据实际情况调试确定。我们有了第一个公式D_term kD* (error- last_error)如果上面的例子还是不好理解的话考虑前面的单摆模型P相当于重力的作用让摆左右往复运动而D则相当于空气阻力让摆慢慢停在中点。D的大小很理想的情况下应该是大概摆动左右各一下之后就停在中点想象把摆放在水中摆动的情况。I积分有的时候我们会发现系统中存在一些固定的阻力例如我们用PID控制一个电机的转速当给定的目标速度很小的时候就会出现这样的情况根据P_term kP * error由于error很小P的输出也很小而由于摩擦力的存在此时并不能让电机转动起来又由D_term kD* (error- last_error)由于电机没有转动显然(error- last_error)始终为0于是D输出也为0那么问题来了除非改变目标值否则电机就永远转不起来了…I的作用就是消除这样的静态误差它会将每次的误差都积累起来然后同样也是乘以一个系数之后作为输出。比如上面的情况虽然误差很小但却不是0于是在每一轮的计算中I项把error逐渐累积直到超过临界值让电机转起来而在误差为0的情况下I项却又不会帮倒忙。第三个公式I_term kI*I_term error以上就是PID的全部计算了最后三者加起来就得到了PID_output P_term I_term D_term每隔一段固定时间把它运行一遍就是PID算法了。可以看出PID的算法实现其实非常简单不过只有几行代码而已所以非常建议自己实现一遍PID代码。Arduino平台上也是有PID库的但库的名字叫什么我不告诉你自己去找哦。制造篇如果上面的都可以理解的话就可以开始动手制作啦这里会以Nano的制作过程为例但是大家可以根据实际情况自行调整。网盘老是链接失效所有文件(源代码STL模型文件APP)都发在与非电路城上(收1元当请我吃辣条了…)对里面文件说明一下1、STL文件是Nano头部和身体的结构件底座由于大家使用电机不同需要自己确定按照自己买到的电机的情况制作一个带两个电机的底座就行有热熔胶枪的帮助应该挺简单的2、源码建议用1.6.5版本的IDE编译旧版本的库文件有些区别原理图需要说明的是图里面的电源线是没有连接的(一正一负大家都知道)另外IO大家可自己调换只要在程序里改一下宏定义就行另外编码器分为单相和AB相的我这里用的是单相只能测转速不能测方向所以其实方向的检测是通过给电机的PWM方向近似模拟的有条件的话还是用双向的更好。单相编码器的话直接把信号线接到D2D3脚分别属于中断0和中断1AB相的话则是一根线接到D2或D3另一根线接到一个普通IO用来判断方向(这时候需要修改程序最后的ENCODER_L()和 ENCODER_R()函数内容)。然后就开始按图连接模块到外壳里文件打印好之后按原理图组合头部里面装了超声波Arduino nano板(不带排针)蓝牙模块两个LED摄像头以及蜂鸣器注意把所有的IO都用导线引出到脖子部位正面的样子头部模块都塞完之后先别急着粘合之后还有身体的导线要连接到主控板里面的部件可以先用热熔胶固定一下。对了导线选择的话如果技术好可以用漆包线最省空间没有把握的话就用这种FC排线比较软去皮容易比较细而且是整排一起的会美观一些杜邦线真的很不好用…身体部分主要放舵机(如果要用的话)OLED电机驱动板及升压板OLED塞的时候注意不要用蛮力不然屏幕玻璃易碎(不要问我怎么知道的…)如果上面装头部的时候有把导线引出这时就可以焊在屏幕上了。MPU6050在底部也用502或者热熔胶固定。然后是舵机舵机用的是最常见的9g舵机虽然也有更小的但是怕力矩不够可以看到由舵机摆臂推动脖子的连接杆就可以让头部运动了。舵机不是很建议采用一个是小机器人的电池功率比较小舵机在堵转的时候容易造成死机另一个头部重量还是相对比较大所以运动的时候重心变化容易干扰平衡参数设置会更复杂。然后是装身体部分侧面先把升压板用热熔胶固定在一边然后盖上盖板用502粘合红色圈住的是一块DC-DC升压板这时候主体就已经快完成啦这时可以开始制作电机底座了一个参考方案是用一张废弃的电话卡或者银行卡剪裁一下作为基板然后把两个电机用热熔胶固定在基板上这样基板就可以用胶和身体粘合起来了。现在可以装电机驱动了我用的是L9110S直接盖在身体背面装上背盖整个身体部分就完成啦最后是电池包找块轻薄一点的电池直接粘在背部就行也可以加上电池盖侧面的样子小Nano完成了当然现在它还不会动这时候还是先别急着把头部粘合先写几个小程序逐个测试一下每个模块的工作状态比如超声波是否工作6050有没有数据这些程序直接去各个库里面找到例程改一下定义的引脚运行看效果就行。当确定没有问题之后用热熔胶仔细地固定好每个部位准备开始程序调试工作了。打开源程序文件夹里任意一个文件就可以看到整个工程代码。首先需要修改的是引脚定义把引脚改成你实际连接的情况/*********************引脚定义*********************/
#define LFT 0
#define RHT 1
#define BUZZER 4 //蜂鸣器
#define BUTTON 5 //按钮
#define LED 11 //脸颊LED
//#define SERVO 13 //舵机,小机器人不推荐使用,电流易过载
#define TRIG_PIN 8 //超声波模块触发脚
#define ECHO_PIN 7 //超声波模块接收脚然后再最上面的调试选项中取消IMU_OUTPUT的注释像这样/*****************************调试选项********************************/
//#define TIMING_DEBUG //PID周期调试,开启后打印时间信息
//#define PARAM_DEBUG //PID参数调试,关闭后用宏取代变量值节省动态内存
#define IMU_OUTPUT //输出6050数据
//#define SONIC_OUTPUT //输出超声波数据
//#define SPEED_LOOP //速度环开关
//#define MOTOR_ENABLE //电机使能
//#define SONIC_ENABLE //超声波使能
//#define CAMERA_ENABLE //摄像头使能下载程序到主控里打开串口监视器按一下按键就可以看到输出的角度数据了。如果数据不正常的话需要检查前面哪里出问题了这一步是为了获取机器人平衡的自然角度手动把机器人放正就是大概在自然重心的平衡角度读取串口的角度数据记录下这个值就是angle_setpoint的值了把66行的angle_setpoint 0改成你得到的值。下一步把IMU_OUTPUT重新注释掉开启MOTOR_ENABLE的注释然后用 Motor(char LR, int SPEED)这个函数放在setup()的最后面来检测电机的正负极是否正确也就是当给Motor(LFT,100)时左轮正转Motor(LFT,-100)时左轮反转Motor(RHT,100)时右轮正转Motor(RHT,-100)时右轮反转。上一步也检测成功之后就可以开始调节角度环的PID参数了/***************PID变量定义**********************/
#ifdef PARAM_DEBUG //角度环数据
double P_angle 0, I_angle 0, D_angle 0;
#else
#define P_angle 0
#define I_angle 0
#define D_angle 0
#endif
double angle_setpoint 0, angle_output, angle_integral;
uint32_t angle_PID_timer;
#ifdef PARAM_DEBUG //速度环数据
double P_speed 0, I_speed 0;
#else
#define P_speed 0
#define I_speed 0
#endif
double speed_setpoint 0, speed_output, speed_integral;
uint32_t speed_PID_timer;说明一下这里用宏定义了一遍参数的原因是如果用的mega328p的芯片的话由于整个程序代码量还是挺大的所以会提示动态内存紧张所以在调试完参数之后就把它们用宏固化了节省SRAM。总体的参数整定原则是1、先P后D如果电机响应慢(比如减速级很多的电机)再调I如果PD效果足够好的话则不需要I2、单一变量法即调整一个参数的时候其他参数都固定不变3、先定量级再定数值比如调整P的时候先从0.0001开始查看小车反应没有效果的话改为0.001以此类推直到确定一个合适的数量级然后才开始在这个数量级里微调这样其实就已经把调整的范围缩小到很小了4、先超调再减小即所有参数都先尽量加大直到系统震荡然后再取这个值的小一点的值作为最合适参数5、调试过程中尽量让车处于自然状态没有额外的力作用即尽量用无线调试有线的话找根软一些的线好那么调节过程中小车什么表现才算是“好”呢在角度环中当P逐渐增大小车会开始有恢复力作用也就是当手扶着往前倒的时候小车也能大概跟着往前走但是还是走的很“软”再逐渐增大参数恢复力越来越大直到大到一定程度小车开始前后自主剧烈抖动电机性能好一点的小车即使手不扶着也能大概站立了。稍微减小刚刚震荡的参数作为P值固定在程序里开始调节D值依然是确定量级之后逐渐增大在增大的过程中会发现小车的震荡频率逐渐降低了增大到一定程度小车基本不再震荡这个值就是需要的D值了也会有一部分情况下由于电机性能原因上面PD的调整过程中始终无法达到很好的效果那么此时需要加入I在调完P值之后D值置0增加 I值直到小车的恢复力变得比较“硬”然后稍微减小P值直到出现比较理想的直立效果最后再加D视效果增加到震荡为止再减小到70%左右这样角度环PID所有参数就整定完成了。角度环调好了小车可以稳定平衡了可是为啥它一直往一边跑呢因为角度环的任务就是维持小车的角度除此之外就是它能力范围之外了角度环是不关心小车是静止着平衡的还是边跑边平衡的 — 如果恰好目标平衡点和小车重心平衡点重合那么小车可以大概静止而如果不是那小车就会在平衡中不断加速直到轮子的速度超出了电机所能提供的转速于是小车还是会倒下。所以我们需要添加一个速度环用编码器测量速度来作为反馈在速度环中首先确定编码器获取的数值是正确的在程序中分别是count_L和count_R储存计数打印输出一下转动轮子看数据对不对正确的话在调节好角度环的基础上就可以添加速度环了。在调试选项中取消SPEED_LOOP的注释然后这次我们不需要D速度环单纯靠PI调节而且先调 I再调P对应的表现如下先给一个比较小的P值(因为I是P的累加如果P为0的话I也就没有意义了)随着I值逐渐增大用手轻推小车小车会前进之后慢慢后退就说明参数起作用了。此时你可以决定到底给一个更大的 I值还是小的I值越大的I值对应了更快的恢复速度在偏离之后会更剧烈地后退在更短的距离内回到原点但是当然这样也会降低小车的稳定性而小的参数则于此相反需要在前进更长的距离之后才会慢慢回到原点但是也使得抗干扰能力增强也就是不会被轻易推倒。只用I值的话小车的回复会是往复的逐渐逼近原点加上P值则可以消除这种来回震荡与角度环调节D值的过程一样逐渐增加直到推了之后可以在前后各摆动一次就回复到原点静止此时这个P值便是对应于那个 I值的最合适参数。这里有个我之前做的一个大车的抗干扰视频该车的电机性能非常暴力因此可以看到其平衡性能非常好PID参数的调整过程大概如此总之这是一项既需要细心调整但自由度也很大的工作所谓“大胆假设小心求证”在多尝试几种参数组合之后你会找到适合你的小车的magic point的~关于参数的调整本来还有很多可以说比如调整的形式上大家可以在小车上加上几个电位器用analogRead读取后作为参数值这样就可以方便而直观地观察到参数连续变化带来的影响又比如无线调试的话使用SSH终端的串口协议方式控制会比使用串口助手方便很多等等。但我想对于参数理解最有效的方式还是亲手去操作多尝试多对比。推荐阅读专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号后台回复「1024」获取学习资料网盘链接。欢迎点赞关注转发在看您的每一次鼓励我都将铭记于心~