电子说
第1步:机箱
我使用机器人底盘的目的是保持简单,并使用易于使用的材料。这就导致了分层设计,使用了我的废木盒子中的1/4英寸胶合板和铝制支架。我尝试了多种方法将圆形马达固定到一块胶合板上,但最终每个马达使用2个软管夹
我使用图中所示的尺寸开始了电机层的组装。我在router刨机中使用了1/4“钻头,并使用了边缘导轨进行切割8个插槽,用于安装直流电动机。我在每个角上钻了安装孔,将其沉没在底部,以使安装螺钉头齐平。我在一个角上钻了一个更大的孔,用于布线电动机电线。要安装电动机,我一直打开软管夹,以使皮带穿过插槽,然后重新连接夹子以将电动机固定到位。我将MPU-6050模块安装在电机层上,将模块上的主控制芯片的中心与驱动桥对齐。我用胶水将8针母连接器连接到胶合板上,然后将模块插入连接器中。
注意:在每一层中,我仅使用一个孔进行电线管理。这导致直流电机和MPU-6050导线在机器人的整个高度上平行运行。最后,由于与直流电动机电源线耦合,我需要切换到用于MPU-6050连接的屏蔽电缆。您可以在此处通过将直流电动机和MPU-6050分开放置在机箱的相对两侧来避免使用屏蔽电缆,但这需要钻第二个电线管理孔。
准备电池层是更直截了当,只有2个用于电池魔术贴带的插槽,以及相同的转角安装和电线管理孔。我再次反击沉没了底部的安装孔,因为支脚的螺纹端不够长,否则无法穿过胶合板。我将两节电池拉在一起,然后用在我当地的业余爱好商店发现的便捷的魔术贴皮带将它们固定在胶合板上。
电子产品层的准备工作包括钻相同的角和电线管理孔,以及Galileo板和蓝牙模块的安装孔。我选择使用较短的支架将蓝牙模块安装在伽利略板上。因为蓝牙模块没有安装孔,所以我通过在塑料支架侧面切一些缺口来做-我确信有一个更优雅的解决方案,它使我回避了。顶层是一个甚至更简单的结构,因为它仅包含4个角安装孔。
然后,使用对角线将机箱的组装仅从4层开始,然后逐步进行。
在构建的最后一步,我在机器人上使用了RC卡车轮胎。我可以从当地的业余爱好商店购买套装,但它们与网上的类似。我还在当地的业余爱好商店中找到了电机轴到车轮的适配器,但在线搜索在这里找到了类似的东西。
步骤2:接线
机器人电气子系统之间的接线图如接线图所示。
为避免Galileo板电压下降,我运行了单独的电源电池到Galileo板和Arduino电机护罩的电缆。我切断了旧的壁式电源插座的末端,以重新使用2.1毫米电源插头连接至Galileo。电动机的防护罩最终会吸收一些健康的电流,因此我使用绞合的20号标准线来与电池连接。我在面糊连接器上使用了3针公接头,这是我在当地一家业余爱好商店发现的-但是我在网上找到同等产品时遇到了一些困难。
我使用了24号绞合线,阴式插针连接器端子和热收缩器,以使Galileo板,蓝牙模块和Galileo与加速度计/陀螺仪MPU-之间的4芯屏蔽屏蔽电缆之间的电缆连接6050模块-屏蔽层的两端都接地。
在电机控制屏蔽层和DC电机之间,我使用了22号实心线。请注意,其中一台电动机的连接是反向的,因此,从伽利略到电动机护罩的方向控制在两个电动机上的正向和反向都相同。还要注意,“正向”是一个相对术语,可以仅通过电动机护罩和直流电动机之间的连接进行更改。在最终的机器人测试中,您需要确保“正向”与PID控制器的正输出之间存在相关性-通过电动机连接或PID项的极性。
我在RadioShack挑选的Seeedstudio Arduino原型防护罩可以提供通用/灵活的连接点,也可以安装杂项。电阻和LED。当我构建机器人时,原型屏蔽板上的组件放置会随着时间的推移而变化,因此,我相信会有更好的布局。 Galileo Gen 2电源电压规范的额定值为7-12V,如果在低于7V的电源电压下运行该板,我会在网上发现一些有关损坏该板的担忧。结果,我将分压器网络和连接添加到模拟输入,以便草图可以监视电池电压,以防万一。
伽利略和电动机护罩之间的电气连接是通过安装电动机来实现的屏蔽罩连接到Galileo Arduino连接器,原型屏蔽罩堆叠在电机屏蔽罩的顶部。
注意:由于直流电动机电源电压直接连接到电动机屏蔽罩,因此我确实使用X-acto刀切割了电动机控制罩上的Vin迹线,以隔离伽利略和电动机屏蔽罩的供电电压
我确实必须在电动机屏蔽罩和原型屏蔽罩之间放置一些电气胶带,以避免两者之间短路(可能只是我的原始焊接技能的一种体现)。
步骤3:机器人软件
我选择在单个文件中实现机器人草图,这虽然有点长,但将所有内容都放在一个位置。我不会逐行浏览SW,而只是评论它的组织方式以及每个部分的重点。
该草图从标准的注释头和库包含文件开始。我确实在标题注释中记录了屏蔽引脚的用法,以帮助我自己直接使用SW的引脚。我还定义了PID函数使用的数据结构,以为这样可以使以后添加第二个级联速度PID更加容易。
接下来是常量和常用值的#define语句,可以方便地更改它们。例如,一旦确定了机器人的最佳P,I和D值,就可以在此处永久地重新编码它们。接下来是变量定义,我试图以一种逻辑的方式对它们进行分组-您可以判断我的表现如何。
下一部分包含了草图中稍后使用的功能。第一个功能实现平衡PID。这是我从Brett Beauregard的教程中大量利用的软件。 PID功能中包含一个部分,如果启用了数据记录功能,则该部分会将PID信息记录到SD卡中。在调整PID值时,我发现它具有指导性和娱乐性,以查看各个PID项的行为。这会将数据保存为CSV格式的文件,后来我将其导入Excel并生成图形以进行可视化。显然,只有在Galileo板上有SD卡的情况下,所有这些功能才有效。
随后是一些电动机控制功能,这些功能可将电动机控制信息映射到电动机罩的方向,速度和制动控制上
Next是从MPU-6050模块检索位置数据的功能。我以Jeff Rowberg的参考代码为傲。我使用常规间隔数据拉方法进行数据传输,而不是像Jeff那样使用中断,因为我很难使中断起作用。时间间隔是在主程序循环中实现的,我发现3ms的间隔足以确保没有数据溢出。
然后我们继续进行一组处理蓝牙通信的功能。这些功能以发送更复杂命令的一些功能开头-这些功能主要被分解为功能,以提高代码的可读性。然后是主要的蓝牙命令解析器,它实现了与Android应用程序的接收通信协议。此功能从蓝牙串行端口累积字符,直到检测到命令结束字符,然后对命令进行解码。正如预期的那样,解码最终只是一个大写的语句。
最后一个功能是高级机器人控制状态机。我以一种有限状态机(FSM)的方式实现了该功能-可能有点过头了,但是我预想将其添加到机器人中来扩展它。
接下来是所有Arduino草图所需的设置功能。代码中的注释应该使这一部分变得不言而喻。有一节尝试初始化SD文件进行数据记录,如果没有SD卡,则应该出错,但是我花了很多时间来验证这一点。
最后,还有主草图循环。第一部分实现了用于从MPU-6050检索数据的计时器。如果检索到数据,则需要进行一些计算以检测机器人是否处于直立状态或处于失衡状态。
接下来,要检查连接到蓝牙模块的串行端口上是否有收到的字符,如果正在等待,
后面是PID和电动机控制计时器。 “ if”语句可确保仅在机器人积极尝试平衡时才进行PID/电动机控制。这是MPU_6050数据输入PID的地方,PID输出被传递到电机控制上。通过将蓝牙派生的方向输入添加到一个电机,并从另一个电机中减去它,也可以实现转向。因为我们要对PID输出进行额外的数学运算,所以我们必须再次限制PID的最大/最小值限制,以将其保持在电机PWM值之内。
最后,调用机器人控制状态机,并使用计时器用于实现机器人心跳功能。我从一个单独的心跳蓝牙命令和电池电压命令开始,然后将它们合并为一个功能,并将电压作为心跳指示发送。
就是这样-有点长,
步骤4:Android应用
从这个项目的开始,我的目标之一就是开发配套的Android应用,以控制机器人。由于我的软件开发技能“仍在开发中”,我很高兴偶然发现MIT AI2 Android应用程序开发环境-事实证明它非常适合我想做的事情。
我花了一些时间通过一些教程来了解如何进行设置,以及使用Whatakuai和Pura Vida Apps来了解如何利用BT接口。但是,除了花时间解释MIT AI2之外,我将描述该应用程序的使用方式以及块的结构。
该应用程序是按钮和滑块的简单集合,允许用户进行配置并控制机器人。以下是各种应用程序控件的说明。
·BT模块:每次启动应用程序或关闭机器人电源后,用户都需要连接到机器人BT模块。这是便于执行该操作的按钮。
·待机:一旦机械手连接到BT,并且Galileo板已启动,机械手便会进入待机状态。该按钮用于指示机器人进入活动的平衡状态。请注意,只有在垂直方向2度以内时,机器人才会尝试进行平衡,因此,即使此按钮报告为“活动”,也需要将机器人置于接近垂直的位置以开始平衡。此按钮可用于根据需要在“待机”和“活动”之间切换。
·PID:此按钮用于允许用户更改“ P”,“ I”和“ D”机器人运行时机器人中PID控制器的值。按下后,它将从机器人中检索PID值,并将其显示在相应的“ +”和“-”按钮下方。每个参数的增量和减量值都被硬编码到机器人草图中。
·FW Ver:这是机器人草图的固件版本。我经历了许多版本的草图和多个SD卡,因此发现了解机器人上正在运行哪个版本非常有帮助。此值使用#define语句硬编码到草图中,并在机器人退出待机状态时发送到Android应用。
·Vbat:每秒从机器人发出的电池电压
·HB:心跳指示器。文本每秒更改一次颜色,以指示草图仍在机器人上运行。
·滚动校准:根据您所拥有的模块及其在机器人上的安装方式,垂直可能不会显示为0deg。这使您可以“校准”机器人垂直时MPU读取的内容。 “ +”和“-”按钮在“滚动校准”和“电动机松弛”之间共享,因此在任何给定时间只能更改一个按钮。当选中单选按钮时,将从机器人获取当前的Roll Calibrate值。
·电动机松弛:我使用的齿轮直流电动机的PWM值较低,因此不会导致任何电动机轴运动。这将导致PID输出的非线性控制区域。我发现通过“跳过” PID输出中的这些低PWM值(电机松弛),可以更好地平衡机器人。该按钮允许您从机器人中检索当前值,并调整“跳转”的大小。
·Speed:这允许用户控制机器人的速度。由于MIT AI编译环境的限制,该应用程序不允许多点触摸,因此您无法同时更改速度和方向滑块。互联网上对该主题的搜索显示,存在一种允许多点触摸操作的解决方法,但我尚未进行操作。
·方向:这允许用户控制机器人的方向。
·退出:退出Android应用程序
我发现MIT AI2用于开发“块”部分上的应用程序详细信息的可视化方法有些麻烦-但我会让你来根据您自己的结论。我未能成功拍摄“块”布局的屏幕截图,但它们以三列排列。您应该能够将.iai文件导入MIT AI2,并亲自查看详细信息。
第一列实现了退出,BT模块,待机,数据记录,速度,方向,横滚误差和电机松弛按钮。
第二列实现PID启用按钮,以及P,I和D的“ +”和“-”按钮。它还实现了“滚动错误”和“电动机松弛”的“ +”和“-”按钮。
第三列实现了蓝牙计时器,用于检查接口以接收信息,并阻止从中提取和实现命令机器人。为了使蓝牙数据接收和命令提取正常工作,需要经过反复试验,结果有点有点残酷,但最终效果很好。
步骤5:设置和调整
在构建机器人时,我为每个子系统(MPU-6050,BT模块,电动机护罩)开发了一个临时的专用草图,以将问题分解为尺寸I可以应付。但即使在那之前,这一切都始于启动并运行系统的核心Galileo Gen 2板。
网上有一个不错的“入门指南”,您可以在其中安装Android IDE和Galileo设备驱动程序,并更新Galileo板上的固件。
注意:由于Bluetooth和MPU-6050模块都使用3.3V信号,因此请确保移动Galileo上的I/O电压跳线。将板卡设置为3.3V设置以避免损坏模块。
我还建议您花些时间将可引导映像加载到SD卡上(确保获取最新映像)。它使您的Arduino草图可以在板上电源循环后保留在Galileo上。不利的一面是,它确实增加了Galileo主板的启动时间(启动需要1分钟左右的时间),但是在我看来这是一个值得权衡的问题。
注意:我延迟了从SD引导的步骤(是的,因为我很懒)。结果,我不得不通过USB电缆将机器人拴在PC上,这样我就可以在每个电源周期下载草图。当机器人掉落在USB电缆上,从而破坏了Galileo板上的微型USB连接器时,这带来了不便,这变成了灾难。我现在不得不求助于将新草图加载到主机PC上的SD卡上,然后从SD引导Galileo,然后通过Linux串行控制台将草图移至/sketch/sketch.elf,然后重新启动Galileo……都是因为通过USB的主机连接不再起作用。因此,请注意我的悲伤故事,并考虑是否要警告您是否决定在连接USB电缆的情况下操作机器人。
我还为MPU-6050安装了多个安装位置。我首先将其安装在Galileo板下方的电子层,但发现将其移至电机层可以更好地控制。
到目前为止,我遇到的确定性最低的阶段是确定正确的P, PID控制器的D和D值。我听说这是一门妖术,但现在花了一些时间对此过程有了更健康的尊重。正是在开发的这一阶段,我将PID数据记录添加到SD卡中,因此我可以弄清楚每个术语对输出的贡献。在线上有许多手动PID调节的方法,但是我发现最好的方法如下:
·将I和D项设置为0
·增加P直到机器人几乎能够保持垂直。通过我选择的电动机,这是机器人朝一个方向倾斜地在地板上奔跑
·稍微降低P项,并增加I项,直到机器人可以平衡,但是在振荡的情况下做到了
·增加了D项以减少振荡。
我仍然对我获得的结果感到不满意,因为它们似乎已针对平衡性或驱动性进行了优化。搜索仍在继续……
关于“纸卷校准”,我在添加纸卷校准功能后回过头来对MPU-6050进行了校准。令我惊讶的是,在校准MPU-6050模块后,我发现滚动校准更改没有显着效果。
我确实发现,调整Motor Slack使机器人的响应速度更快-向上
步骤6:结论
我认为我所听到的一些关于生命的最佳建议是适用的同样适合制造商流程-一定要喜欢这个旅程。虽然我完全喜欢这个项目的每一个时刻,但让我们面对现实吧,结果只是一个简单的,具有自我平衡能力的机器人。
我认为将来可以进行的一些改进包括:
·为机器人添加速度/位移指示(添加编码器或移动到步进电机)
·添加障碍/避免碰撞传感器和功能
·为语音添加音频输入命令,音乐/节拍检测
·为导航/机器人控制添加机器视觉
·添加机器人自动导航/环境映射
简单的机器人。现在是时候打造自己的了。修改。凑合。提高。享受。
全部0条评论
快来发表一下你的评论吧 !