×

Arduino机器人开源分享

消耗积分:0 | 格式:zip | 大小:0.08 MB | 2022-10-26

分享资料个

描述

介绍

我想介绍一下 YAAR——又一个 Arduino 机器人。YAAR(ar ar – Lt. Tasha Yar、星际迷航……和 YACC Yet Another Compiler Compiler)旨在作为机器人项目的模块化硬件和软件开发平台。以下是主要特点:

  • Wi-Fi 连接命令和监督控制
  • Wi-Fi视频监控
  • 用于更高级别处理的 Raspberry Pi
  • 用于低电平控制的 Arduino Mega2560
  • 闭环速度控制
  • 支持直流电机和无刷电机
  • 伺服驱动转向
  • 软件差动动力和转向
  • 带按钮开/关的 Pi 兼容电源
  • 支持更大平台的模块化硬件

多年来,我已经制造了许多具有不同程度自主性的在地板上跑来跑去的机器人。但我之前的所有机器人项目都受到通信问题的困扰。我使用了带有 900 MHz / 2.4 GHz / 5.8 GHz 数据链路和视频发射器和接收器的射频和蓝牙链路。它们都可以工作,但是要设置所有组件并正常工作总是很麻烦。通过 Wi-Fi 整合所有通信将是一项重大改进。此外,我想到了一些更大的机器人项目,这些项目将受益于 Raspberry Pi 带来的更高智能。YAAR 就是这样诞生的。

项目说明

该项目的机械方面是使用 Fusion 360 设计的。这是一个免费(非商业)的 Autodesk 3D CAD 系统。CAD的基本要求是能够导出用于激光切割的.DXF文件和用于3D打印的.STL文件。某些激光切割机无法正确导入 .DXF 文件。Inkscape 非常擅长解决这些文件不兼容问题。

我使用 DipTrace 进行原理图捕获和 PWB 布局。DipTrace 可免费用于非商业用途,以创建最多 500 个焊盘的一层或两层板。如果需要,DipTrace 可以导出 Eagle 文件。原理图和 PWB 布局以 DipTrace 文件的形式提供。还提供了 Gerber 文件。尽管我提供了 GBR、DXF 和 STL 格式的文件,但我鼓励您直接从 Fusion 或 DipTrace 生成这些文件——尤其是 .DXF 文件的结果令人不安。

我通过全球速卖通购买几乎所有的组件。最小的电阻器和电容器为 0805 尺寸,因此手工焊接很简单。我还从中国购买了通用集成电路,例如 MCP6001 运算放大器、TCST1103 光断续器、DRV8833 双电机控制和 SS34 肖特基二极管。诚然,您必须等待几周才能交货(我的平均时间是 3 到 4 周)。Digi-Key 是我购买 Molex C-Grid 连接器等特殊零件的首选来源。我使用 Oshpark 和 JLCPCB 作为 PCB 源。我使用 0.1 英寸 Molex C-Grid 系统进行电线互连和端接。

这是一个项目概述。我不会详细介绍诸如“下载 Arduino IDE……”之类的所有细节,这需要一本书。但是,我认为我已经为具有基本硬件和软件技能的人提供了足够的资源来成功启动和运行 YAAR。

此处的所有内容以及更多内容均可从文章末尾附近的 .ZIP 文件中获得。

建筑学

YAAR的硬件由4个主要部分组成;电源、硬件输入/输出和相关的微控制器、电机控制和大脑。

Raspberry Pi 的主要目的是充当通信中心并提供高级思考能力。Pi 与运行终端仿真程序 (PuTTY) 的 PC 之间的通信基于 Wi-Fi 上的 SSH 协议。来自摄像机的视频也由 UV4L 流媒体服务器通过 Wi-Fi 传输。UV4L 是根据最佳视频延迟选择的,大约半秒。我在这个项目中使用了 Raspberry Pi 3B+,因为我手头有它,并且所有 Raspberry Pi 目前都缺货或只能以黄牛价格购买。

pYYBAGNYfSqAfylFAAElDK071CU022.png
雅尔建筑
 

微控制器选择

Arduino Mega2560 Pro 用作低级硬件控制器。评估了另外两个微控制器;基于 32U4 的 Pro Micro 和基于 STM32F103 的 Blue Pill。虽然 Pro Micro 有足够的内部资源,但它没有足够的 I/O 引脚来支持该项目。Blue Pill 确实有足够的 I/O,而且速度相当快,但很容易受到电机产生的噪音的影响。此外,Blue Pill 不是“主流”Arduino。安装一致的、最新的库并找到文档是一项挑战。

poYBAGNYfS2Ae0TnAAEh-tZhQ7g831.png
微控制器选择
 

硬件控制单元

Arduino 连接到一个定制板,该板提供板载电源并将电源和信号分配到所有连接的输入和输出。一个定制的双电机控制器板连接到配电板上。该硬件控制单元 (HCU) 共同支持以下功能:

  • 两个有刷电机的 PWM 输出
  • 可选,两个用于无刷电机的 RC 输出
  • 两个轴编码器传感器输入
  • 紧急停止保险杠
  • SR-04 声纳障碍物检测
  • 电源监控
  • 伺服控制转向
  • 闪烁激光二极管(就像 Picard the Borg)
  • 压电报警器
  • 与 Raspberry Pi 的串行通信
  • 板载 5 伏开关电源
  • 大量未使用的 I/O 以满足未来需求

硬件控制单元响应通过连接到 Pi 的串行端口或 Arduino IDE 串行端口发送的命令。HCU 将监视和控制转向和电机以完成以下任务:

  • 沿直线路径以规定的速度前进
  • 以规定的速度倒退
  • 停止
  • 遵循规定半径的弯曲路径
  • 按规定量向右或向左倾斜路径
poYBAGNYfTGAFRi1AAOOkg11TBo067.png
示意图 - 配电板
 

硬件控制单元软件

Pro Micro 有足够的内部资源(中断、定时器、串行端口),但缺少所需数量的 I/O 引脚。Blue Pill 的速度很诱人,但我发现微控制器很容易受到噪音的影响,虽然我成功地让它运行起来,但我发现 Mega2560 更容易连接,更无故障,软件支持环境更发达并更好地记录在案。Arduino 以 100 x/秒的速度管理任务调度程序,并以超过 100k/秒的循环速度运行事件驱动的状态机,处理器开销约为 20%。所有事件都尽可能由中断驱动。虽然没有蓝丸那么快,但也足够快了。

Arduino 控制方案以两个主要元素为中心;一个任务调度器和一个状态机。任务调度器由定时器 5 每 10 毫秒产生的周期性中断驱动。中断服务程序设置一个对应于自上次调用以来的时间间隔的标志。标志设置为对应于 10 毫秒、20 毫秒、50 毫秒、100 毫秒、…… 1 秒。主程序循环由任务调度程序组成,检查每个标志,如果设置,则执行分配给该时隙的任务。最终结果是某些任务(例如闭环速度控制)可以以更高的速率执行,而其他任务(例如电池监控)可以以低得多的速率执行。

poYBAGNYfTOADzHHAABpSPuQaZc559.png
任务计划程序
 

第二个主要的软件元素是状态机。YAAR 始终处于几种状态之一,例如,停止、前进或后退。状态机不断监控与当前状态相关的所有输入,如果有任何变化,则采取适当的措施。许多事件是中断驱动的,这减少了微控制器开销并提高了执行率。任务调度器每 10 毫秒执行一次状态机任务。

poYBAGNYfTWACpztAACB1TYfhkM447.png
状态机
 

YAAR 的主要功能之一是光学速度编码器,可为闭环速度控制提供速度信息。如果没有反馈回路控制方案,速度会受到负载、摩擦、表面和几何形状变化的严重影响。YAAR 能够以稳定的 5 厘米/秒(0.1 英里/小时!)的速度爬行。编码器还支持轨道控制,可以实现受控转向角,例如“右 20 度”。

转向是通过伺服控制的前轮和两个后轮的差速控制来完成的。在机械上,前轮简单地安装在伺服系统的前叉上。为了使 YAAR 旋转到位,前轮伺服必须从中心左右旋转 90 度。

电机控制

YAAR 的软件和硬件与机器人大小无关,电机控制除外。HCU 上提供了一个连接器,用于连接外部电机控制。可用的信号有 PWM、RC 伺服、电源和用于启用和方向的单独控制。RC 伺服信号支持现成的无刷电机控制器。

pYYBAGNYfTiAPYJGAAGhRX9SFS8840.jpg
DRV8833 双电机控制板
 
poYBAGNYfTuARsLbAAERyMFBNzw397.png
示意图
 

这里使用的电机控制是为“Arduino TT”电机设计的,这些电机体积小、容易获得且价格便宜。Texas Instruments DRV8833 双电机控制以 11.5 伏的最大输入电压为每个电机提供高达 1 安培的电流。跳线选择 5 伏电源或电池作为电机电源 - 使用电池选项。DRV8833 每个电机只有两个控制引脚。如果一个用于 PWM 速度控制,另一个成为方向控制,但在反转方向时,PWM 信号必须反转。幸运的是,Arduino 中的定时器支持输出反相的 PWM 信号。两个输入信号的状态控制 DRV8833 如何处理反激电流(电感器关闭后流动的电流)。如果两个输入信号均为低电平,电流通过电源再循环,直到消散,然后电机惯性滑行。如果两个信号都为高电平,则电机对地短路,从而在电机上施加电气制动。制动效率较低,但会导致低速运行更平稳。我选择了制动模式进行前进操作,导致平稳的慢速前进运动,但在倒车状态下以低速移动时运动更加剧烈。两个示波器捕获说明了电机两侧的波形。第一个在慢衰减模式下是正向的,第二个在快速衰减模式下是反向的。明显的区别在于,在第二次示波器捕获中,可以看到电机电枢“反冲”到超过电源的电压。PWM 速率的范围可以从 30Hz 到 31kHz。我选择了 4kHz。电机对地短路,从而在电机上设置电子制动器。制动效率较低,但会导致低速运行更平稳。我选择了制动模式进行前进操作,导致平稳的慢速前进运动,但在倒车状态下以低速移动时运动更加剧烈。两个示波器捕获说明了电机两侧的波形。第一个在慢衰减模式下是正向的,第二个在快速衰减模式下是反向的。明显的区别在于,在第二次示波器捕获中,可以看到电机电枢“反冲”到超过电源的电压。PWM 速率的范围可以从 30Hz 到 31kHz。我选择了 4kHz。电机对地短路,从而在电机上设置电子制动器。制动效率较低,但会导致低速运行更平稳。我选择了制动模式进行前进操作,导致平稳的慢速前进运动,但在倒车状态下以低速移动时运动更加剧烈。两个示波器捕获说明了电机两侧的波形。第一个在慢衰减模式下是正向的,第二个在快速衰减模式下是反向的。明显的区别在于,在第二次示波器捕获中,可以看到电机电枢“反冲”到超过电源的电压。PWM 速率的范围可以从 30Hz 到 31kHz。我选择了 4kHz。我选择了制动模式进行前进操作,导致平稳的慢速前进运动,但在倒车状态下以低速移动时运动更加剧烈。两个示波器捕获说明了电机两侧的波形。第一个在慢衰减模式下是正向的,第二个在快速衰减模式下是反向的。明显的区别在于,在第二次示波器捕获中,可以看到电机电枢“反冲”到超过电源的电压。PWM 速率的范围可以从 30Hz 到 31kHz。我选择了 4kHz。我选择了制动模式进行前进操作,导致平稳的慢速前进运动,但在倒车状态下以低速移动时运动更加剧烈。两个示波器捕获说明了电机两侧的波形。第一个在慢衰减模式下是正向的,第二个在快速衰减模式下是反向的。明显的区别在于,在第二次示波器捕获中,可以看到电机电枢“反冲”到超过电源的电压。PWM 速率的范围可以从 30Hz 到 31kHz。我选择了 4kHz。明显的区别在于,在第二次示波器捕获中,可以看到电机电枢“反冲”到超过电源的电压。PWM 速率的范围可以从 30Hz 到 31kHz。我选择了 4kHz。明显的区别在于,在第二次示波器捕获中,可以看到电机电枢“反冲”到超过电源的电压。PWM 速率的范围可以从 30Hz 到 31kHz。我选择了 4kHz。

电机控制任务是一个简单的误差反馈回路,由比例和积分校正项组成(定时器 OCR2A、B 寄存器用作 I 项)。我尝试过使用 D 项,但没有发现任何改进。也许随着更快的编码器更新率,这会改变。该任务每秒执行 20 次。电机控制软件编写在 Arduino IDE 中标有“DRV8833”的单独选项卡中,以方便更换其他电机控制器。在将诊断报告打印到 IDE 串行监视器时,有时会观察到电机速度的“打嗝”,因为在较长的报告期间任务会暂停。

编码器

槽编码器是一个简单的电路。尽管您可以在 AliExpress 上以 1 美元的价格购买 Arduino 机器人的插槽编码器,但我测试过的那些有几个缺点。最大的问题是它们会反弹。它们很大并且消耗大量电流。该电路消除了运算放大器周围正反馈的反弹。

插槽编码器是 YAAR 设计的关键。它们可以实现准确的速度控制和跟踪。所示电路结构紧凑、功耗低且无反弹。该电路的工作电压为 3V 至 6V。

与编码器一起改进的编码器盘有 50 个孔,而不是通常的 10 个。不幸的是,没有实用的方法将编码器盘连接到电机轴的末端而不是轮轴。尽快获取尽可能多的速度信息是实现平稳低速运行的关键。五十个孔是我的激光切割机能干净地切割的最大值。圆盘是从 1/16” 层切割而成的。用 2-56 或 2mm 螺钉将圆盘连接到轮轴的另一端。PWB 应在 2 盎司的 032 英寸库存上制造。铜。

pYYBAGNYfT6AHMseAAH7OXpiRbM559.jpg
编码器
 
poYBAGNYfUCAarEWAACMvYc13PU626.bmp
编码器
 

电源

电源是一个开关模式降压转换器,可将 7.4 伏 2S 锂聚合物电池调节至 5 伏。按下按钮即可启动系统电源。关机是用同一个按钮完成的——就像你的电脑一样。这很重要,因为就像不建议拔掉 PC 上的插头一样,也不建议将其用于 Raspberry Pi。为什么不直接关掉电源?因为 Pi 有很多家务要做才能关闭。如果此过程在错误的时间中断,SD 卡文件可能会损坏。电源直接插入 Pi 的 40 针接头,由 Arduino 控制。请注意,当按下按钮时,配电板的电源是通过按钮提供的,然后通过二极管到配电板上电源的使能引脚。Arduino 启动后(大约需要一秒钟),Arduino 将通过第二个隔离二极管控制使能引脚。

  • 直接连接到 Pi 20 排针
  • 20 伏最大电池输入
  • 3 安培输出
  • 可调电位器从 4.95 到 5.48 伏输出
  • 92% 效率
  • 2 芯 LiPo 供应
poYBAGNYfUeAVEwnABBRrS2aUUQ045.jpg
带有附加电源的 Pi
 
poYBAGNYfUmAHVIYAACYnN_LGnM332.bmp
电源
 
pYYBAGNYfUuAfcn5AAA9PO9WM9Y504.png
电源控制
 

该电源基于 Diodes Inc. 的 3 Amp AP62300T 开关模式稳压器。最初,我将电源设计为使用 5 Amp Texas Instruments TPS565201 稳压器。然而,在我最初的原型机开始工作后,我试图订购更多,却发现交货时间已经延长到一年多。我暗自窃笑,我的小项目助长了汽车行业的“芯片短缺”。幸运的是,AP62300T 几乎可以直接替代。我对 Raspberry Pi 的所有电流消耗(带摄像头)的测量平均不到 1 安培,在 1.75 安培的启动期间有短暂的偏移,因此 AP62300T 就足够了。参考电压和使能引脚控制要求存在细微差别。此外,还有两个版本;具有不同参考电压的“T”和“非 T”版本。没关系——原理图显示了每个版本的正确电阻。与从速卖通购买的大多数组件一样,数据表是一厢情愿的想法。中国采购的电容都没有爆炸,7x7x3 毫米电感器的额定电流似乎普遍超过 5 安培。显示电阻值时,输出范围为 4.95 V 至 5.48 V(使用“T”版本)。调整微调电位器时要小心,如果您没有非导电螺丝刀,请勿在插入 Pi 时进行调整 - 将金属十字螺丝刀插入插槽会改变电压。安装R1后,除非EN引脚拉高,否则电源不会打开,因此请在测试和调整单元后安装R1。我已将设备调整为 5.1 V,负载为 5 Ohm。电源将保持稳定,除非电池电压低于 6.5 伏,此时 2 节锂聚合物电池将耗尽 90% 以上。AP62300T 的额定最大输入电压为 20 伏。

事实证明,控制连接器的最佳方向是 90 度。这掩盖了电压调整微调器,使调整乏味。调整微调器时关闭电源。与硬件控制单元的连接如下:

poYBAGNYfU6AEWMUAAAssXF3Kjc158.png
线路调节
 
pYYBAGNYfVCAUXjwAAAybkA2bcs124.png
负载调节
 

电源还提供 I2C 连接器。将电源连接到 Pi 的连接器掩盖了 SDA 和 SCL 信号,因此它们在 I2C 连接器上与几个控制信号一起重新创建。

您可能已经注意到,电池始终连接到系统,这可能会导致大量漏电流。泄漏电流测量为 10 uA,相当于 LiPo 18650 电池的数年。PWB 应在 2 盎司的 032 英寸库存上制造。铜。最后,因为 Arduino 需要大约一秒钟才能启动,所以您必须按住按钮直到持续的哔声开始或激光二极管开始闪烁,这意味着 Arduino 已经启动。

电源和信号排序

互连电路上电和断电时必须特别小心。大多数 IC 具有输入保护二极管,如部分数据表原理图所示。在我们的例子中,Arduino 首先启动,这意味着 Pi 仍然处于关闭状态。如果 Arduino 试图向 Pi 上的任何引脚输出数字高电平,结果将是通过输入保护二极管短路。这将大大超过 Arduino 的最大输出电流额定值和 Pi 的输入电流额定值。但问题还不止于此。一些 IC 容易受到“闩锁”的影响,这意味着如果在上电期间电流流过体二极管,整个 IC 将像 SCR 一样将电源短路到地,从而导致尖锐的“砰砰”声,a一小股烟雾和我们极客非常熟悉的刺鼻气味。关闭电源时必须牢记这些相同的注意事项;所有 Arduino 输出都处于三态,只有这样 Pi 才能安全关闭。您可以通过 SSH / PC 终端链接发送“(K)ill”命令或按下按钮来执行此过程。

poYBAGNYfVKAOiwBAAAau9nP2XE120.png
输入保护二极管
 

传感器单元

传感器单元由摄像头、SR-04超声波距离传感器、保险杠开关和激光二极管组成。3D 打印支架专为所有传感器设计,以便在安装到机器人之前进行组装和接线。

SR-04、摄像头和保险杠开关安装在升高的头部单元中。这是用 3 毫米螺钉连接到 ECU 的,因此可以向上旋转以访问下面的连接。安装相机时要小心。在组件下面放一块软布,否则会损坏镜头。

注意:激光二极管模块包含一个 91 欧姆的电阻器,它会从微控制器输出中汲取过多的电流 (31 mA)。这必须用一个 150 欧姆的电阻器代替,它将电流限制在 19 毫安。

pYYBAGNYfVmAMa3mABAv6GrnLY4007.jpg
传感器接线
 

树莓派

Raspberry Pi 充当 YAAR 的“大脑”和通信中心。目前命令通过 SSH 通过 Wi-Fi 从 PC 终端 (PuTTY) 发送到 Pi,然后通过串行链路中继到硬件控制单元。通过连接到 Pi 的摄像头使用低延迟 UV4L 软件链接到浏览器窗口,在 PC 上监控进度。

在这一点上,我必须承认我不是 Python / Linux 程序员。Python 代码的第一部分是一个简单的草图,它监控来自 Arduino 的输入,并在信号变低时执行关机命令。这是从网络上许多地方发现的按钮关闭代码中提取的一个简单的黑客攻击。第二段代码原则上很简单,但需要一段时间才能正常工作。基本上,代码将来自 SSH 端口的任何输入发送到 UART,并将从 UART 接收到的任何输入发送到 SSH 端口。听起来很容易,对吧?

pYYBAGNYfVuAIObFAAA-DsqBTaE848.png
机器人控制
 
#!/usr/bin/env python3
# non blocking input from SSH
# without "timeout" any noise will hang program
# This is a Pyton3 sketch, the .py file type is removed so it can be invoked easier


import sys
import select
import serial
from time import sleep


ser = serial.Serial("/dev/ttyS0", 9600, timeout=1) # timeout=1 second


while True:
    while sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
        fromSSH = sys.stdin.readline() #get input string from PC via SSH
    
        if fromSSH:                    # if not empty
            fromSSH += '\n'            # add lf, needed for parseInt()
            toUART = fromSSH.encode('utf-8') # convert utf-8 to bytes
            ser.write(toUART)          # write out ascii bytes
            sleep(0.1)                 # time for Arduino to reply
 
    else:
        if ser.inWaiting() > 0:        # anything from Arduino?
            fromUART = ser.readline()  # '\n' terminated line, bytes
            toSSH = fromUART.decode()  # convert bytes to utf-8 string
            print(toSSH)               # send to PC via SSH

以下是必须在 Pi 上安装的操作和项目的概述:

  • 启用 Wi-Fi
  • 启用并测试与您的 PC 终端程序的 SSH 通信(PuTTY 主机名 raspberrypi,端口 22,连接类型 SSH,登录为:pi,Pi@raspberrypi 的密码:默认为 raspberry,除非您更改它)
  • 安装和测试 Python shutdown.py 代码——使用接地按钮进行测试
  • 使 shutdown.py 在启动时执行
  • 安装和测试 UV4L
  • 安装和测试robot.py——此时你应该能够连接到YAAR并通过Wi-Fi/SSH/PuTTY与HCU通信

接线

制作线束。我为 SIG1 使用了一个 18 针 DRH,为 SIG2 使用了一个 24 针 DRH,一个 6 针 SRH 用于连接电源的控制连接器,一个 6 针极化 SRH 用于连接传感器头单元的连接器。

poYBAGNYfV6AQcJ-AAGa9f2eoSg167.png
雅尔接线
 
pYYBAGNYfWWACKP9ABJr-SFWmVs545.jpg
线束
 

机械的

从机械上讲,YAAR 没什么好说的——只是测试电子设备和开发软件所需的最低要求。我发现激光切割 1/8” (3mm) lite ply (3 ply poplar) 是一种快速简便的车身制造方法。我使用薄的氰基丙烯酸酯胶来组装胶合板,事先用橡皮筋把它粘在一起。小心不要让电机支架周围或 ECU 安装区域有多余的胶水——这些地方非常贴合。

poYBAGNYfWuAWObcAAsu_hMyCkM756.jpg
身体
 

电机提出了一个设计挑战——在某些电机和车轮中,电机与车轮的间隙可能小至 1 毫米(存在相当大的差异)。不幸的是,电机安装螺钉直接位于挤压点下方,因此即使电机安装在车身外侧,螺钉头也会在车轮上摩擦。解决方案是设计一个 3D 打印电机安装座,该安装座用螺钉固定在车身内部,并放置在足够间隙的位置。编码器底座通过正常的电机安装孔连接到电机底座,以确保编码器和编码器盘的正确光学对准。组装电机/电机支架/编码器支架时,注意电机本体上的小突起与车轮在同一侧(电机不对称)。我尽可能使用 3 毫米螺钉并轻敲 3D 打印的 PLA。这导致非常令人满意的组装过程。旧台式电脑可以是 3 毫米螺丝的母线。

有几个 3D 打印部件:

  • 电子控制单元 (ECU) – Pi、HCU 和电池的支架
  • 保险杠延长臂 – 延长微动开关臂
  • 保险杠 - 连接车轮前部的两个保险杠臂延伸件
  • 伺服安装 - 持有转向伺服
  • 前叉 – 可容纳 1.75” 轮子
  • 电机安装 - 固定电机和编码器安装
  • 传感器安装 - 允许在安装前对传感器单元进行接线

ECU 设计用于安装 Raspberry Pi 3B+。Pi 4 需要重新设计。前叉是为具有 25 个样条的 TS-53 伺服系统设计的。不同的伺服系统可能需要重新设计。我选择的 TS-53 伺服已经过时了。我相信源文件中建议的替代方案更好,但未经测试。为了让 YAAR 旋转到位,伺服必须能够旋转 180 度。

将微动开关臂向前弯曲到足以使保险杠在压下时与前轮脱离。使用制造商最好的朋友 - 热熔胶将保险杠连接到手臂延伸部分。

测试/调试

我的第一步是拿出热熔胶枪,在 Arduino 上的微型 USB 连接器上涂上一团胶水。没有什么比在从板上撕下后看到 USB 电缆末端悬挂的连接器更令人沮丧的了。

首先对 HCU 进行基准测试。将 Arduino 连接到配电板并连接微型 USB。调用 Arduino IDE 并加载代码。不要在 HCU 上附加任何其他东西。电源将由 USB 提供。调用 IDE 串行监视器并确认显示菜单。

pYYBAGNYfW2AK3h2AADDKezZTn4564.png
菜单
 

接下来将电机控制模块和两个电机组件连接到 HCU。可以通过发送正向和反向命令来测试电机。请记住,电源由 PC USB 端口供电,因此请限制您的速度。我的果汁以大约 25 厘米/秒的速度耗尽。通过在每个车轮上放一点便利贴来检查编码器是否正确运行,并通过注意标记的相对位置未更改来验证电机实际上是否在跟踪。问题可能是由编码器和编码器盘未对准或被遮挡(或部分遮挡)的槽造成的。

连接传感器模块和连接器 SIG2。激光应该开始闪烁。超声波测距仪可以使用报告 3 进行测试。

将电源连接到 SIG1 连接器,将 SIG1 连接器连接到 HCU。向电源施加 7.4V 电源。确认保险杠开关和按钮的正确操作。每当进入 STOP 状态时,HCU 都会发送一个表示原因的二进制代码 (CODABOPP):

pYYBAGNYfXCAJweYAACkOYepAg0039.jpg
CODABOPP
 

单击监视器中的数据输入窗口并输入命令,例如“f”表示前进,然后输入“v10”表示速度。有 7 个内置诊断报告,例如“x1”,如下图所示(见插图)。请注意,基本指令速度为 10 厘米/秒,但每个电机都在稍微修改指令速度,因为转向任务试图保持轨道笔直,Adist = Bdist。

poYBAGNYfXKAaxiCAABin4_yGmk977.jpg
报告 1
 

有7个报告:

1 - 电机信息

2 - 转向

3 - 一般

4 - 平

5 - 旋转

6 - 电源控制

7 - 机械和菜单

输入任何没有预期参数的命令都会将该参数设置为零,因此调用报告 0 将关闭任何活动报告。您将不得不检查代码以了解许多列的含义,因为缩写的标题可能是钝的。

请注意,您的 PC 的 USB 连接器可能限制为 500 mA。接近此限制将导致异常行为。

几秒钟后,您将看到显示器上显示的命令菜单。命令可以从 IDE 串行监视器或 Raspberry Pi 串行端口(通过 SSH 和 PuTTY)发送到 Arduino。

在您对 HCU 正常运行感到满意后,将电源连接到 Pi 并将 HCU 连接到控制连接器。连接电池(或外部电源)。请记住,当连接 Arduino IDE 时,您必须小心不要导致 Arduino 重置,因为这会立即关闭 Pi 的电源,例如当您加载新代码或调用监视器时。该软件检测电池的存在,并仅在存在且充电充足的情况下为 Pi 供电。使用 Raspberry Pi 和 Arduino IDE 进行调试并激活监视器可能会很棘手。这是我的启动程序:

在 PC 上调用 Arduino IDE,打开相应的代码文件

将 USB 电缆插入 Arduino,这将启动 Arduino,但不会启动 Pi

启用 IDE 串行监视器,这将重新启动 Arduino

如果需要,将新代码加载到 Arduino

将电池连接到电源板上

禁用然后重新启用 IDE 串行监视器,这将重新启动 Arduino 和 Pi。将注意到电池的存在,并且 Pi 将通电。

几秒钟后,您将看到显示器上显示的命令菜单。Pi 大约需要 30 秒才能启动,之后您可以确认视频链接的操作。命令可以从 IDE 串行监视器或 Raspberry Pi 串行端口(通过 SSH 和 PuTTY)发送到 Arduino。

通过按下按钮或发送 (K)ill 命令来完成关机。等待断开电池,直到警报停止发出哔哔声或激光停止闪烁。如果要将新代码加载到 Arduino 中,请关闭系统,断开电池,加载代码并重新启动系统。Arduino 和 Pi 之间的通信失败通常是由电池电量不足引起的。尽管我对在操作过程中关闭 Pi 进行了所有警告,但我的机器在数十次意外断电后仍然幸免于难,没有发现任何不良影响。

在调试 HCU 时,我确实遇到了一个棘手的问题,其特点是电机在低速时运行良好,但在加速时会打嗝或重置。这(终于!)被追踪到 20 针 MTRCTRL 连接器上的引脚 1 和 2 与 SIG1 连接器上的接地引脚 1 和 2 之间的弱接地连接。在引脚之间添加 22 号线解决了这个问题。

手术

YAAR 响应 9 个基本命令:

  • 停止 - 进入停止状态,电机将应用电机制动
  • 前进 - 进入前进状态(速度 = 0)
  • 反向 - 进入反向状态(速度 = 0)
  • 速度——设定规定的速度
  • 距离 - 设置规定的距离(默认 = 10 公里)
  • 曲线 - 将路径设置为以厘米为单位的规定半径的右 (+) 或左 (-) 圆
  • 右 - 以度数设置规定的新轨道
  • 左 - 如果从停止状态执行,YAAR 将原地旋转
  • Halt – 设置速度=0,但保持正向或反向状态

命令可以从 Arduino 串行控制台输入或由 Raspberry Pi 发送。一个典型的命令包括进入所需的状态,然后指定所需的速度。命令不区分大小写。每个命令都必须使用 发送,例如:

f     Enter the forward state
v20   Set speed to 20 cm/sec, begin moving forward

以下命令序列将导致 YAAR 以 30 厘米/秒的速度向后移动 100 厘米:

b     Enter the backup state
d100  Set distance to 100 cm
v30   Set speed to 30 cm/sec, begin moving backward

可以输入相同的命令序列:

B d100 v30 Use spaces to separate commands, execute upon ENTER

在 YAAR 进入前进状态后,可以使用 R、L 和 C 命令修改路径。

f      Enter the forward state
v20   Begin forward motion at speed = 20 cm/sec
r45   Change track to the right 45 degrees
c-100 Circle to the left with a radius of 1 meter
r     Change track to right 0 degrees (straight ahead)
s     Enter the stop state
r360  Enter the spin state, rotate in place right 360 degrees

在后备状态下不调用转向任务,从而导致在反向时对两个电机的速度命令相同。

 

从这里到哪里?

现在,大脑并没有像中继通信那样考虑太多,但可能性是无穷无尽的……首先,正如我所说,我不太习惯用 Python 编码。但也许我的第一步是用飞行时间传感器(如通过 I2C 连接到 Pi 的 VL53L5)替换 SR-04 超声波距离传感器。这将导致架构改进,因为 Pi 将能够利用空间信息以及简单的避障。它也会给 Pi 一些思考的东西,这是项目的重点。

之后,以下项目招手;跟随一个颜色斑点,在房子周围导航,构建一个更大的平台,远程呈现,音频命令,跟随一个人……如果有人感兴趣,我很想合作扩展这个项目的功能。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'Arduino机器人开源分享',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);