机电控制是智能车最重要的输出功能,假如您使用Jetbot官方的自行打印车体并用组装方式来搭建智能小车的话,就需要搭配下图这个 ”DC-Stepper-Motor” 控制板,因为3D打印车体是根据这个控制板所设计的。
只要在淘宝上输入 “DC-Stepper-Motor” 关键字,就能找到非常多的供应商,价位在30~50人民币之间,不过出货都是以上图左边的散件为主,需要将四个关键位置自己加以焊接,其他用不上的部分可以不用处理。
这个控制板是由一个PCA9685的PWM控制芯片与两个TB6612电机驱动芯片所组成,与Jetson设备、TT电机之间形成如下图的接线关系。由PCA9685接收来自Jetson设备I2C总线的指令,然后驱动TB6612芯片按照PWM控制信号对两个TT电机,透过改变电流大小去调整电机转速与方向,来执行Jetbot小车的移动。
但是这里有个在“Jetbot实战系列06:I2C总线与PiOLED”所遗留的问题需要先解决,因为PiOLED显示屏也要接上一组3V3/GND供电与SDA/SCL接脚,已经将Jetson的1~6引脚全部占用,那么这个DC-Stepper-Motor控制板的SDA/SCL该如何与Jetson的I2C引脚对接呢?
这个显示屏的选项有三种,Jetbot原厂使用下图最左边的Adafruit原厂显示屏,然后按照 https://jetbot.org/master/hardware_setup.htm 的第10步骤,在上面焊接6根90度弯曲引脚,再透过杜邦线与DC-Stepper-Motor控制板上的3V3/GND与SDA/SCL的四个脚位对接,如此一来只需要一组I2C总线就能完成在PiOLED屏上显示与控制DC-Stepper-Motor用途,在总线上的资源调用是最节省的。
但这种Adafruit显示屏在国内的售价大约在120~150人民币,比中间的国产显示器的30~50人民币足足高出4~5倍,而且还需要额外的6根接脚的焊接作业,其实并不是个优选的方案。
这里推荐一个既省钱又省力的方案,:
14 |
i2c_bus = traitlets.Integer(default_value=0).tag(config=True) |
如果是使用Docker容器的方式,修改代码之后需要重新创建base与jupyter两个容器,请执行以下代码,就能让修改的配置生效:
$ $
$ $ $ |
cd ~/jetbot/docker && ./disable.sh source configure.sh # 只需要重建base与jupyter两个容器 cd base && ./build.sh && cd .. cd jupyter && ./build.sh && cd .. ./enable.sh $HOME/jetbot |
这样就能用原本I2C_2执行PiOLED显示内容,另一组I2C_1处理机电控制的部分,总的来说会是最简单轻松的处理方式。
前面提到DC-Stepper-Motor控制版是由PCA9685与TB6612两种芯片所组成,前者在I2C总线应用领域是非常重要的一个PWM控制器,后者则是根据PWM的控制信号为TT电机提供对应电流控制的芯片,透过二者的协作让Jetbot用最简便的元器件,搭建完整功能的车轮控制体系。
Jetbot已经针对这两个芯片提供高级封装的接口,极大程度减少我们的代码复杂度,但是为了让读者能在这过程中,对于I2C总线与这些控制芯片的协作有进一步理解,能更广泛地在Jetson设备上开发出更丰富的机电控制应用,因此占用一些篇幅来讲解一下这两个控制器的基本工作与Jetbot里面的底层代码内容。
这里最重要的关键技术是“脉冲宽度调制(PWM,Pulse width modulation)”控制信号,负责调节对机电设备的电源供给量,但并不对设备提供电源,就像水龙头的功能是负责调节水量而并不具备供水能力是一样的,水龙头是大家所熟悉的“人机界面”,我们只要简单地调节水龙头来控制水流量就像,至于埋藏在墙里的供水管道有多复杂,通常不太引人们注意,除非漏水或阻塞!
目前大部分嵌入式设备都提供这个功能,包括Jetson系列开发套件里也都提供一组PWM引脚(32与33),不过这必须先经过前面讲解过的jetson-io.py工具进行配置,并且重启之后才能使用。但除非您要开发的应用只需要非常单纯地控制一个设备,否则一组PWM顶多能做个 ”LED闪灯”这类最基础的入门小实验而已。
PCA9685芯片是能提供16个PWM通道的控制芯片,用1组I2C总线就能控制高达16组机电设备,在机器人、机械手臂或无人机等应用领域是非常合适的,毕竟I2C总线在设备上的数量是相对稀缺的。在https://i2cdevices.org/devices/pca9685设备地址列表中,可以看到PCA9685地址编号横跨0x40~0x7F的半壁江山,就能显示这个芯片在I2C应用领域的高使用性。
这个信号控制器需要独立的2.5V~5.5V电源来支持其运作,在控制板上以 ”VCC” 作为标识,由于所需要的电流非常小,可以直接使用主控设备(如Jetson Nano 2GB)上扩充引脚的合适电源与GND,也不会影响主控设备的稳定性,另外再加上一组来自主控设备上的I2C总线的SDA/SCL输入就可以开始工作。
控制板上有另一个 ”V+” 标识的电源输入,是真正要对舵机(下图左)、电机马达(下图右)等动力设备提供电力的供电源。
根据设备不同转速、扭力、转距等参数有不同的工作电流,总的来说一路舵机的最基本工作电流在100毫安以上、一个电机马达的待机状态最少就需要250毫安,实际所需要预留的供电量往往是这个最低量的2~3倍以上,这样的用电级别就不是Jetson Nano 2GB这类嵌入设备所能供应的,必须依赖一个独立供电源才足以支撑。
网上大部分提到的PCA9685控制板,指的是下图中间这种16路PWM舵机驱动板,左边的接脚与Jetson Nano 2GB的I2C与电源的引脚相连,下面有编号0~15总共16组引脚可以接上右边的各种舵机。控制板中间可以看到 ”PWM/V+/GND” 的印刷字样,上方白色电源孔接到独立供电系统,这样就能轻松地组合多机械手臂的应用。
读者可以自行采购这类舵机控制板,去搭建组合机械手臂或者二维/三维可旋转的摄像头的项目,透过指定控制板上的0~15通道(channel)编号的PWM值,进而控制每个舵机的独立工作。
这是个俗称为“H桥”的直流电机控制器,主要因为其核心电路形状酷似字母”H”而得名,其功能就是根据所接收的PWM信号,为电机马达提供对应的电流,每个TB6612芯片可以控制一对(两个)电机马达的转速与方向。
在DC-Stepper-Motor控制板上(如下图中),可以看到两边各有一个 ”6612FNC” 芯片,每个芯片占用PCA9685一个通道,各自控制两组电源供应线路,每一组都有正(红线)负(黑线)两极的线,与最右边TT减速电机进行对接。
这个芯片的每个桥都为电机提供1.2A的高电流,每组两个电机就至少需要2.4A以上电流,这绝对不是Jetson Nano 2GB这类嵌入设备所能供应的,必须依赖独立的5V电源才足以满足。
在Jetbot项目中只需要用到1个通道的两个电机组就可以,5V电源由市售的充电宝来担任,但受到这种电源的供电能力所局限,后面要进行的Jetbot范例全都是“慢速低电流”的应用,读者可以在过程中尝试将电机转速调到最大,会发现很容易因为供电不足而导致整套Jetbot掉电。
在~/jetbot/jetbot下面的robot.py与motor.py两个代码,就是为这个项目提供的两个不同阶层的调用库,在这里简单做个说明,读者可以根据这些定义进行调整,改写成适用于其他项目的代码:
以上将两个代码中最重要的关键提取出来简单说明,其实还是比较简单的,只要捋清楚上面参数之间的关系,就能很轻松地调整代码内容。
这两个代码是针对TB6612驱动的车轮应用所设计的,并不适用于舵机用途,但是只要清楚这些调用逻辑之后,其实代码内容同样是“根据PWM值给设备供给电流”的操作过程,最关键的工作就是先确认设备所对应的接脚编号,其他的代码就是指派工作而已,并没有什么技术难度。
强烈推荐读者可以基于本文所讲解的技术内容,先试着将网上众多树莓派小型项目移植到Jetson设备上,例如LED灯闪烁控制、多维度摄像头云台等机械手臂相关应用,也可以到https://developer.nvidia.com/embedded/community/jetson-projects 这个英伟达开发社区优选项目中,寻找合适的范例。[完]
好文章,需要你的鼓励
临近年底,苹果公布了2024年App Store热门应用和游戏榜单,Temu再次成为美国下载量最多的免费应用。
云基础设施市场现在已经非常庞大,很难再有大的变化。但是,因为人们可以轻松地关闭服务器、存储和网络——就像开启它们那样,预测全球云基础设施开支可能非常困难。