2 探索机器人-代码和电子设备
我们将拆开一个机器人,看看它的部件和系统。我们将探索机器人的各个组成部分,包括软件(代码、命令和程序库)和硬件,以及它们是如何组合在一起的。在开始制作机器人时,考虑你想要的部件以及它们之间的关系是很有价值的。我建议您绘制机器人的草图–框图,作为连接代码和部件的指南,我们将在本章对此进行探讨。
在本章中,我们将讨论以下主题:
- 了解机器人内部结构
- 探索机器人组件类型
- 探索控制器和输入/输出
- 规划组件和代码结构
- 规划实体机器人
请准备:
- 简单的绘图材料,如笔和纸
- 可选 – 绘图软件,如 Draw.io(免费,网址:https://app.diagrams.net)或 Inkscape(免费,网址:https://inkscape.org)。
2.1 了解机器人内部结构
我们可以先将机器人看作一个物理系统。比如下图的简单的业余机器人:
业余爱好机器人的组件布局
图中的部件组包括九类部件:
- 底盘或机身是机器人的主要结构,其他部件都连接在这里。
- 一个脚轮可使机器人保持平衡。
- 两个驱动轮。其他机器人可能会在此处使用更多的轮子或支腿。
- 电机是机器人移动的关键。
- 电机控制器是连接控制器和电机的桥梁。
- 控制器(这里是 Raspberry Pi)运行指令,从传感器获取信息,并处理这些信息,通过电机控制器驱动输出(如电机)。
- 所有机器人都必须有电源,通常是一组或多组电池。
- 传感器提供有关机器人环境或物理系统状态的信息。
- 最后,调试设备是一种输出设备,可让机器人就其代码的运行情况与人类进行交流,同时还能起到美观的作用。
我们可以将机器人形象地看成一个由相互连接的部件组成的框图。方框图使用简单的图形来显示事物之间的大致连接方式:
框图可以看到硬件中的功能块,以及它们之间的高级数据流。
根据该图,您可以制定更详细的计划,其中包括电气连接、电源要求、硬件和所需空间等方面的细节。绘制你想制作的机器人方框图是制作机器人的第一步。
方框图不是原理图,也不是机器人成品的比例图。它甚至无法显示实际的电子连接。图中忽略了一些小细节,例如如何在超声波距离传感器作出反应之前向其发出信号。连接线给出了数据流的总体概念。方框图可以显示电机和传感器的类型和数量,以及它们可能需要的其他控制器。
以上是对机器人组件的简要概述,我们看到了一个与您将要制作的机器人相似的机器人,以及将其拆解成的各个部件。我们看到了一个简单的机器人框图及其意图。在下一节中,我们将从电机开始,仔细研究机器人的各个组件。
2.2 探索机器人组件类型
电机(英语:electric machine)又称电力机械,是机械能与电能之间转换装置的通称,指依靠电磁感应运行且具有能做相对运动部件的机械,可将电能转换成机械能或将机械能转换成电能的装置。
传感器(英语:Sensor)是用于侦测环境中所生事件或变化,并将此消息发送出至其他电子设备(如中央处理器)的设备,通常由感测器件和转换器件组成。
2.2.1 电机类型
扭矩是一种旋转/扭转力,例如,电机转动车轮所需的力。电机有一个极限,即失速转矩,在此转矩下电机将停止运转。
以上为不同类型的电机 – 直流电机、直流减速电机、伺服电机和步进电机
-
直流电机: 这是机器人技术中最简单的电机类型,也是减速电机的基础。它使用直流(DC)电压,这意味着只需单向通过电压即可驱动它。电机速度与通过它的电压和移动所需的扭矩成正比。上图所示的裸直流电机可能会因转速过快而无法使用。它的扭矩不大,很容易失速。
-
直流减速电机: 这是一种配有齿轮箱的直流电机。齿轮箱可降低转速,增加可承受的扭矩。这种机械优势提高了电机移动负载的能力。请注意,这种齿轮电机缺少焊接引线!我推荐这些类型的电机用于机器人车轮。
-
伺服电机(或伺服机构): 这种电机将齿轮电机、传感器和内置控制器结合在一起示。发送到控制器的信号说明了电机的位置,控制器利用传感器的反馈来尝试达到该位置。伺服电机可用于摇摄和俯仰机构,以及机器人手臂和四肢。
-
步进电机(Servomotor): 这些电机的线圈按顺序供电,使电机步进一定的度数。在需要精确运动时,工程师会使用步进电机。与直流电机或伺服电机相比,步进电机速度较慢,发热量大。您会在3D打印机和高端机械臂等精细控制应用中看到步进电机。它们比其他电机更重、更贵。
-
无刷电机:它们由专门的控制器驱动,可以达到很高的速度和扭矩。它们运行时噪音较低,在无人机中很受欢迎。目前还没有与之相当的齿轮电机,因此可能需要制作一个变速箱。
除伺服电机外,所有电机都需要控制器(如 Raspberry Pi)的硬件来驱动。这些硬件允许Pi控制耗电设备,而不会损坏它们。切勿将直流电机、步进电机或螺线管直接连接到 Raspberry Pi!
2.2.2 其他类型的执行器
线性致动器是将电信号转换为单轴运动的设备。它们可以是步进电机驱动固定外壳中的螺杆,也可以使用线圈和磁铁阵列:
电磁线圈是一种简单的线性致动器,它使用一个带有金属芯的电磁线圈,通电后可被拉动或推开。这种类型通常用于液压或气动阀门。液压和气动系统可产生强大的运动,如挖掘机中的运动。
2.2.3 状态指示器 – 显示器、灯光和声音
另一种有用的输出设备是显示器。LED(小型电子灯)就能显示机器人某些部分的状态。LED 阵列可以显示更多信息并增加颜色。图形显示屏可以显示一些文字或图片,就像手机上的显示屏一样。
扬声器和蜂鸣器可以让机器人发出声音与人类交流。这些设备输出的声音可以是简单的噪音,也可以是语音或音乐。
许多机器人没有任何显示屏,需要依靠连接的手机或笔记本电脑来显示它们的状态。我们将在第 17 章 “用手机和 Python 控制机器人 “中使用手机来控制和查看机器人的状态。
2.2.4 传感器类型
下图显示了机器人技术中使用的传感器类型。它们与我们将在本书中探索和使用的传感器相似。让我们来看看其中一些传感器及其用途。请注意,这些传感器可能与之前看到的传感器类型不同–做相同工作的传感器有很大差异。当我们将它们添加到机器人中时,我们将更详细地介绍它们的变体:
我们机器人中的部分传感器:1 – Raspberry Pi 摄像头;2 – 光学距离传感器;3 – 超声波距离传感器;4 – 线传感器;5 – 麦克风;6 – 光学中断传感器
- Raspberry Pi 摄像头模块
该模块连接到Raspberry Pi,为其提供成像功能。该模块可捕捉图像或视频序列。它可以快速生成大量数据,而这正是与机器人视觉相关的问题之一。它对光照条件比较敏感。
- 光学距离传感器
VL53L0X飞行时间激光测距传感器是一种距离传感器。它使用红外激光反弹物体,检测物体的距离。它可能会受到光照条件的影响。
VL53L0X 传感器使用 I2C 向 Raspberry Pi 发送检测到的距离,并可与许多其他设备共享两个通信引脚。当您有许多传感器和输出,而连接的地方开始不够用时,I2C 就非常有用。I2C 传感器可能比较昂贵。
- 超声波距离传感器
HC-SR04 是另一种距离/测距传感器,它通过物体反射声脉冲来检测距离。它受物体材料类型的影响,无法检测到某些表面,但不受光照条件的影响。有些表面,例如织物,会过多地吸收声音,而且永远不会将声音传回,而其他表面,例如网格或网眼,与声波的相互作用不大,对传感器来说是透明的。
HC-SR04 需要在控制器中进行精确计时,以确定回声的时间,我们必须用代码来管理这一点。与 VL53L0X 激光传感器相比,HC-SR04 的探测距离更远,价格也更便宜,但在近距离时灵敏度较低
- 线性传感器
这是一组三个线型传感器,利用光来检测从亮到暗的过渡。它们可以进行调整,以便在不同条件下进行感应。这些模块有几种变体。这些模块可根据其下方的明暗区域提供开或关信号。它们是最简单的传感器。
- 麦克风
第五个传感器是一对麦克风。它们可以直接连接到Pi上的PCM引脚。其他一些麦克风需要连接到电子设备上,才能将信号处理成Raspberry Pi可以使用的信号。
- 光学中断传感器
它能检测穿过两根柱子间缝隙的红外光,感知柱子间是否有东西干扰了光束。这些传感器与凹槽轮一起使用,通过计数凹槽来检测旋转和速度。与轮子一起使用时,它们也被称为编码器。
还有很多传感器,包括用于检测肢体位置、光线、烟雾、热源和磁场的传感器。这些传感器可以用来制作更先进的机器人,并添加更多令人兴奋的行为。
我们已经介绍了电机、显示器、指示器和传感器,以及它们的类型、示例和一些细节。这些都是让我们的机器人与世界互动的部件。现在,我们将开始学习控制器,即运行代码并将传感器和电机连接在一起的机器人部件。
2.3 探索控制器和I/O
机器人框图的中心是控制器。机器人通常有一个主控制器,即某种计算机。它们还可能有一些辅助控制器,一些更特殊的机器人有很多控制器。本书将保持简单,您的代码将在传统的中央控制器上运行。控制器将所有其他部分连接在一起,并构成它们互动的基础。
在了解控制器之前,我们需要更好地了解将控制器与其他部件连接起来的一个重要部件–I/O 引脚。
2.3.1 I/O 引脚
I/O引脚用于控制器的输入和输出。它们使控制器能够连接现实世界中的传感器和电机。
控制器上的I/O引脚数量是在不使用辅助控制器的情况下与机器人连接的限制因素。您可能还会看到通用输入输出(GPIO)这一术语。控制器的I/O引脚具有不同的功能。
最简单的I/O引脚只能输出或读取开/关信号。这些引脚被称为数字I/O引脚。它们可以通过信号定时编程来执行复杂的任务。这就是HC-SR04 距离传感器所采用的原理。高电平代表数字逻辑高电平(1,真,开)。低电平代表数字逻辑低电平(0,假,关)。控制器会尝试将任何值解释为高电平或低电平:
模拟输入引脚可以读取不同的电平,如图是另一个电压-时间曲线图。如果传感器产生不断变化的电阻或连续刻度值,那么模拟引脚就是合适的。这有分辨率限制,例如,8位模拟输入可读取256个可能的值:
脉宽调制(PWM Pulse Width Modulation)引脚输出循环数字波形,下图也显示了随时间变化的电压,但脉冲的定时代表了连续电平,因此虚线显示的是定时产生的连续电平。PWM输出允许代码选择频率和导通时间。在一个周期内,接通时间与断开时间的长短会发生变化,从而改变输出信号。这通常用于控制电机的速度:
有些I/O引脚可用于组成数据传输线,如串行总线、I2S 总线、I2C 总线和 SPI 总线。它们被称为数据总线。数据总线用于向或从其他控制器和智能传感器发送数据。
微控制器引脚可用于数字或模拟输入和输出,也可作为数据总线的一部分。许多控制器允许在运行的软件中配置引脚的使用模式,但有些功能仅限于特定引脚。
2.3.2 控制器
虽然只要掌握适当的技能,就可以使用裸微控制器芯片来创建周围的电子设备和自己的印刷电路板,但在本书中,我们将通过使用控制器模块来保持简单。这些模块往往是成套的、易于使用的系统:
部分控制器模块:Raspberry Pi、NodeMCU、Arduino 和 micro:bit
它们都可以通过USB连接供电。除Raspberry Pi外,所有控制器都可以通过USB进行编程。它们都有连接器,可以方便地连接I/O引脚。让我们看看每种控制器的特点和优缺点:
- 树莓派
功能强大,足以进行视觉处理。它的功耗略高,价格较贵,但功能与手机类似。它拥有最灵活的编程环境。有几种型号可供选择。它们有很多I/O引脚,但都不是模拟输入引脚。
- NodeMCU
基于ESP8266控制器。该控制器内置Wi-Fi,可使用Arduino C++、MicroPython或Lua进行编程。它有大量I/O引脚,但只有一个能读取模拟信号。它支持多种数据总线类型。与 Arduino相比,它的速度更快,可容纳的程序也更多。它是本阵容中最便宜的控制器。
- Arduino Leonardo
基于Atmega 328芯片。Arduino 之所以重要,是因为它可以通过USB轻松连接到电脑,并通过编程立即与连接到其I/O引脚上的设备进行交互。Arduino主要使用C++语言编程。它具有最灵活的内置I/O引脚–7个模拟引脚、多个数字引脚、PWM 输出引脚,并可设置为处理大多数数据总线。Arduino的处理器非常简单,不能执行视觉或语音处理任务。在这里展示的所有选项中,Arduino的功耗最低。
- micro:bit
该产品于 2015 年发布,用于教育领域,非常适合儿童使用。在机器人技术中使用时,如果您需要的I/O引脚多于其出厂时的3个,则需要一个额外的适配器,但它仍然是功能相当强大的机器人控制器,并配有方便的内置LED矩阵。它可以用 MicroPython、C、JavaScript 和其他几种语言编程。
值得一提的还有PIC微控制器,这里没有配图。这种微控制器早在其他微控制器之前就被用于业余机器人技术,并且拥有一个蓬勃发展的社区。
以下是根据优缺点对控制器进行的比较:
其他控制器运行的可能是简单的解释器或编译代码,而Raspberry Pi运行的是完整的操作系统。当前的型号具有Wi-Fi和蓝牙功能,我们将利用这些功能制作无头机器人并与游戏控制器连接。
2.3.2 选择树莓派
下图显示了几款当前的Raspberry Pi型号。随着新款Raspberry Pi的发布,机器人制作者可能需要根据最新版本进行调整。所有这些型号都具有Wi-Fi和蓝牙功能。Raspberry Pi的I/O引脚支持多种数据总线类型和数字I/O。模拟读取和其他一些I/O功能需要外部控制器:
Raspberry Pi 型号 – 4B、3A+ 和 Zero W
- Raspberry Pi 4B
作为最新型号,它是该系列中速度最快、功能最强大的。它占用空间更大,是这一组中最贵的,耗电量也最大。
- Raspberry Pi 3A+:
它在尺寸和功耗方面都做了很好的折衷。它完全能够通过摄像头进行视觉处理。它的速度不如4B+快,但对于我们的目的来说绝对够快。
- Raspberry Pi Zero W
这是其他型号 Raspberry Pi 的廉价、轻便替代品。仍然支持摄像头和扬声器。Zero WH 型号还包括I/O接头。它的语音和视觉识别速度比 Raspberry Pi 3 和 4 慢。它们体积小,因此也是遥控板的一个有趣选择。
另外有更便宜的Raspberry Pi Pico,只适合进行简单的控制。
Raspberry Pi 4B 可能是功能最强大的,但 3A+ 功能强大,足以应对这里的所有活动。
参考资料
- 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
- 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
- python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
- Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html
- Raspberry Pi Sensors, Rushi Gajjar, Packt Publishing
- Make Sensors: A Hands-On Primer for Monitoring the Real World with Arduino and Raspberry Pi
- Make Electronics: Learning Through Discovery
2.4 规划组件和代码结构
现在,您已经简单了解了机器人中可能会用到的一些组件,并且遇到了将它们组合在一起的框图。在这里,您可以开始下一步,进一步思考如何将各部件连接起来,以及为它们编写的代码将如何结构化。
将代码看作逻辑块而不是一大块时,更容易进行推理。以类似于硬件功能图的方式来安排代码,将有助于在代码变得越来越复杂时为你导航。
电机控制器有很多种。它们有不同的方式向电机输出信号,还可能对电池电量进行监控。有些智能电机控制器可直接与车轮编码器连接,以确保车轮已完成指定的行程。当我们为机器人编写行为时,如果更换了电机控制器,我们可能就不想重写了。将直接的电机控制器代码与行为代码混合在一起,也会增加推理难度。为此,我建议创建一个接口层,即实际电机控制器代码与标准接口之间的抽象层,这样就可以交换组件了。
每个传感器的情况也类似。它们将有一些代码来管理如何获取信号并将其转化为可用数据。所有这些设备在启动或停止与它们连接的行为时,都可能需要运行设置和拆卸代码。摄像头就是一个复杂的例子,需要经过处理才能获得我们可以用来执行任务的数据值:
与硬件一样,一个简单的图表也可以表示软件。它可以用绘图程序绘制,也可以在手边的任何纸张上草绘。图中,我特意选择了手绘的方上式,这样你就不会觉得需要用绘图工具才能完成。这不会很整洁,但很快就能重新绘制,甚至可以在外出就餐时突发奇想,在收据纸的背面完成。与此相关的是,如果使用铅笔,请用钢笔或细线笔再画一遍,以免褪色。为了让读者看得更清楚,我还在电脑上画了一幅图,但你不必这样做。
手绘草图后,可以使用软件工具。这将比手绘版本花费更多时间,而且尽量不要被工具的怪异和风格所干扰。
就设计本身而言,这仍然是一个非常简单的视图。车轮框将是一个代码块,处理要求车轮电机控制器做的事情。这些代码可以是电机控制器公司编写的代码,也可以使用连接到控制器的 I/O 引脚。
距离传感器是一个代码块,用于从传感器读取距离,并在必要时触发传感器。我们将对两种不同的传感器进行比较。有了这样的代码块,在这一层更改传感器就意味着其他代码无需更改。
相机也有一个代码块,负责设置相机、分辨率、白平衡等繁琐的工作,其他部分我们将陆续介绍。在此之上是一个将使用相机图像的图层。该层可以获取彩色物体的位置,并将该位置返回给上一层。
横跨电机和距离传感器的是行为层,它可以让机器人避免碰撞,也许是当它的一侧低于阈值时。这将覆盖其他行为,让机器人转向远离障碍物,然后开走一段距离。
顶层是另一个行为,它从 “获取对象位置 “代码中获取位置数据。利用该位置选择一个方向,然后指示电机驶向目标。如果该行为通过 “避免碰撞 “行为,则可能会产生复杂的交互,导致机器人在避开障碍物和绕过物体的同时,寻找正确的物体。同时,机器人也不会靠近检测到的物体,以免与之发生碰撞。
每个模块都相对简单,也许更接近硬件的下层更为复杂,尤其是摄像头。
将代码分解成这样的模块意味着你可以一次只处理一个模块,测试并调整其行为,然后再专注于另一个模块。当你编写了这样的代码块后,就可以重复使用它们。您可能需要多次使用电机代码,而现在不需要多次编写。
使用程序块来描述我们的软件,可以让我们以不同的方式实现程序块及其交互。我们可以考虑是使用函数、类还是服务来实现这些模块。当我们开始编写代码时,我将花更多时间讨论这个问题,并展示不同的方法。
2.5 规划物理机器人
现在,让我们利用所有这些知识,规划一下我们在本书中制作的机器人物理部分的布局。在学习各章节的过程中,我们每次都会添加新的部件,因此,在学习的过程中,在头脑中保持一张整体地图,有助于我们看清自己所处的位置。开始描绘机器人要做的所有事情是一件令人兴奋的事情。让我们先列出我们的机器人会做什么和会是什么:
- 它将有轮子,可以在地板上行驶。
- 它将有一个 Raspberry Pi 3A+ 控制器。
- 它将有一个车轮电机控制器。
- 它将能用一组多色 LED 指示其状态。
- 机器人将使用一对伺服电机来实现摇摆和倾斜机构。
- 它能够避开墙壁,并利用超声波或激光测距传感器绕过障碍物。
- 它的每个轮子都有一个编码器,可以知道自己移动了多远。
- 机器人将使用摄像头来感知彩色物体或人脸。
- 它还能用摄像头追踪线路。
- 机器人将有一个麦克风和扬声器,可以使用语音指令。
- 它将有一个游戏手柄作为遥控器。
- 所有这些都需要电源。
呼!功能还真不少。现在,我们需要绘制硬件模块。图 2.14 显示了我们的框图。虽然是用 Draw.io 完成的,但简单的封底草图也是机器人规划的良好开端。我的大多数机器人都是这样开始的:
虽然这看起来像是一个令人生畏的机器人,但我们将在每一章中专注于一个功能区域,并在转向其他区域之前构建它。这里的注释并不是任何正式的符号,它只是一种将所有需要连接的部件可视化的方式。与此同时,我通常会勾勒出传感器和部件之间的大致物理位置:
使用Draw.io绘制的机器人物理布局示意图
- 传感器有清晰的视野,距离传感器指向两侧。我会在相关的传感器章节中详细说明这一点的重要性。
- 编码器放置在需要使用的车轮上方。
- 重物,特别是电池,应放在低处(低于重心),以免机器人翻倒。
- 电池需要更换,因此要考虑如何取用。
- 尽量让直接连接的部件彼此靠近。
- 这只是一个粗略的计划。不需要这么详细,这也不是试装。实际尺寸、设计折衷和缺陷都意味着这将会发生变化。这只是一个起点。
在本书的学习过程中,我们将研究这些图表中的细节,并开始充实真正的机器人,使其中一些细节不再模糊。在项目开始时,任何这样的图表都应该被视为有点粗糙。它不是按比例绘制的,不应盲目照搬。它只是一个指南,或者说是开始工作的快速地图。
2.6 小结
在本章中,您已经了解了机器人的各种组成部件,并通过方框图开始想象如何将这些部件组合成一个完整的机器人。你们已经了解了如何在信封上快速勾画出自己的机器人创意,以及如何利用计算机上的绘图工具绘制出更整洁的同一张图。您已经快速了解了电机、传感器和控制器,以及控制器与其连接的其他设备进行通信的几种方式,包括模拟、数字、PWM 和数据总线。在此基础上,你已经看到了我们将在本书中制作的机器人的平面图。